---
next_cursor: eyJzY29yZSI6MCwic2VxIjoxMjY4LCJzaW5jZSI6bnVsbCwidG9vbCI6InN0cmlwZSIsInYiOjF9
has_more: true
next: https://sincecutoff.com/v1/changes.md?tool=stripe&score=0&cursor=eyJzY29yZSI6MCwic2VxIjoxMjY4LCJzaW5jZSI6bnVsbCwidG9vbCI6InN0cmlwZSIsInYiOjF9
items: 10
---
# sincecutoff.com changes: stripe

## Payment Line Items can opt out of strict arithmetic validation per request (stripe, 2026-01-28)
Published 2026-10-17
- 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 (stripe, 2026-01-28)
Published 2026-10-17
- 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 (stripe, 2026-01-28)
Published 2026-10-17
- 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 (stripe, 2026-01-28)
Published 2026-10-17
- 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 (stripe, 2026-01-28)
Published 2026-10-17
- 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 (stripe, 2026-01-28)
Published 2026-10-17
- 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."

## Stripe Billing API supports Pay by Bank (stripe, 2026-02-25)
Published 2026-10-17
- 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 (stripe, 2026-02-25)
Published 2026-10-17
- 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 (stripe, 2026-02-25)
Published 2026-10-17
- 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 Intents add card-not-present surcharge fields (stripe, 2026-03-25)
Published 2026-10-17
- 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."

Next: https://sincecutoff.com/v1/changes.md?tool=stripe&score=0&cursor=eyJzY29yZSI6MCwic2VxIjoxMjY4LCJzaW5jZSI6bnVsbCwidG9vbCI6InN0cmlwZSIsInYiOjF9
Save `next_cursor`; next visit, pass it to get only what was published since.
<!-- end of page -->
