Skip to content

Scopes

Scopes are the permissions a business grants your app on the consent screen. They are enforced per endpoint, deny-by-default: every API route declares the scopes it requires, and a token without them gets a 403. You cannot escalate a live token — to add scopes, send the user through authorization again with the wider scope value. Scopes bound what an app may request; some operations additionally require the consenting user’s business role — see Errors.

Request the minimum set your integration needs. The business sees every requested scope by name on the consent screen; over-asking costs you conversions and slows down review.

:read grants view access, :write grants create/modify. This is the same registry the console’s scope picker uses (also served at GET https://api.getonebooks.com/developer/scopes).

ScopeGrants
profile:readView your profile information
ScopeGrants
invoices:readView invoices
invoices:writeCreate and modify invoices
customers:readView customers
customers:writeCreate and modify customers
quotes:readView quotes
quotes:writeCreate and modify quotes
sales-returns:readView sales returns (credit notes)
sales-returns:writeCreate and modify sales returns
payments:readView customer payments
payments:writeRecord customer payments
ScopeGrants
suppliers:readView suppliers
suppliers:writeCreate and modify suppliers
purchases:readView purchase orders / bills
purchases:writeCreate and modify purchases
purchase-returns:readView purchase returns (debit notes)
purchase-returns:writeCreate and modify purchase returns
supplier-payments:readView supplier payments
supplier-payments:writeRecord supplier payments
expenses:readView expenses
expenses:writeRecord expenses
ScopeGrants
journal:readView journal entries
journal:writeCreate journal entries
accounts:readView chart of accounts
accounts:writeCreate and modify accounts
contra:readView contra vouchers (cash/bank transfers)
contra:writeCreate contra vouchers
fiscal-year:readView fiscal year and close status
fiscal-year:writeLock or unlock fiscal years
ScopeGrants
bank-recon:readView bank statements and reconciliations
bank-recon:writeUpload statements and match transactions
ScopeGrants
items:readView items catalog
items:writeCreate and modify items
ScopeGrants
reports:readView financial reports (P&L, Balance Sheet, etc.)
gstr:readView and export GSTR-1 / GSTR-3B (India)
ScopeGrants
app-data:readRead this app’s own data stored on your records
app-data:writeStore this app’s own data on your records
events:readRead the event log (what changed, and when)

The Grants column is the registry’s own wording — it’s written to the merchant, which is why it says “your records”. app-data:* never exposes another app’s fields — your namespace is always derived from the token itself; see App data. events:read unlocks the Events API; each event in it is still filtered by that event’s own read scope (see the Event catalog).

Every OneBooks plan — Free included — includes the OAuth API, webhooks and MCP. The merchant’s plan never decides whether your app can connect or call a route, so there is nothing to check during onboarding: scope and permission are the only two gates between a token and a 200. That holds for every app-platform capability too — embedded apps, app data, hosted functions and the marketplace are not gated by the merchant’s plan either.

What a plan does bound is volume, and only on invoice creation:

PlanNew invoices
FreeUp to a yearly invoice count and an annual turnover ceiling, both set per country
StandardUp to a yearly invoice limit
ProfessionalUp to a higher yearly invoice limit
PremiumUnlimited

A POST /invoices past the ceiling returns 403 with a message naming the limit — whichever door the request came through, the app, your integration or an AI client. Nothing else changes: reads, payments against existing invoices and every other route keep working. Treat that 403 as “the merchant needs to pick a plan”, show them the message, and don’t retry.

You can edit your app’s registered scope set in the console at any time, but:

  • Widening the scopes of an approved app resets its review status to CHANGES_REQUESTED — it drops out of general availability until re-approved. Narrowing (or keeping the set identical) does not. See Go live.
  • Existing consents are unchanged; each business’s grant stays at whatever it approved. To use a new scope with an existing business, re-run authorization with the wider scope request.

Scopes also gate webhooks: an event is only delivered if your app holds the event’s gating scope and the business’s installation of your app includes it — checked when the event is matched and again just before each delivery is sent.