Sign in
An image of the Stripe logo
Create account
Sign in
Home
Payments
Business operations
Financial services
Developer tools
No-code
All products
Home
Payments
Business operations
Home
Payments
Business operations
Financial services
Developer tools
Support
Overview
Online payments
Products and prices
Invoicing
Subscriptions
Quotes
In-person payments
Multiparty payments
After the payment
Add payment methods
Payment Links
Stripe Checkout
Stripe Elements
About the APIs
    API tour
    Payment Intents
      How intents work
      Payment status updates
      Asynchronous Capture
      Compare to Charges
    Setup Intents
    Payment methods
    Older APIs
Regulation support
Implementation guides
Testing
HomePaymentsPayment Intents

Asynchronous Capture

Learn how to use Asynchronous Capture to enable faster PaymentIntent confirmations.

Asynchronous Capture reduces the latency of PaymentIntent confirmations by making the capture operation asynchronous. To use these faster PaymentIntent confirmations, set the capture_method=automatic_async parameter when confirming a PaymentIntent.

Opt in to Asynchronous Capture at confirmation time

Here’s an example of how to opt into Asynchronous Capture in a PaymentIntent Create and Confirm API call

Command Line
curl https://api.stripe.com/v1/payment_intents \ -u
sk_test_4eC39HqLyjWDarjtT1zdp7dc
: \ -d amount=2000 \ -d currency=usd \ -d "payment_method_types[]"=card \ -d payment_method=pm_card_visa \ -d capture_method=automatic_async \ -d confirm=true

If you have an existing integration with Stripe, you might need to make additional changes when you opt into Asynchronous Capture because the API response and some webhooks have different behavior than they did before.

For all payments, the balance_transaction is null on the following objects. For Connect payments, the transfer and application_fee are also null on the following objects:

  • attached Charge object of the API response
  • charge.succeeded webhook
  • payment_intent.succeeded webhook

Modified Charge object on the charge.succeeded webhook

# Charge Object { "id": "ch_123", "object": "charge", "amount_captured": 1000, # the capture has happened "application_fee_amount": 100, "captured": true, - "balance_transaction": "txn_123", # applicable to all charges. - "transfer": "tr_123", # applicable to destination charge only. - "application_fee": "fee_123", # applicable to destination charge only. + "balance_transaction": null, # object might not be created yet, might be shown as nil. + "transfer": null, # object might not be created yet, might be shown as nil. + "application_fee": null, # object might not be created yet, might be shown as nil. ... }

Modified API response and payment_intent.succeeded webhook (different based on API version)

# PaymentIntent Object { "id": "pi_123", "object": "payment_intent", "capture_method": "automatic_async", "status": "succeeded", "latest_charge": "ch_**" # if expanded, this is the Modified Charge object above }

Listen to webhooks to get notified when additional data is available

Our SLA for the charge.updated webhook is 1 hour after the successful PaymentIntent confirmation.

If you need access to the objects set to null by Asynchronous Capture, you can listen to webhooks.

  • To get the balance_transaction, subscribe to the charge.updated webhook event.
  • To get the application_fee, subscribe to the application_fee.created webhook event.
  • To get the transfer, subscribe to the transfer.created webhook events.

Webhooks for Asynchronous Capture

# Webhook: POST '/my-webhook' do case event.type when 'charge.updated' # check ch.balance_transaction # execute relevant logic when 'transfer.created' # execute relevant logic when 'application_fee.created' # execute relevant logic else # other events end status 200 end # Events: # charge.updated { "data": { "id": "ch_123", "object": "charge", "amount": 100, "balance_transaction": "txn_123", # applicable to all charges. "transfer": "tr_123", # applicable to destination charge only. "application_fee": "fee_123", # applicable to destination charge only. ... }, previous_attributes: { "balance_transaction": null, # applicable to all charges. "transfer": null, # applicable to destination charge only. "application_fee": null, # applicable to destination charge only. } } # transfer.created { "data": { "id": "tr_123", "object": "transfer", "amount": 1000, ... } } # application_fee.created { "data": { "id": "fee_123", "object": "application_fee", "amount": 100, ... } }
Was this page helpful?
Questions? Contact us.
Watch our developer tutorials.
Check out our product changelog.
Powered by Markdoc
You can unsubscribe at any time. Read our privacy policy.
On this page
Opt in to Asynchronous Capture at confirmation time
Listen to webhooks to get notified when additional data is available
Stripe Shell
Test mode
Welcome to the Stripe Shell! Stripe Shell is a browser-based shell with the Stripe CLI pre-installed. Login to your Stripe account and press Control + Backtick on your keyboard to start managing your Stripe resources in test mode. - View supported Stripe commands: - Find webhook events: - Listen for webhook events: - Call Stripe APIs: stripe [api resource] [operation] (e.g. )
The Stripe Shell is best experienced on desktop.
$