Skip to main content

Scopes

Availability

The API is GA on production (app.traceable.digital) as of v0.99.6.1. The API returns 503 FEATURE_DISABLED on any environment where it is not enabled. See Availability.

Each API key carries one or more scopes, fixed at key mint time. A request that needs a scope the key does not hold returns 403 FORBIDDEN_SCOPE. Scopes follow least privilege: read is separate from write, gate-read is separate from product-read, withdraw is separate from submit, and supplier-read is separate from product-read.

Grantable scopes

These are the scopes you can grant when minting a key:

ScopeGrants
dpp:readRead products, traceability, components, GS1 prefixes, and document metadata and download URLs
dpp:draft:writeCreate and update drafts, ingest form data, and write traceability, components, and GS1 prefixes
dpp:gate:readRead the publish gate and the readiness report
dpp:submitSubmit a product for review
dpp:withdrawWithdraw a published product (distinct from submit)
document:writeUpload evidence documents
category:readList authorized industries and categories
schema:readRead a category's field schema, schema diff, and product schema-compatibility
supplier:readList owned-or-linked suppliers (distinct from product read)
mapping:readRead ERP field-mappings, lint columns, and fetch the ERP template
mapping:writeCreate, update, and delete ERP field-mappings
webhook:readRead webhook endpoints and their delivery history
webhook:writeCreate, update, delete, and rotate webhook endpoints, and redeliver events

There is no dpp:publish scope and no AI (ai.*) scope. Publication is a human action in the portal, and AI flows are portal-only. See Regulatory boundary.

Privileged scopes

Two scopes sit outside the grantable set above. They are minted only from the Company Portal admin-key dialog, each always in isolation, and cannot be requested through the normal scope picker:

ScopeGrants
keys:adminProgrammatic key management (/api/v1/keys — mint, list, rotate, revoke, IP allow-lists)
gdpr:adminGDPR data-subject endpoints (/api/v1/gdpr/*, live mode only)

See Authentication → Privileged scopes.

Scope required per endpoint

EndpointScope
GET /api/v1/industriescategory:read
GET /api/v1/categoriescategory:read
GET /api/v1/categories/{code}/schemaschema:read
GET /api/v1/categories/{code}/diffschema:read
GET /api/v1/supplierssupplier:read
GET /api/v1/productsdpp:read
POST /api/v1/productsdpp:draft:write
GET /api/v1/products/{id}dpp:read
PATCH /api/v1/products/{id}dpp:draft:write
PUT /api/v1/products/{id}/form-datadpp:draft:write
GET /api/v1/products/{id}/traceabilitydpp:read
POST /api/v1/products/{id}/traceabilitydpp:draft:write
GET /api/v1/products/{id}/componentsdpp:read
POST /api/v1/products/{id}/componentsdpp:draft:write
GET /api/v1/products/{id}/gatedpp:gate:read
GET /api/v1/products/{id}/readinessdpp:gate:read
GET /api/v1/products/{id}/schema-compatibilitydpp:read
POST /api/v1/products/{id}/submitdpp:submit
POST /api/v1/products/{id}/withdrawdpp:withdraw
POST /api/v1/products/{id}/documentsdocument:write
GET /api/v1/products/{id}/documentsdpp:read
GET /api/v1/documents/{id}/downloaddpp:read
GET /api/v1/companies/me/gs1-prefixesdpp:read
POST /api/v1/companies/me/gs1-prefixesdpp:draft:write
GET /api/v1/categories/{code}/diffschema:read
GET /api/v1/erp-mappingsmapping:read
POST /api/v1/erp-mappingsmapping:write
PATCH /api/v1/erp-mappings/{id}mapping:write
DELETE /api/v1/erp-mappings/{id}mapping:write
POST /api/v1/mappings/lintmapping:read
GET /api/v1/categories/{code}/erp-templatemapping:read
GET /api/v1/webhook-endpointswebhook:read
POST /api/v1/webhook-endpointswebhook:write
GET /api/v1/webhook-endpoints/{id}webhook:read
PATCH /api/v1/webhook-endpoints/{id}webhook:write
DELETE /api/v1/webhook-endpoints/{id}webhook:write
POST /api/v1/webhook-endpoints/{id}/rotate-secretwebhook:write
GET /api/v1/webhook-endpoints/{id}/deliverieswebhook:read
POST /api/v1/webhook-deliveries/{id}/redeliverwebhook:write
POST and GET on /api/v1/keys (and /keys/{id}, /rotate, /bulk-revoke)keys:admin (privileged)
/api/v1/gdpr/access, /api/v1/gdpr/erase, /api/v1/gdpr/portabilitygdpr:admin (privileged)

The operational endpoints carry no scope: GET /api/v1/health and GET /api/v1/openapi.json are unauthenticated, and GET /api/v1/meta requires a valid key but no specific scope (it returns only the key's own grants and public constants).

Choosing scopes

Grant only what an integration needs. A read-only sync that mirrors product status into an ERP needs only dpp:read. A full authoring integration needs the discovery scopes (category:read, schema:read), the write scopes (dpp:draft:write, document:write), the gate scope (dpp:gate:read), and dpp:submit. Add dpp:withdraw only to the integration that is allowed to pull a published passport, and supplier:read only where you reference suppliers in traceability. Mint a separate key per integration so a revocation is contained.