Every report carries the whole story.
What one tap sends, what never leaves the device, where it goes, and what happens when it lands. Everything here is shipped unless it says beta or planned; the docs have the rest.
Rendered in the dashboard. Raw on your webhook.
The same report both ways. The dashboard view is what your team opens; the JSON is the envelope the SDK filed. A webhook delivers it inside an event wrapper as data.report, with data.reporter and attachment URLs beside it.
{
"protocolVersion": "1.0",
"reportId": "5d3c9a1e-7b42-4f0e-9c1a-0b6e2f8d4a17",
"submittedAt": "2026-09-02T09:41:07.412Z",
"source": "manual",
"sdk": { "name": "everframe-web", "version": "0.6.6",
"platform": "web", "formFactor": "tablet" },
"reporter": {
"title": "Place order does nothing",
"description": "Tapped it three times on iPad, nothing happens.",
"user": { "id": "u_8f21", "displayName": "Ana Ruiz" }
},
"captures": { "screenshot": true, "logs": true, "network": true,
"breadcrumbs": true, "focus": true, "uiTree": false },
"captureControl": {
"included": ["screenshot", "replay", "logs", "network", "breadcrumbs"],
"excluded": []
},
"payload": {
"focus": {
"path": [0, 2, 1, 3],
"componentPath": "App > CheckoutPage > CheckoutForm > PlaceOrderButton",
"source": "touch"
},
"breadcrumbs": [],
"logs": [],
"network": [],
"networkBodies": []
},
"context": {
"app": { "name": "acme-web", "version": "2.3.1" },
"device": { "os": "iPadOS", "osVersion": "18.1", "model": "iPad14,5",
"screenSize": { "width": 1024, "height": 1366 },
"pixelRatio": 2, "locale": "en-GB", "timezone": "Europe/London" },
"route": "/checkout"
},
"attachments": [
{ "partName": "screenshot", "kind": "annotated-screenshot",
"contentType": "image/webp", "byteLength": 59392,
"width": 1024, "height": 1366, "sha256": "9c4a…f21e" },
{ "partName": "replay", "kind": "session-replay", "format": "rrweb",
"contentType": "application/json", "byteLength": 19456,
"durationMs": 30000, "sha256": "e1b7…03c9" }
]
} Field names follow the envelope reference; the arrays are emptied here, a real report carries every crumb, line and request (41, 14 and 22 in this one). Replay and request bodies appear only when enabled for the app. The webhook wrapper around it is documented separately.
Same envelope on every platform. One row differs.
Five SDKs write the same schema, so triage rules, webhooks and prompts do not change when the platform does. Replay is the one capability with a different mechanism on native.
Unattended reports cover uncaught exceptions and, on web, unhandled rejections; native signal crashes and ANRs are not shipped yet. TV apps — tvOS, Android TV, Fire TV and the rest — use the iOS, Android or React Native SDK; the capture set is the same. Per-SDK detail: web, React, React Native, iOS, Android.
Masked before it is sent. Nothing sent until someone reports.
One signed POST to your endpoint.
HMAC-SHA256, Stripe-style. Retried for four days and logged attempt by attempt. Or work from the dashboard, or both.
With triage on, a model reads every report. An agent can fix it. A person decides.
Sessions, not only the reported ones. In beta.
Ship better, faster.
Start free — 1,000 monthly active installs and unlimited reports, no card required. Upgrade to Starter at $19/mo when you go to production. Read the protocol, drop in the SDK, file your first signed report in under five minutes.
