Skip to main content
err:unkey:authentication:portal_token_missing
Example

What Happened?

This error occurs when a request was made to an endpoint that requires a Customer Portal session, but no access token was supplied. Portal-authenticated endpoints expect either:
  • An httpOnly session cookie set by the portal after a successful code exchange, or
  • An Authorization: Bearer <portal-access-token> header on direct API calls from a browser session.
Common causes include:
  • The user’s browser has cookies disabled or blocked for the portal domain.
  • The session was never established: the user landed on the portal without going through POST /v2/portal.exchangeCode.
  • A backend integration is calling a portal-only endpoint with a root key instead of a portal access token.
  • The session cookie was cleared or the user opened the portal in a private/incognito window with stripped state.

How To Fix

Make sure the user has an active portal session before calling portal endpoints:
  1. From your backend, call POST /v2/portal.createSession with your root key.
  2. Redirect the user to the returned url. The portal will redeem the code it carries for a 24-hour access token.
  3. Subsequent requests from the browser must include the portal session cookie or access token.
If you are calling the portal API directly from JavaScript, ensure your fetch includes credentials so the session cookie is sent:

Common Mistakes

  • Calling portal endpoints with a root key: Root keys authenticate backend requests, not portal endpoints. Use a portal session.
  • Sending the id instead of the access token: portal.createSession returns a non-secret id. It identifies the session but does not authenticate it.
  • Missing credentials: "include": Cross-origin browser requests omit cookies by default.
  • Expired session not refreshed: After 24 hours the access token expires, so your backend must create a new session.
  • Direct navigation to the portal: Users must arrive via your backend redirect, not by visiting the portal URL directly.
Last modified on August 19, 2026