Reference
Ingest Responses, Error Codes and Limits
The HTTP responses the AnyReplay ingest service returns — 202, 402, 403, 413, 422 and 429 — with error codes, what the recorders do with each, and limits.
Every SDK sends recordings to the ingest service at https://in.anyreplay.com. You never call it yourself, but its answers explain most "why is nothing recording" questions, and they are visible in the browser's network panel. Every error has the same shape:
{
"error": {
"code": "origin_not_allowed",
"message": "This origin is not on the project’s allow-list."
}
}POST /v1/ingest/events
| Status | Code | Meaning | Recorder |
|---|---|---|---|
202 | — | Chunk accepted. The body includes sessionId and duplicate; a duplicate chunk also carries nextSeq. | Continues. On a duplicate that was not a retry, resends under nextSeq. |
402 | quota_exceeded | The organisation's monthly plan limit is used up. details.limit is sessions or hours. | Stops, and skips recording for two minutes: in this tab (browser SDK), across launches (React Native). |
402 | session_cap_reached | The project reached its monthly session cap. | Stops, and skips recording for two minutes: in this tab (browser SDK), across launches (React Native). |
402 | test_mode_cap_reached | The project is in test mode and has started as many sessions as test mode allows today. The count starts over at midnight UTC. | Stops, and skips recording for two minutes: in this tab (browser SDK), across launches (React Native). |
403 | origin_not_allowed | The request's Origin is not on the project's allowed domains, or there is no Origin and no appId and the project has an allow-list. | Stops for this page. |
403 | app_not_allowed | The request came from an app (no web origin) and its appId is not on the project's allowed apps. | Stops for this launch. |
403 | project_not_accepting | The key is unknown, or the project is paused. Both answer the same, so a key cannot be used to probe which projects exist. | Stops for this page. |
413 | payload_too_large | The chunk is larger than the size limit (512 KB by default). | Sends the events again in smaller chunks and goes on (0.1.4 stopped). A single event too large for any chunk is dropped; a whole-page snapshot that is stops the browser SDK, while React Native drops it and tries the next one. |
422 | invalid_payload | The body does not match the schema; the message lists the fields. | The browser SDK drops that chunk and goes on, stopping after three in a row; React Native stops for this launch. (0.1.4 stopped.) |
429 | rate_limited | Too many requests from this device, for this project key, or from this address. A Retry-After header gives the seconds to wait. | Keeps the events and retries, never before Retry-After, and never stops for it. (0.1.4 counted it as a failure and stopped after five.) |
5xx | internal_error | Something went wrong on the server. | Keeps the events and retries after a wait of 2 s doubling to a minute, or a Retry-After when one is sent, and never stops for it. (0.1.4 stopped after five failures in a row.) |
Limits
| Limit | Value |
|---|---|
| Chunk size | 512 KB (default) |
| Events per chunk | 5,000 (the recorders send 200) |
| Chunk number | 0–100,000 per session |
| Requests per device (project key and visitor id) | 120 per minute (default); a recorder sends 12–30 |
| Requests per project key, all devices together | 12,000 per minute (default) |
| Requests per source address | 6,000 per minute (default) |
| Custom events indexed | 200 per chunk, 5,000 per session |
| Custom event name | 1–64 characters of [A-Za-z0-9_.:-] |
| Custom event properties | 4 KB serialised |
| Session cap | 1–1,000,000 per month |
| Session metadata | URL and referrer up to 2,048 characters, user agent up to 512 |
POST /v1/ingest/identify
| Status | Code | Meaning |
|---|---|---|
200 / 202 | — | { applied: true } when the identity was attached; applied: false (202) when the session was not found yet. |
403 | origin_not_allowed, app_not_allowed, project_not_accepting | As for events. |
422 | invalid_payload | Malformed, or neither userId nor email was given. |
429 | rate_limited | Too many requests from this address for this project key, for the key, or from the address. A Retry-After header gives the seconds to wait. |
Image uploads (apps)
| Status | Code | Meaning |
|---|---|---|
201 / 200 | — | Stored, or already held (duplicate: true). |
403 | asset_quota_exceeded | The project already stores as many images as it may (500 images or 200 MB by default). |
413 | asset_too_large | The image is larger than 3 MB. |
415 | unsupported_asset | Only PNG, JPEG, GIF and WebP are accepted. |
422 | hash_mismatch | The bytes do not match the hash they were sent under. |
Where refusals show up
Refused chunks are recorded as install signals, so the project's setup page can say what happened — for example "One request from https://staging.example.com was refused" with a button to allow that domain, or that the plan limit or session cap was reached. See no sessions arriving.