---
schema_version: 1
route: /t/stripe.md
tool: "stripe"
---

# sincecutoff.com /t/stripe — Stripe API

- name: Stripe API
- kind: api
- children: none
- homepage: <https://stripe.com>

Changes to the tools coding agents drive, since a model's training cutoff, each linked to its first-party source. Check installed versions and limitations before acting; a cutoff date does not establish what a model knows.
Original editorial content: [Apache 2.0](https://sincecutoff.com/v1/data-license.txt), by [0xPatrick](https://0xpatrick.dev). Preserve applicable license and [NOTICE](https://sincecutoff.com/notice.txt) attribution when redistributing. Third-party source text and examples retain their own rights. [License scope and attribution](https://sincecutoff.com/v1/license.json).
To stay current, read the changes feed: [`/v1/changes.md?tool=stripe`](https://sincecutoff.com/v1/changes.md?tool=stripe) (or `.json`), adding `since=YYYY-MM-DD` for your training cutoff. Entries for registered children are included; the registry itself is `/v1/tools.json`. How to page and save your place: [llms.txt](https://sincecutoff.com/llms.txt).

### GB bank account payout method payments eligibility no longer waits on Confirmation of Payee (2026-09-30)
- slug: gb-bank-account-payout-method-payments-eligibility-no-longer-waits-on-confirmati-084238929e82
- score: 0.95

How to use it:

When handling a GB bank account payout method on API version `2026-09-30.preview`, treat `usage_status.payments: eligible` as payment eligible and stop waiting for `confirmation_of_payee` or an Outbound Setup Intent `requires_action`.

- why_it_matters: Update GB bank account payout handling that waits for payment eligibility or Outbound Setup Intent completion.
- before: Previously, GB bank account payout methods reported `usage_status.payments = requires_action` with a `confirmation_of_payee` next action, and their Outbound Setup Intents resolved to `requires_action`.
- sources: <https://docs.stripe.com/changelog/endive/2026-09-30/pre-ga-upgrades-v2-poms>, <https://docs.stripe.com/api/v2/money-management/payout-methods/object?api-version=2026-09-30.preview>
- gotchas: "Version: 2026-09-30.preview"; "usage_status.payments: Payment eligibility status; the object page documents `usage_status` as indicating requirements for outbound money movement. The versioned change specifies that GB bank accounts report `eligible` from `2026-09-30.preview`."; "usage_status.transfers: Transfer eligibility status; unchanged by this change."; "Confirmation of Payee may still be required before the payout method can be used to receive payouts."; "`usage_status.transfers` is unchanged."

### Stripe Accounts v2 adds the satispay_payments capability (2026-09-30)
- slug: stripe-accounts-v2-adds-the-satispay-payments-capability-ca54090a9d6a
- score: 0.98

How to use it:

If an Accounts v2 integration needs to accept Satispay payments, set `configuration.merchant.capabilities.satispay_payments.requested` to `true` when creating or updating the v2 Account. Read `status` and `status_details` for the capability state and context.

Examples:

```
POST /v2/core/accounts
{"configuration":{"merchant":{"capabilities":{"satispay_payments":{"requested":true}}}}}
```

```
POST /v2/core/accounts/<account_id>
{"configuration":{"merchant":{"capabilities":{"satispay_payments":{"requested":true}}}}}
```

- why_it_matters: For an integration using Accounts v2 that needs to accept Satispay payments, request the capability on the v2 Account.
- before: Configure Satispay separately instead of requesting the capability directly on the v2 Account.
- sources: <https://docs.stripe.com/changelog/endive/2026-09-30/satispay-payments-capability-for-accounts-v2-api>
- gotchas: "satispay_payments.requested (required): Set to `true` to request the capability."; "satispay_payments.status: Reports whether Satispay payments are active, pending, restricted, or unsupported for the account."; "satispay_payments.status_details: Array with additional context about capability status."; "Prerequisite: The integration uses Accounts v2."; "Applies to integrations using Accounts v2 that want to accept Satispay payments."; "The capability status can be active, pending, restricted, or unsupported for the account."

### Stripe Activity Logs API adds action groups and investigation context (2026-09-30)
- slug: stripe-activity-logs-api-adds-action-groups-and-investigation-context-c4e593454d01
- score: 0.93

How to use it:

When investigating account security, authentication, payout, or Issuing changes, list Activity Logs filtered to the relevant action groups. Inspect each entry’s type and details, plus actor, related_object, and request for investigation context.

Examples:

```
curl https://api.stripe.com/v2/iam/activity_logs?action_groups[]=<action_group> -H "Authorization: Bearer <YOUR_SECRET_KEY>" -H "Stripe-Version: 2026-09-30.preview" -H "Stripe-Context: <CONTEXT>"
```

```
curl https://api.stripe.com/v2/iam/activity_logs -H "Authorization: Bearer <YOUR_SECRET_KEY>" -H "Stripe-Version: 2026-09-30.preview" -H "Stripe-Context: <CONTEXT>"
```

- why_it_matters: Inspect authentication, security, payout, or Issuing changes recorded in Activity Logs and filter entries for the relevant action groups.
- sources: <https://docs.stripe.com/changelog/endive/2026-09-30/adds-authentication-and-money-movement-actions-to-activity-logs>, <https://docs.stripe.com/api/v2/iam/activity-logs/list?api-version=2026-09-30.preview>, <https://docs.stripe.com/api/v2/iam/activity-logs/object?api-version=2026-09-30.preview>
- gotchas: "Availability: Activity Logs API version 2026-09-30.preview"; "action_groups: Array filter for activity log action groups. Documented values relevant here: sso, scim, user_profile, account_security, authentication, payout, issuing."; "type: Response enum identifying the action performed."; "details: Response object containing action-specific details."; "actor: Response object identifying the actor that performed the action."; "related_object: Nullable response object for the object related to the activity log entry."; "request: Nullable response object for the API request that instigated the action."

### Stripe Balance Transactions add Issuing provisional credit types (2026-09-30)
- slug: stripe-balance-transactions-add-issuing-provisional-credit-types-b2769d7669c7
- score: 0.94

How to use it:

If your integration filters or processes Balance Transaction `type` values, handle `issuing_dispute_provisional_credit` and `issuing_dispute_provisional_credit_reversal`. Use those types to distinguish provisional credit movements during reconciliation, and review Balance Reports that use `reporting_category`.

Examples:

```
curl -G https://api.stripe.com/v1/balance_transactions -u "<secret_key>:" -d "type=issuing_dispute_provisional_credit"
```

```
curl -G https://api.stripe.com/v1/balance_transactions -u "<secret_key>:" -d "type=issuing_dispute_provisional_credit_reversal"
```

- why_it_matters: Update an integration that filters or processes Stripe Balance Transactions by type to handle provisional credits for Issuing disputes.
- sources: <https://docs.stripe.com/changelog/endive/2026-09-30/provisional-credit-issuing-disputes-balance-transaction-types>, <https://docs.stripe.com/api/balance_transactions/list?api-version=2026-09-30.endive>, <https://docs.stripe.com/api/balance_transactions/object?api-version=2026-09-30.endive>
- gotchas: "type: Filters the list to transactions of the given type; the release note adds the two provisional-credit values listed above."; "reporting_category: Balance Transaction categorization used by Balance Reports; the two new values each have a corresponding category for differentiation."; "The new values concern money movement related to provisional credits for Issuing disputes."; "The existing `issuing_dispute` type continues to represent the final credit for a won dispute."; "Both new values are available as filters when listing Balance Transactions."; "Each new type has a corresponding `reporting_category` for differentiation in Balance Reports."; "The values also appear in SDK type definitions and OpenAPI specs."; "Docs conflict: The accessible current API reference omits the two new types from its documented enum, although the release note for API version 2026-09-30.endive states they are valid list filters. Used the release note for those values; do not rely on the current enum list."

### Stripe Billing Feedback Options API adds custom subscription cancellation reasons (2026-09-30)
- slug: stripe-billing-feedback-options-api-adds-custom-subscription-cancellation-reason-f16ab79b6f21
- score: 0.95

How to use it:

When configuring portal cancellation feedback, set the cancellation feature and its documented reason settings on the customer portal configuration. The available documentation does not show how to attach Billing Feedback Option resources.

Examples:

```
curl https://api.stripe.com/v1/billing_portal/configurations/<configuration_id> -u "<secret_key>:" --data-urlencode "features[subscription_cancel][cancellation_reason][enabled]=true"
```

- why_it_matters: Configure custom cancellation reasons for a subscription customer portal cancellation flow.
- sources: <https://docs.stripe.com/changelog/endive/2026-09-30/feedback-options-api>, <https://docs.stripe.com/api/customer_portal/configurations/object?api=true&shell=true>
- gotchas: "Version: 2026-09-30.endive"; "features (required): Portal configuration features object."; "features.subscription_cancel.cancellation_reason.enabled (required): Whether cancellation reasons are collected in the portal."; "features.subscription_cancel.cancellation_reason.options (required): Documented as an array of enums; the page does not document custom feedback-option resource IDs."; "The feedback options are presented to customers canceling through the customer portal."; "Docs conflict: The accessible configuration reference documents cancellation_reason.options as enum values (too_expensive, missing_features, switched_service, unused, other), not Billing Feedback Option resource IDs; it does not establish the custom-resource configuration described in the release note."; "Docs conflict: The accessible configuration reference does not carry the stated 2026-09-30.endive API version."

### Stripe card payment options declare saved-card usage (2026-09-30)
- slug: stripe-card-payment-options-declare-saved-card-usage-370ee6ba3394
- score: 0.95

How to use it:

When saving a card for future use, set `payment_method_options.card.setup_credential_usage` on a SetupIntent or a PaymentIntent with `setup_future_usage`. When charging a saved card off-session, set `payment_method_options.card.stored_credential_usage` to the usage type for that charge.

Examples:

```
curl https://api.stripe.com/v1/setup_intents -u "<YOUR_SECRET_KEY>:" -d "customer=<CUSTOMER_ID>" -d "automatic_payment_methods[enabled]=true" -d "payment_method_options[card][setup_credential_usage]=unscheduled"
```

```
curl https://api.stripe.com/v1/payment_intents -u "<YOUR_SECRET_KEY>:" -d amount=2000 -d currency=usd -d "customer=<CUSTOMER_ID>" -d "automatic_payment_methods[enabled]=true" -d "payment_method_options[card][setup_credential_usage]=unscheduled"
```

```
curl https://api.stripe.com/v1/payment_intents -u "<YOUR_SECRET_KEY>:" -d amount=2000 -d currency=usd -d "customer=<CUSTOMER_ID>" -d "payment_method=<PAYMENTMETHOD_ID>" -d off_session=true -d "payment_method_options[card][stored_credential_usage]=unscheduled" -d confirm=true --data-urlencode "return_url=https://example.com/return"
```

- why_it_matters: When implementing saved-card setup or off-session charging that needs a declared credential-on-file usage type, set the corresponding card payment method option.
- sources: <https://docs.stripe.com/changelog/endive/2026-09-30/add-card-on-file-usage-indicators>, <https://docs.stripe.com/payments/cards/save-and-reuse>
- gotchas: "payment_method_options[card][setup_credential_usage]: Declare the intended future usage type when saving a card with a SetupIntent or a PaymentIntent with `setup_future_usage`. Allowed values: `recurring`, `unscheduled`, `installment`."; "payment_method_options[card][stored_credential_usage]: Declare the usage type for the subsequent charge when charging a saved card. Allowed values: `recurring`, `unscheduled`, `installment`. It can differ from the setup usage type. No mutual exclusivity is documented."; "customer (required): Customer ID for the saved card payment examples."; "amount (required): Amount in the smallest currency unit, shown as `2000` in PaymentIntent examples."; "currency (required): Payment currency, shown as `usd` in PaymentIntent examples."; "payment_method (required): Attached PaymentMethod ID for the saved-card charge."; "off_session (required): Set to `true` for the documented off-session charge."; "confirm (required): Set to `true` in the documented saved-card off-session charge example."; "automatic_payment_methods[enabled]: Set to `true` in the documented card-saving examples."; "Prerequisite: Create the Customer before setting up the card. Create the SetupIntent or PaymentIntent on the server side."; "Prerequisite: For PaymentIntent saving, the customer must opt in to save the card or `setup_future_usage` must be set for `setup_credential_usage` to take effect."; "Existing integrations are not affected unless they adopt these parameters."; "`setup_credential_usage` applies to a Setup Intent or a Payment Intent that uses `setup_future_usage`."; "`stored_credential_usage` is set when charging a saved card off-session."

### Stripe Charge expansion supports payment_method_details.card.mandate (2026-09-30)
- slug: stripe-charge-expansion-supports-payment-method-details-card-mandate-a47c4b2f382d
- score: 0.98

How to use it:

For a Charge on a card payment with an associated mandate, retrieve the Charge with `expand[]=payment_method_details.card.mandate` to include the full Mandate object in the response. Without expansion, the field is the mandate ID when present, or `null`.

Examples:

```
curl -G https://api.stripe.com/v1/charges/<CHARGE_ID> \
  -u "<YOUR_SECRET_KEY>:" \
  -d "expand[]=payment_method_details.card.mandate"
```

- why_it_matters: When retrieving a Charge for a card payment with an associated mandate, include the mandate details in the same API response.
- before: Previously, the property returned the mandate ID when present; the release note does not state the prior retrieval procedure.
- sources: <https://docs.stripe.com/changelog/endive/2026-09-30/expand-mandate-on-card-payments-details>, <https://docs.stripe.com/expand>
- gotchas: "expand[] = payment_method_details.card.mandate: Expands the card mandate property to its full Mandate object. The release note names this value; Stripe’s expansion guide documents `expand[]` and dot notation for nested expansions."; "CHARGE_ID (required): Placeholder for the Charge identifier in the retrieve URL. The exact retrieve command was not available in the official docs accessed."; "YOUR_SECRET_KEY (required): Placeholder for the Stripe secret API key used for authentication in the documented curl expansion pattern."; "Applies to card payments with an associated mandate."

### Stripe Checkout Sessions removes `payment_method_types` on creation (2026-09-30)
- slug: stripe-checkout-sessions-removes-payment-method-types-on-creation-2563620951b1
- score: 0.97

How to use it:

If creating Checkout Sessions with `payment_method_types`, remove that parameter because it now returns HTTP 400. Use Dashboard-managed dynamic payment methods, or set `allowed_payment_method_types` to filter compatible methods; use `excluded_payment_method_types` to exclude methods.

Examples:

```
curl https://api.stripe.com/v1/checkout/sessions \
  -u <secret_key>: \
  -d success_url="https://example.com/success" \
  -d "line_items[0][price]"=<price_id> \
  -d "line_items[0][quantity]"=2 \
  -d mode=payment
```

- why_it_matters: Update an integration that creates Checkout Sessions with `payment_method_types` to use the supported payment method configuration.
- before: Pass `payment_method_types` when creating a Checkout Session; specifying an incompatible payment method returned an error.
- sources: <https://docs.stripe.com/changelog/endive/2026-09-30/remove-payment-method-types-checkout-sessions>, <https://docs.stripe.com/payments/payment-methods/dynamic-payment-methods>
- gotchas: "Version: 2026-09-30.endive"; "payment_method_types: Removed from Checkout Session creation; including it returns HTTP 400."; "allowed_payment_method_types: Array of payment method types; filters to methods compatible with parameters such as currency, amount, and customer. The compatible subset appears in the response’s `payment_method_types` property."; "excluded_payment_method_types: Excludes specific payment methods from dynamic payment method results. The create API parameter details were inaccessible, so its accepted values and exact syntax were not verified."; "Prerequisite: Dynamic payment methods can be configured in the Stripe Dashboard; only enabled methods can be shown to customers."; "Passing `payment_method_types` when creating a Checkout Session now returns a `400` error."; "`allowed_payment_method_types` accepts an array of payment method types and filters the list to methods compatible with other parameters such as `currency`, `amount`, and `customer`."

### Stripe Checkout Sessions update payment_intent_data in payment mode (2026-09-30)
- slug: stripe-checkout-sessions-update-payment-intent-data-in-payment-mode-2ea60877782b
- score: 0.96

How to use it:

For an active Checkout Session in payment mode using `ui_mode=elements`, update it with `payment_intent_data` before confirming payment. Set the documented PaymentIntent fields there to change them without recreating the session.

- why_it_matters: When updating PaymentIntent settings for an active Checkout Session in payment mode, modify them before confirming payment without recreating the session.
- sources: <https://docs.stripe.com/changelog/endive/2026-09-30/update-payment-intent-data-on-checkout-sessions>, <https://docs.stripe.com/api/payment_intents/update>
- gotchas: "payment_intent_data: Nested PaymentIntent configuration passed when updating the Checkout Session. The current update reference available here does not document this parameter; the release note says it is accepted for this change."; "description: Arbitrary string attached to the PaymentIntent."; "metadata: Key-value pairs attached to the PaymentIntent; individual keys or all keys can be unset with empty values."; "setup_future_usage: Controls whether the payment method is intended for reuse; allowed values documented on the PaymentIntent update page are `on_session` and `off_session`."; "statement_descriptor: Statement text for a non-card charge; setting it for a card charge returns an error."; "statement_descriptor_suffix: Not documented in the official PaymentIntent update reference page available here."; "ui_mode=elements (required): Required by the release note for this update capability."; "mode=payment (required): Checkout Session mode must be `payment`."; "active state; update before confirmation (required): The release note requires the Checkout Session to be active and the update to occur before payment confirmation."; "Prerequisite: The release note identifies this capability in the 2026-09-30.preview API version; the versioned update reference was inaccessible, so specific setup or preview-access requirements were not confirmed."; "The Checkout Session must use `ui_mode=elements` and be in an active state."; "The session must be in payment mode."; "Update the PaymentIntent configuration before confirming the payment."; "Docs conflict: The currently accessible unversioned Checkout Session update reference documents `metadata`, `collected_information`, and `shipping_options`, but not `payment_intent_data`; it may reflect an older API version, so it does not establish behavior for 2026-09-30.preview. https://docs.stripe.com/api/checkout/sessions/update"

### Stripe customer portal sessions support recovery after expiration (2026-09-30)
- slug: stripe-customer-portal-sessions-support-recovery-after-expiration-55cf232d23f7
- score: 0.96

How to use it:

When creating a portal session that should be recoverable after expiration, set `after_expiration[type]` to `customer_login`. Customers can verify their email and receive a replacement session using the original URL; set `after_expiration[customer_login][expires_at]` to limit recovery.

Examples:

```
curl https://api.stripe.com/v1/billing_portal/sessions \
  -u "<YOUR_SECRET_KEY>:" \
  -H "Stripe-Version: 2026-09-30.preview" \
  -d "customer=<CUSTOMER_ID>" \
  --data-urlencode "return_url=https://example.com/account" \
  -d "after_expiration[type]"=customer_login
```

```
curl https://api.stripe.com/v1/billing_portal/sessions \
  -u "<YOUR_SECRET_KEY>:" \
  -H "Stripe-Version: 2026-09-30.preview" \
  -d "customer=<CUSTOMER_ID>" \
  --data-urlencode "return_url=https://example.com/account" \
  -d "after_expiration[type]"=customer_login \
  -d "after_expiration[customer_login][expires_at]"=<UNIX_TIMESTAMP>
```

- why_it_matters: Let customers reopen the customer portal from an existing session URL after that session expires.
- sources: <https://docs.stripe.com/changelog/endive/2026-09-30/adds-session-recovery-for-expired-customer-portal-sessions>, <https://docs.stripe.com/api/customer_portal/sessions/create?api-version=2026-09-30.preview>, <https://docs.stripe.com/customer-management/integrate-customer-portal>
- gotchas: "Availability: API version 2026-09-30.preview"; "customer (required): ID of an existing customer."; "return_url: Redirect destination when the customer returns to your site; required if no default return URL is set in the Dashboard configuration."; "after_expiration: Set when creating each portal session to configure behavior after expiration."; "after_expiration.type (required): Set to `customer_login` to allow customers to verify their email and receive a replacement session with the same configuration."; "after_expiration.customer_login.expires_at: Timestamp deadline for recovery. If omitted, recovery is available at any time after the session expires."; "Prerequisite: Create a customer before creating the portal session."; "Prerequisite: Authenticate customers on your site before creating sessions for them."; "Prerequisite: Use the customer ID and a `return_url`; `return_url` is required when the Dashboard configuration has no default return URL."; "Session recovery is enabled by setting `after_expiration` when creating each portal session."; "If `expires_at` is omitted, customers can recover the session at any time after it expires."

### Stripe Subscription updates support cancel_at_period_end in pending updates (2026-09-30)
- slug: stripe-subscription-updates-support-cancel-at-period-end-in-pending-updates-5a83f430205f
- score: 0.93

How to use it:

When an update should cancel a subscription at the current period end after payment succeeds, update it with `payment_behavior=pending_if_incomplete` and `cancel_at_period_end=true`. Stripe stores the setting in `pending_update` if payment fails or requires customer action; a conflicting later cancellation value expires the pending update.

Examples:

```
curl https://api.stripe.com/v1/subscriptions/<subscription_id> \
  -u "<YOUR_SECRET_KEY>:" \
  -d payment_behavior=pending_if_incomplete \
  -d proration_behavior=always_invoice \
  -d "items[0][id]=<subscription_item_id>" \
  -d "items[0][price]=<price_id>" \
  -d cancel_at_period_end=true
```

- why_it_matters: When scheduling an incomplete Subscription update that should also cancel at the billing period end, set cancel_at_period_end as part of the pending update.
- before: Before this change, passing `cancel_at_period_end` with `payment_behavior=pending_if_incomplete` returned an error.
- sources: <https://docs.stripe.com/changelog/endive/2026-09-30/scheduled-subscription-cancellation>, <https://docs.stripe.com/billing/subscriptions/pending-updates>, <https://docs.stripe.com/api/subscriptions/update?api-version=2025-04-30.basil>
- gotchas: "subscription_id (required): Subscription ID in the update URL."; "payment_behavior (required): Set to `pending_if_incomplete` to use pending updates."; "cancel_at_period_end (required): Set to `true` to cancel at the current period end; supported for pending updates."; "proration_behavior: `always_invoice` creates an invoice and attempts payment when the update is made."; "items[0][id]: Subscription item ID to update; included in the documented example."; "items[0][price]: Price ID to apply to the subscription item; included in the documented example."; "Prerequisite: Pending updates require `collection_method=charge_automatically` and a supported payment method."; "Prerequisite: The update must generate an invoice to trigger a pending update; `proration_behavior=always_invoice` does so in the documented example."; "Prerequisite: Authenticate the API request with a Stripe secret key."; "cancel_at_period_end is a nullable boolean property of pending_update on a Subscription."; "The cancellation takes effect at the end of the current billing period after the pending update applies."; "A conflicting cancel_at_period_end value in a subsequent update expires the existing pending update."

### Stripe Subscriptions can be paused and resumed on demand (2026-09-30)
- slug: stripe-subscriptions-can-be-paused-and-resumed-on-demand-18253f992aab
- score: 0.95

How to use it:

When pausing or resuming a subscription, use flexible billing mode and handle its paused status and pause/resume events to update service access. Stripe’s versioned pause and resume API details, including the new fields, were not accessible in the documentation search.

Examples:

```
curl https://api.stripe.com/v1/subscriptions/<SUBSCRIPTION_ID>/resume \
  -u "<SECRET_KEY>:" \
  -d billing_cycle_anchor=now
```

- why_it_matters: When implementing subscription lifecycle handling, pause and resume a subscription and update service access based on subscription events.
- sources: <https://docs.stripe.com/changelog/endive/2026-09-30/pause-subscription>, <https://docs.stripe.com/api/subscriptions/resume?lang=java>, <https://docs.stripe.com/api/subscriptions?lang=go&lang%29=>, <https://docs.stripe.com/api/events/types?event_types-invoice.payment_succeeded=>, <https://docs.stripe.com/billing/subscriptions/billing-mode>
- gotchas: "Version: 2026-09-30.endive"; "billing_cycle_anchor: Resume-time billing cycle anchor: `now` or `unchanged`; defaults to `now`."; "status: Subscription status may be `paused`. The current object reference does not document `status_details`."; "customer.subscription.paused: Event emitted when a subscription enters `status=paused`; not when payment collection is paused."; "customer.subscription.resumed: Event emitted when a subscription is no longer paused; not when payment collection resumes."; "Prerequisite: Flexible billing mode requires Stripe API version `2025-06-30.basil` or later. API-created subscriptions use flexible mode by default on `2025-09-30.clover` or later; otherwise set the billing mode explicitly or migrate existing subscriptions."; "Prerequisite: The Subscription reference says a paused subscription does not generate invoices; pausing payment collection leaves status unchanged and still generates invoices."; "Flexible billing mode must be enabled to pause a subscription."; "Pausing a subscription stops invoice generation; pausing payment collection instead continues invoice generation but pauses payment collection."; "Docs conflict: Current subscription object reference says a subscription can only enter `paused` when a trial ends without a payment method. The release note describes on-demand pausing; this reference may predate the stated release version, so it does not establish the new behavior."

### Trial Offers support archiving and trial end settings (2026-09-30)
- slug: trial-offers-support-archiving-and-trial-end-settings-487620f4dbda
- score: 0.91

How to use it:

To retire a trial offer, set `active=false` when creating or updating it. For subscription trial-end behavior, set `trial_settings` to configure the missing-payment-method action and billing-cycle anchor.

Examples:

```
curl https://api.stripe.com/v1/product_catalog/trial_offers/<TRIAL_OFFER_ID> \
  -u "<YOUR_SECRET_KEY>" \
  -H "Stripe-Version: 2026-09-30.preview" \
  -d active=false
```

```
curl https://api.stripe.com/v1/subscriptions \
  -u "<YOUR_SECRET_KEY>" \
  -H "Stripe-Version: 2026-09-30.preview" \
  -d customer=<CUSTOMER_ID> \
  -d "items[0][price]=<PRICE_ID>" \
  -d "trial_settings[end_behavior][missing_payment_method]=pause" \
  -d "trial_settings[end_behavior][billing_cycle_anchor]=unchanged"
```

- why_it_matters: Retire an outdated trial offer while preserving subscriptions already using it, or configure what happens when a trial ends.
- before: For missing-payment-method behavior, use subscription-level free trials; trial offers did not support those options. The source doesn't state the prior archiving behavior or prior billing cycle anchor behavior.
- sources: <https://docs.stripe.com/changelog/endive/2026-09-30/trial-offers-archiving-and-trial-end-behavior-settings>, <https://docs.stripe.com/api/product-catalog/trial-offer/update?api-version=2026-09-30.preview>, <https://docs.stripe.com/api/subscriptions/create?api-version=2026-09-30.preview>
- gotchas: "active: Boolean; whether the trial offer can be used for new purchases. Set to `false` to archive it."; "trial_settings.end_behavior.missing_payment_method: At trial end without a payment method, choose `create_invoice`, `pause`, or `cancel`."; "trial_settings.end_behavior.billing_cycle_anchor: The release note describes `unchanged` as preserving the existing billing cycle and creating a prorated post-trial period."; "end_behavior.type: Use this property to determine the trial offer’s end behavior."; "end_behavior.transition: Optional property; it is no longer returned on all responses."; "customer: Identifier of the customer to subscribe."; "items (required): List of up to 20 subscription items, each with an attached price."; "Prerequisite: The subscription-create reference lists prerequisite setup: create a payment method, create a customer and attach it, create a product, and create a price."; "Prerequisite: Requests use a Stripe secret key and the `2026-09-30.preview` API version."; "Archived offers can't be attached to new subscription items; existing subscriptions continue using the trial offer until their trial ends."; "Missing-payment-method settings apply when a trial ends naturally or when the trial is ended early by changing or removing the trialing item."

### Stripe billing portal sessions support the customer_update deep link (2026-08-26)
- slug: stripe-billing-portal-sessions-support-the-customer-update-deep-link-0cd514f14ecf
- score: 0.97

How to use it:

When creating a billing portal session for customer detail updates, set `flow_data.type` to `customer_update` to link directly to the billing information page.

Examples:

```
curl https://api.stripe.com/v1/billing_portal/sessions \
  -u "<YOUR_SECRET_KEY>" \
  -H "Stripe-Version: 2026-08-26.dahlia" \
  -d customer=<CUSTOMER_ID> \
  -d "flow_data[type]"=customer_update
```

- why_it_matters: When implementing a billing portal flow that lets customers update their billing details, create a session that links directly to the billing information page.
- sources: <https://docs.stripe.com/changelog/dahlia/2026-08-26/adds-a-customer-update-deep-link-for-billing-portal-sessions>, <https://docs.stripe.com/api/customer_portal/sessions/create?api-version=2026-08-26.dahlia>
- gotchas: "customer: ID of an existing customer; the request example uses it to identify the customer."; "flow_data: Information about a specific flow for the customer to go through."; "flow_data.type: Set to `customer_update` for a direct link to the billing information page. The release note documents `customer_update` alongside `payment_method_update`, `subscription_cancel`, and `subscription_update` as flow types."; "Prerequisite: Create a customer first; the session API reference lists `createCustomer` as a prerequisite."

### Stripe Checkout Sessions restrict card funding types (2026-08-26)
- slug: stripe-checkout-sessions-restrict-card-funding-types-af4ffa6bbf17
- score: 0.96

How to use it:

When creating a Checkout Session, set `payment_method_options.card.restrictions.funding_types_blocked` to block specified card types; Stripe says a customer attempting to use a restricted type sees an error.

Examples:

```
curl https://api.stripe.com/v1/checkout/sessions \
  -u "<secret_key>:" \
  -H "Stripe-Version: 2026-08-26.dahlia" \
  --data-urlencode success_url="<success_url>" \
  -d "line_items[0][price]"="<price_id>" \
  -d "line_items[0][quantity]"=1 \
  -d mode=payment \
  -d "payment_method_options[card][restrictions][funding_types_blocked][]"=prepaid
```

- why_it_matters: When implementing checkout payment restrictions, configure a Checkout Session to block specified card funding types.
- sources: <https://docs.stripe.com/changelog/dahlia/2026-08-26/adds-card-funding-type-filtering-to-checkout-sessions>, <https://docs.stripe.com/api/checkout/sessions/create?lang=>
- gotchas: "payment_method_options[card][restrictions][funding_types_blocked]: List of card funding types to block: `credit`, `debit`, and/or `prepaid`. The release note documents the setting and allowed values; create-session request example documents the other required fields shown."; "mode (required): Checkout Session mode; `payment` accepts one-time payments."; "line_items (required): List of items being purchased; required for `payment` and `subscription` mode."; "success_url: Redirect URL after payment or setup; required for embedded or custom UI mode when redirect-based payment methods are enabled, and disallowed for those UI modes."; "Prerequisite: To use this parameter, requests must use API version `2026-08-26.dahlia` (or the corresponding SDK/API version upgrade); the Stripe changelog says to set the `Stripe-Version` header for REST requests."; "Applies to Checkout Sessions."; "Restricted card funding types cause the Checkout Session to show an error."

### Stripe Confirmation Tokens support metadata (2026-08-26)
- slug: stripe-confirmation-tokens-support-metadata-a5f6c07118b5
- score: 0.94

How to use it:

When an Elements payment flow creates a ConfirmationToken for server-side confirmation, call `stripe.createConfirmationToken` with metadata in `params`; then retrieve the token server-side with your secret key and read `metadata`.

Examples:

```
const {confirmationToken, error} = await stripe.createConfirmationToken({elements, params: {metadata: {order_id: "<order_id>"}}});
```

```
stripe.confirmationTokens.retrieve("<confirmation_token_id>")
```

- why_it_matters: When implementing a payment flow that creates and retrieves Confirmation Tokens, attach metadata and read it on the server.
- sources: <https://docs.stripe.com/changelog/dahlia/2026-08-26/adds-metadata-support-to-confirmation-tokens>, <https://docs.stripe.com/js/confirmation_tokens/create_confirmation_token>, <https://docs.stripe.com/api/confirmation_tokens/retrieve?api-version=2026-08-26.dahlia>, <https://docs.stripe.com/api/confirmation_tokens/object?api-version=2026-08-26.dahlia#confirmation_token_object-metadata>
- gotchas: "Version: 2026-08-26.dahlia"; "elements (required): Elements instance used to create the Express Checkout Element or Payment Element; `stripe.createConfirmationToken` collects payment, billing, and shipping details from it."; "params: Parameters passed to the Stripe API; may include `metadata`."; "params.metadata: Map of key-value pairs attached to the ConfirmationToken; supports up to 50 pairs. Metadata is not returned in the frontend response."; "metadata: Nullable map of key-value pairs on a ConfirmationToken object."; "Prerequisite: Use the Elements instance associated with an Express Checkout Element or Payment Element."; "Prerequisite: Retrieving the token and its metadata is described for server-side use with a secret key."; "Metadata can be attached when creating a ConfirmationToken through Stripe.js."; "Up to 50 key-value pairs are supported."; "Retrieval with metadata is described for server-side use with a secret key."

### Stripe Customer Sessions query entitlements and open customer portal (2026-08-26)
- slug: stripe-customer-sessions-query-entitlements-and-open-customer-portal-47269324db93
- score: 0.97

How to use it:

For subscription access and billing management in an iOS app, create a Customer Session for the authenticated user with `active_entitlements` and/or `customer_portal` enabled. Return its `client_secret` to the app, then use BillingSDK to check entitlements or present the portal.

Examples:

```
const customerSession = await stripe.customerSessions.create({ customer: "<stripe_customer_id>", components: { active_entitlements: { enabled: true }, customer_portal: { enabled: true } } });
res.json({ clientSecret: customerSession.client_secret });
```

```
let entitlements = try await BillingManager.shared.billing.getActiveEntitlements(forceRefresh: true)
```

```
let portal = try await BillingManager.shared.billing.getCustomerPortal()
portal.presentCustomerPortal(from: self)
```

- why_it_matters: When implementing subscription access and billing management in an application, enable the relevant Customer Session components and use the session client secret in the client.
- sources: <https://docs.stripe.com/changelog/dahlia/2026-08-26/customer-session-improvements>, <https://docs.stripe.com/billing/subscriptions/manage-ios>
- gotchas: "customer (required): Stripe Customer ID for the authenticated user."; "components.active_entitlements.enabled: Set to `true` to enable active entitlement retrieval for the Customer Session."; "components.customer_portal.enabled: Set to `true` to enable customer portal access for the Customer Session."; "components.active_entitlements: Enables the active entitlements component; can be enabled together with `customer_portal`."; "components.customer_portal: Enables the customer portal component; can be enabled together with `active_entitlements`."; "client_secret (required): Customer Session secret returned by the server and used by the client SDK to authenticate."; "forceRefresh: When true, forces an entitlement refresh to obtain the latest data from the server."; "Prerequisite: Use Stripe API version `2026-08-26.dahlia` or later for the iOS BillingSDK flow."; "Prerequisite: Provide a backend server to create Customer Sessions; the iOS guide also requires iOS 15+, macOS 12+, and Xcode 15+."; "Prerequisite: The customer portal requires an active authenticated session."; "These components don't change the behavior of the Payment Element."

### Stripe Payment Link update accepts Connect parameters (2026-08-26)
- slug: stripe-payment-link-update-accepts-connect-parameters-24cc6f966411
- score: 0.94

How to use it:

When updating a Payment Link used with Connect, send the supported money movement parameters to update its settings for future Checkout Sessions. Existing active sessions are unaffected.

Examples:

```
curl https://api.stripe.com/v1/payment_links/<PAYMENT_LINK_ID> \
  -u "<YOUR_SECRET_KEY>:" \
  -H "Stripe-Version: 2026-08-26.dahlia" \
  -d "application_fee_amount=<AMOUNT>" \
  -d "application_fee_percent=<PERCENT>" \
  -d "on_behalf_of=<CONNECTED_ACCOUNT_ID>" \
  -d "transfer_data[destination]=<CONNECTED_ACCOUNT_ID>"
```

```
curl https://api.stripe.com/v1/payment_links/<PAYMENT_LINK_ID> \
  -u "<YOUR_SECRET_KEY>:" \
  -H "Stripe-Version: 2026-08-26.dahlia" \
  -d "application_fee_amount="
```

- why_it_matters: For a repository workflow that updates an existing Payment Link's Connect money movement configuration, modify the link and apply the updated settings to future Checkout Sessions.
- before: These parameters were previously available only when creating a Payment Link.
- sources: <https://docs.stripe.com/changelog/dahlia/2026-08-26/adds-connect-parameters-to-the-payment-link-update-method>, <https://docs.stripe.com/api/payment-link/update?api-version=2026-08-26.dahlia>
- gotchas: "Version: 2026-08-26.dahlia"; "<PAYMENT_LINK_ID> (required): ID of the Payment Link to update."; "application_fee_amount: Integer fee amount transferred to the application owner; only when no line item has a recurring price. Empty string unsets it."; "application_fee_percent: Non-negative percentage from 0 to 100, at most two decimals; requires at least one recurring-price line item. Empty string unsets it."; "on_behalf_of: Account on whose behalf to charge. Empty string unsets it."; "transfer_data: Object specifying the account, if any, to which payments are attributed for tax reporting and where funds are transferred. Empty string unsets it; documented subkeys not found."; "Prerequisite: The update API reference lists a Price and an existing Payment Link as prerequisite objects; create a Price and Payment Link first if they do not already exist."; "Prerequisite: The changelog says REST API requests must specify Stripe-Version: 2026-08-26.dahlia to use this API version."; "Applies to Payment Links used with Connect."; "The updated configuration affects Checkout Sessions created from the Payment Link after the change; existing active sessions are unaffected."

### Stripe Signals APIs add account activity, evaluations, and risk-signal lookup (2026-08-26)
- slug: stripe-signals-apis-add-account-activity-evaluations-and-risk-signal-lookup-a961690aac5a
- score: 0.98

How to use it:

When integrating account abuse risk decisions with Stripe, submit activity, request evaluations for `user_account_sharing` and `user_multi_accounting`, and use completed evaluation signals to guide a decision; report the outcome and list or retrieve account signals. Exact operation parameters were not accessible in the official docs I could read.

Examples:

```
Not found: complete runnable Account Activity and Account Evaluation requests for this task.
```

- why_it_matters: For a coding workflow that integrates account-abuse risk decisions with Stripe, submit account activity, request evaluations, and retrieve their signals.
- sources: <https://docs.stripe.com/changelog/dahlia/2026-08-26/adds-account-signals-account-evaluations-and-account-activity-apis-in-public-preview>, <https://docs.stripe.com/api/v2/signals/account-signals?api-version=2026-08-26.preview>
- gotchas: "Availability: public preview"; "Prerequisite: The release note describes these APIs as public preview. The readable Account Signals page says terminal docs require Stripe CLI v1.43.3+ and points to CLI installation."

### Stripe v2 Payout Methods can be disabled for outbound money movement (2026-08-26)
- slug: stripe-v2-payout-methods-can-be-disabled-for-outbound-money-movement-b88a4cb8ffc9
- score: 0.90

How to use it:

When processing v2 Payout Methods for payments or transfers, handle `usage_status` values including `disabled`. To stop outbound use, disable the Payout Method; to re-enable it, create a new Outbound Setup Intent.

- why_it_matters: When maintaining an integration that uses v2 Payout Methods for outbound payments or transfers, handle payout methods whose usage_status is disabled.
- sources: <https://docs.stripe.com/changelog/dahlia/2026-08-26/disable-payout-methods>, <https://docs.stripe.com/api/v2/money-management/payout-methods/object?api-version=2026-08-26.preview>, <https://docs.stripe.com/api/v2/money-management/payout-methods?api-version=2026-08-26.preview>
- gotchas: "usage_status: Object indicating whether the Payout Method meets requirements for outbound money movement. The retrieved object example shows `payments` and `transfers` values as `eligible`. The docs page did not expose the allowed values for these sub-keys."; "Payout Method disable endpoint (required): `POST /v2/money_management/payout_methods/:id/disable`; endpoint parameters and runnable example were not accessible in the official docs page."; "A disabled payout method is unavailable for outbound money movement."; "The disabled status is non-terminal; re-enabling requires creating a new Outbound Setup Intent."; "Integrations that do not handle usage_status=disabled for payments and transfers might experience unexpected failures."

### Reject connected accounts with non-zero balances and control payout pausing (2026-07-29)
- slug: reject-connected-accounts-with-non-zero-balances-and-control-payout-pausing-d349c84c2274
- score: 0.95

How to use it:

When rejecting a connected account, call the Reject an account endpoint; for accounts with any balance, use `payouts_action=none` to keep payouts enabled, or omit it to use the default `pause` behavior.

Examples:

```
curl https://api.stripe.com/v1/accounts/<account_id>/reject \
  -u "<secret_key>:" \
  -d reason=fraud \
  -d payouts_action=none
```

```
curl https://api.stripe.com/v1/accounts/<account_id>/reject \
  -u "<secret_key>:" \
  -d reason=fraud
```

- why_it_matters: When maintaining an integration that rejects connected accounts, reject an account with a non-zero balance or keep payouts enabled after rejection.
- before: Before the change, rejecting an account with a non-zero balance returned an error, and payouts were always paused during rejection.
- sources: <https://docs.stripe.com/changelog/dahlia/2026-07-29/reject-connected-accounts-with-non-zero-balances>, <https://docs.stripe.com/api/account/reject?api-version=2026-07-29.dahlia>
- gotchas: "account_id (required): Account ID in the endpoint path."; "reason (required): Reason for rejection: `fraud`, `terms_of_service`, or `other`."; "payouts_action: `pause` (default) pauses payouts during rejection; `none` leaves payouts enabled."; "Prerequisite: Reject is available for connected accounts where the platform is liable for negative balances, including Custom and Express accounts. The API reference says test-mode accounts can be rejected at any time."; "Prerequisite: Authenticate the request with a Stripe secret key."; "Docs conflict: The API reference available to search says live-mode accounts can only be rejected after all balances are zero and only documents `reason`; this conflicts with the 2026-07-29 Dahlia release note. The endpoint page could not be accessed with the Dahlia version parameter, so those older reference details are not applied here."

### Stripe API adds Unreject an account for platform-initiated rejections (2026-07-29)
- slug: stripe-api-adds-unreject-an-account-for-platform-initiated-rejections-cb058767a8c0
- score: 0.98

How to use it:

If a connected account is currently rejected by your platform, POST to the unreject endpoint to reverse that rejection. This re-enables charges and payouts only when no separate restrictions remain, and reverts the account’s application state.

Examples:

```
curl -X POST https://api.stripe.com/v1/accounts/<ACCOUNT_ID>/unreject \
  -u "<YOUR_SECRET_KEY>" \
  -H "Stripe-Version: 2026-07-29.dahlia"
```

- why_it_matters: If a connected account was rejected by your platform and needs re-enabling after merchant remediation or a false positive, reverse the rejection.
- before: Reversing a rejection required contacting Stripe support.
- sources: <https://docs.stripe.com/changelog/dahlia/2026-07-29/unreject-connected-account-endpoint>, <https://docs.stripe.com/api/account/unreject?api-version=2026-07-29.dahlia>
- gotchas: "ACCOUNT_ID (required): Path parameter identifying the account to unreject."; "YOUR_SECRET_KEY (required): Stripe secret key used for request authentication."; "Stripe-Version (required): Request header specifying API version; the release note documents 2026-07-29.dahlia."; "Prerequisite: The account must currently be rejected by your platform; Stripe-rejected accounts and accounts that are not currently rejected return an error."; "Prerequisite: Separate pauses on charges or payouts remain after unrejection; only restrictions caused by the rejection are removed."; "Only rejections initiated by your platform can be reversed; Stripe-initiated rejections cannot be reversed through this endpoint."

### Stripe Financial Connections deactivation webhook events (2026-07-29)
- slug: stripe-financial-connections-deactivation-webhook-events-5b14ced3b19e
- score: 0.91

How to use it:

If the integration needs advance warning of Financial Connections deactivation, subscribe the webhook endpoint to the four deactivation events. Handle each event’s `data.object` and prepare for deactivation, such as by prompting users to relink when appropriate.

Examples:

```
curl https://api.stripe.com/v1/webhook_endpoints \
  -u "<YOUR_SECRET_KEY>:" \
  -d "enabled_events[]=financial_connections.account.expected_deactivation_date_updated" \
  -d "enabled_events[]=financial_connections.account.upcoming_deactivation" \
  -d "enabled_events[]=financial_connections.authorization.expected_deactivation_date_updated" \
  -d "enabled_events[]=financial_connections.authorization.upcoming_deactivation" \
  --data-urlencode "url=https://<YOUR_DOMAIN>/<WEBHOOK_PATH>"
```

- why_it_matters: When maintaining an integration that needs to respond to Financial Connections account or authorization deactivation, subscribe to the new webhook events and handle their payloads.
- sources: <https://docs.stripe.com/changelog/dahlia/2026-07-29/financial-connections-deactivation-event-notifications>, <https://docs.stripe.com/api/webhook_endpoints/create>, <https://docs.stripe.com/webhooks>
- gotchas: "url (required): HTTPS URL for the webhook endpoint."; "enabled_events (required): Event types enabled for this endpoint; specify each event as an array entry. The four deactivation event types were added for webhook endpoint creation and updates."; "financial_connections.account.expected_deactivation_date_updated: Event sent when an Account’s expected deactivation date is set or updated; payload contains the updated Account object."; "financial_connections.account.upcoming_deactivation: Event sent 30 days before an Account is expected to become inactive; payload contains the Account object."; "financial_connections.authorization.expected_deactivation_date_updated: Event sent when an Authorization’s expected deactivation date is set or updated; payload contains the updated Authorization object."; "financial_connections.authorization.upcoming_deactivation: Event sent 30 days before an Authorization is expected to become inactive; payload contains the Authorization object."; "Prerequisite: Provide a publicly accessible HTTPS URL for the registered webhook endpoint."; "Prerequisite: Authenticate the API request with a Stripe secret key."; "Upcoming deactivation events are sent 30 days before an Account or Authorization is expected to become `inactive`."; "Expected deactivation date updated events are sent when the expected deactivation date is set or updated."; "Event payloads contain the relevant updated Account or Authorization object."

### Stripe Financial Connections sessions add explicit configuration options (2026-07-29)
- slug: stripe-financial-connections-sessions-add-explicit-configuration-options-c6427339e4c7
- score: 0.94

How to use it:

When a session must tailor collected accounts or the authentication fallback, create it with `filters.require_payment_method_support`, `limits.accounts`, and `manual_entry.mode` as needed. After manual entry, use the returned `bank_account_token`; subscribe to the eligibility update event when you need notice of confirmed payment eligibility.

Examples:

```
curl https://api.stripe.com/v1/financial_connections/sessions \
  -u "<SECRET_KEY>:" \
  -H "Stripe-Version: 2026-07-29.dahlia" \
  -d "account_holder[type]"=customer \
  -d "account_holder[customer]"=<CUSTOMER_ID> \
  -d "permissions[]"=payment_method \
  -d "filters[require_payment_method_support]"=at_least_one \
  -d "limits[accounts]"=<MAX_ACCOUNTS> \
  -d "manual_entry[mode]"=automatic
```

```
curl https://api.stripe.com/v1/webhook_endpoints \
  -u "<SECRET_KEY>:" \
  -d "url"=<WEBHOOK_URL> \
  -d "enabled_events[]"=financial_connections.account.supported_payment_method_types_updated
```

- why_it_matters: Configure a Financial Connections session to collect accounts and handle authentication according to the integration’s use case.
- before: Session behavior was implicitly determined by account holder type.
- sources: <https://docs.stripe.com/changelog/dahlia/2026-07-29/financial-connections-advanced-session-config>, <https://docs.stripe.com/api/webhook_endpoints/create?api-version=2026-07-29.dahlia>
- gotchas: "Version: 2026-07-29.dahlia"; "filters.require_payment_method_support: Restricts account selection: `all` makes every linked account payment-eligible; `at_least_one` makes at least one payment-eligible while allowing others; `none` imposes no restriction."; "limits.accounts: Maximum number of accounts a user can link in a session."; "manual_entry.mode: Controls manual bank entry fallback: `automatic` lets Stripe manage it; `disabled` removes the option. These values are alternatives."; "bank_account_token: Returned on the Session object when the user completes manual entry."; "enabled_events[] (required): Webhook event types to enable; include `financial_connections.account.supported_payment_method_types_updated` for payment eligibility notifications."; "Prerequisite: For the new options, use API version `2026-07-29.dahlia`; Stripe says to upgrade SDKs to the corresponding version if used, or send the `Stripe-Version` header for direct API requests. Upgrade the webhook endpoint API version as well."; "`filters.require_payment_method_support` accepts `all`, `at_least_one`, or `none`."; "`manual_entry.mode` accepts `automatic` or `disabled`."; "`bank_account_token` is returned when a user completes manual entry."

### Stripe FPX adds BNP Paribas, Citibank, and MBSB Bank values (2026-07-29)
- slug: stripe-fpx-adds-bnp-paribas-citibank-and-mbsb-bank-values-45e8a4337a3e
- score: 0.92

How to use it:

For BNP Paribas or Citibank B2B payments, create an FPX PaymentMethod with the corresponding `bank` value; for MBSB Bank B2B or B2C payments, use `mbsb_bank`.

Examples:

```
curl https://api.stripe.com/v1/payment_methods \
  -u "<YOUR_SECRET_KEY>" \
  -H "Stripe-Version: 2026-07-29.dahlia" \
  -d type=fpx \
  -d fpx[bank]=<bnp_paribas|citibank|mbsb_bank>
```

- why_it_matters: Update an FPX integration to accept payments from BNP Paribas or Citibank business customers, or from MBSB Bank business and consumer customers.
- before: The integration could not pass these newly added bank values to accept FPX payments from these customers.
- sources: <https://docs.stripe.com/changelog/dahlia/2026-07-29/fpx-payments-new-banks>, <https://docs.stripe.com/api/payment_methods/create?api-version=2026-07-29.dahlia>, <https://docs.stripe.com/changelog/dahlia/2026-07-29/fpx-payments>, <https://docs.stripe.com/payments/fpx>
- gotchas: "type (required): PaymentMethod type; use `fpx` for FPX."; "fpx[bank]: For BNP Paribas or Citibank B2B, pass `bnp_paribas` or `citibank`; for MBSB Bank B2B or B2C, pass `mbsb_bank`. The release note does not state whether this parameter is required."; "Prerequisite: FPX is available to Stripe accounts in Malaysia; the business must provide its Business Registration Number to process FPX charges and receive payouts."; "BNP Paribas and Citibank are supported for B2B transactions."; "MBSB Bank is supported for both B2B and B2C transactions."

### Stripe hosted invoice page supports MB WAY (2026-07-29)
- slug: stripe-hosted-invoice-page-supports-mb-way-d1beef856979
- score: 0.97

How to use it:

For EUR invoices or subscriptions paid through Stripe’s hosted invoice page, set `collection_method` to `send_invoice` and enable MB WAY in the Dashboard or via `payment_settings.payment_method_types`. Customers authorize each payment on the hosted invoice page.

Examples:

```
curl https://api.stripe.com/v1/invoices -u "<SECRET_KEY>" -H "Stripe-Version: 2026-07-29.dahlia" -d customer=<CUSTOMER_ID> -d collection_method=send_invoice -d "payment_settings[payment_method_types][]=mb_way"
```

```
curl https://api.stripe.com/v1/subscriptions -u "<SECRET_KEY>" -H "Stripe-Version: 2026-07-29.dahlia" -d customer=<CUSTOMER_ID> -d "items[0][price]=<PRICE_ID>" -d collection_method=send_invoice -d "payment_settings[payment_method_types][]=mb_way"
```

- why_it_matters: When configuring invoices or subscriptions for customers paying in EUR through the hosted invoice page, enable MB WAY with invoice-based collection.
- sources: <https://docs.stripe.com/changelog/dahlia/2026-07-29/hosted-invoice-page-mb-way-support>, <https://docs.stripe.com/api/invoices/create>, <https://docs.stripe.com/api/subscriptions/create?api-version=2026-07-29.dahlia>, <https://docs.stripe.com/payments/mb-way>
- gotchas: "collection_method (required): Set to `send_invoice`; MB WAY invoices and subscriptions require this collection method. The API parameter is optional generally."; "payment_settings.payment_method_types (required): Array of payment method types to provide to the invoice’s PaymentIntent; set to `mb_way`. The API parameter is optional generally."; "payment_settings: Subscription payment settings passed to invoices created by the subscription."; "customer (required): Customer identifier; required to create a subscription."; "items (required): Subscription items with attached prices; up to 20."; "payment_settings.payment_method_types[]: Invoice API documents this as an optional list of payment method types for the invoice’s PaymentIntent. `mb_way` was not found in the opened API reference."; "Prerequisite: MB WAY supports EUR presentment; Stripe accounts in supported business locations can accept it. Invoices and subscriptions support MB WAY only with `send_invoice`."; "Prerequisite: Subscription creation requires a customer and at least one item with an attached price."; "MB WAY supports EUR payments."; "MB WAY requires customer authorization for each payment and is only available with the `send_invoice` collection method; customers complete payment through the hosted invoice page."

### Stripe invoices and subscriptions accept Alipay with send_invoice collection (2026-07-29)
- slug: stripe-invoices-and-subscriptions-accept-alipay-with-send-invoice-collection-9554cc9ec1e9
- score: 0.92

How to use it:

When an invoice or subscription uses `collection_method=send_invoice`, set `payment_settings.payment_method_types` to include `alipay`. For an existing object, update that setting on the Invoice or Subscription.

Examples:

```
curl https://api.stripe.com/v1/subscriptions \
  -u "<SECRET_KEY>:" \
  -H "Stripe-Version: 2026-07-29.dahlia" \
  -d customer=<CUSTOMER_ID> \
  -d collection_method=send_invoice \
  -d days_until_due=<DAYS> \
  -d "items[0][price]=<PRICE_ID>" \
  -d "payment_settings[payment_method_types][0]=alipay"
```

```
curl -X POST https://api.stripe.com/v1/invoices/<INVOICE_ID> \
  -u "<SECRET_KEY>:" \
  -H "Stripe-Version: 2026-07-29.dahlia" \
  -d "payment_settings[payment_method_types][0]=alipay"
```

```
curl -X POST https://api.stripe.com/v1/subscriptions/<SUBSCRIPTION_ID> \
  -u "<SECRET_KEY>:" \
  -H "Stripe-Version: 2026-07-29.dahlia" \
  -d "payment_settings[payment_method_types][0]=alipay"
```

- why_it_matters: Configure an invoice or subscription to accept Alipay when collecting payment by sending an invoice.
- sources: <https://docs.stripe.com/changelog/dahlia/2026-07-29/alipay-support-for-invoices-and-subscriptions-with-sendinvoice-collection>, <https://docs.stripe.com/api/subscriptions/create?api-version=2026-07-29.dahlia>, <https://docs.stripe.com/payments/alipay>
- gotchas: "collection_method: Use `send_invoice` for Alipay; for subscriptions, `days_until_due` is also valid only with this collection method."; "payment_settings.payment_method_types: List of payment method types to provide to the invoice’s PaymentIntent. Include `alipay`."; "payment_settings.payment_method_types[]: Array entry containing the payment method type; set an entry to `alipay`. Sub-key details and whether this conflicts with other payment settings were not found in the accessible current-version docs."; "Prerequisite: Creating a subscription requires an existing customer and price; the documented create request also requires subscription items. `days_until_due` applies when collection method is `send_invoice`."; "Prerequisite: Stripe’s Alipay guide says to enable Alipay in the Dashboard. Business eligibility restrictions apply; recurring payments require approval."; "For both Invoice and Subscription objects, `alipay` is only supported when `collection_method` is `send_invoice`."

### Stripe Payment Intents and Setup Intents add allowed_payment_method_types (2026-07-29)
- slug: stripe-payment-intents-and-setup-intents-add-allowed-payment-method-types-22ca61ab1793
- score: 0.97

How to use it:

When an integration manually specifies accepted payment methods and wants Stripe to filter incompatible types, use `allowed_payment_method_types` on PaymentIntent and SetupIntent create, update, or confirm calls. Pass the existing type array, remove incompatible-method error handling, and read the response `payment_method_types` for the compatible subset.

Examples:

```
curl https://api.stripe.com/v1/setup_intents \
  -u "<YOUR_SECRET_KEY>" \
  -H "Stripe-Version: 2026-07-29.dahlia" \
  -d "allowed_payment_method_types[]=card"
```

```
curl https://api.stripe.com/v1/payment_intents/<PAYMENT_INTENT_ID> \
  -u "<YOUR_SECRET_KEY>" \
  -H "Stripe-Version: 2026-07-29.dahlia" \
  -d "allowed_payment_method_types[]=card"
```

- why_it_matters: When updating an integration to accept a set of payment methods while allowing Stripe to filter incompatible types, migrate the relevant intent calls to the new parameter.
- before: Use `payment_method_types` to specify accepted methods; incompatible methods return an error.
- sources: <https://docs.stripe.com/changelog/dahlia/2026-07-29/allowed-payment-method-types-parameter>, <https://docs.stripe.com/api/setup_intents/create?api-version=2026-07-29.dahlia>, <https://docs.stripe.com/api/payment_intents/update?api-version=2026-07-29.dahlia>, <https://docs.stripe.com/api/setup_intents/object?api-version=2026-07-29.dahlia>
- gotchas: "allowed_payment_method_types: Array of allowed payment method type enums; Stripe uses only types in the list when determining the types to offer. Mutually exclusive with `payment_method_types`, `excluded_payment_method_types`, `automatic_payment_methods`, and `payment_method_configuration`."; "payment_method_types: Response property containing the resulting payment method types."; "Prerequisite: Use the Stripe API version `2026-07-29.dahlia` for the documented request shape; authenticate with a secret key."; "`allowed_payment_method_types` accepts an array of payment method types and filters it to methods compatible with parameters such as `currency`, `amount`, and `customer`."; "The response `payment_method_types` property reflects the resulting compatible subset."; "`allowed_payment_method_types` is mutually exclusive with `payment_method_types`, `excluded_payment_method_types`, `automatic_payment_methods`, and `payment_method_configuration`."

### Stripe Payment Link update endpoint accepts setup_future_usage (2026-07-29)
- slug: stripe-payment-link-update-endpoint-accepts-setup-future-usage-73c45f1f544d
- score: 0.91

How to use it:

When updating an existing Payment Link, set `payment_intent_data.setup_future_usage` to `on_session` or `off_session` to indicate the intended reuse of the payment method collected during Checkout.

Examples:

```
curl https://api.stripe.com/v1/payment_links/<PAYMENT_LINK_ID> \
  -u "<YOUR_SECRET_KEY>:" \
  -H "Stripe-Version: 2026-07-29.dahlia" \
  -d "payment_intent_data[setup_future_usage]=off_session"
```

- why_it_matters: Set future payment method reuse behavior when updating an existing Payment Link.
- before: Requests including `payment_intent_data.setup_future_usage` returned a 400 error before this change.
- sources: <https://docs.stripe.com/changelog/dahlia/2026-07-29/payment-links-update-endpoint-new-parameters>, <https://docs.stripe.com/api/payment-link/update?api-version=2026-07-29.dahlia>
- gotchas: "payment_intent_data: Subset of parameters passed to PaymentIntent creation for Checkout Sessions in `payment` mode."; "payment_intent_data.setup_future_usage: Set to `on_session` or `off_session` to indicate intended reuse of the payment method collected during Checkout. The future usage docs recommend `off_session` when payments may occur both on and off session."; "Prerequisite: A Payment Link ID and Stripe secret key are needed for the documented update request. This API parameter applies to Checkout Sessions in `payment` mode."; "The value indicates how the payment method collected during the Checkout Session is intended to be reused."

### Stripe Payment Link update endpoint adds shipping, consent, and future-usage parameters (2026-07-29)
- slug: stripe-payment-link-update-endpoint-adds-shipping-consent-and-future-usage-param-53f27274d051
- score: 0.97

How to use it:

When updating an existing Payment Link, send the needed `shipping_options`, `consent_collection`, or `payment_intent_data.setup_future_usage` fields. Use the documented values for future usage; the update API requires the Payment Link ID and secret-key authentication.

Examples:

```
curl https://api.stripe.com/v1/payment_links/<PAYMENT_LINK_ID> \
  -u "<YOUR_SECRET_KEY>" \
  -H "Stripe-Version: 2026-07-29.dahlia" \
  -d "shipping_options[0][shipping_rate]=<SHIPPING_RATE_ID>"
```

```
curl https://api.stripe.com/v1/payment_links/<PAYMENT_LINK_ID> \
  -u "<YOUR_SECRET_KEY>" \
  -H "Stripe-Version: 2026-07-29.dahlia" \
  -d "payment_intent_data[setup_future_usage]=off_session"
```

```
curl https://api.stripe.com/v1/payment_links/<PAYMENT_LINK_ID> \
  -u "<YOUR_SECRET_KEY>" \
  -H "Stripe-Version: 2026-07-29.dahlia" \
  -d "consent_collection[promotions]=auto"
```

- why_it_matters: Update an existing Payment Link's shipping options, consent settings, or payment method reuse behavior through the API.
- before: These parameters were previously configurable only through the Dashboard; requests including `payment_intent_data.setup_future_usage` returned HTTP 400.
- sources: <https://docs.stripe.com/changelog/dahlia/2026-07-29/payment-links-update-endpoint-new-parameters>, <https://docs.stripe.com/api/payment-link/update?api-version=2026-07-29.dahlia>
- gotchas: "<PAYMENT_LINK_ID> (required): ID of the Payment Link to update."; "<YOUR_SECRET_KEY> (required): Stripe secret API key used for HTTP basic authentication."; "shipping_options: Shipping rate options applied to checkout sessions created by the Payment Link; release note specifies up to five objects and empty array removes all options."; "shipping_options[].shipping_rate (required): Existing Shipping Rate ID for the shipping option, per the release note."; "consent_collection: Optional object to configure active customer consent collection."; "consent_collection.payment_method_reuse_agreement.position: Controls where the payment method reuse agreement is displayed; allowed values not found."; "consent_collection.promotions: Controls whether to display a promotional communications consent checkbox; allowed values not found."; "consent_collection.terms_of_service: Controls whether to display a terms of service acceptance checkbox; allowed values not found."; "payment_intent_data.setup_future_usage: Indicates whether payment methods collected during checkout are intended for reuse; release note allows `on_session` or `off_session`."; "Prerequisite: Authenticate the request with a Stripe secret key and provide the Payment Link ID."; "Prerequisite: A Payment Link must already exist. Stripe's page prerequisite example creates a Price and then a Payment Link."; "Prerequisite: Each shipping rate must already exist, per the release note."; "Each shipping_options array can contain up to five shipping rate objects, each referencing an existing Shipping Rate ID."; "payment_intent_data.setup_future_usage accepts `on_session` or `off_session`."; "The consent settings described are payment method reuse agreement position, promotions consent checkbox, and terms of service checkbox."

### Stripe SharedPaymentToken adds redirect_to_url next actions (2026-07-29)
- slug: stripe-sharedpaymenttoken-adds-redirect-to-url-next-actions-93c027e2686d
- score: 0.96

How to use it:

When an integration handles Shared Payment Token or requested Delegated Checkout Session next actions, set `use_stripe_sdk` according to whether a Stripe client-side SDK handles them. When handling outside a client-side SDK, provide `return_url` and accept either `use_stripe_sdk` or `redirect_to_url` as `next_action.type`.

Examples:

```
curl https://api.stripe.com/v1/shared_payment/issued_tokens -u "<YOUR_SECRET_KEY>" -H "Stripe-Version: 2026-07-29.preview" -d payment_method=<PAYMENT_METHOD_ID> -d "seller_details[network_business_profile]=<PROFILE_ID>" -d "usage_limits[currency]=usd" -d "usage_limits[expires_at]=<UNIX_TIMESTAMP>" -d "usage_limits[max_amount]=<AMOUNT>" -d use_stripe_sdk=true
```

```
curl https://api.stripe.com/v1/shared_payment/issued_tokens -u "<YOUR_SECRET_KEY>" -H "Stripe-Version: 2026-07-29.preview" -d payment_method=<PAYMENT_METHOD_ID> -d "seller_details[network_business_profile]=<PROFILE_ID>" -d "usage_limits[currency]=usd" -d "usage_limits[expires_at]=<UNIX_TIMESTAMP>" -d "usage_limits[max_amount]=<AMOUNT>" -d use_stripe_sdk=false -d return_url=<RETURN_URL>
```

- why_it_matters: Update an integration that creates Shared Payment Tokens or confirms requested Delegated Checkout Sessions to handle 3DS next actions.
- before: `next_action.type` on SharedPaymentToken returned only `use_stripe_sdk`; integrations using client-side SDKs did not set `use_stripe_sdk` when creating a Shared Payment Token or confirming a requested Delegated Checkout Session.
- sources: <https://docs.stripe.com/changelog/dahlia/2026-07-29/spts-next-action-support>, <https://docs.stripe.com/api/shared-payment/issued-token/create?api-version=2026-07-29.preview>, <https://docs.stripe.com/api/delegated-checkout/requested-session/confirm?api-version=2026-07-29.preview>
- gotchas: "use_stripe_sdk: Optional boolean on SharedPaymentIssuedToken creation. Set true when Stripe.js, iOS, or Android client-side SDKs handle next actions. Release note says false requires `return_url`."; "return_url (required): Required by the release note when `use_stripe_sdk` is false; parameter definition not independently verified in the accessible API page."; "next_action.type: Release note says it can be `use_stripe_sdk` or `redirect_to_url`; handle both values."; "Prerequisite: Create a PaymentMethod first; the create page example uses a US bank account PaymentMethod."; "Prerequisite: The create request example requires `payment_method`, `seller_details`, and `usage_limits`."; "When `use_stripe_sdk` is `false`, a `return_url` is required."; "`redirect_to_url` is returned for 3DS authentication flows when `use_stripe_sdk` is `false`."; "`next_action.type` can now be either `use_stripe_sdk` or `redirect_to_url`; integrations that only handle `use_stripe_sdk` may need to update their logic."

### Stripe Top-ups accept US bank account PaymentMethods (2026-07-29)
- slug: stripe-top-ups-accept-us-bank-account-paymentmethods-27298d0a2e9e
- score: 0.96

How to use it:

For US top-ups using the API version that adds PaymentMethod support, create the top-up with a `us_bank_account` PaymentMethod ID in `payment_method`. Optionally set `payment_method_options.us_bank_account.network`; it defaults to `ach`.

Examples:

```
curl https://api.stripe.com/v1/topups \
  -u "<YOUR_SECRET_KEY>" \
  -H "Stripe-Version: 2026-07-29.dahlia" \
  -d amount=<AMOUNT_IN_MINOR_UNITS> \
  -d currency=<SUPPORTED_CURRENCY> \
  -d payment_method=<US_BANK_ACCOUNT_PAYMENT_METHOD_ID> \
  -d "payment_method_options[us_bank_account][network]=<NETWORK>"
```

- why_it_matters: Create and manage US top-ups using the Payment Methods API.
- before: Use the Sources API when creating and managing US top-ups.
- sources: <https://docs.stripe.com/changelog/dahlia/2026-07-29/adds-payment-method-support-to-top-ups>, <https://docs.stripe.com/api/topups/create?__=>
- gotchas: "amount (required): Positive integer amount to transfer."; "currency (required): Lowercase supported three-letter ISO currency code."; "payment_method: ID of the PaymentMethod to use; for this change, its type must be `us_bank_account`."; "payment_method_options: Object containing top-up payment-method-specific configuration."; "payment_method_options.us_bank_account.network: US bank transfer network; defaults to `ach`. The docs retrieved do not enumerate allowed values for this top-up parameter."; "Prerequisite: Use API version `2026-07-29.dahlia` or later for this behavior. For REST requests, Stripe's upgrade instructions say to send the version in the `Stripe-Version` header."; "Applies to top-ups in the US."; "Currently supports only `us_bank_account` payment method types."

### Stripe Checkout Sessions accept billing_cycle_anchor_config (2026-06-24)
- slug: stripe-checkout-sessions-accept-billing-cycle-anchor-config-b1f560f9ed6d
- score: 0.95

How to use it:

When creating a Checkout Session for a recurring subscription, set `mode=subscription` and `subscription_data[billing_cycle_anchor_config][day_of_month]` to the desired billing day. The `day_of_month` field is required; `hour`, `minute`, `month`, and `second` are optional, and this configuration cannot be combined with `billing_cycle_anchor` or trial period parameters.

Examples:

```
curl https://api.stripe.com/v1/checkout/sessions -u "<SECRET_KEY>" -H "Stripe-Version: 2026-06-24.dahlia" --data-urlencode "success_url=https://example.com/success" -d "line_items[0][price]=<RECURRING_PRICE_ID>" -d "line_items[0][quantity]=1" -d "mode=subscription" -d "subscription_data[billing_cycle_anchor_config][day_of_month]=<DAY_OF_MONTH>"
```

- why_it_matters: When implementing subscription-mode Checkout Session creation that aligns subscribers to a fixed billing date, configure the session's billing cycle anchor.
- sources: <https://docs.stripe.com/changelog/dahlia/2026-06-24/checkout-sessions-billing-cycle-anchor-config>, <https://docs.stripe.com/api/checkout/sessions/create?api-version=2026-06-24.dahlia>
- gotchas: "mode (required): Set to `subscription` to use Stripe Billing for fixed-price subscriptions."; "line_items (required): Required for subscription mode; pass recurring Price items."; "subscription_data[billing_cycle_anchor_config][day_of_month] (required): Required day of month for the configured billing cycle anchor."; "subscription_data[billing_cycle_anchor_config][hour]: Optional hour for the configured billing cycle anchor."; "subscription_data[billing_cycle_anchor_config][minute]: Optional minute for the configured billing cycle anchor."; "subscription_data[billing_cycle_anchor_config][month]: Optional month for the configured billing cycle anchor."; "subscription_data[billing_cycle_anchor_config][second]: Optional second for the configured billing cycle anchor."; "subscription_data[billing_cycle_anchor_config]: Configuration is mutually exclusive with `subscription_data[billing_cycle_anchor]` and any trial period parameters."; "Prerequisite: Create a recurring Price and use its ID in `line_items`; the API reference shows creating a monthly USD Price before creating the Checkout Session."; "Prerequisite: Authenticate the API request with a Stripe secret key."; "Available for Checkout Sessions in subscription mode."; "`day_of_month` is required; `hour`, `minute`, `month`, and `second` are optional."; "`billing_cycle_anchor_config` is mutually exclusive with `billing_cycle_anchor` and any trial period parameters."

### Stripe invoice preview supports subscription pauses (2026-06-24)
- slug: stripe-invoice-preview-supports-subscription-pauses-06f65aeb5a26
- score: 0.97

How to use it:

When previewing a subscription pause, create a preview invoice with `subscription_details.pause`, `invoicing_behavior=invoice`, and `bill_for` settings that produce billable unused time or metered usage. Use the returned preview invoice and expanded projected subscription state; the preview does not modify the subscription.

Examples:

```
curl https://api.stripe.com/v1/invoices/create_preview \
  -u "<<YOUR_SECRET_KEY>>:" \
  -d subscription=<SUBSCRIPTION_ID> \
  -d "subscription_details[pause][invoicing_behavior]=invoice" \
  -d "subscription_details[pause][bill_for][unused_time_from][type]=now" \
  -d "subscription_details[pause][bill_for][outstanding_usage_through][type]=now" \
  -d "expand[]=parent.subscription_details.subscription"
```

- why_it_matters: When implementing subscription pausing, preview the billing impact and projected subscription state before changing the subscription.
- sources: <https://docs.stripe.com/changelog/dahlia/2026-06-24/preview-invoices-before-pausing-subscription>, <https://docs.stripe.com/billing/subscriptions/pause#preview-the-invoice-before-pausing>, <https://docs.stripe.com/api/invoices/create_preview?api-version=2026-06-24.preview>, <https://docs.stripe.com/billing/subscriptions/pause#how-pausing-affects-billing>, <https://docs.stripe.com/billing/subscriptions/pause#before-you-begin>
- gotchas: "Availability: Preview API version 2026-06-24.preview"; "subscription (required): Subscription identifier for the upcoming invoice preview."; "subscription_details.pause.invoicing_behavior (required): Set to `invoice` to receive a preview invoice; `pending_invoice_item` returns 404."; "subscription_details.pause.bill_for.unused_time_from.type (required): `now` credits unused licensed time from pause time; `item_current_period_start` credits from each item's period start; `none` does not credit unused time."; "subscription_details.pause.bill_for.outstanding_usage_through.type (required): `now` bills metered usage from current period start through pause time; `none` does not bill current-period metered usage."; "expand[]: Set to `parent.subscription_details.subscription` to see the projected subscription state after pausing; these changes do not persist."; "Prerequisite: For a restricted API key, grant `invoice_read` to preview invoices."; "Prerequisite: A valid subscription/customer must be provided; preview invoice creation requires valid customer information."; "`invoicing_behavior` must be `invoice` to receive a preview invoice; `pending_invoice_item` returns a 404 error."; "`bill_for` must produce billable amounts for unused licensed time or outstanding metered usage; if pausing would not create debits or credits, the endpoint returns a 404 error."

### Stripe Subscriptions API supports invoice description, footer, and custom_fields (2026-06-24)
- slug: stripe-subscriptions-api-supports-invoice-description-footer-and-custom-fields-2d0601f4f03d
- score: 0.99

How to use it:

When setting details on subscription-generated invoices, set `invoice_settings.description`, `invoice_settings.footer`, and `invoice_settings.custom_fields` when creating or updating a Subscription; retrieve the Subscription to read them.

Examples:

```
curl https://api.stripe.com/v1/subscriptions \
  -u "<YOUR_SECRET_KEY>" \
  -H "Stripe-Version: 2026-06-24.dahlia" \
  -d "customer=<CUSTOMER_ID>" \
  -d "items[0][price]=<PRICE_ID>" \
  -d "invoice_settings[description]=<DESCRIPTION>" \
  -d "invoice_settings[footer]=<FOOTER>" \
  -d "invoice_settings[custom_fields][0][name]=<FIELD_NAME>" \
  -d "invoice_settings[custom_fields][0][value]=<FIELD_VALUE>"
```

```
curl https://api.stripe.com/v1/subscriptions/<SUBSCRIPTION_ID> \
  -u "<YOUR_SECRET_KEY>" \
  -H "Stripe-Version: 2026-06-24.dahlia" \
  -d "invoice_settings[description]=<DESCRIPTION>" \
  -d "invoice_settings[footer]=<FOOTER>" \
  -d "invoice_settings[custom_fields][0][name]=<FIELD_NAME>" \
  -d "invoice_settings[custom_fields][0][value]=<FIELD_VALUE>"
```

```
curl https://api.stripe.com/v1/subscriptions/<SUBSCRIPTION_ID> \
  -u "<YOUR_SECRET_KEY>" \
  -H "Stripe-Version: 2026-06-24.dahlia"
```

- why_it_matters: Set invoice details for every invoice generated by a subscription when implementing or maintaining subscription billing.
- before: These fields were configurable exclusively in the Stripe Dashboard.
- sources: <https://docs.stripe.com/changelog/dahlia/2026-06-24/invoice-description-footer-and-custom-fields>, <https://docs.stripe.com/api/subscriptions/create?api-version=2026-06-24.dahlia>, <https://docs.stripe.com/api/subscriptions/update?api-version=2026-06-24.dahlia>, <https://docs.stripe.com/api/subscriptions/retrieve?api-version=2026-06-24.dahlia>
- gotchas: "invoice_settings: Optional settings applied to all invoices for the subscription."; "invoice_settings.description: Added as a Subscription invoice_settings parameter; the reference details were not available in the opened documentation."; "invoice_settings.footer: Added as a Subscription invoice_settings parameter; the reference details were not available in the opened documentation."; "invoice_settings.custom_fields: Added as a Subscription invoice_settings parameter; the reference details were not available in the opened documentation."

### Stripe Top-ups API accepts US bank account payment methods (2026-06-24)
- slug: stripe-top-ups-api-accepts-us-bank-account-payment-methods-2b631a2cbafc
- score: 0.97

How to use it:

When creating a top-up funded by a US bank account, pass its `us_bank_account` PaymentMethod ID as `payment_method`; use `payment_method_options` for payment-method-specific configuration. Both parameters are optional.

Examples:

```
curl https://api.stripe.com/v1/topups \
  -u "<YOUR_SECRET_KEY>" \
  -H "Stripe-Version: 2026-06-24.dahlia" \
  -d amount=2000 \
  -d currency=usd \
  -d payment_method=<PAYMENT_METHOD_ID> \
  -d payment_method_options[<DOCUMENTED_OPTION>]=<VALUE>
```

- why_it_matters: Fund a top-up from a US bank account using the Payment Methods API.
- sources: <https://docs.stripe.com/changelog/dahlia/2026-06-24/top-ups-payment-method-support-for-us-bank-accounts>, <https://docs.stripe.com/api/topups/create?api-version=2026-06-24.dahlia>
- gotchas: "amount (required): Positive integer amount to transfer."; "currency (required): Lowercase three-letter ISO currency code; must be supported."; "payment_method: PaymentMethod ID; a PaymentMethod of type `us_bank_account` can be used."; "payment_method_options: Object for payment-method-specific configuration for this top-up. Sub-keys and allowed values were not found in the accessible reference."; "Both parameters are optional."; "Currently only `us_bank_account` payment method types are supported."

### Balance Settings API configures connected-account start_of_day (2026-05-27)
- slug: balance-settings-api-configures-connected-account-start-of-day-910b6a246fc0
- score: 0.91

How to use it:

For an eligible connected account, set `payments[settlement_timing][start_of_day]` when updating its Balance Settings to define the local cutoff used for automatic payout grouping. Use a supported time zone and an allowed hour for the account’s country.

Examples:

```
curl https://api.stripe.com/v1/balance_settings \
  -u "<YOUR_SECRET_KEY>:" \
  -H "Stripe-Account: <CONNECTED_ACCOUNT_ID>" \
  --data-urlencode "payments[settlement_timing][start_of_day][timezone]=<SUPPORTED_TIME_ZONE>" \
  -d "payments[settlement_timing][start_of_day][hour]=<HOUR>" \
  -d "payments[settlement_timing][start_of_day][minutes]=<MINUTES>"
```

- why_it_matters: When aligning a connected account’s payment availability and automatic payout bundling with its local business hours, update that account’s balance settings with a custom daily cutoff.
- before: Connected accounts used the same start-of-day time as their platform.
- sources: <https://docs.stripe.com/changelog/dahlia/2026-05-27/custom-start-of-day>, <https://docs.stripe.com/connect/customized-start-of-day>, <https://docs.stripe.com/api/balance-settings/update?api-version=2026-05-27.dahlia>
- gotchas: "Availability: Currently only available for connected accounts in certain countries."; "Stripe-Account (required): Connected account ID for the Balance Settings update."; "payments[settlement_timing][start_of_day][timezone] (required): Time zone for the custom day; use one supported for the connected account’s country."; "payments[settlement_timing][start_of_day][hour] (required): Start-of-day hour, within the allowed range for the selected time zone and country."; "payments[settlement_timing][start_of_day][minutes] (required): Start-of-day minutes."; "Prerequisite: Feature is available for connected accounts in AU, HK, ID, IN, JP, MY, NZ, SG, and TH; it is in private preview for US connected accounts."; "Prerequisite: Use the connected account’s supported time zone and allowed start-of-day hour range documented for its country."; "Applies per connected account."; "Country availability is restricted to certain countries; the source does not enumerate them."

### Payment Links block specified card brands (2026-05-27)
- slug: payment-links-block-specified-card-brands-2c7d1c2654d1
- score: 0.92

How to use it:

When a Payment Link should reject selected card brands, set `payment_method_options[card][restrictions][brands_blocked]` to the brands to block. Customers using a blocked brand must choose another payment method to complete payment.

Examples:

```
curl https://api.stripe.com/v1/payment_links -u <SECRET_KEY>: -d "line_items[0][price]"=<PRICE_ID> -d "line_items[0][quantity]"=1 -d "payment_method_options[card][restrictions][brands_blocked][0]"=visa
```

```
curl https://api.stripe.com/v1/payment_links/<PAYMENT_LINK_ID> -u <SECRET_KEY>: -d "payment_method_options[card][restrictions][brands_blocked][0]"=visa
```

- why_it_matters: When creating or updating a Payment Link that should reject selected card brands, configure its blocked brands.
- sources: <https://docs.stripe.com/changelog/dahlia/2026-05-27/adds-card-brand-restrictions-to-payment-links>, <https://docs.stripe.com/api/payment-link/create?api-version=2026-05-27.dahlia>, <https://docs.stripe.com/api/payment-link/update?api-version=2026-05-27.dahlia>
- gotchas: "payment_method_options[card][restrictions][brands_blocked]: Array of card brand strings to block. Supported values include `visa`, `mastercard`, `american_express`, and `discover_global_network`. You cannot block all supported card brands in one Payment Link."; "line_items (required): Items being sold; each item represents a product for sale."; "<PAYMENT_LINK_ID> (required): Payment Link identifier in the update endpoint path."; "You can't block all supported card brands in one Payment Link."

### PaymentIntent transfer_data accepts destination payment_data description and metadata (2026-05-27)
- slug: paymentintent-transfer-data-accepts-destination-payment-data-description-and-met-91fbbcaf584a
- score: 0.94

How to use it:

When creating a PaymentIntent with a destination payment, include `transfer_data[payment_data]` to set the destination payment’s description and/or metadata. Use the `2026-05-27.dahlia` API version; description is limited to 5,000 characters and metadata values to 500 characters each.

Examples:

```
curl https://api.stripe.com/v1/payment_intents \
  -u "<YOUR_SECRET_KEY>" \
  -H "Stripe-Version: 2026-05-27.dahlia" \
  -d amount=2000 \
  -d currency=usd \
  -d "transfer_data[destination]=<CONNECTED_ACCOUNT_ID>" \
  -d "transfer_data[payment_data][description]=<DESTINATION_PAYMENT_DESCRIPTION>" \
  -d "transfer_data[payment_data][metadata][<KEY>]=<VALUE>"
```

- why_it_matters: When creating a PaymentIntent with a destination payment, attach a description or payment-specific metadata to that destination payment.
- before: Previously, description and metadata could be set on the transfer, but not on the destination payment created as part of the transfer process.
- sources: <https://docs.stripe.com/changelog/dahlia/2026-05-27/transfer-data-destination-payment-description-and-metadata>, <https://docs.stripe.com/api/payment_intents/create?api-version=2026-05-27.dahlia>, <https://docs.stripe.com/api/payment_intents/create?api-version=2026-05-27.dahlia#create_payment_intent-transfer_data>
- gotchas: "amount (required): Amount to collect in the smallest currency unit."; "currency (required): Lowercase three-letter ISO currency code."; "transfer_data[destination] (required): Connected account that receives the destination payment; the reference marks destination required within transfer_data."; "transfer_data[payment_data][description]: Description for the destination payment; up to 5,000 characters."; "transfer_data[payment_data][metadata][<KEY>]: Standard key-value metadata for the destination payment; each value can be up to 500 characters."; "Prerequisite: Authenticate using a Stripe secret API key. The release documents this feature for API version 2026-05-27.dahlia; requests can specify it with the Stripe-Version header."; "Prerequisite: After creating the PaymentIntent, attach a payment method and confirm it to continue the payment."; "Applies to destination payments when creating transfers through `transfer_data` on PaymentIntent and Charge objects."; "The `payment_data` hash sets properties for the destination payment, separate from the transfer itself."; "Description limit is 5,000 characters."; "Metadata values can be up to 500 characters each and use Stripe’s standard key-value pair format."; "Maintains full backward compatibility with existing integrations."

### Stripe Checkout Sessions adds Contact Details Element for email (2026-05-27)
- slug: stripe-checkout-sessions-adds-contact-details-element-for-email-58bbbb913259
- score: 0.95

How to use it:

When integrating Elements with the Checkout Sessions API, use the Contact Details Element to collect and validate the customer’s email and help them sign in to Link.

Examples:

```
const contactDetailsElement = checkout.createContactDetailsElement();
contactDetailsElement.mount("#contact-details-element");
```

```
<CheckoutElementsProvider clientSecret={clientSecret}>
  <ContactDetailsElement />
</CheckoutElementsProvider>
```

- why_it_matters: When integrating Elements with the Checkout Sessions API, collect and validate a customer's email address without building a custom email form.
- before: Build and validate a custom email input, then use `actions.updateEmail(email)` to update the customer’s email.
- sources: <https://docs.stripe.com/changelog/dahlia/2026-05-27/add-contact-details-element-to-checkout>, <https://docs.stripe.com/js/custom_checkout/create_contact_details_element and https://docs.stripe.com/js/element/mount>, <https://docs.stripe.com/js/react_stripe_js/checkout/contact_details_element and https://docs.stripe.com/js/react_stripe_js/checkout/checkout_provider>, <https://docs.stripe.com/js/custom_checkout/create_contact_details_element>, <https://docs.stripe.com/js/element/mount>, <https://docs.stripe.com/js/react_stripe_js/checkout/checkout_provider>, <https://docs.stripe.com/js/react_stripe_js/checkout/contact_details_element>, <https://docs.stripe.com/payments/quickstart>, <https://docs.stripe.com/payments/quickstart and https://docs.stripe.com/js/react_stripe_js/checkout/contact_details_element>, <https://docs.stripe.com/changelog/dahlia/2026-05-27/add-contact-details-element-to-checkout and https://docs.stripe.com/js/custom_checkout/update_email>
- gotchas: "checkout (required): Checkout instance used to create the element."; "#contact-details-element (required): Selector for the DOM node where the element is mounted."; "clientSecret (required): Checkout Session client secret, or a promise resolving to it; passed to the React CheckoutElementsProvider."; "ContactDetailsElement (required): React component from `@stripe/react-stripe-js/checkout`; render inside CheckoutElementsProvider."; "Prerequisite: Create the Checkout Session server-side with `ui_mode` set to `elements`; return its client secret to the client."; "Prerequisite: For React, install and import React Stripe.js; the ContactDetailsElement must be inside CheckoutElementsProvider."

### Stripe List PaymentMethodConfigurations supports active-status filtering (2026-05-27)
- slug: stripe-list-paymentmethodconfigurations-supports-active-status-filtering-c4885e8278b4
- score: 0.96

How to use it:

When updating payment configuration code or customer-facing payment flows, add `active=true` to the List PaymentMethodConfigurations API request to return active configurations. The release note says `active=false` returns inactive configurations and omitting `active` returns all configurations.

- why_it_matters: When updating payment configuration code or customer-facing payment flows, retrieve only active payment method configurations.
- sources: <https://docs.stripe.com/changelog/dahlia/2026-05-27/payment-method-configurations-active-status-filtering>
- gotchas: "active: Boolean filter: `true` for active configurations, `false` for inactive configurations; omit it to retrieve all configurations."

### Stripe Subscription pending updates accept metadata (2026-05-27)
- slug: stripe-subscription-pending-updates-accept-metadata-e386b3cc643d
- score: 0.97

How to use it:

When a subscription change should wait for payment, update the Subscription or SubscriptionItem with `payment_behavior=pending_if_incomplete` and `metadata`; Stripe applies the metadata when the pending update resolves, merging keys into subscription metadata.

Examples:

```
curl https://api.stripe.com/v1/subscriptions/<SUBSCRIPTION_ID> -u "<YOUR_SECRET_KEY>" -H "Stripe-Version: 2026-05-27.dahlia" -d payment_behavior=pending_if_incomplete -d "metadata[<KEY>]=<VALUE>"
```

```
curl https://api.stripe.com/v1/subscription_items/<SUBSCRIPTION_ITEM_ID> -u "<YOUR_SECRET_KEY>" -H "Stripe-Version: 2026-05-27.dahlia" -d payment_behavior=pending_if_incomplete -d "metadata[<KEY>]=<VALUE>"
```

- why_it_matters: When implementing a subscription update that should remain pending until payment succeeds, attach metadata to the pending update.
- before: Previously, passing `metadata` with `payment_behavior=pending_if_incomplete` returned an error.
- sources: <https://docs.stripe.com/changelog/dahlia/2026-05-27/pending-subscription-update-metadata>, <https://docs.stripe.com/api/subscriptions/update?api-version=2026-05-27.dahlia>, <https://docs.stripe.com/api/subscription_items/update?api-version=2026-05-27.dahlia>, <https://docs.stripe.com/api/subscriptions/object?api-version=2026-05-27.dahlia#subscription_object-pending_update-metadata>
- gotchas: "payment_behavior: Optional enum; set to `pending_if_incomplete` to create a pending update when payment fails. Only supported pending-update attributes can be passed."; "metadata: Optional key-value object; attach keys to the pending update. Applied to subscription metadata when resolved; new and updated keys merge while unrelated keys are preserved."; "<SUBSCRIPTION_ID> (required): ID in the Subscription update path."; "<SUBSCRIPTION_ITEM_ID> (required): ID in the SubscriptionItem update path."; "<YOUR_SECRET_KEY> (required): Stripe secret API key used for request authentication."; "Prerequisite: The update endpoint requires an existing subscription; the SubscriptionItem endpoint requires an existing subscription item. API reference setup examples create a payment method, customer, product, price, and subscription (and a subscription item for the item endpoint)."; "Prerequisite: `pending_if_incomplete` is for updates, and applies only when payment fails; supported attributes and payment methods are limited."; "Metadata is applied when the pending update is resolved."; "Existing integrations that do not pass `metadata` are unaffected."

### Stripe Subscriptions API adds pause and configurable resume behavior (2026-05-27)
- slug: stripe-subscriptions-api-adds-pause-and-configurable-resume-behavior-55a5e85725b0
- score: 0.98

How to use it:

For an active subscription using flexible billing mode, call the pause endpoint to suspend service and invoice generation. Revoke access on `customer.subscription.paused`, restore it on `customer.subscription.resumed`, and choose the resume payment behavior.

Examples:

```
curl https://api.stripe.com/v1/subscriptions/<SUBSCRIPTION_ID>/pause \
  -u "<YOUR_SECRET_KEY>:" \
  -H "Stripe-Version: 2026-05-27.preview" \
  -d type=subscription
```

```
curl https://api.stripe.com/v1/subscriptions/<SUBSCRIPTION_ID>/resume \
  -u "<YOUR_SECRET_KEY>:" \
  -H "Stripe-Version: 2026-05-27.preview" \
  -d payment_behavior=resume_on_payment_success
```

```
curl https://api.stripe.com/v1/subscriptions/<SUBSCRIPTION_ID>/resume \
  -u "<YOUR_SECRET_KEY>:" \
  -H "Stripe-Version: 2026-05-27.preview" \
  -d payment_behavior=resume_on_payment_attempt
```

- why_it_matters: When implementing subscription lifecycle handling for a subscription using flexible billing mode, pause it to suspend service and invoice generation, then restore service when it resumes.
- sources: <https://docs.stripe.com/changelog/dahlia/2026-05-27/pause-subscriptions>, <https://docs.stripe.com/api/subscriptions/pause?api-version=2026-05-27.preview>, <https://docs.stripe.com/api/subscriptions/resume?api-version=2026-05-27.preview>, <https://docs.stripe.com/billing/subscriptions/pause>
- gotchas: "Availability: Public preview"; "type: Pause type; `subscription` pauses collection, billing, and servicing. Defaults to `subscription`."; "payment_behavior: Resume payment behavior; defaults to `resume_on_payment_attempt`. `resume_on_payment_attempt` skips payment during resume; a failed later payment moves the subscription to `past_due`, with no automatic retry. `resume_on_payment_success` attempts payment during resume; on failure the subscription stays paused and Stripe retries failed payments. These are mutually exclusive enum values."; "Prerequisite: The subscription must use flexible billing mode to pause."; "Prerequisite: The subscription must use `charge_automatically` collection to resume."; "Prerequisite: A restricted API key needs `subscription_write` permission to pause or resume subscriptions."; "Pausing requires flexible billing mode."

### Stripe subscriptions support billing schedules for prebilling future periods (2026-05-27)
- slug: stripe-subscriptions-support-billing-schedules-for-prebilling-future-periods-f2717dc788a8
- score: 0.99

How to use it:

When prebilling subscription periods, use `billing_schedules` on create or update to set the end date and target items. Read each subscription item's `billed_until` to see when its prebilled period ends.

Examples:

```
curl https://api.stripe.com/v1/subscriptions -u "<<YOUR_SECRET_KEY>>:" -d "customer={{CUSTOMER_ID}}" -d "items[0][price]={{PRICE_ID}}" -d "billing_mode[type]=flexible" -d "billing_schedules[0][bill_until][type]=duration" -d "billing_schedules[0][bill_until][duration][interval]=month" -d "billing_schedules[0][bill_until][duration][interval_count]=2"
```

```
curl https://api.stripe.com/v1/subscriptions/{{SUBSCRIPTION_ID}} -u "<<YOUR_SECRET_KEY>>:" -d "billing_schedules[0][bill_until][type]=duration" -d "billing_schedules[0][bill_until][duration][interval]=month" -d "billing_schedules[0][bill_until][duration][interval_count]=2"
```

- why_it_matters: When implementing subscription billing that collects payment before a future period begins, create, update, or preview the subscription with a billing schedule and inspect each item's billed_until value.
- sources: <https://docs.stripe.com/changelog/dahlia/2026-05-27/subscriptions-billing-schedules>, <https://docs.stripe.com/billing/subscriptions/prebilling>, <https://docs.stripe.com/api/subscriptions/create?api-version=2026-05-27.dahlia>
- gotchas: "billing_schedules: Array of billing schedule objects for the subscription."; "billing_schedules[].applies_to[].type: Use `price` to target items by price; omit `applies_to` to prebill all applicable licensed-price items."; "billing_schedules[].applies_to[].price: Price ID of an item to prebill when `type=price`."; "billing_schedules[].bill_until.type (required): Select `duration` or `timestamp`; these alternatives are mutually exclusive."; "billing_schedules[].bill_until.duration.interval (required): Duration unit, such as `month`."; "billing_schedules[].bill_until.duration.interval_count (required): Number of duration units."; "billing_schedules[].bill_until.timestamp (required): Unix timestamp for the prebilling end date when `type=timestamp`."; "billing_schedules[].proration_behavior: Controls invoice timing: `always_invoice` generates the prebilling invoice immediately; `create_prorations` generates it at the next natural billing cycle."; "billing_mode[type] (required): Set to `flexible`; prebilling requires flexible billing mode."; "billed_until: Subscription item property showing when that item's prebilled period ends."; "Prerequisite: Prebilling requires flexible billing mode and API version `2026-05-27.dahlia` or later."; "Prerequisite: For an existing subscription, it must already use `billing_mode=flexible`."; "Billing schedules can apply to some or all items in a subscription."; "Docs conflict: The release note says billing schedules can apply to some or all subscription items. The prebilling guide narrows this: all-item prebilling covers applicable licensed-price items; usage-based prices are excluded. The guide also says prebilling cannot be used with subscription schedules or subscriptions backed by one."

### Stripe test clock creation accepts a customer parameter (2026-05-27)
- slug: stripe-test-clock-creation-accepts-a-customer-parameter-298e8b06edda
- score: 0.97

How to use it:

When creating a test clock for API-based testing with an existing customer, pass the customer ID in `customer`; Stripe says an attached customer cannot be removed.

Examples:

```
curl https://api.stripe.com/v1/test_helpers/test_clocks \
  -u "<YOUR_SECRET_KEY>" \
  -H "Stripe-Version: 2026-05-27.dahlia" \
  -d frozen_time=<UNIX_TIMESTAMP> \
  -d customer=<CUSTOMER_ID>
```

- why_it_matters: When automating test clock setup for API-based testing, create the test clock with an existing customer attached.
- before: Use the Dashboard to attach a customer to a test clock.
- sources: <https://docs.stripe.com/changelog/dahlia/2026-05-27/test-clock-creation-customer-parameter>, <https://docs.stripe.com/api/test_clocks/create?api-version=2026-05-27.dahlia>
- gotchas: "frozen_time (required): Timestamp for the test clock’s initial frozen time."; "customer: Existing customer to attach to the test clock; attached customers cannot be removed."; "Stripe-Version (required): Set to `2026-05-27.dahlia` to use the documented API version."; "Prerequisite: Use a Stripe secret key for authentication."; "Prerequisite: Send API requests with `Stripe-Version: 2026-05-27.dahlia` for this version."; "The `customer` parameter accepts an existing customer ID."; "After a customer is attached to a test clock, it cannot be removed."

### Stripe Trial Offers expand end_behavior.transition.price (2026-05-27)
- slug: stripe-trial-offers-expand-end-behavior-transition-price-72e8a0994b6e
- score: 0.94

How to use it:

When creating or retrieving a Trial Offer and you need its transition pricing details, include `end_behavior.transition.price` in the request’s `expand` parameter to receive the full Price object.

- why_it_matters: When retrieving or creating a Trial Offer and you need its transition pricing details, retrieve the full Price object in the response.
- before: The transition price property returned the Price object’s ID as a string.
- sources: <https://docs.stripe.com/changelog/dahlia/2026-05-27/trial-offer-prices-expansion>, <https://docs.stripe.com/api/expanding_objects?api-version=2026-05-27.preview>
- gotchas: "expand[]: end_behavior.transition.price: Expands the nested transition price ID into a full Price object in the response. `expand` accepts multiple entries; the docs do not say entries are mutually exclusive."; "expand: Request parameter that expands an expandable ID into an object in that request’s response."; "The full Price object is returned only when `end_behavior.transition.price` is included in the `expand` parameter; otherwise the field returns the price ID as a string."

### Stripe adds SharedPaymentGrantedToken for agentic commerce (2026-04-22)
- slug: stripe-adds-sharedpaymentgrantedtoken-for-agentic-commerce-df409ea7f58d
- score: 0.98

How to use it:

When an authorized agent shares a token, pass its ID as `payment_method_data.shared_payment_granted_token` when creating and confirming a PaymentIntent. In test mode, create a test token and revoke it to exercise those scenarios.

Examples:

```
curl https://api.stripe.com/v1/test_helpers/shared_payment/granted_tokens -u "<YOUR_SECRET_KEY>" -H "Stripe-Version: 2026-04-22.preview" -d payment_method=<PAYMENT_METHOD_ID> -d "usage_limits[currency]=usd" -d "usage_limits[expires_at]=<UNIX_TIMESTAMP>" -d "usage_limits[max_amount]=1000"
```

```
curl https://api.stripe.com/v1/payment_intents -u "<YOUR_SECRET_KEY>" -H "Stripe-Version: 2026-04-22.preview" -d amount=2000 -d currency=usd -d confirm=true -d "payment_method_data[shared_payment_granted_token]=<TOKEN_ID>"
```

```
curl https://api.stripe.com/v1/test_helpers/shared_payment/granted_tokens/<TOKEN_ID>/revoke -u "<YOUR_SECRET_KEY>" -H "Stripe-Version: 2026-04-22.preview" -X POST
```

- why_it_matters: Accept a payment initiated by an authorized agent on a customer's behalf in an integration under development.
- sources: <https://docs.stripe.com/changelog/dahlia/2026-04-22/shared-payment-granted-token>, <https://docs.stripe.com/api/shared-payment/granted-token/create?api-version=2026-04-22.preview>, <https://docs.stripe.com/api/payment_intents/create?api-version=2026-04-22.preview>, <https://docs.stripe.com/api/shared-payment/granted-token?api-version=2026-04-22.preview>
- gotchas: "Availability: Public preview (API version 2026-04-22.preview)."; "payment_method (required): PaymentMethod to be shared by the test token."; "usage_limits (required): Limits on use of the test token; documented example includes `currency`, `expires_at`, and `max_amount`. Definitions for these sub-keys were not accessible."; "payment_method_data.shared_payment_granted_token: The release note identifies this PaymentIntent parameter for passing the token; parameter requiredness and description were not accessible in the opened reference."; "amount (required): Positive integer amount to collect, in the currency’s smallest unit."; "currency (required): Lowercase three-letter ISO currency code supported by Stripe."; "confirm: Set to `true` to attempt to confirm the PaymentIntent immediately; defaults to `false`."; "Prerequisite: Creating a test token is available only in test mode."; "Prerequisite: Create a PaymentMethod first; the test-token docs show a `us_bank_account` PaymentMethod example."; "Prerequisite: Use a Stripe secret key for the documented API requests."

### Stripe Batch Jobs v2 supports DELETE operations (2026-04-22)
- slug: stripe-batch-jobs-v2-supports-delete-operations-f513936a7603
- score: 0.99

How to use it:

When batching resource deletions, create a Batch Job with `endpoint.http_method` set to `delete`. Include the `2026-04-22.preview` Stripe API version in the request.

Examples:

```
curl -X POST https://api.stripe.com/v2/core/batch_jobs \
  -H "Authorization: Bearer <YOUR_SECRET_KEY>" \
  -H "Stripe-Version: 2026-04-22.preview" \
  --json '{"endpoint":{"path":"<RESOURCE_ENDPOINT_PATH>","http_method":"delete"},"metadata":{},"skip_validation":false}'
```

```
"endpoint": {"path": "/v1/subscriptions/:subscription/migrate", "http_method": "delete"}
```

- why_it_matters: Batch DELETE operations on Stripe resources, such as canceling multiple subscriptions.
- before: Set `endpoint.http_method` to `post`; this parameter previously only supported `post`.
- sources: <https://docs.stripe.com/changelog/dahlia/2026-04-22/batch-api-delete-method>, <https://docs.stripe.com/api/v2/core/batch-jobs/create?api-version=2026-04-22.preview>
- gotchas: "Availability: preview"; "endpoint (required): Object configuring the batch job endpoint."; "endpoint.path (required): Path for the endpoint; use the resource endpoint path to batch."; "endpoint.http_method (required): HTTP method for the operation; the release note documents `delete` and `post` as allowed values."; "metadata (required): Metadata of the batch job; use an empty object when no metadata is supplied."; "skip_validation (required): Whether validation runs before executing the batch job."; "Prerequisite: For REST API requests, include the `Stripe-Version: 2026-04-22.preview` header. Use a Stripe secret key as the bearer credential."; "The `endpoint.http_method` parameter previously only supported `POST` operations."; "The change does not affect existing batch operations that use the `POST` method."

### Stripe Checkout Sessions and Payment Links support Managed Payments (2026-04-22)
- slug: stripe-checkout-sessions-and-payment-links-support-managed-payments-e12a19c8422f
- score: 0.97

How to use it:

For a repository selling eligible digital products through Checkout Sessions or Payment Links, enable Managed Payments with `managed_payments[enabled]=true` when creating the session or link. Remove parameters Stripe manages automatically; Checkout setup also requires Dashboard enablement, accepted terms, and eligible products.

Examples:

```
curl https://api.stripe.com/v1/checkout/sessions -u "<<YOUR_SECRET_KEY>>:" -d "line_items[0][price]={{PRICE_ID}}" -d "line_items[0][quantity]=1" -d "managed_payments[enabled]=true" -d mode=payment --data-urlencode "success_url=https://example.com/success"
```

```
curl https://api.stripe.com/v1/payment_links -u "<<YOUR_SECRET_KEY>>" -H "Stripe-Version: 2026-04-22.dahlia" -d "line_items[0][price]={{PRICE_ID}}" -d "line_items[0][quantity]=1" -d "managed_payments[enabled]=true"
```

- why_it_matters: For a repository integrating Stripe Checkout Sessions or Payment Links to sell digital products, enable Managed Payments when using Stripe’s merchant-of-record service.
- sources: <https://docs.stripe.com/changelog/dahlia/2026-04-22/managed-payments>, <https://docs.stripe.com/payments/managed-payments/update-checkout>, <https://docs.stripe.com/api/payment-link/create?api-version=2026-04-22.dahlia>, <https://docs.stripe.com/api/checkout/sessions/create?api-version=2026-04-22.dahlia>
- gotchas: "managed_payments (Checkout Sessions and Payment Links): Optional object with Managed Payments settings for the session or link and resulting objects."; "managed_payments[enabled]: Set to `true` to enable Managed Payments when creating a Checkout Session. The guide documents this parameter for Checkout Sessions."; "line_items (required): Payment Link items being sold; up to 20 line items."; "line_items (required): Required for Checkout Sessions in `payment` and `subscription` mode; passes one-time or recurring Prices."; "mode (required): Checkout Session mode; use `payment` for one-time payments or `subscription` for subscriptions."; "success_url: URL for customers after payment or setup completes; required conditionally, and unavailable with `embedded_page` or `elements` UI modes."; "Prerequisite: Checkout integration must create Checkout Sessions in `payment` or `subscription` mode; enable Managed Payments in Dashboard, accept its terms, ensure products meet eligibility requirements, and use API version `2025-03-31.basil` or later."; "Prerequisite: Set an eligible tax code on each product used with Managed Payments."; "Prerequisite: The API examples require a Price ID; the docs list creating a Price as a prerequisite."; "For selling digital products such as SaaS, software, and digital content or downloads."; "When Managed Payments is enabled, certain parameters related to Connect, tax configuration, and shipping are managed automatically and can't be manually specified."; "Indirect tax compliance coverage is described as more than 80 countries."

### Stripe invoice and credit note retrieval expands tax_rate_details.tax_rate (2026-04-22)
- slug: stripe-invoice-and-credit-note-retrieval-expands-tax-rate-details-tax-rate-26dd8f304697
- score: 0.93

How to use it:

When implementing invoice or credit note tax breakdowns on API version `2026-04-22.dahlia`, retrieve the resource with `expand[]=tax_rate_details.tax_rate` to receive the full Tax Rate object inline. The field applies to invoice and credit note total taxes and line taxes, and to invoice and credit note line items.

Examples:

```
curl -G https://api.stripe.com/v1/invoices/<invoice_id> -u "$STRIPE_SECRET_KEY:" -d 'expand[]=tax_rate_details.tax_rate'
```

```
curl -G https://api.stripe.com/v1/credit_notes/<credit_note_id> -u "$STRIPE_SECRET_KEY:" -d 'expand[]=tax_rate_details.tax_rate'
```

- why_it_matters: When implementing invoice or credit note tax breakdowns, retrieve the full tax rate details with the resource.
- before: Previously, `tax_rate` returned the Tax Rate ID as a string, requiring additional API calls to retrieve the full Tax Rate object.
- sources: <https://docs.stripe.com/changelog/dahlia/2026-04-22/adds-expandable-tax-rate-property-to-tax-rate-details>, <https://docs.stripe.com/api/invoices/retrieve?api-version=2026-04-22.dahlia>, <https://docs.stripe.com/api/credit_notes/retrieve?api-version=2026-04-22.dahlia>
- gotchas: "expand[]: Expansion request parameter; set its value to `tax_rate_details.tax_rate` to expand that property."; "tax_rate_details.tax_rate: Expandable Tax Rate property on invoice total taxes and line taxes, invoice line item taxes, credit note total taxes, and credit note line item taxes."; "Prerequisite: Use API version `2026-04-22.dahlia` or later for this change. For REST requests, set the `Stripe-Version` header to `2026-04-22.dahlia`."; "Prerequisite: Authenticate API requests with a Stripe secret key."; "Applies to Invoice total_taxes and line taxes, Invoice Line Item taxes, Credit Note total_taxes, and Credit Note Line Item taxes."

### Stripe Issuing adds card-presence spending controls (2026-04-22)
- slug: stripe-issuing-adds-card-presence-spending-controls-8bd5f73047c9
- score: 0.95

How to use it:

When an Issuing card needs a card-presence restriction, update its spending controls with an allowed or blocked presence list. Inspect the Authorization’s `card_presence` to see its status; the docs’ example blocks `not_present`.

Examples:

```
curl https://api.stripe.com/v1/issuing/cards/<ISSUINGCARD_ID> \
  -u "<YOUR_SECRET_KEY>:" \
  -d "spending_controls[blocked_card_presences][]=not_present"
```

- why_it_matters: Restrict Issuing card transactions in a repository integration based on whether the card was present.
- sources: <https://docs.stripe.com/changelog/dahlia/2026-04-22/issuing-card-presence-spending-control>, <https://docs.stripe.com/issuing/controls/spending-controls>
- gotchas: "ISSUINGCARD_ID (required): ID of the Issuing card in the update URL."; "YOUR_SECRET_KEY (required): Stripe secret key used for authentication."; "spending_controls[allowed_card_presences]: Presence statuses to allow; authorizations with other statuses are blocked."; "spending_controls[blocked_card_presences]: Presence statuses to block; authorizations with other statuses are allowed. The example uses `not_present`."; "card_presence: Authorization object property showing the card-presence status."

### Stripe Payment Intents API adds amount_to_confirm (2026-04-22)
- slug: stripe-payment-intents-api-adds-amount-to-confirm-a5701bf76ead
- score: 0.95

How to use it:

When confirming a PaymentIntent for an amount different from its original amount, send `amount_to_confirm` with the exact amount. If omitted, it defaults to the PaymentIntent’s `amount`.

Examples:

```
curl https://api.stripe.com/v1/payment_intents/<PAYMENT_INTENT_ID>/confirm \
  -u "<YOUR_SECRET_KEY>:" \
  -H "Stripe-Version: 2026-04-22.preview" \
  -d amount_to_confirm=<AMOUNT>
```

- why_it_matters: When implementing an integration that confirms a PaymentIntent for an amount different from its original amount, specify the confirmation amount.
- sources: <https://docs.stripe.com/changelog/dahlia/2026-04-22/amount-confirmation-parameter-to-paymentintent>, <https://docs.stripe.com/api/payment_intents/confirm?api-version=2026-04-22.preview>
- gotchas: "amount_to_confirm: Integer amount to confirm on the PaymentIntent; defaults to `amount` if omitted."; "PAYMENT_INTENT_ID (required): ID in the confirmation endpoint path."; "YOUR_SECRET_KEY (required): Secret key used to authenticate the request."; "Prerequisite: Create a PaymentIntent before confirming it."; "Prerequisite: Use a secret key for this parameter, per the release note."; "The parameter is for secret key callers."

### Stripe Reporting Query Runs API v2 runs SQL over Stripe data (2026-04-22)
- slug: stripe-reporting-query-runs-api-v2-runs-sql-over-stripe-data-25775fb0f5fe
- score: 0.98

How to use it:

When a workflow needs programmatic analysis of Stripe data, create a Reporting Query Run with SQL and retrieve it to check status and obtain results. Download results through the returned pre-signed URL before it expires after 5 minutes; lifecycle events are listed in the release note.

Examples:

```
curl https://api.stripe.com/v2/data/reporting/query_runs/<query_run_id> \
  -H "Authorization: Bearer <YOUR_SECRET_KEY>" \
  -H "Stripe-Version: 2026-04-22.preview"
```

- why_it_matters: For a repository workflow that needs to analyze Stripe data programmatically, run a SQL query against Stripe data and retrieve its status and results.
- sources: <https://docs.stripe.com/changelog/dahlia/2026-04-22/reporting-query-runs-api-v2>, <https://docs.stripe.com/api/v2/data/reporting/query-runs/retrieve?api-version=2026-04-22.preview>
- gotchas: "Version: 2026-04-22.preview"; "Availability: preview"; "<query_run_id> (required): ID of the query run to retrieve; the reference example uses a qryrun_ ID."; "Authorization: Bearer <YOUR_SECRET_KEY> (required): Bearer authentication using a Stripe secret key."; "Stripe-Version (required): API version header; the reference example specifies 2026-04-22.preview."; "status: Returned current status: failed, running, or succeeded."; "result: Returned result details for a successfully completed query; includes a pre-signed download URL when results are ready."; "Prerequisite: A Stripe secret key is required for the documented Bearer-authenticated request."; "Prerequisite: Stripe documents a 403 query_run_api_inaccessible error when the API is unavailable to the request, such as when the feature is not enabled or the compartment is not allowed."; "Prerequisite: The release note states that result URLs expire after 5 minutes."; "Query results are delivered through pre-signed S3 URLs that expire after 5 minutes."

### Stripe Workflows API supports programmatic invocation and run monitoring (2026-04-22)
- slug: stripe-workflows-api-supports-programmatic-invocation-and-run-monitoring-425db1b5d033
- score: 0.95

How to use it:

For a Dashboard-created Workflow with an on-demand trigger, call the v2 API to list or retrieve it and invoke it with `input_parameters`; monitor runs by listing or retrieving runs and subscribing to their lifecycle events.

Examples:

```
curl 'https://api.stripe.com/v2/extend/workflows' -H 'Authorization: Bearer <YOUR_SECRET_KEY>' -H 'Stripe-Version: 2026-04-22.preview'
```

```
curl -X POST 'https://api.stripe.com/v2/extend/workflows/<WORKFLOW_ID>/invoke' -H 'Authorization: Bearer <YOUR_SECRET_KEY>' -H 'Stripe-Version: 2026-04-22.preview' --json '{"input_parameters":{"<PARAMETER_NAME>":"<VALUE>"}}'
```

```
curl 'https://api.stripe.com/v2/extend/workflow_runs' -H 'Authorization: Bearer <YOUR_SECRET_KEY>' -H 'Stripe-Version: 2026-04-22.preview'
```

- why_it_matters: Integrate Dashboard-created Stripe Workflows into application logic and monitor their runs.
- before: Workflows could only be triggered by Stripe events.
- sources: <https://docs.stripe.com/changelog/dahlia/2026-04-22/adds-workflows-api-with-programmatic-invocation>, <https://docs.stripe.com/api/v2/extend/workflows/list?api-version=2026-04-22.preview>, <https://docs.stripe.com/api/v2/extend/workflow-runs/invoke-workflow?api-version=2026-04-22.preview>, <https://docs.stripe.com/api/v2/extend/workflow-runs/list?api-version=2026-04-22.preview>, <https://docs.stripe.com/api/v2/extend/workflows/retrieve?api-version=2026-04-22.preview>, <https://docs.stripe.com/api/v2/extend/workflow-runs/event-types?api-version=2026-04-22.preview>
- gotchas: "Availability: The linked API references use API version 2026-04-22.preview."; "Authorization: Bearer <YOUR_SECRET_KEY> (required): Authenticates the API request with your Stripe secret key."; "Stripe-Version: 2026-04-22.preview (required): Sets the API version used in the documented request."; "<WORKFLOW_ID> (required): Workflow ID in the retrieve or invoke URL."; "input_parameters (required): Map of parameters used to invoke the Workflow Run."; "limit: Maximum page size for listing Workflows or Workflow Runs."; "page: Current page token for list requests."; "status: List filter: Workflow status values are active, archived, draft, inactive; Run status values are failed, started, succeeded. Values are not documented as mutually exclusive."; "workflow: List filter for Workflow Runs associated with specified Workflow IDs."; "Prerequisite: Workflows to invoke must have an on-demand trigger; the API reports `workflow_not_invokable` otherwise."; "Prerequisite: The invoke reference lists creating a customer first as a prerequisite for its example request."; "Prerequisite: Workflow run event payloads are unversioned; during processing, fetch the versioned event from the API or fetch the resource’s current state."; "The workflows are created through the Dashboard."

### Payment Intents add card-not-present surcharge fields (2026-03-25)
- slug: payment-intents-add-card-not-present-surcharge-fields-d1c2f0c4b520
- score: 0.95

How to use it:

For card-not-present PaymentIntents with a surcharge, include the surcharge in the total `amount` and provide `amount_details.surcharge.amount` when creating, updating, confirming, or capturing. Configure `amount_details.surcharge.enforce_validation` as `automatic`, `enabled`, or `disabled`; `automatic` is the default and changeable, while `enabled` and `disabled` cannot be changed.

Examples:

```
curl https://api.stripe.com/v1/payment_intents \
  -u "<<YOUR_SECRET_KEY>>" \
  -H "Stripe-Version: 2026-03-25.preview" \
  -d amount=<TOTAL_AMOUNT_IN_SMALLEST_CURRENCY_UNIT> \
  -d currency=<CURRENCY> \
  -d "amount_details[surcharge][amount]=<SURCHARGE_AMOUNT>" \
  -d "amount_details[surcharge][enforce_validation]=automatic"
```

```
curl https://api.stripe.com/v1/payment_intents/<PAYMENT_INTENT_ID> \
  -u "<<YOUR_SECRET_KEY>>" \
  -H "Stripe-Version: 2026-03-25.preview" \
  -d amount=<TOTAL_AMOUNT_IN_SMALLEST_CURRENCY_UNIT> \
  -d "amount_details[surcharge][amount]=<SURCHARGE_AMOUNT>" \
  -d "amount_details[surcharge][enforce_validation]=automatic"
```

```
curl https://api.stripe.com/v1/payment_intents/<PAYMENT_INTENT_ID>/confirm \
  -u "<<YOUR_SECRET_KEY>>" \
  -H "Stripe-Version: 2026-03-25.preview" \
  -d amount=<TOTAL_AMOUNT_IN_SMALLEST_CURRENCY_UNIT> \
  -d "amount_details[surcharge][amount]=<SURCHARGE_AMOUNT>" \
  -d "amount_details[surcharge][enforce_validation]=automatic"
```

- why_it_matters: Update a Payment Intents integration to create, update, confirm, or capture card-not-present payments with a surcharge.
- before: Calculate the surcharge separately from the Payment Intent total.
- sources: <https://docs.stripe.com/changelog/dahlia/2026-03-25/card-not-present-payments-surcharge-configuration-options>, <https://docs.stripe.com/api/payment_intents/create?api-version=2026-03-25.preview>, <https://docs.stripe.com/api/payment_intents/update?api-version=2026-03-25.preview>, <https://docs.stripe.com/api/payment_intents/confirm?api-version=2026-03-25.preview>, <https://docs.stripe.com/api/payment_intents/object?api-version=2026-03-25.preview#payment_intent_object-amount_details-surcharge-amount>, <https://docs.stripe.com/api/payment_intents/create?api-version=2026-03-25.preview#create_payment_intent-amount_details-surcharge-enforce_validation>
- gotchas: "Version: 2026-03-25.preview"; "Availability: Preview API version 2026-03-25.preview"; "amount (required): Total amount, inclusive of the surcharge, in the smallest currency unit."; "amount_details.surcharge.amount (required): Identifies the surcharge amount."; "amount_details.surcharge.enforce_validation: Validation enforcement setting; `automatic` is the default and changeable, while `enabled` and `disabled` cannot be changed."; "amount_details.surcharge.enforce_validation=automatic: Enforces validation; can be changed."; "amount_details.surcharge.enforce_validation=enabled: Enforces validation; cannot be changed."; "amount_details.surcharge.enforce_validation=disabled: Does not enforce validation; cannot be changed."; "Prerequisite: Use Stripe API version `2026-03-25.preview`; requests require a secret key in the documented curl examples."; "If `amount_details.surcharge.enforce_validation` is `enabled` or `disabled`, it cannot be changed."; "If `amount_details.surcharge.enforce_validation` is `automatic`, validation is enforced but the setting can be changed."; "Pass the total amount inclusive of the surcharge when creating, updating, confirming, or capturing a Payment Intent with a surcharge."

### Stripe API adds configurable trial offers for subscription items (2026-03-25)
- slug: stripe-api-adds-configurable-trial-offers-for-subscription-items-4e285612ab3e
- score: 0.97

How to use it:

When setting up trial pricing and duration for a subscription item, create a Trial Offer, then attach it through `current_trial`; use `trial_settings.end_behavior.billing_cycle_anchor` to choose the anchor behavior at trial end.

Examples:

```
curl https://api.stripe.com/v1/product_catalog/trial_offers -u "<YOUR_SECRET_KEY>" -H "Stripe-Version: 2026-03-25.preview" -d "duration[relative][iterations]=2" -d "end_behavior[transition][price]=<POST_TRIAL_PRICE_ID>" -d price=<TRIAL_PRICE_ID>
```

```
curl https://api.stripe.com/v1/subscription_items -u "<YOUR_SECRET_KEY>" -H "Stripe-Version: 2026-03-25.preview" -d subscription=<SUBSCRIPTION_ID> -d price=<PRICE_ID> -d "current_trial[trial_offer]=<TRIAL_OFFER_ID>"
```

```
curl https://api.stripe.com/v1/subscriptions -u "<YOUR_SECRET_KEY>" -H "Stripe-Version: 2026-03-25.preview" -d customer=<CUSTOMER_ID> -d "items[0][price]=<PRICE_ID>" -d "trial_settings[end_behavior][billing_cycle_anchor]=now"
```

- why_it_matters: Configure trial pricing and duration for a subscription item, and set its post-trial billing-cycle behavior.
- sources: <https://docs.stripe.com/changelog/dahlia/2026-03-25/trial-offers-on-subscription-items>, <https://docs.stripe.com/api/product-catalog/trial-offer/create?api-version=2026-03-25.preview>, <https://docs.stripe.com/api/product-catalog/trial-offer?api-version=2026-03-25.preview>, <https://docs.stripe.com/api/subscriptions/create?api-version=2026-03-25.preview>, <https://docs.stripe.com/api/subscription_items/create?api-version=2026-03-25.preview>
- gotchas: "Availability: API links specify api-version=2026-03-25.preview."; "duration (required): Trial duration object; the create example uses `relative[iterations]`."; "duration[relative][iterations]: Number of price intervals in the documented relative-duration example."; "end_behavior (required): Defines what occurs when the trial ends; the example transitions to a price."; "end_behavior[transition][price]: Price used after the trial in the documented transition example."; "price (required): Price configuration during the trial period."; "subscription (required): Identifier of the subscription to modify when creating a subscription item."; "current_trial: Trial Offer to apply to the subscription item."; "current_trial[trial_offer]: Trial Offer identifier; attachment field shown in the Trial Offer reference."; "trial_settings.end_behavior.billing_cycle_anchor: Controls whether the subscription billing cycle anchor resets at trial end; permitted values were not exposed in the retrieved reference text."; "customer: Identifier of the customer to subscribe."; "items[0][price]: Price ID for a subscription item in the create-subscription example."; "Prerequisite: Create a Price before creating a Trial Offer; the create reference's prerequisite uses a recurring monthly price."; "Prerequisite: The Subscription Item create reference lists a PaymentMethod, Customer with attached payment method, Product, Price, and Subscription as prerequisite objects."

### Stripe Checkout Sessions create adds pending invoice item interval (2026-03-25)
- slug: stripe-checkout-sessions-create-adds-pending-invoice-item-interval-9415e6f35be0
- score: 0.96

How to use it:

For a subscription Checkout Session, set `subscription_data[pending_invoice_item_interval]` to `day`, `week`, `month`, or `year` to set the billing frequency for pending invoice items. [Stripe changelog](https://docs.stripe.com/changelog/dahlia/2026-03-25/adds-pending-invoice-item-interval-parameter-to-checkout-sessions)

Examples:

```
curl https://api.stripe.com/v1/checkout/sessions -u "<YOUR_SECRET_KEY>" -H "Stripe-Version: 2026-03-25.dahlia" --data-urlencode "success_url=https://example.com/success" -d "line_items[0][price]=<PRICE_ID>" -d "line_items[0][quantity]=1" -d "mode=subscription" -d "subscription_data[pending_invoice_item_interval][interval]=month" -d "subscription_data[pending_invoice_item_interval][interval_count]=1"
```

- why_it_matters: Configure a subscription Checkout Session to invoice pending items on a schedule different from the subscription cycle.
- before: The changelog says the previous approach was to update the Subscription after the Checkout Session completed to configure the pending invoice item interval.
- sources: <https://docs.stripe.com/changelog/dahlia/2026-03-25/adds-pending-invoice-item-interval-parameter-to-checkout-sessions>, <https://docs.stripe.com/api/checkout/sessions/create?api-version=2026-03-25.dahlia>
- gotchas: "Version: 2026-03-25.dahlia"; "mode (required): Set to `subscription` for a Checkout Session that includes at least one recurring item."; "line_items (required): Items being purchased; required for `subscription` mode."; "subscription_data: Optional subset of parameters passed to subscription creation for Checkout Sessions in `subscription` mode."; "subscription_data.pending_invoice_item_interval: Sets the billing frequency for pending invoice items; supported values: `day`, `week`, `month`, `year`. The docs do not state whether these values are mutually exclusive."; "subscription_data.pending_invoice_item_interval nested fields: Not found in accessible official reference; exact nested field names and any count parameter are undocumented in the pages read."; "Prerequisite: Use Checkout in `subscription` mode with at least one recurring item. The API reference lists `line_items` as required for subscription mode."; "Prerequisite: The API reference gives a prerequisite Price creation example using a recurring monthly Price."; "Applies when using Checkout with subscriptions."; "Supported intervals are `day`, `week`, `month`, and `year`."

### Stripe Checkout Sessions update accepts pending invoice item interval (2026-03-25)
- slug: stripe-checkout-sessions-update-accepts-pending-invoice-item-interval-442093e8c23a
- score: 0.97

How to use it:

When updating a subscription-based Checkout Session and setting a pending invoice item billing frequency, send `subscription_data[pending_invoice_item_interval][interval]` as `day`, `week`, `month`, or `year`. This lets pending items use a schedule different from the subscription cycle without a later Subscription update.

Examples:

```
curl https://api.stripe.com/v1/checkout/sessions/<SESSION_ID> -u "<SECRET_KEY>" -H "Stripe-Version: 2026-03-25.preview" -d "subscription_data[pending_invoice_item_interval][interval]=month"
```

- why_it_matters: When updating a subscription-based Checkout Session, set a billing schedule for pending invoice items that differs from the subscription cycle.
- sources: <https://docs.stripe.com/changelog/dahlia/2026-03-25/adds-pending-invoice-item-interval-parameter-to-checkout-sessions-update>, <https://docs.stripe.com/api/checkout/sessions/update?api-version=2026-03-25.preview>, <https://github.com/stripe/stripe-php/blob/master/lib/Checkout/Session.php>
- gotchas: "subscription_data: Subscription-related parameters for Checkout Session updates."; "subscription_data[pending_invoice_item_interval][interval] (required): Billing interval. Allowed values: `day`, `week`, `month`, `year`."; "subscription_data[pending_invoice_item_interval][interval_count]: Multiplier for the interval. The official Stripe PHP parameter definition lists this sub-key as optional; the changelog does not describe its behavior."; "Prerequisite: For REST API requests, use API version `2026-03-25.preview` in the `Stripe-Version` header to use this release’s feature."; "Prerequisite: A Stripe secret key is used for authentication in the documented update request."; "Applies to pending invoice items when using Checkout with subscriptions."

### Stripe credit note line items accept metadata (2026-03-25)
- slug: stripe-credit-note-line-items-accept-metadata-fbe92495e934
- score: 0.90

How to use it:

When creating or previewing a credit note that needs per-line-item data, set `metadata` on each object in `lines`. Retrieve the credit note or its line items to read that metadata.

- why_it_matters: When creating or previewing a credit note and you need per-line-item data for repository billing logic or reporting, attach metadata to each line item.
- sources: <https://docs.stripe.com/changelog/dahlia/2026-03-25/adds-metadata-field-to-credit-note-line-items>, <https://docs.stripe.com/api/credit_notes/create?api-version=2026-03-25.dahlia>, <https://docs.stripe.com/api/credit_notes/line_item?api-version=2026-03-25.dahlia>
- gotchas: "lines (required): Array of line items making up the credit note; one of `amount`, `lines`, or `shipping_cost` must be provided."; "lines[].metadata: Key-value pairs attached to a credit note line item. Up to 50 keys; key names up to 40 characters and values up to 500 characters."; "invoice (required): ID of the invoice."; "Prerequisite: Create a customer and an invoice before creating or previewing the credit note."; "Metadata can contain up to 50 keys; key names can be up to 40 characters and values up to 500 characters."

### Stripe Invoice Items and Invoice Line Items accept decimal quantities (2026-03-25)
- slug: stripe-invoice-items-and-invoice-line-items-accept-decimal-quantities-bc040d77f07f
- score: 0.96

How to use it:

When creating or updating an Invoice Item or updating an invoice line item with fractional units, set `quantity_decimal` to a non-negative decimal string with up to 12 decimal places. Use only `quantity_decimal`; a request cannot set both it and `quantity`.

Examples:

```
curl https://api.stripe.com/v1/invoiceitems -u "<YOUR_SECRET_KEY>" -H "Stripe-Version: 2026-03-25.dahlia" -d customer=<CUSTOMER_ID> -d "pricing[price]=<PRICE_ID>" -d quantity_decimal="5.7"
```

```
curl https://api.stripe.com/v1/invoiceitems/<INVOICEITEM_ID> -u "<YOUR_SECRET_KEY>" -H "Stripe-Version: 2026-03-25.dahlia" -d quantity_decimal="5.7"
```

```
curl -X POST https://api.stripe.com/v1/invoices/<INVOICE_ID>/lines/<LINE_ITEM_ID> -u "<YOUR_SECRET_KEY>" -H "Stripe-Version: 2026-03-25.dahlia" -d quantity_decimal="5.7"
```

- why_it_matters: When implementing invoice creation or updates that need fractional quantities, use decimal quantities for Invoice Items or Invoice Line Items.
- sources: <https://docs.stripe.com/changelog/dahlia/2026-03-25/invoice-items-decimal-quantity>, <https://docs.stripe.com/api/invoiceitems/create?api-version=2026-03-25.dahlia>, <https://docs.stripe.com/api/invoiceitems/update?api-version=2026-03-25.dahlia>, <https://docs.stripe.com/api/invoice-line-item/update?api-version=2026-03-25.dahlia>
- gotchas: "quantity_decimal: Non-negative decimal quantity string with at most 12 decimal places; use it for decimal precision."; "quantity: Non-negative integer quantity; deprecated in favor of `quantity_decimal`. A request may set either `quantity` or `quantity_decimal`, but not both."; "customer: Customer ID to bill for the Invoice Item."; "pricing[price]: Price ID used to price the Invoice Item."; "invoice (required): Invoice ID for the invoice line item update endpoint."; "line_item_id (required): Invoice line item ID for the invoice line item update endpoint."; "Prerequisite: Authenticate with a Stripe secret key. Creating an Invoice Item requires a customer and a price; the docs list creating those objects as setup. Invoice Items can only be added to draft invoices. Updates to Invoice Items are only possible before the attached invoice is closed; invoice line item updates are only possible before the invoice is finalized."; "`quantity_decimal` accepts string values in decimal format, with up to 12 decimal places of precision."; "A single request can set either `quantity` or `quantity_decimal`, but not both."; "Setting `quantity_decimal` also sets `quantity` to the same value truncated to an integer."; "`quantity` remains available for existing integrations but is deprecated, does not support decimal values, and will be removed in a future breaking API version."

### Stripe Payment Links API enables Managed Payments for digital products (2026-03-25)
- slug: stripe-payment-links-api-enables-managed-payments-for-digital-products-6b14bd5af5d2
- score: 0.98

How to use it:

For a digital product, create a Payment Link with `managed_payments.enabled` set to `true`. The release note supports doing this through the Payment Links API or Dashboard.

Examples:

```
curl https://api.stripe.com/v1/payment_links \
  -u "$STRIPE_SECRET_KEY:" \
  -H "Stripe-Version: 2026-03-25.preview" \
  -d "line_items[0][price]"="<price_id>" \
  -d "line_items[0][quantity]"=1 \
  -d "managed_payments[enabled]"=true
```

```
Dashboard: https://dashboard.stripe.com/payment-links/create
```

- why_it_matters: Create a payment link to sell a digital product using Managed Payments.
- sources: <https://docs.stripe.com/changelog/dahlia/2026-03-25/adds-support-for-managed-payments-on-payment-links>, <https://docs.stripe.com/api/payment_links/create>, <https://docs.stripe.com/payments/managed-payments>
- gotchas: "line_items (required): Items being sold; each item has a Price and quantity. Up to 20 line items."; "managed_payments.enabled: Set to `true` to enable Managed Payments for the Payment Link."; "Stripe-Version (required): Set to `2026-03-25.preview` to use the API version adding this parameter."; "STRIPE_SECRET_KEY (required): Secret API key used for authentication; represented by the create endpoint's documented `-u` authentication pattern."; "Prerequisite: A Stripe account and a Price for the product to use as a Payment Link line item."; "Prerequisite: Managed Payments is for digital products; Stripe's guide lists SaaS, software, and digital content or downloads as examples."; "Prerequisite: Managed Payments does not support Connect/platform or marketplace integrations."; "Managed Payments is for digital products."

### Stripe Radar ValueList accepts crypto_fingerprint items (2026-03-25)
- slug: stripe-radar-valuelist-accepts-crypto-fingerprint-items-ead73aa42d17
- score: 0.96

How to use it:

When using Stripe API version `2026-03-25.dahlia`, create a Radar ValueList with `item_type=crypto_fingerprint`. Add wallet fingerprints as list items; the release note says Radar rules can then use those fingerprints to allow trusted wallets or block fraudulent ones.

Examples:

```
curl https://api.stripe.com/v1/radar/value_lists \
  -u "<SECRET_KEY>" \
  -H "Stripe-Version: 2026-03-25.dahlia" \
  -d "name=<LIST_NAME>" \
  -d "alias=<LIST_ALIAS>" \
  -d "item_type=crypto_fingerprint"
```

```
curl https://api.stripe.com/v1/radar/value_list_items \
  -u "<SECRET_KEY>" \
  -H "Stripe-Version: 2026-03-25.dahlia" \
  -d "value_list=<VALUE_LIST_ID>" \
  -d "value=<WALLET_FINGERPRINT>"
```

- why_it_matters: When writing Radar rules to allow trusted crypto wallets or block known fraudulent wallets, add wallet fingerprints to a Radar ValueList.
- sources: <https://docs.stripe.com/changelog/dahlia/2026-03-25/adds-crypto-fingerprint-support-to-radar-value-list-items>, <https://docs.stripe.com/api/radar/value_lists/create?api-version=2026-03-25.dahlia>, <https://docs.stripe.com/api/radar/value_list_items/create?api-version=2026-03-25.dahlia>
- gotchas: "alias (required): Name of the list for use in rules; maximum 100 characters."; "name (required): Human-readable list name; maximum 100 characters."; "item_type: Type of list items. Set to `crypto_fingerprint`; the documented enum values are alternatives, not mutually exclusive object sub-keys."; "value_list (required): ID of the parent ValueList to receive the item."; "value (required): Item value, which must match the parent list's item type; maximum 800 characters."; "Stripe-Version (required): For API requests using this change, set the version to `2026-03-25.dahlia`."; "Prerequisite: Use API version `2026-03-25.dahlia` for requests that rely on this change."; "Prerequisite: Authenticate the API request with a Stripe secret key."

### Stripe Tax adds event-location tax calculation for ticket sales (2026-03-25)
- slug: stripe-tax-adds-event-location-tax-calculation-for-ticket-sales-e7afdaf055a2
- score: 0.95

How to use it:

For ticket sales and other event-based transactions using Stripe Tax, calculate tax using the event location. Create a Tax Location and pass its ID as `performance_location`; the exact calculation parameters are not available in the pages I could read.

- why_it_matters: When implementing tax calculation for ticket sales or other event-based goods and services with Stripe Tax, calculate tax using the event location.
- sources: <https://docs.stripe.com/changelog/dahlia/2026-03-25/stripe-tax-ticket-sales-event-location>, <https://docs.stripe.com/api/tax_codes/object?api-version=2026-03-25.preview#tax_code_object-requirements-performance_location>
- gotchas: "Availability: API version 2026-03-25.preview"; "performance_location (required): Pass the Tax Location ID when calculating tax. The release note states this; I could not verify its precise parameter location or required status in an accessible API reference."; "requirements.performance_location: Tax Code requirements object describing tax location requirements; some tax codes require a performance location. The accessible reference did not document this property's subkeys or allowed values."; "country_options.us.type: US Tax Registration type. The release note names `admissions_tax`, `entertainment_tax`, and `tourism_tax`; the accessible object reference did not show this property's allowed values."; "Applies to ticket sales and other event-based goods and services when using Stripe Tax."; "Calculates tax based on event location rather than customer location."

### Stripe v2 Payout Methods add currency-specific payout accounts (2026-03-25)
- slug: stripe-v2-payout-methods-add-currency-specific-payout-accounts-7a1529a6a1e8
- score: 0.96

How to use it:

When creating v2 Payout Method credentials, include the required `currency` value. For GB bank accounts, use `sort_code` and `account_number` for GBP, or `iban` for non-GBP; use one Payout Method per accepted currency.

Examples:

```
curl -X POST https://api.stripe.com/v2/core/vault/gb_bank_accounts \
  -H "Authorization: Bearer <YOUR_SECRET_KEY>" \
  -H "Stripe-Version: 2026-03-25.preview" \
  --json '{"currency":"gbp","sort_code":"<sort_code>","account_number":"<account_number>"}'
```

```
curl -X POST https://api.stripe.com/v2/core/vault/gb_bank_accounts \
  -H "Authorization: Bearer <YOUR_SECRET_KEY>" \
  -H "Stripe-Version: 2026-03-25.preview" \
  --json '{"currency":"<non-GBP currency>","iban":"<iban>"}'
```

- why_it_matters: Update an integration that creates v2 Payout Methods to accept payouts in a specified currency, including for GB bank accounts.
- before: Previously, v2 Payout Methods could receive payouts only in the bank account's local currency (or USD for US-issued debit cards).
- sources: <https://docs.stripe.com/changelog/dahlia/2026-03-25/multicurrency-v2-payout-methods>, <https://docs.stripe.com/api/v2/core/vault/gb-bank-accounts/create?api-version=2026-03-25.preview>
- gotchas: "Version: 2026-03-25.preview"; "Availability: Preview API version 2026-03-25.preview."; "currency (required): Currency of the bank account; specify the payout currency."; "sort_code: GB bank account sort code; release note says required for GBP accounts."; "account_number: GB bank account number; release note says required for GBP accounts."; "iban: IBAN for a GB bank account; release note says use for non-GBP currencies."; "supported_currencies: Response array listing currencies supported by the GB bank account."; "Prerequisite: Authenticate with a Stripe secret key and send the `Stripe-Version: 2026-03-25.preview` header, as shown in the versioned endpoint example."; "Each Payout Method supports only one currency; create a separate object for each supported currency."; "v2 money movement flows such as OutboundPayments, OutboundTransfers, and InboundTransfers don't support multicurrency PayoutMethods; use them only with PayoutMethods set up with the local currency."; "For GB Bank Accounts, include either only `iban` or both `sort_code` and `account_number`, depending on the currency."; "The `supported_currencies` property is a single-element array containing the currency specified in `currency`."; "Creating v2 Payout Method credentials without `currency` will fail."

### Stripe Billing API supports Pay by Bank (2026-02-25)
- slug: stripe-billing-api-supports-pay-by-bank-615a58e90fb7
- score: 0.95

How to use it:

When adding Pay by Bank to a Stripe Billing operation, include `pay_by_bank` in its `payment_settings.payment_method_types` array. The release note says no special configuration or feature enablement is required.

Examples:

```
curl https://api.stripe.com/v1/subscriptions \
  -u "<YOUR_SECRET_KEY>" \
  -H "Stripe-Version: 2026-02-25.clover" \
  -d "customer=<CUSTOMER_ID>" \
  -d "items[0][price]=<PRICE_ID>" \
  -d "payment_settings[payment_method_types][]=pay_by_bank"
```

- why_it_matters: Add Pay by Bank as a payment method for recurring billing in an application using Stripe Billing.
- sources: <https://docs.stripe.com/changelog/clover/2026-02-25/billing-api-pay-by-bank>, <https://docs.stripe.com/api/subscriptions/create?api-version=2026-02-25.clover>
- gotchas: "payment_settings: Subscription payment configuration object; includes payment method settings."; "payment_settings.payment_method_types: Array of allowed payment method types; set it to include `pay_by_bank`."; "pay_by_bank: Payment method type added for Billing invoices, subscriptions, customers, and quotes in API version `2026-02-25.clover`."; "customer: Identifier of the customer to subscribe."; "items (required): Subscription items, each with an attached price."; "Prerequisite: Use API version `2026-02-25.clover` or a corresponding SDK version to access the change."; "Prerequisite: Create a customer and a recurring price before creating a subscription."; "Docs conflict: The Pay by Bank overview says its separate Pay by Bank Recurring offering is in private preview and combines an initial Pay by Bank payment with a Bacs Direct Debit mandate. This differs from the Billing API addition; the overview does not document the Billing API change."

### Stripe subscription item deletion supports pending payment behavior (2026-02-25)
- slug: stripe-subscription-item-deletion-supports-pending-payment-behavior-78224998795b
- score: 0.96

How to use it:

When deleting a subscription item would create an invoice that requires payment, pass `payment_behavior=pending_if_incomplete` to stage the deletion as a pending update. The parameter is optional; pending updates accept only supported parameters.

Examples:

```
curl -X DELETE https://api.stripe.com/v1/subscription_items/<SUBSCRIPTION_ITEM_ID> \
  -u "<YOUR_SECRET_KEY>" \
  -H "Stripe-Version: 2026-02-25.clover" \
  -d "payment_behavior=pending_if_incomplete"
```

- why_it_matters: When implementing subscription changes that may require payment, defer deleting a subscription item until payment is confirmed.
- before: Previously, subscription items could only be deleted immediately.
- sources: <https://docs.stripe.com/changelog/clover/2026-02-25/subscription-item-deletion-payment-behavior-control>, <https://docs.stripe.com/api/subscription_items/delete?api-version=2026-02-25.clover>
- gotchas: "subscription item ID (required): Identifies the subscription item in the DELETE endpoint path."; "payment_behavior: Controls behavior when payment is required. `pending_if_incomplete` uses pending updates; allowed values are `allow_incomplete`, `default_incomplete`, `error_if_incomplete`, and `pending_if_incomplete`. The docs do not say these values are mutually exclusive; it is a single enum parameter."; "Prerequisite: Have an existing subscription item to delete. The reference's example setup creates a payment method, customer, product, price, subscription, and subscription item."; "Prerequisite: Authenticate the API request with a Stripe secret key."; "Prerequisite: Use API version `2026-02-25.clover` to access the release-note change; the changelog says requests should specify this version when upgrading the REST API."; "This behavior applies when the change would generate an invoice that requires payment."

### Stripe v2 Accounts configure Smart Disputes auto-response (2026-02-25)
- slug: stripe-v2-accounts-configure-smart-disputes-auto-response-2a099c821e19
- score: 0.91

How to use it:

When configuring a connected account’s Smart Disputes auto-response through the v2 Accounts API, set `configuration.merchant.smart_disputes.auto_respond.preference` to `on`, `off`, or `inherit`. Read `value` to see the effective setting.

Examples:

```
curl -X POST https://api.stripe.com/v2/core/accounts/<ACCOUNT_ID> -H "Authorization: Bearer <SECRET_KEY>" -H "Stripe-Version: 2026-02-25.preview" --json '{"configuration":{"merchant":{"smart_disputes":{"auto_respond":{"preference":"inherit"}}}}}'
```

```
curl -X POST https://api.stripe.com/v2/core/accounts -H "Authorization: Bearer <SECRET_KEY>" -H "Stripe-Version: 2026-02-25.preview" --json '{"configuration":{"merchant":{"smart_disputes":{"auto_respond":{"preference":"inherit"}}}}}'
```

- why_it_matters: When managing dispute response settings for connected accounts through the v2 Accounts API, configure each account’s Smart Disputes auto-response preference.
- before: Connected accounts could manage Smart Disputes settings only through their Dashboard access.
- sources: <https://docs.stripe.com/changelog/clover/2026-02-25/smart-disputes-v2-accounts>, <https://docs.stripe.com/api/v2/core/accounts/update?api-version=2026-02-25.preview>, <https://docs.stripe.com/api/v2/core/accounts/create?api-version=2026-02-25.preview>
- gotchas: "Availability: v2 Accounts API version 2026-02-25.preview"; "id (required): Account ID to update."; "configuration: Account Configuration object; includes the merchant configuration."; "configuration.merchant.smart_disputes.auto_respond.preference: Writable preference. Allowed values: `on`, `off`, `inherit`; `inherit` uses the platform’s default Smart Disputes configuration. Values are alternatives; docs do not state they are mutually exclusive."; "configuration.merchant.smart_disputes.auto_respond.value: Read-only effective setting, shown as `on` or `off`."; "Stripe-Version (required): API version header; the official create/update examples use `2026-02-25.preview`."; "Authorization (required): Bearer secret key for the request."; "Prerequisite: Accounts v2 must be enabled for the platform; Stripe documents `accounts_v2_access_blocked` when it is not enabled."; "Prerequisite: Use API version `2026-02-25.preview` for the documented release-version request."; "`preference` is writable; `value` is read-only."; "When `preference` is `inherit`, the connected account uses the platform’s default Smart Disputes configuration."

### Payment Line Items can opt out of strict arithmetic validation per request (2026-01-28)
- slug: payment-line-items-can-opt-out-of-strict-arithmetic-validation-per-request-83ebcc2b5ee7
- score: 0.97

How to use it:

When Payment Line Item amounts can differ from the PaymentIntent total, set `amount_details.enforce_arithmetic_validation=false` on the create request. Read `amount_details.error` in the response; card payments with arithmetic errors omit line item data from card networks and do not qualify for L2/L3 interchange savings.

Examples:

```
curl https://api.stripe.com/v1/payment_intents \
  -u "<secret_key>:" \
  -d amount=<amount_in_smallest_currency_unit> \
  -d currency=<three_letter_lowercase_currency> \
  -d "amount_details[enforce_arithmetic_validation]"=false \
  -d "amount_details[line_items][0][<field>]"=<value>
```

- why_it_matters: When submitting a Payment Intent with Payment Line Items whose amounts may not match the total, set the per-request validation option and handle the returned errors.
- before: By default, Stripe validates that Payment Line Items add up to the total; if they do not, it returns a 400 error.
- sources: <https://docs.stripe.com/changelog/clover/2026-01-28/loosen-arithmetic-validation-for-payment-line-items>, <https://docs.stripe.com/api/payment_intents/create?api-version=2026-01-28.clover>, <https://docs.stripe.com/payments/payment-line-items>
- gotchas: "amount (required): Amount to collect, in the smallest currency unit."; "currency (required): Three-letter ISO currency code in lowercase."; "amount_details.enforce_arithmetic_validation: Set to `false` to let the request proceed when line item amounts do not match the total; per-request option."; "amount_details.error: Response field containing validation error details when arithmetic errors occur."; "amount_details.line_items: PaymentIntent line item details; use documented fields for the applicable payment integration."; "The opt-out is per request."; "For card payments, line item data with arithmetic errors is not sent to card networks, preventing the transaction from qualifying for L2/L3 interchange savings."

### Stripe Accounts API accepts contact_phone (2026-01-28)
- slug: stripe-accounts-api-accepts-contact-phone-ec487656d567
- score: 0.92

How to use it:

When creating or updating an Account, or creating an Account Token, supply optional `contact_phone` to set the Account’s default contact phone; use E.164 format.

Examples:

```
curl -X POST https://api.stripe.com/v2/core/accounts -H "Authorization: Bearer <<YOUR_SECRET_KEY>>" -H "Stripe-Version: 2026-01-28.clover" --json '{"contact_phone":"+15555550123"}'
```

```
curl -X POST https://api.stripe.com/v2/core/accounts/<ACCOUNT_ID> -H "Authorization: Bearer <<YOUR_SECRET_KEY>>" -H "Stripe-Version: 2026-01-28.clover" --json '{"contact_phone":"+15555550123"}'
```

```
curl -X POST https://api.stripe.com/v2/core/account_tokens -H "Authorization: Bearer <<YOUR_SECRET_KEY>>" -H "Stripe-Version: 2026-01-28.clover" --json '{"contact_phone":"+15555550123"}'
```

- why_it_matters: When creating or updating an account or creating an Account Token, set a default contact phone number for the account.
- sources: <https://docs.stripe.com/changelog/clover/2026-01-28/accounts-contact-phone>, <https://docs.stripe.com/api/v2/core/accounts/create?api-version=2026-01-28.clover>, <https://docs.stripe.com/api/v2/core/accounts/update?api-version=2026-01-28.clover>, <https://docs.stripe.com/api/v2/core/account-tokens/create?api-version=2026-01-28.clover>
- gotchas: "Version: 2026-01-28.clover"; "contact_phone: Default contact phone for the Account; phone numbers must use E.164 format."; "<ACCOUNT_ID> (required): ID of the Account to update."; "The parameter is optional."; "Phone numbers must be in E.164 format."; "Existing integrations are unaffected."

### Stripe Accounts v2 adds identity.business_details.registration_date (2026-01-28)
- slug: stripe-accounts-v2-adds-identity-business-details-registration-date-16ed1368ac09
- score: 0.91

How to use it:

When recording a company’s incorporation or registration date, set `identity.business_details.registration_date` on its Accounts v2 object. The field specifies when the business was incorporated or registered.

- why_it_matters: When implementing an integration that records a company's incorporation or registration date, update the Accounts v2 account object with that date.
- sources: <https://docs.stripe.com/changelog/clover/2026-01-28/accounts-v2-registration-date>
- gotchas: "Version: 2026-01-28.clover"; "identity.business_details.registration_date: Added to Accounts v2 create and update parameters; indicates when the business was incorporated or registered. The docs retrieved do not specify its value format."; "Prerequisite: Use API version `2026-01-28.clover` in API requests, or upgrade to the corresponding SDK version, for this change."

### Stripe API detach payment from invoice (2026-01-28)
- slug: stripe-api-detach-payment-from-invoice-2853a5b232ee
- score: 0.98

How to use it:

When changing payment or reconciliation flows, POST to detach a PaymentIntent from its invoice; if this creates an unpaid balance, the invoice reopens as `open` and Stripe generates a default PaymentIntent for the remaining amount. Listen for `invoice_payment.detached` to track detachment.

Examples:

```
curl https://api.stripe.com/v1/invoices/<INVOICE_ID>/detach_payment \
  -u "<YOUR_SECRET_KEY>" \
  -H "Stripe-Version: 2026-01-28.preview" \
  -d payment_intent=<PAYMENT_INTENT_ID>
```

```
Listen for the `invoice_payment.detached` event.
```

- why_it_matters: When changing payment and reconciliation flows, detach a PaymentIntent from an invoice so it can be used in another invoice or payment flow.
- sources: <https://docs.stripe.com/changelog/clover/2026-01-28/detach-payment-from-invoice>, <https://docs.stripe.com/api/invoices/detach_payment?api-version=2026-01-28.preview>, <https://docs.stripe.com/api/events/types?api-version=2026-01-28.preview#event_types-invoice_payment.detached>
- gotchas: "invoice ID (path) (required): Invoice from which to detach the payment."; "payment_intent: ID of the PaymentIntent to detach from the invoice."; "Stripe-Version (required): Set to `2026-01-28.preview` for the documented API version."; "secret key (required): Authenticate the API request."; "Prerequisite: Have a Stripe secret key and the invoice and PaymentIntent IDs. The endpoint reference lists customer, invoice, and PaymentIntent creation as prerequisite API objects."; "Prerequisite: For REST requests, use API version `2026-01-28.preview`; the changelog says to include it in the `Stripe-Version` request header when not using an SDK."

### Stripe Financial Connections Sessions can relink deactivated accounts (2026-01-28)
- slug: stripe-financial-connections-sessions-can-relink-deactivated-accounts-0ea9a31eb3cd
- score: 0.98

How to use it:

When an account or authorization’s `status_details.inactive.action` indicates relinking is available, create a Financial Connections Session for its authorization, optionally targeting one account. After the flow, inspect `relink_result` for success or authentication failure.

Examples:

```
curl https://api.stripe.com/v1/financial_connections/sessions \
  -u "<SECRET_KEY>:" \
  -H "Stripe-Version: 2026-01-28.preview" \
  -d "account_holder[type]"=customer \
  -d "account_holder[customer]"=<CUSTOMER_ID> \
  -d "permissions[]"=payment_method \
  -d "relink_options[authorization]"=<AUTHORIZATION_ID>
```

```
curl https://api.stripe.com/v1/financial_connections/sessions \
  -u "<SECRET_KEY>:" \
  -H "Stripe-Version: 2026-01-28.preview" \
  -d "account_holder[type]"=customer \
  -d "account_holder[customer]"=<CUSTOMER_ID> \
  -d "permissions[]"=payment_method \
  -d "relink_options[authorization]"=<AUTHORIZATION_ID> \
  -d "relink_options[account]"=<ACCOUNT_ID>
```

- why_it_matters: When updating a Financial Connections integration to reconnect a deactivated account, create a session configured for the authorization or account to relink and handle its result.
- sources: <https://docs.stripe.com/changelog/clover/2026-01-28/financial-connections-relink>, <https://docs.stripe.com/api/financial_connections/sessions/create?api-version=2026-01-28.preview>, <https://docs.stripe.com/api/financial_connections/authorizations/object?api-version=2026-01-28.preview>
- gotchas: "relink_options.authorization (required): Authorization to relink."; "relink_options.account: Account to relink; it must belong to the specified authorization. Set this with `relink_options.authorization` to target one account."; "account_holder (required): Account holder to link accounts for; the `type` child is required, and the `customer` child is available when type is `customer`."; "permissions (required): Requested data features; documented values include `balances`, `transactions`, `ownership`, and `payment_method`."; "status_details.inactive.action: Indicates the action, if any, for relinking an inactive authorization; `relink_required` means the user may complete the streamlined relink flow; `none` means no action is currently recommended."; "relink_result: Session result indicating whether the expected authorization was relinked or authentication failed, as stated in the release note."; "Prerequisite: Create a Stripe Customer before creating the session; the docs show `POST /v1/customers` with a name and email."; "Prerequisite: Use the `2026-01-28.preview` Stripe API version for the documented request."; "Relinking is for Financial Connections Accounts deactivated due to authentication issues or account changes at the financial institution."; "Use `relink_options.authorization` to relink all accounts belonging to a specific authorization; pass both `relink_options.authorization` and `relink_options.account` to relink a specific account."; "The `transactable` status applies to accounts for previously deactivated Tokenized Account Numbers."

### Stripe tax IDs accept the Polish NIP type (2026-01-28)
- slug: stripe-tax-ids-accept-the-polish-nip-type-8e0f3c94f6e9
- score: 0.92

How to use it:

For customers based in Poland, create a tax ID with `type=pl_nip` and the customer's tax ID value. Stripe's release note says the Dashboard also offers Polish NIP for Checkout, invoices, and customer profiles.

Examples:

```
curl https://api.stripe.com/v1/tax_ids -u "<YOUR_SECRET_KEY>" -H "Stripe-Version: 2026-01-28.preview" -d type=pl_nip -d value=<NIP>
```

- why_it_matters: When implementing customer tax ID collection for customers based in Poland, add support for the Polish NIP tax ID type.
- sources: <https://docs.stripe.com/changelog/clover/2026-01-28/polish-nip-tax-id-type>, <https://docs.stripe.com/api/tax_ids/create?api-version=2026-01-28.preview>
- gotchas: "type (required): Tax ID type; `pl_nip` is an allowed value."; "value (required): Value of the tax ID."; "owner: Account or customer the tax ID belongs to; defaults to `owner[type]=self`."; "Polish NIP is a 10-digit tax identification number used by businesses and individuals in Poland."
