Skip to content
Create account
or
Sign in
The Stripe Docs logo
/
Ask AI
Create account
Sign in
Get started
Payments
Revenue
Platforms and marketplaces
Money management
Developer resources
Overview
Versioning
Changelog
Upgrade your API version
Upgrade your SDK version
Essentials
SDKs
API
    API v2
    API keys
    Stripe-Context header
    Rate limits
    Automated testing
    Metadata
    Expanding responses
      Use cases
    Include-dependent response values v2
    Pagination
    Domains and IP addresses
    Search
    Localization
    Error handling
    Error codes
Testing
Stripe CLI
Sample projects
Tools
Workbench
Developers Dashboard
Stripe Shell
Stripe for Visual Studio Code
Features
Workflows
Event destinations
Stripe health alertsFile uploads
AI solutions
Agent toolkit
Model Context Protocol
Security and privacy
Security
Privacy
Extend Stripe
Build Stripe apps
Use apps from Stripe
Partners
Partner ecosystem
Partner certification
HomeDeveloper resourcesAPIExpanding responses

Use cases for expanding responses

Expand API responses to return common payment details.

Use the expand parameter in your API request to retrieve details that the API doesn’t return in it’s default response. The following use cases illustrate this for commonly requested information.

See the Stripe fee for a given payment

You can check a payment’s processing fees after the payment processes and Stripe creates the balance transaction. The charge.updated event references the balance_transaction property (for example, txn_123), indicating that it’s ready to use.

Instead of looking up the balance transaction separately, you can retrieve it in a single call using expand.

Note

IC+ users can’t retrieve payment fee information from the balance transaction. Use the Payment fees report instead.

Command Line
curl
Ruby
Python
PHP
Java
Node
Go
.NET
No results
curl https://api.stripe.com/v1/payment_intents/pi_1Gpl8kLHughnNhxyIb1RvRTu \ -u
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:
\ -d "expand[]"="latest_charge.balance_transaction" \ -G

Users on API version 2022-08-01 or older:

Command Line
curl
Ruby
Python
PHP
Java
Node
Go
.NET
No results
curl https://api.stripe.com/v1/payment_intents/pi_1Gpl8kLHughnNhxyIb1RvRTu \ -u
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:
\ -d "expand[]"="charges.data.balance_transaction" \ -G

Note

A PaymentIntent must be captured and have a status of succeeded for the Stripe fees to be available.

When using automatic_async (the default capture_method since version 2024-04-10), balance transactions are created after the payment succeeds, but asynchronously in the background. This means:

  • The balance_transaction field on the Charge object might be null immediately after confirmation
  • If you expand balance_transaction or latest_charge.balance_transaction, it might not be available in the response
  • You can listen for the charge.updated event to know when the balance transaction becomes available

This asynchronous behavior improves payment performance, but requires your integration to handle the possibility that the balance transaction might not be immediately available.

See the charges included in a payout

Every automatic payout is tied to historical changes to the balance of your Stripe account. The API records these historical changes as balance transactions, which you can retrieve using List Balance Transactions. From a list of balance transactions, you can expand the source property to gather information on what triggered the change to the account balance (Charge, Refund, Transfer, and so on). For example:

Command Line
curl
Ruby
Python
PHP
Java
Node
Go
.NET
No results
curl https://api.stripe.com/v1/balance_transactions \ -u
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:
\ -d payout=po_1Gl3ZLLHughnNhxyDrOia0vI \ -d type=charge \ -d "expand[]"="data.source" \ -G

Note

You can only retrieve balance transaction history on automatic payouts. If you have manual payouts enabled, you must track transaction history on your own.

Learn more about payout reconciliation.

If you’re using Connect with destination charges, you can retrieve the same information on behalf of your connected accounts. One difference is that destination charges involve both a transfer and a linked payment (in the form of a Charge object) to move funds to a connected account. So when listing the balance transactions bundled in your connected account’s payouts, each balance transaction’s source is linked to the transfer’s payment rather than the originating Charge. To retrieve the originating Charge, you need to expand a payment’s linked transfer through the source_transfer property; and from there, expand the transfer’s source_transaction property:

Command Line
curl
Ruby
Python
PHP
Java
Node
Go
.NET
No results
curl https://api.stripe.com/v1/balance_transactions \ -u
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:
\ -d payout=po_1G7bnaD2wdkPsFGzdVOqU44u \ -d type=payment \ -d "expand[]"="data.source.source_transfer.source_transaction" \ -H "Stripe-Account: acct_1G7PaoD2wdkPsFGz" \ -G
Was this page helpful?
YesNo
  • Need help? Contact Support.
  • Join our early access program.
  • Check out our changelog.
  • Questions? Contact Sales.
  • LLM? Read llms.txt.
  • Powered by Markdoc