Scope reference
Every permission, with its risk level.
What is callable today: all
*:readscopes in the endpoint list, plus the write scopesproducts:write,files:write,orders:writeandsubscriptions:write(subscription links). Only scopes explicitly marked (not callable in v1) below are unavailable. The Store scopesstore:read,products:read,products:write,files:write,orders:readandorders:writeare callable in v1 through the routes listed in Endpoints. The callable surface is always the list in Endpoints.
A scope is a single permission. Your app can only touch data a merchant explicitly granted. Scopes are shown on the consent screen with their risk level, so over-asking directly costs you installs — and reviewers compare your scope list against what your app actually does.
Naming
resource:action — e.g. payments:read = "list and view payments".
| Action | Means |
|---|---|
read |
List and retrieve objects. Never changes anything. |
write |
Create and update objects of that resource. |
Risk levels
| Risk | Meaning |
|---|---|
| Low | Read-only, no personal or money-moving data. Approved by default. |
| Medium | Personal data or configuration changes. Needs a clear reason in your listing. |
| High | Moves or reverses money. Written justification at review, extra security checks. |
| Restricted | Financial reporting data. Granted case by case and revocable. |
Catalog
| Scope | What it lets your app do | Typical use case | Risk |
|---|---|---|---|
merchant:read |
Read the merchant profile: name, country, city, VAT number, status, plan | Show whose account you are connected to | Low |
payments:read |
List and view payments | Order sync, reporting, reconciliation | Low |
refunds:read |
View refunds | Returns dashboards | Low |
customers:read |
Read buyer records (personal data). No /customers endpoint in App API v1 — buyer name and email are returned inline on payments, invoices and subscriptions |
CRM sync | Medium |
customers:write |
Create and update buyers (not callable in v1; no /customers route exists) |
Two-way CRM sync | Medium |
products:read |
Read the product catalog, option groups and variants | Storefront, catalog sync | Low |
products:write |
Create, update and archive store products, prices, option groups, values and variants | Catalog management, PIM, Shopify/ERP sync | Medium |
store:read |
Read the merchant's Southbill Store: name, slug, branding, status | Storefront apps | Low |
files:write |
Upload product images, documents and covers (max 5 MB) | Catalog sync with media | Medium |
orders:read |
Read store orders with customer, shipping and fulfillment state | Order sync, fulfillment | Medium |
orders:write |
Update fulfillment/tracking and attach delivery evidence | Shipping automation | Medium |
invoices:read |
Read invoices | Accounting export | Low |
invoices:write |
Create, send and void invoices (not callable in v1 — invoices are read-only in the App API) | Invoicing tools | Medium |
subscriptions:read |
Read subscriptions | Churn analytics, entitlements | Low |
subscriptions:write |
Create, update and archive subscription links | Subscription link automation | High |
disputes:read |
Read disputes and deadlines | Chargeback alerting | Medium |
disputes:write |
Submit or update evidence (not callable in v1 — disputes are read-only in the App API) | Chargeback automation | High |
payouts:read |
Read payouts, bank settlement data and /balance |
Bank reconciliation | Restricted |
analytics:read |
Aggregated volume figures | Dashboards | Low |
webhooks:read |
Read the merchant's webhook configuration (not callable in v1 — app webhooks are configured in your developer dashboard) | Diagnostics | Low |
webhooks:write |
Manage webhook endpoints (not callable in v1) | Auto-setup during install | Medium |
Rules that trip people up
- Least privilege. Reviewers reject scope lists that don't match the described functionality.
- Read before write. Ask for Store write scopes only if your app really creates or updates catalog/order data.
- Adding a scope requires a new app version and re-consent from every merchant. Missing scopes only surface as
403 insufficient_scopeat runtime — check the granted scopes after install and degrade gracefully. - Restricted scopes can be revoked if we see misuse; your app must keep working without them.
- A missing scope returns
403witherror.type: "insufficient_scope"— see Error & status codes.