Skip to content
P

Error codes

Every error response uses the envelope { "error": { "code", "message", "details"? } }. code is a stable, machine-checked identifier — branch on it, not on message (which is a human sentence and may change). Every response also carries an X-Request-ID header; include it when reporting an issue. The most common cross-cutting codes:

CodeHTTPWhen it occurs
VALIDATION_ERROR422Request body or query params failed Zod validation; details lists the offending paths.
TARGET_NOT_OWNED422A link or scope names a product, entity or asset that belongs to another organisation (for example one a supplier shares through a grant). Only your own records can be linked.
COMPLIANCE_JUSTIFICATION_REQUIRED422Publishing a food product with mandatory EU FIC particulars missing, without a justification. details lists each missing field and locale; complete them, or publish again with a justification of at least 10 characters (granted buyers see it).
REVISION_CHANGED409A save sent If-Match with an editToken that is no longer current: someone else changed the product or its draft since you opened it. Reload, then save again.
REVISION_OPEN409Publishing an archived product that has an unpublished draft through POST /products/{id}/publish or PATCH status=published. Publish the draft (POST /products/{id}/revision/publish) instead — its gates then run on what goes live.
REVISION_BASE_CHANGED409Publishing a draft whose fields were also changed on the published product since the draft started. details names each field; discard the draft or redo those fields.
REVISION_EMPTY422Publishing a draft that no longer differs from the published product.
GTIN_CLAIMED409Publishing a Digital Product Passport for a GTIN another organisation (or another of your products) already holds on the public GS1 resolver. Contact support to have a GTIN transferred.
EMAIL_TAKEN409Changing a sign-in email to an address another account already uses.
EMAIL_SUPPRESSED422The new sign-in address is on the delivery-suppression list after earlier bounces; a platform admin can release it.
EMAIL_SSO_MANAGED422The account, or the old or new address’s domain, signs in through single sign-on, so the identity provider owns the email.
EMAIL_CHANGE_LOCKED409An email change on this account was undone in the last 24 hours, so a new one cannot be started yet.
SESSION_REVOKED401The token was issued before the account was signed out everywhere (its sign-in email changed or was reverted). Sign in again.
UNAUTHORIZED401No valid credential (missing/expired JWT or API key).
INVALID_CREDENTIALS401Login failed — email/password did not match.
ROLE_CHANGED401The session token was issued before the user’s role or organisation changed. Sign in again to get a token that matches.
INVALID_TOKEN401A one-time or scoped token (invite, verify, onboarding, refresh) is malformed, expired, or already used.
FORBIDDEN403Authenticated, but the principal’s role lacks permission for this action (RBAC).
NOT_FOUND404The resource does not exist, or is not visible to the caller under row-level security.
CONFLICT409The request conflicts with current state (e.g. a duplicate unique value).
INVALID_STATE422The target is not in a state that permits this transition.
RATE_LIMITED429The per-plan sliding-window rate limit was exceeded; see the Retry-After header.
ENTITLEMENT_EXCEEDED422A plan ceiling (products, seats, storage) is already at its limit; details names the entitlement. Only returned when entitlement enforcement is enabled.
PLAN_UPGRADE_REQUIRED402The requested capability is not included in the organisation's plan; details names the entitlement. Only returned when entitlement enforcement is enabled.
GONE410The resource once existed but has been withdrawn or offboarded.
ORG_SUSPENDED403The organisation is suspended — reads and DSAR export stay open, mutations are frozen.
INTERNAL_ERROR500An unexpected server error; internals are never leaked to the client.
SANDBOX_READONLY403A sandbox API key attempted a mutating request; sandbox keys are read-only.
INSUFFICIENT_SCOPE403The API key lacks the *:read/*:write scope this verb requires.
SELECTION_TOO_LARGE422A bulk selection (e.g. enrichment ids) exceeds the per-job cap.
CONDITION_NOT_MET422A workflow transition’s data condition evaluated false (fail-closed).
QUALITY_EVALUATION_TOO_EXPENSIVE422A blocking quality profile’s regex() rules exceeded the time budget for one evaluation, so a mandatory rule could not be decided (publish gate, onboarding approve). Simplify the regex rules.
TRANSFORM_FAILED422An onboarding mapping transform failed; approve is all-or-nothing with row-addressed details.
GLN_INVALID422A supplied GLN failed check-digit or ownership validation.
UNKNOWN_FRAMEWORK400A compliance framework code is not registered.
GDSN_NO_CONNECTION400A GDSN publish was attempted with no active data-pool connection.
SSO_FAILED401The SAML/OIDC assertion could not be validated or mapped to an org connection.