How enforcement works
- Store-bound — an app token is tied to the single store it was installed on. Salesive resolves the store server-side from the installation, so you never send a store id, and a token can never reach another store’s data.
- Scope-checked — each endpoint requires a specific scope. A request without the required
scope is rejected with
403. - Resource-limited — apps can reach only the resources listed below (orders, catalog,
customers, categories, shipping, discounts, blogs, notifications, tasks, notes, scripts,
comments, domains, roles, payouts, Shipday, KYC, files, settings, plus outbound email).
Requests to any other resource (wallet, staff, payments, themes, …) are rejected with
403, regardless of scope. - Rate-limited — outbound messaging scopes (
SEND_NOTIFICATIONS,SEND_EMAILS) are rate limited per installation; over-limit requests get429. See Outbound messaging. - Revoked on uninstall — deactivating the installation (uninstall) invalidates the app’s tokens immediately.
Read scopes (
READ_*) cover GET endpoints; write scopes (WRITE_*) cover create/update
endpoints and include their read counterpart’s endpoints where relevant. A few
irreversible owner-only actions (e.g. deleting an order or a customer record) are reserved
for the store owner and are not available to apps even with a write scope.Default grant — store & user context
Every installed app can call one endpoint without requesting any scope. It returns basic store and user info so your app can display the merchant’s store name, logo, and contact details on first load without needing a full permission grant:storeRole is "owner" if the
installing user owns the store, or "staff" if they are a staff member — useful for
conditionally showing admin-level controls in your app UI. No financial, payment, or
credential fields are included.
If you are using the App Starter, this endpoint is pre-wired at GET /api/context?shop=<id>
on your app’s own server and your frontend can call apiGet(\/context?shop=$`)` directly.
The app token is store-bound — the store comes from the installation, not from any
header or query you send. You cannot call this endpoint on behalf of a store you aren’t
installed on.
Available scopes
You request scopes as a space-separated list in thescope parameter, e.g.
READ_ORDERS WRITE_ORDERS READ_INVENTORY.
WRITE_DOMAINS exists but is not grantable to apps — changing a store’s domains stays a
human, owner-level action. Likewise, role, payout and custom-domain writes are reserved
for the store owner and are not available to apps even with a read scope.Files — externally-hosted only.
WRITE_FILES lets apps register images and videos whose
bytes are hosted on an external service (your CDN, S3 bucket, etc.) — only the URL is stored
in the gallery. Only image/* and video/* MIME types are accepted; size is recorded as
0 since no storage is consumed on Salesive’s servers. Apps may update or delete only files
they registered (files whose size is 0). Merchant-uploaded files (stored on Salesive’s file
service) must be managed from the store dashboard.Settings scope.
READ_SETTINGS / WRITE_SETTINGS cover the store’s preferences and
checkout behaviour: notification toggles (push, payment, order, shipping, sales, visitor),
allowOrderWithoutShipping, disableShipmentInStorefront, and posTaxRate. Store identity
fields (name, logo, business info, social media) are available without any scope via
GET /app/context and are writeable by humans only. Analytics, wallet, payment method, and
theme settings are not accessible to apps.The authoritative, always-current list is in the OAuth discovery document
(
scopes_supported) and via the Developer console scope picker, which only offers scopes
that map to a reachable endpoint.The catalog differs by store type. A store’s catalog lives at
/products (ecommerce),
/foods (restaurant menu), or /services (business) — all covered by the single
READ_INVENTORY / WRITE_INVENTORY scope. If you don’t know the store type, request the
catalog from each and use whichever returns items.Outbound messaging (send notifications & emails)
Two scopes let your app reach out to people instead of just reading and writing store data. Because they generate messages, they are rate limited per installation and constrained to the store’s own audience — your app can never message an arbitrary address.Send a notification — SEND_NOTIFICATIONS
POST /notifications sends an in-app + push notification to the merchant (the store owner).
The recipient is fixed server-side; you cannot target another user.
429.
Send an email — SEND_EMAILS
POST /emails sends an email to one of three audiences. Recipients are resolved server-side
from the store’s own records, so you supply only the audience — never raw email addresses.
Limit: 10 send requests per hour per installation, each fanning out to at most 1,000
recipients. Subscriber unsubscribes are always honoured. Over the limit returns
429.
Email content is delivered through Salesive’s branded notification template (
subject,
title, message, optional actionText + actionUrl) — arbitrary HTML is not accepted.
Sending to customers and subscribers is done on the merchant’s behalf; respect their consent
and applicable anti-spam law.Requesting scopes
Include the scopes in the authorization redirect (see Install flow):scope field — read it to confirm what you were actually granted.
Adding scopes later
If a future version of your app needs more access, add the new scopes to your app and send the merchant through the consent flow again to grant the additional permissions. Existing installs keep working with their originally granted scopes until they re-consent.Handling permission errors
A403 on an API call means one of:
- Missing scope — your token wasn’t granted the scope that endpoint requires. Request it at install and have the merchant re-consent.
- Out-of-scope resource — the endpoint belongs to a resource apps can’t access in this release.
Next steps
Build & publish your app
Register your app, configure its listing, and submit it for review.

