Scopes
A key can only call the endpoints its scopes allow. Give each integration the fewest scopes it needs.
How scopes work
- Scopes look like
int:<area>.<resource>:<read|write>, plusint:webhooks:manage. - A
:writescope includes its:read: a key withint:fin.invoices:writecan also list and read invoices. - You choose scopes when you create a key in Settings → API keys. A key's scopes cannot be changed afterwards — create a new key.
int:*grants every scope. It is not offered in the apps; it is needed only to subscribe to the 64 event types that have no read endpoint (compliance, e-invoicing, DATEV, tachograph, dashcam and e-signature) or to every event (["*"]) — ask support.
All scopes
| Scope | Allows |
|---|---|
int:files.documents:readread | GET /v1/documents — List documentsGET /v1/documents/{id} — Retrieve a document |
int:fin.bills:readread | GET /v1/bills — List billsGET /v1/bills/{id} — Retrieve a bill |
int:fin.invoices:readread | GET /v1/invoices — List invoicesGET /v1/invoices/{id} — Retrieve an invoice |
int:fin.invoices:writewrite | POST /v1/invoices — Create a draft invoicePATCH /v1/invoices/{id} — Update a draft invoicePOST /v1/invoices/{id}/void — Void an invoice |
int:fin.payments:readread | GET /v1/payments — List paymentsGET /v1/payments/{id} — Retrieve a payment |
int:fin.purchase_orders:readread | GET /v1/purchase_orders — List purchase ordersGET /v1/purchase_orders/{id} — Retrieve a purchase order |
int:fm.fuel_logs:readread | GET /v1/fuel_logs — List fuel logsGET /v1/fuel_logs/{id} — Retrieve a fuel log |
int:fm.vehicles:readread | GET /v1/vehicles — List vehiclesGET /v1/vehicles/{id} — Retrieve a vehicle |
int:fm.work_orders:readread | GET /v1/work_orders — List work ordersGET /v1/work_orders/{id} — Retrieve a work order |
int:hr.employees:readread | GET /v1/employees — List employeesGET /v1/employees/{id} — Retrieve an employee |
int:hr.leave_requests:readread | GET /v1/leave_requests — List leave requestsGET /v1/leave_requests/{id} — Retrieve a leave request |
int:hr.timesheets:readread | GET /v1/timesheets — List timesheetsGET /v1/timesheets/{id} — Retrieve a timesheet |
int:support.tickets:readread | GET /v1/tickets — List ticketsGET /v1/tickets/{id} — Retrieve a ticket |
int:webhooks:managemanage | GET /v1/webhook_endpoints — List webhook endpointsPOST /v1/webhook_endpoints — Create a webhook endpointGET /v1/webhook_endpoints/{id} — Retrieve a webhook endpointPATCH /v1/webhook_endpoints/{id} — Update a webhook endpointDELETE /v1/webhook_endpoints/{id} — Delete a webhook endpointPOST /v1/webhook_endpoints/{id}/rotate_secret — Rotate the signing secretPOST /v1/webhook_endpoints/{id}/pause — Pause a webhook endpointPOST /v1/webhook_endpoints/{id}/resume — Resume a webhook endpointGET /v1/webhook_endpoints/{id}/deliveries — List deliveries for an endpointPOST /v1/webhook_endpoints/{id}/deliveries/{delivery_id}/replay — Send a delivery againPOST /v1/webhook_endpoints/{id}/deliveries/replay_failed — Send failed deliveries again |
int:identity.users:readwebhooks only |
No endpoint. Subscribing a webhook endpoint to identity.user.created, identity.user.deactivated, identity.user.reactivated
needs it. Settings → API keys does not offer it; a key with int:* covers it — ask support.
|
int:messaging.messages:readwebhooks only |
No endpoint. Subscribing a webhook endpoint to messaging.message.sent
needs it. Settings → API keys does not offer it; a key with int:* covers it — ask support.
|
When a scope is missing
The request is refused with 403 and the scope the key needs:
{
"type": "https://officehero.io/errors/forbidden",
"title": "Forbidden",
"status": 403,
"detail": "The API key does not have the scope required for this endpoint.",
"detail_key": "errors.integrations.missing_scope",
"missing_scope": "int:fin.invoices:write"
} Create a key that includes missing_scope; existing keys cannot be widened.