Troubleshooting: Browser Events Get 403 / "Origin not allowed"
This happens when a browser request's Origin header doesn't match any domain verified for
the workspace. Server-to-server requests are unaffected - they don't send an Origin
header, so this only applies to requests made directly from a page (the JavaScript SDK, or a manual
fetch/XHR call).
How Origin Matching Works
For every browser request, the API checks the Origin header against the workspace's list
of verified domains (AllowedOrigins, built from verified rows in
workspace_domains). An origin is allowed if any of the following match:
-
Exact match - the origin's host is identical to a verified domain
(
https://axi.yourdomain.commatches a verifiedaxi.yourdomain.com). -
Same registrable domain (eTLD+1) -
added 2026-08-05 - the origin and the verified domain share the same
registrable domain per the Public Suffix List. This means verifying
axi.shop.comalso admits the apex (https://shop.com) and any sibling subdomain on the same registrable domain, such ashttps://www.shop.comorhttps://checkout.shop.com- even though neither of those was individually verified. This does not cross registrable-domain boundaries: verifyingaxi.shop.com.pldoes not admithttps://other.com.pl, because eTLD+1 for a multi-part public suffix likecom.plis computed correctly, not by naively dropping the first label. -
Explicit wildcard - if a verified domain is stored as
*.example.com, any subdomain ofexample.commatches.
The eTLD+1 rule above does not apply to IP addresses. An origin like
http://203.0.113.10 can only pass via the exact-match rule - there is no such thing as
a "registrable domain" for an IP literal, and IP-literal origins never match a wildcard or
sibling-subdomain rule.
Server-to-Server Calls Are Always Allowed
A request without an Origin header - which is how server-to-server calls (curl, backend
HTTP clients, webhooks) normally work - is always allowed through the CORS check. This
check exists specifically to constrain browser requests; it has no bearing on
/v1/* calls authenticated with your Secret Key via Basic Auth. If you're getting a
"403 Origin not allowed" from a server-side integration, the cause is something else (check
your HTTP client isn't setting an Origin header, which some do by default) - see
HTTP API for the correct server-side request shape.
Fixing It
- Go to Workspace settings → Tracking & domains and confirm the domain the page is served from - not just your tracking subdomain - is added and shows Verified.
-
If the page is served from a different subdomain than the one you verified (e.g. you verified
axi.shop.combut the storefront is oncheckout.shop.com), no action is needed as of 2026-08-05 as long as both share the same registrable domain - the sibling-subdomain rule above covers it automatically. - If the storefront domain does not share a registrable domain with any verified domain (e.g. a separate checkout domain on a different TLD, or a staging environment on an unrelated domain), add and verify that domain explicitly, or ask support about a wildcard entry.
- Confirm the public key used to initialize the SDK belongs to the workspace that has the domain verified - a mismatched public key will look like a CORS failure but is actually an unknown workspace.
Enter domains without the https:// prefix in the admin panel - see
Domain Configuration for the full setup guide,
including DNS verification and post-verification routing/certificate provisioning delays.