/v1/buyer/* directly with the bounded
buyer bearer. The browser SDK does this for you; this page is
the contract it relies on, for when you call the API yourself or need to debug a
refusal.
What the origin decides, and what it does not
An origin is never evidence of buyer authority. Alyte checks session provenance, any live merchant-attestation capability and the existing permission server-side. Browser origin checks decide which pages may read a response. Two consequences:- An ordinary bounded bearer gets exactly the same answers from your page as from anywhere
else: it can act inside permission the buyer already granted and is refused
(
403 step_up_required) when it tries to create or widen authority. - Sign-in and verification never happen on your origin. Those routes are refused to every partner origin; they run inside Alyte’s own pages and consent view.
Access-Control-Allow-Credentials, and a request without Authorization: Bearer …
is refused with 401.
Preflight
OPTIONS /v1/buyer/* succeeds (204) only when all of these hold:
The response allows exactly that origin, those methods and headers, and is cached
for 30 seconds (
Access-Control-Max-Age: 30). Anything else is 403. A newly
registered origin can take up to 30 seconds to be accepted.
Actual requests
Evaluated in this order, before any handler runs:
Registering an origin on shop A does not let that page use a bearer minted for
shop B.
The exchange endpoint
400 validation_error. The
token is single-use: the exchange and the redeem link share one atomic claim, so a
token can never yield both a bearer and a cookie session.
Which routes an ordinary bounded bearer may call
The table below covers sessions without the separately enabled merchant-attestation exception. Attestation permits specific creation routes within staff-set ceilings; it does not widen the browser’s allowed methods or origin policy. Planned emailed-consent routes are
All paths are under
/v1/buyer.
Limits that matter in a browser
A
429 carries retryAfter in seconds and the Retry-After header, which these
responses expose to your page.
Troubleshooting
consent_unavailablefrom the SDK, or a blank frame. The page’s origin is not in the shop’sembedOrigin(the frame is blocked byframe-ancestors), or the registration is younger than 30 seconds. Check the exact origin: scheme, host and port, no path.- Every call answers
403. The origin is registered, but on a different shop than the bearer’s; or the origin ishttpoutside localhost. 401 link_invalidon exchange. The token was already consumed — most often because the page also navigated the redeem link — or it is older than 15 minutes.- A
401 unauthorizedafter it worked. The bearer expired. Mint and exchange again; the buyer’s agents and permissions are unchanged.

