Expandable Objects

Expandable objects let a Stripe API request inline a related object in the response instead of returning only its ID, saving extra round trips.

Expandable objects are Stripe's way of returning a nested, fully-populated object inside a response instead of just its ID. By default many fields hold only a reference — for example a charge's customer field is a string like cus_123. Passing an expand parameter tells the API to replace that reference with the full object, so you get the data you need in a single request.

How expansion works

Add expand[] entries to a request, naming the fields you want inflated. Stripe supports dot notation to reach nested references and applies expansion to both individual retrievals and list endpoints.

expand[]=customer turns a charge.customer ID into the full customer object

A common example: retrieving a PaymentIntent and expanding its latest charge and the charge's balance transaction in one call, expand[]=latest_charge.balance_transaction, so you see the fee and net amount without a second lookup.

Why it matters

  • Fewer round trips. One expanded request replaces two or three sequential calls, which also keeps you further from the rate limit.
  • Simpler code. Related data arrives together, so you don't stitch responses back together by ID.
  • Cost visibility. Expanding a charge's balance transaction is the standard way to read the Stripe fee and the net amount that lands in your balance.

Limits to keep in mind

Expansion has depth caps — Stripe limits how many levels you can inflate in one request, and list responses can only expand within data. Over-expanding also makes payloads larger and slower, so request only the references you actually consume. For high-volume ingestion, reading events and expanding just the fields your handler needs is usually the leaner path.

Related terms

Updated July 6, 2026