Validation and quarantine
Two different things can go wrong with a request, and they are told apart on purpose.
Refused: nothing is stored
A 4xx on the whole batch. It concerns the key, the owner or the request, never the content of one activity: a missing or revoked key (401), a browser key on an endpoint it may not use (403), a body over 500 KB (413), the key's rate limit (429 with Retry-After), an activity the key class may not send or that names no valid owner (400), a body that is not a batch of activities (400). The sender fixes the request and retries. A 503 means the log could not take the batch; retry.
Quarantined: stored, with a reason
A 202 means every activity in the batch is durably stored. An activity that is well-formed enough to attribute to an owner but fails validation is quarantined rather than refused, so that a sender never retries something that fails every time. It is kept for 30 days with its reason and can be replayed after the cause is fixed (a schema that was missing a field, a draft activity turned active).
| Reason | Meaning |
|---|---|
malformed | Not an activity: no name, no id, an unparseable time, features that cannot be encoded. |
unregistered | The name is not in the catalogue, for this owner. |
draft | The activity exists but is still a draft; its events are collected here so the schema can be tested. |
retired | The activity was retired; its name is never reused. |
schema_mismatch | Strict mode: an undeclared key, a wrong type, a missing required key, or a declared key of the wrong type in open mode. The detail names the key. |
money_in_features | A money-like key in features. Money goes in the revenue block (revenue). |
payload_too_large | An open activity's features over their cap. |
revenue_not_allowed | A revenue block on an activity that is not revenue-bearing, or from a browser key. |
revenue_malformed | A number instead of a decimal string, more than four decimals, an unknown currency, the wrong sign. |
unparseable_identifier | An identifier that cannot be normalised. The detail names the type, never the value. |
key_class_not_allowed | The key's class may not send this activity (a 400 when sent directly; a quarantine when a tracking call became it). |
Dropped values that do not quarantine the activity are counted with a cause: an attribute that is not a plausible instance of its attribute, a value that looks like an identifier in an undeclared field, a geo block from a browser key, a placeholder phone number (placeholder_identifier: seven or more of one digit or consecutive digits in a row, such as 06 12345678, typed to get past a required field; the activity keeps its other identifiers), an identifier whose key is longer than the identity tables can hold (identifier_too_long: 80 characters by default; the activity keeps its other identifiers).
Seeing the verdicts
Send "debug": true with the batch and the answer lists, per activity, the verdict (accepted or quarantined), the reason and detail, the schema version it was checked against, and observed when the key is in observe mode. For tracking calls the answer also says which activities each call became, or why it became none. The forms on this site send with debug on.
Observe mode
A key being onboarded can be put in observe mode: non-conforming activities are stored and flagged instead of quarantined, kept out of the CRM's views, so a new site can be watched before it is held to the schema. It expires after 14 days.