Skip to content

Scopes and role tiers

Scopes and role tiers

A connection's effective permission is the intersection of the scopes it was granted, the granting member's live role, and the app's own capability flags (spec §4.1 step 4) — checked on every request, never cached from token issuance.

Scope Description Minimum granting role tier
accounts:read Read chart of accounts ADMIN, ADVISER, EDITOR, OWNER, VIEWER
bills:read Read bills ADMIN, ADVISER, EDITOR, OWNER, VIEWER
bills:write Create and update bills ADMIN, EDITOR, OWNER
contacts:read Read suppliers and customers ADMIN, ADVISER, EDITOR, OWNER, VIEWER
credit_notes:read Read credit notes ADMIN, ADVISER, EDITOR, OWNER, VIEWER
credit_notes:write Push parsed credit notes ADMIN, EDITOR, OWNER
invoices:read Read sales invoices ADMIN, ADVISER, EDITOR, OWNER, VIEWER
invoices:write Push parsed sales invoices ADMIN, EDITOR, OWNER
migration:read Read migration batches and reference data ADMIN, OWNER
migration:write Submit and roll back migration batches ADMIN, OWNER
payroll:read Read pay-runs ADMIN, OWNER
payroll:write Post pay-runs and corrections ADMIN, OWNER
tax_rates:read Read tax rate configuration ADMIN, ADVISER, EDITOR, OWNER, VIEWER
webhooks:manage Manage webhook subscriptions org (still requires org selection during consent)

Verified-only by default (staff-editable, developer.verified_only_scopes): payroll:read, payroll:write.

Restricted-capability scopes (webhooks:manage, migration:read, migration:write) additionally require the app to carry the matching can_use_webhooks/can_use_migration_api flag — shown in the portal and the docs as Restricted — by arrangement.

Naming convention — documented once

Scope strings use resource:verb (bills:read, invoices:write). API URL paths use hyphenated plural nouns (/api/v1/orgs/{org_id}/credit-notes). These are two independent, deliberately different conventions — a scope string is never a literal fragment of a URL path, and this is the one place that's spelled out; nothing else in these docs restates it.

Verified-only scopes can change without notice

Which scopes are verified-only is a staff-editable runtime setting (developer.verified_only_scopes), not a fixed list — a scope can move in or out of verified-only status at any time, without a version bump. This has a live effect, not just a consent-time one: for an unverified app, the effective scope set is recomputed on every request, and a verified-only scope is subtracted from it every time — existing access tokens that already carry the scope lose it on their very next call and start getting insufficient_scope 403s, with no separate revocation or re-consent step. Removing the scope from the verified-only setting restores it live, the same way. Verified apps are never affected by this setting. There's no contractual guarantee such a change is announced ahead of time; changes may be noted in the changelog, but don't assume today's verified-only set (above) is stable.

Restricted capabilities

Scopes marked Restricted — by arrangement above additionally require your app to carry a matching capability flag before they can be requested at consent or used on a request — this is separate from, and checked in addition to, the scope/role-tier table. To request access, use Verification in My Apps (https://<your LuciBook host>/developer/apps/<client_id>/verification/).