fastmon Docs
Analytics

Break errors down by signature

Report an issue

Get breakdown of error signatures from collected beacons.

Reads the structured errors Nested column. Each beacon stores up to 5 (type, count, sample_message, frame_hosts, frame_lines, frame_cols, fingerprint, is_first_party) entries; we ARRAY JOIN and aggregate by fingerprint, the canonical server-computed signature key.

Display projections (error_type, sample_message, frames) are aggregated via any() since within a fingerprint group they're stable by construction (the fingerprint hashes those exact inputs); using any() rather than argMax/groupArray keeps the query cheap.

Authorization

bearerAuth
headerAuthorizationBearer <token>

API token generated from the fastmon dashboard (Account → API Token) or at organization level (fmo_…, one that outlives its creator). Send as Authorization: Bearer fm_... or paste the full token (including its prefix) into the Authorize dialog.

Path Parameters

org_id*Org Id
Formatuuid

Request Body

application/json
  1. body

Request for error types breakdown.

time_range*

Time range for the query

filters?

Optional filters

error_type?array<string>|

Restrict to specific error types (e.g. ['ResourceLoadError']).

exclude_error_type?array<string>|

Drop these error types from the breakdown (e.g. ['ResourceLoadError'] to stop third-party resource-load noise from counting). Negative of error_type.

exclude_hosts?array<string>|

Exclude error signatures whose stack frames touch any of these hosts (e.g. ['bat.bing.com'] to drop a noisy 3rd-party).

ownership?|

Restrict to first_party or third_party error signatures. Matches per-signature errors.is_first_party (filter-then-rank: the Top-N reflects the chosen group). Unset = both, mixed is rejected. Signature-accurate, unlike the page-level filters.error_origin, which says whether the PAGEVIEW carried an own error.

group_variants?Group Variants

Merge the fingerprints of one fault into one row: the engines report the same throw site a few columns apart, and a second caller is a second stack. A row then counts all of them and lists them as variants. Off by default, because a client that compares rows across periods has to match them by their variants rather than by fingerprint.

Defaultfalse
limit?Limit

Max error types to return

Range1 <= value <= 50
Default10
compare_to?|

Also count each returned signature over an earlier window, as previous_period on its row. The window is the one /analytics/query derives for the same mode. Only previous_period is accepted, any other mode is a 422.

Response Body

Successful Response

application/json
  1. response

Response for error types breakdown.

meta*

Facts about the result

request*

The request as the server resolved it

data*array<>

Error types with counts

error_count*Error Count

Total JavaScript error count. Failed resource loads are a separate signal, see /analytics/failed-resources.

blocked_count?Blocked Count

Ad-blocked tracker requests in the same filter scope - surface as 'N excluded as ad-blocked', not as a failure. A subset of the blocked bucket on /analytics/failed-resources.

Default0
own_subdomain_hosts?array<string>

Hosts on the site's own registrable domain, other than the page host, that served scripts or slow resources in this scope. Filled only when a ScriptError row is present: a masked error cannot be attributed, but the fix (crossorigin="anonymous" plus CORS on the host) needs a host name, and these are the ones the site owner controls. A hint, not a verdict: the beacon carries no exhaustive script-host list.

POST
/organizations/{org_id}/analytics/error-types
curl -X POST 'https://api.fastmon.eu/organizations/497f6eca-6276-4993-bfeb-53cbbbba6f08/analytics/error-types' \  -H 'Content-Type: application/json' \  -d '{  "time_range": {    "from": "2019-08-24T14:15:22Z",    "to": "2019-08-24T14:15:22Z"  }}'
{  "meta": {    "execution_time_ms": 0,    "total": 0,    "limit": 0,    "offset": 0,    "has_more": true,    "next_cursor": "string",    "sampling": {      "sampling_rate": 0,      "is_sampled": true,      "estimated_metrics": [        "string"      ]    },    "is_identity_mixed": true  },  "request": {    "time_range": {      "from": "2019-08-24T14:15:22Z",      "to": "2019-08-24T14:15:22Z"    },    "comparison_time_range": {      "from": "2019-08-24T14:15:22Z",      "to": "2019-08-24T14:15:22Z"    },    "granularity": "minute",    "identity": "stitch",    "window_seconds": 0,    "filters": {}  },  "data": [    {      "fingerprint": "string",      "error_type": "string",      "count": 0,      "share": 0,      "sample_message": "string",      "message_kind": "",      "message_value": "",      "ownership": "first_party",      "frames": [        {          "host": "string",          "path": "",          "line": 0,          "column": 0        }      ],      "last_seen_at": "2019-08-24T14:15:22Z",      "variants": [        {          "fingerprint": "string",          "count": 0,          "frames": [            {              "host": "string",              "path": "",              "line": 0,              "column": 0            }          ]        }      ],      "previous_period": {        "count": 0      }    }  ],  "error_count": 0,  "blocked_count": 0,  "own_subdomain_hosts": [    "string"  ]}