Skip to content
The reference

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.

A real report

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.

What each SDK captures

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.

WebReactReact NativeiOSAndroid
Screenshot with annotations, masked on the device yes yes yes yes yes
Session replay, rolling buffer, enabled per app, nothing sent until a report DOM · rrweb DOM · rrweb native wireframe native wireframe native wireframe
Console, last 100 lines yes yes native logs yes yes
Network requests yes yes no JS capture yet opt-in opt-in
Network bodies, enabled per app in the dashboard yes yes no yes yes
Breadcrumbs and screen tracking yes yes yes yes yes
Focused component, resolved to a real name element component no no no
Unattended reports from uncaught errors errors + rejections errors + rejections JS errors uncaught exceptions uncaught exceptions
Sensitive regions and redaction engine yes yes yes yes yes
Two-way replies to the reporter, in-app yes yes no no no
Reporter trigger hotkey · your button hotkey · your button your button your button your button
Session Vitals — playback health, memory, responsiveness (beta, not yet generally available) beta beta planned planned planned

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.

What stays on the device

Masked before it is sent. Nothing sent until someone reports.

Mark a field sensitive; its pixels are blacked out in the screenshot before it leaves the device. Card numbers are caught by Luhn, so order ids survive. Replay and logs live in a rolling buffer until a report freezes it.
Delivery

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.

Triage and agents

With triage on, a model reads every report. An agent can fix it. A person decides.

When AI triage is on for the project: a suggested priority with its confidence. You accept or dismiss.
Ask across the project. Answers cite the board cards they came from.
Sandboxed agent on an isolated checkout with a read-only token; the pull request is opened for you.
Sessions beta

Sessions, not only the reported ones. In beta.

Sampled playback health, memory and responsiveness per session, always on once enabled. Off by default. Opt in per app, sample rate set from the server. Reports carry the session id; the Sessions view pictured is the next step, not shipped yet. Web and React first; iOS, Android and TV natives follow on the same protocol.
Shipping today

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.

Unlimited seats15 min to first reportNo credit card