Stripe Restricted Keys

Stripe restricted API key permissions — full map

Every permission on the Restricted Key form, what it unlocks, what breaks if you leave it at None, and how much money is exposed if an agent loops on that endpoint.

TL;DR

Restricted Key permissions are grouped by Stripe resource (Charges, Refunds, Customers, etc.). Each resource offers None / Read / Write. Write implies Read. The rows below are the ones most agents need; the runaway-risk column is what matters when the agent gets stuck — not what the feature does under normal use.

How to read the table

Three columns you should weigh before ticking any permission:

Core payments permissions

PermissionWhat Write enablesWhat breaks if NoneRunaway risk
ChargesCreate, update, capture chargesCannot create new charges or capture pre-authed onesHigh — loop creates real charges against saved cards
RefundsIssue refunds on existing chargesCannot refundHigh — loop refunds entire recent charge history
PaymentIntentsCreate, confirm, cancel payment intentsCannot use the modern payments API at allHigh — same risk profile as Charges; the modern path
SetupIntentsAttach payment methods for future off-session useCannot save cards for laterMedium — no money moves, but enables future charges
DisputesSubmit evidence, accept liability, close disputesCannot interact with disputesMedium — can unnecessarily accept chargebacks

Customer and PM permissions

PermissionWhat Write enablesWhat breaks if NoneRunaway risk
CustomersCreate, update, delete customersCannot manage customer recordsMedium — can corrupt customer data; combined with Charges, unbounded
PaymentMethodsAttach, detach, update payment methodsCannot move cards between customersMedium — card-hygiene disasters more than money loss
Sources / Cards / Bank AccountsLegacy payment-method surfacesLegacy integrations breakLow — most agents should leave these off entirely
Tax IDsAttach tax IDs to customersCannot set customer tax IDs via APILow — data quality issue, not financial

Subscription & invoicing permissions

PermissionWhat Write enablesWhat breaks if NoneRunaway risk
SubscriptionsCreate, update, cancel subscriptionsCannot manage recurring billingHigh — can mass-cancel or mass-upgrade the book
InvoicesDraft, finalize, pay, void invoicesCannot issue invoicesHigh — finalizing a looping draft charges the customer
Invoice ItemsAdd line items to upcoming invoicesCannot pre-seed invoice linesMedium — feeds Invoices risk if combined
Credit NotesIssue credit notes against paid invoicesCannot issue creditsMedium — unbounded credits are real money out
Plans / PricesCreate and update pricing objectsCannot programmatically manage catalogLow — new objects don't auto-bill anyone
ProductsCreate and update productsCannot manage catalogLow — same as Plans
Coupons / Promotion CodesCreate discount artifactsCannot programmatically issue discountsMedium — loop creates uncapped discount codes

Payouts, Transfers, Balance

PermissionWhat Write enablesWhat breaks if NoneRunaway risk
PayoutsCreate manual payouts to your bankCannot trigger manual payouts (auto-payouts unaffected)Very high — moves funds out of Stripe
TransfersMove funds to connected accountsCannot split funds in Connect flowsVery high — Connect platforms should think twice
BalanceRead-only on the balance endpointCannot read available balanceNone — read-only
Balance TransactionsRead the ledgerCannot reconcileNone — read-only

Connect-specific permissions

PermissionWhat Write enablesWhat breaks if NoneRunaway risk
AccountsCreate, update, delete connected accountsCannot onboard new merchantsHigh — can orphan or corrupt merchant data
Account LinksGenerate onboarding URLsCannot redirect merchants to the Stripe-hosted flowLow — just URLs
Application FeesRefund platform feesCannot return platform feesMedium — mass-refund of fees = mass revenue loss
CapabilitiesRequest capabilities on connected accountsCannot programmatically request card payments etc.Low — administrative

Supporting and metadata permissions

PermissionWhat Write enablesWhat breaks if NoneRunaway risk
Webhook EndpointsCreate, update, delete webhook subscriptionsCannot programmatically wire new webhooksHigh — can reroute webhooks to an attacker-controlled URL
EventsRead event historyCannot paginate audit dataNone — read-only
FilesUpload files for disputes / identityCannot upload evidenceLow — storage only
ReportsTrigger report runsCannot fetch large reportsLow — reporting only
Radar Sessions / ReviewsManage fraud signals and manual reviewsCannot close Radar reviews programmaticallyMedium — can approve fraud if paired with Charges
Sigma / Data ExportsRun Sigma queriesCannot run Sigma programmaticallyLow — read-only analytics

Permissions most agents should leave at None

A useful heuristic: if your agent's job description doesn't literally reference the feature, leave the permission at None. In particular, we recommend default-off on Payouts, Transfers, Webhook Endpoints, Subscriptions, and Invoices unless the agent explicitly manages those surfaces. The bar to enable is "this agent's intended behavior requires this resource", not "this agent might find this useful."

Where the Restricted Key model runs out

Three classes of problem Restricted Keys cannot solve, no matter how carefully you pick the permissions:

  1. Amount limits. Refunds: Write is "any refund, any amount, any count." No dollar ceiling. A stuck loop exits only when Stripe's rate limit does.
  2. Record-level scoping. Charges: Write is all charges, not just the ones the agent created. You cannot restrict the key to a cohort.
  3. Mid-run revocation. Rotating a Restricted Key takes human time in the Dashboard. If the loop is running, you have a 60-90 second exposure window while a human logs in, finds the key, and clicks revoke.

Read the longer answer on which Stripe-native controls cover which agent scenarios, and where you still have to build your own.

How Keybrake helps

Keybrake attaches three things the Restricted Key itself can't: a daily dollar cap per resource, a customer / merchant allowlist, and sub-second revocation that propagates to every in-flight agent on the next call. You keep the Restricted Key as our upstream; your agents get Keybrake-issued vault keys with the additional policies layered on top. See the full feature set →

Get early access

Related questions

Does Write imply Read?

Yes. Stripe's permission model is hierarchical: enabling Write on a resource automatically enables Read on that resource. You cannot have Write without Read.

Can I enable a permission for just some endpoints within a resource?

No. Restricted Keys are resource-level, not path-level. Refunds: Write is every endpoint under Refunds, not just POST /v1/refunds. Path-level scoping requires either a wrapper in your code or a proxy.

If I change permissions later, does it affect the existing key?

Yes — Stripe applies the updated scope set immediately. The key string doesn't change; the permissions attached to it do. Useful for tightening, but be aware that in-flight calls made at the instant of change may fail unexpectedly.

How many Restricted Keys can I have on one Stripe account?

Practically unlimited for normal use. A common pattern is one per agent role (support-refund, catalog-update, invoice-read), so revoking one does not affect others.

Further reading