Skip to main content
Every capture request returns a JSON body containing a status. Exactly one code describes a request, because the checks stop at the first failure — the first thing that was wrong names the outcome.

The codes

A form submission is never refused for missing consent. A submission is an explicit action by the visitor, and form processing rests on a different lawful basis from analytics consent.

Telling unknown_source apart

One code, several causes. Use the HTTP status and the request to distinguish them.
A refused origin’s 403 carries no CORS headers, so a browser rejects it as a network error and you never see the body. That’s why the script writes a named console warning instead, and why the runtime config endpoint — which answers every origin — exists.

What each one means for your page

The default messages

The script writes these into your status element: A problem the visitor can fix gets that specific message instead — “This field is required.”, “Enter a valid email address.”, and so on.

One status that never comes from the server

The script also reports error when the request itself failed: a network error, a timeout, or a refused origin whose response carried no readable body. That isn’t a server outcome — it means the request didn’t complete.

The pipelines

Knowing the order tells you what a code rules out. Form capture
Event capture
The two mirror each other on purpose, so the surfaces can’t report different codes for the same class of problem. Note that rate_limited on the event side is returned before the consent check, so a throttled request tells you nothing about consent.