The three grants
For any resource family, such asproducts:
Three separate grants, 136 scopes in total across 66 resource families.
Why delete is split out
Deleting is the only irreversible operation in the set, so it is the one worth granting separately. The common case is an integration that keeps records in sync: it creates and updates constantly and should never destroy anything. Under a two-grant model, giving it write also gives it the ability to wipe your catalogue if it has a bug or its credentials leak. Splitting delete out means that blast radius is something you opt into explicitly. Grant:delete only when the integration genuinely needs to remove records.
Picking the minimum
1
List the endpoints your integration actually calls
Work from your code, not from what you might need later. Scopes can be added to an
existing key at any time without reissuing it.
2
Map each to its family and verb
GET /products needs read_products. POST /orders needs write_orders.3
Leave delete off unless you delete
This is the single highest value restriction available to you.
4
Let the API tell you what you missed
A refusal names the exact scope required, so you can develop against a minimal key
and add scopes as you hit them rather than guessing up front.
Being refused
A valid key on a route it lacks the scope for returns403:
403 insufficient_scope means the key is real and the permission is missing. 401 unauthorized means the credential itself did not check out. They are different
problems: one is fixed in the dashboard, the other in your secret store.