API keys and scopes

Every partner key carries a set of scopes (permissions) following the least-privilege principle. An agent endpoint requires a specific scope: if the key doesn't have it, the call returns 403 FORBIDDEN. You choose scopes when creating a key in the partner portal.

Scope catalog

This is the full list of scopes a partner can assign to a key (in resource → action order). The endpoint rejects the call if the key is missing the listed scope.

ScopeWhat it allows
invoice:readRead invoices (list, detail), Peppol statuses/received documents, and vehicles: GET /agent/invoices, /agent/invoices/{id}, /agent/peppol/status, /agent/peppol/received, and the whole /agent/vehicles/* group (list, detail, by-plate).
invoice:createIssue an invoice: POST /agent/invoices.
invoice:updateEdit an invoice's content (PATCH /agent/invoices/{id}: items, dates, notes; camelCase payload), change its status (PATCH /agent/invoices/{id}/status) and manage attachments: add/remove (POST/DELETE /agent/invoices/{id}/attachments).
invoice:sendSend over Peppol (POST /agent/peppol/send, /send/batch), Peppol enroll, reminders, and POST /agent/organizations/{id}/peppol-claim (resend the Financial Administration confirmation).
invoice:downloadDownload an invoice's PDF and XML: GET /agent/invoices/{id}/pdf, /agent/invoices/{id}/xml.
contact:readRead customers (list, detail): GET /agent/customers.
contact:createCreate a customer: POST /agent/customers.
receipt:readRead received documents / vendors (list, detail, stats, QR): GET /agent/expenses, /agent/vendors.
receipt:createUpload a received document and create a vendor: POST /agent/expenses/upload, /agent/vendors.
receipt:updateEdit / reclassify a received document, including bulk operations (bulk).
receipt:approveApprove a received document.
contract:readRead contracts: GET /agent/contracts, detail, payment schedule, linked invoices, stats, and attachment downloads.
contract:createCreate a contract (POST /agent/contracts) and AI extraction from PDF (POST /agent/contracts/extract).
contract:updateEdit a contract and its payments (PATCH /agent/contracts/{id}, PATCH /agent/contracts/payments/{paymentId}), extend the schedule, and upload/delete attachments.
contract:deleteDelete a contract: DELETE /agent/contracts/{id}.
report:readRead reports / dashboard summary: GET /agent/dashboard/summary.
org:provisionCreate a client organization (POST /agent/organizations) and send the Financial Administration activation token (POST /agent/organizations/{id}/activation-token).

Default scope set

A newly created partner key (via admin "partner registration" or self-service in the portal) gets read + create across the agent surface. By default that's:

invoice:read
invoice:create
invoice:update
invoice:send
contact:read
contact:create
receipt:read
report:read
contract:read
contract:create
contract:update
org:provision

What to watch out for

The default key does not have invoice:download or contract:delete. If you need to download invoice PDF/XML or delete contracts, request these scopes when creating the key. Otherwise these calls return 403 FORBIDDEN. Keys created before contracts were introduced (August 2026) carry no contract scopes: create a new key.
POST /agent/organizations/{id}/peppol-claim requires invoice:send, not org:provision. It only (re)sends the confirmation email for an org the key already owns; it does not create an organization. Details in Production onboarding.

Treat a scope 403 as a configuration error: regenerate the key with the correct scope set, don't retry the call in a loop. More in Error codes.