Apps using Shopify-managed installation can replace any optional write scope with its corresponding read scope. This lets them give up write access without losing read access. No action is required for existing apps.
appDowngradeAccessScopes , is available.appRevokeAccessScopes : revoking a write scope with it also removes any read access that was granted only through that write scope.
appDowngradeAccessScopes drops only the write scope and keeps the corresponding read scope. For example: write_products → read_products.
| Item | appRevokeAccessScopes | appDowngradeAccessScopes |
|---|---|---|
| write scope | Removed | Removed |
| read granted only through write | Removed along with it | Replaced with the matching read and kept |
| Best for | You no longer need access to the resource at all | You no longer need to write, but still need to read |
| Available versions | Not specified | 2027-01~ Admin GraphQL API |
Applies to apps that let Shopify manage installation and scopes.
The app must have an optional write scope and the matching read scope.
List the optional write scopes you no longer need for creating or updating data.
On API 2027-01 or later, call appDowngradeAccessScopes with the target scopes.
downgraded lists the successfully changed scopes;userErrors explains any failures.
For the successfully changed write scopes, handle is returned.
field and message show what failed. If even one item fails, the entire request is rejected.
Earlier versions can't call it. Using it requires upgrading your API version.
Required scopes can't be downgraded. Any write scope you might later downgrade should be declared in optional_scopes from the start.
If any entry is invalid, the whole request is rejected and no scopes change. When passing multiple scopes at once, handling userErrors is essential.
Write scopes that aren't currently granted are ignored rather than raising an error. To see what actually changed, check downgraded .
appRevokeAccessScopes revokes the write scope and also removes any read access that was granted only through it.If code still relies on read access (sync, display, etc.), choose Downgrade. The change affects only the calling app's own installation.
write_products is still granted, though the app still reads product data.appDowngradeAccessScopes(scopes: ["write_products"]) is called to downgrade the scope toread_products .write_products must be declared in optional_scopes. If it's required, it can't be downgraded.userErrors is empty, and inspectdowngraded to see what was returned.downgraded rather than from what you passed in.