PRE-GEN

Refusal codes

17 core codes, 38 at the origin registry · policy version 2026-09-22 · generated from the specification

Core codes are used by every registry with this meaning (spec §3). The rest are the origin registry’s own (PRAMPTA); another registry’s own codes carry its issuer prefix, PG_<ISSUER>_….

Every decision from POST /v1/verify/ carries a reason. A hard code means no retry, reshaped request or new licence changes the answer. A soft code means a different request, a valid licence or a different provider might succeed. An unknown code must be treated as hard.

Two codes are not refusals: PG_STD_TRACKING_ONLY comes with not_blocked (personal use, nothing granted) and PG_ORG_INTERNAL_USE with allow.

CodeCoreCategoryTypeSinceMeaning
PG_MISSING_PROMPT_HASHcorerequestsoft2025-01-01The request did not include a prompt_hash to bind the decision to.
PG_ENTITLEMENT_INACTIVEidentityhard2025-06-01The purchase (entitlement) backing this request is no longer active — reversed or expired.
PG_IDENTITY_MISMATCHidentitysoft2026-07-26The licence belongs to a different end user than the one the caller is acting for — cross-user reuse. Also raised when a request supplies both a link id and a provider user id that describe different people.
PG_IDENTITY_REQUIREDidentitysoft2026-07-26The licence is bound to a specific end user, and REQUIRE_PROVIDER_USER_BINDING is on, so the caller must say which user it is acting for. Supply provider_user_id or provider_identity_link_id.
PG_IDENTITY_REVOKEDidentityhard2025-06-01The provider disowned this end user's identity link (Identity v2 §7).
PG_IDENTITY_UNKNOWNidentitysoft2026-07-26The caller asserted an end-user identity that does not resolve to any live identity link for this provider — the user has not completed the PRAMPTA connect flow, or the link was deleted.
PG_NO_PAIRcoreidentitysoft2025-01-01No live provider↔licensee pair authorizes this caller.
PG_PROVIDER_NOT_ALLOWEDidentitysoft2025-06-01This license's allow/block list excludes the calling provider.
PG_INSUFFICIENT_AUTHORITYsubject trustsoft2025-10-01The subject's authority/verification tier does not meet the bar this request needs.
PG_NO_SUBJECTcoresubject trustsoft2025-01-01No registered subject matches subject_id. Not a prohibition: this registry knows nothing about the subject, so the provider decides under its own policy and must not present the output as licensed (spec P-5).
PG_OWNER_NOT_VERIFIEDsubject trustsoft2026-08-19Commercial use also requires the subject's owning account itself to be verified (identity-verified user, or domain/kyc-tier organization) — the subject alone reaching commercial_enabled is not sufficient.
PG_PROHIBITED_USEcoresubject trusthard2026-06-01A permanently-denied use for a high-risk subject (16.9) — e.g. a sexualized category for a minor.
PG_PROVIDER_VETOEDsubject trusthard2025-07-01The rights holder blocked this specific provider — no license changes that.
PG_REFERENCE_ONLYsubject trusthard2025-01-01The subject is registered as reference-only and never licenses.
PG_SANDBOX_SUBJECT_ONLYsubject trusthard2025-08-01A sandbox (Tier 1) provider credential may only verify against synthetic test subjects.
PG_SUBJECT_DISPUTEDcoresubject trusthard2025-09-01A dispute is open on this subject (A5, §9) — licensing is frozen pending outcome.
PG_SUBJECT_NOT_LICENSABLEsubject trusthard2025-10-01The subject's trust-lifecycle state (suspended/disputed/revoked/archived) permits no licensing at all.
PG_SUBJECT_OPTED_OUTcoresubject trusthard2025-01-01The subject's rules_text refuses this request's category outright.
PG_SUBJECT_PAUSEDcoresubject trustsoft2025-01-01The subject's owner temporarily paused licensing.
PG_SUBJECT_PENDINGcoresubject trustsoft2025-01-01The subject is awaiting operator review before it may license at all (reserved/high-profile name).
PG_SUBJECT_WITHDRAWNcoresubject trusthard2025-01-01The subject was withdrawn by its owner or on moderation takedown.
PG_CONCURRENCY_LIMITlicensesoft2025-05-01The license's concurrent in-flight generation cap is reached.
PG_EXTENSION_REFUSEDlicensesoft2025-05-01A license extension (e.g. a region rider) evaluated and refused this request.
PG_IMMUTABLE_DENIALcorelicensehard2025-01-01The request's declared category matches one of the license's immutable (never-grantable) denials.
PG_INVALID_SIGNATUREcorelicensehard2025-01-01A license was found but its signature does not verify.
PG_LICENSE_REVOKEDcorelicensehard2025-09-15A live revocation (full or partial — this provider/modality/channel/region) withdraws this license (A7).
PG_MISSING_CONTEXTlicensesoft2025-04-01The license restricts a dimension (modality/channel/territory/use case) and the request omitted it — fail-closed rather than let an omission bypass a restriction.
PG_NO_LICENSEcorelicensesoft2025-01-01No valid, live license authorizes this licensee for this subject.
PG_PRODUCT_MISMATCHlicensesoft2025-04-01The license is bound to a specific product and this request names a different one.
PG_PROJECT_MISMATCHlicensesoft2025-04-01The license is bound to a specific project and this request names a different one.
PG_REGION_BLOCKEDlicensesoft2025-06-01The request's territory falls outside the license's allowed regions (Identity v2 scope).
PG_RIGHTS_NOT_GRANTEDlicensesoft2026-06-01The request exercises a rights dimension (16.8 — e.g. model_training) the license never granted.
PG_SCOPE_VIOLATIONcorelicensesoft2025-01-01The request's modality, channel, or territory falls outside what the license scopes.
PG_TIER_VIOLATIONlicensesoft2025-05-01The declared use case ranks above what this license's tier authorizes.
PG_USAGE_LIMITcorelicensesoft2025-05-01The license's purchased quantity (max_uses) is exhausted.
PG_ORG_INTERNAL_USEgrantsoft2026-09-25ALLOWED without a licence: the connected user is an owner, admin or creator of the organization that itself holds this character, brand or work (never a person's likeness or voice). Ends when they leave the organization or lose the role. core/authz.py::org_internal_user.
PG_HELD_FOR_REVIEWcorereviewsoft2026-07-24A commercial generation of a high-risk subject that would otherwise be ALLOWED is held for a human (opt-in, REVIEW_HIGH_RISK_COMMERCIAL).
PG_STD_TRACKING_ONLYcoretrackingsoft2026-09-21Personal use with no licence: the fixed floor (opt-out, status, minors, scope, deny) passed, so PRAMPTA does not block it — but grants nothing. disposition=not_blocked.

A correct client stops on hard codes and reacts to soft ones: offer a licence request, show “buy more”, back off on concurrency. Retrying a withdrawn subject forever is the canonical wrong behaviour.