Spectodocs

Troubleshooting

No sessions arriving? Three questions find almost every cause, in this order.

1. Is the SDK on the page?

Open your site with the browser's developer tools → Network and reload. You should see specto.js load (script tag) and a request to /api/sdk/config.

• specto.js is missing or blocked — some ad and tracker blockers block session-replay scripts. Test in a clean browser profile; for real visitors, the npm package (bundled into your own code) or a self-hosted instance on your own domain avoids most blocking.

• A Content-Security-Policy error in the console — see Content Security Policy.

• /api/sdk/config answers 404 with unknown key — the key is wrong or was rotated; copy it again from Settings → General.

2. Is it recording?

In the console:

Specto.session            // undefined → nothing is recording on this page
Specto.session?.sessionId // the session being recorded

With the npm package, rec.disabled and rec.reason say why. When nothing records, check in this order:

ReasonHow to tellWhat to do
Do-Not-Track or Global Privacy Controlnavigator.globalPrivacyControlBy design these visitors are never recorded. Some browsers (Brave, for example) send GPC by default — test in another one.
Opted outlocalStorage.getItem('specto-optout')Specto.optIn(), or clear the site's storage.
Consent mode, no consent yetdata-consent="required" and no specto-consent in localStorageYour banner must call Specto.consent(true) — see Consent banners.
Not sampledreason: 'not-sampled'; a sample rate below 1 in the tag or in Settings → PrivacyEach session is sampled once. Open a new tab to roll again, or raise the rate.
Recording switched offSettings → Privacy, the project's recording switchSwitch it back on.

3. What does ingest answer?

In Network, open a request to /api/ingest. Errors come back as JSON with a code:

StatuscodeMeaning and fix
401unauthorizedUnknown publishable key — wrong project, or the key was rotated. Update the snippet.
403origin_not_allowedThe page's origin isn't in Settings → General → Allowed origins. It must match exactly: scheme, host and port (https://www.example.com ≠ https://example.com).
403recording_disabledRecording is switched off for the project (Settings → Privacy).
403suspendedThe organization is suspended — contact support.
429quota_exceededThe monthly sessions of the plan are used up. Sessions already in progress keep recording; upgrade, or turn on overage (Settings → Plan & billing).
429rate_limitedMore uploads per second than the plan allows. The SDK backs off and retries; if it persists, lower the sample rate or upgrade.
429session_limitOne session reached its event limit (250,000 by default). The next session records normally.
413payload_too_largeA batch over 2 MB. The SDK keeps batches far smaller, so something in between is usually changing the request.
503overloadedThe instance is busy. The SDK retries with backoff — nothing is lost while its buffer lasts.
400bad_json, bad_request, bad_session_idThe request was altered on the way (a proxy or firewall rewriting bodies), or a custom integration sends the wrong shape.

Still nothing in the dashboard?

• Sessions show up after their first upload, a few seconds in. Settings → Install says whether the project has received any.

• Check the project switcher: the snippet's key belongs to one project.

• Retries, rate limits and the 503 backoff can delay a session by up to a minute.

Replays look wrong

• Unstyled pages — stylesheets the recorder can't read (cross-origin without CORS) are loaded again when you watch, so they must still be reachable from your browser.

• Empty boxes — canvas drawings and cross-origin iframes aren't recorded; elements with specto-block are left out on purpose.

Anything else: the SDK reference and the privacy controls cover what is captured and how.