The Stripe API is organized around REST. Our API has predictable resource-oriented URLs, accepts form-encoded request bodies, returns JSON-encoded responses, and uses standard HTTP response codes, authentication, and verbs.

You can use the Stripe API in test mode, which doesn’t affect your live data or interact with the banking networks. The API key you use to authenticate the request determines whether the request is live mode or test mode.

The Stripe API doesn’t support bulk updates. You can work on only one object per request.

The Stripe API differs for every account as we release new versions and tailor functionality. Log in to see docs with your test key and data.

Just getting started?

Check out our development quickstart guide.

Not a developer?

Use Stripe’s no-code options or apps from our partners to get started with Stripe and to do more with your Stripe account—no code required.

Base URL
https://api.stripe.com
Client Libraries

By default, the Stripe API Docs demonstrate using curl to interact with the API over HTTP. Select one of our official client libraries to see examples in code.

The Stripe API uses API keys to authenticate requests. You can view and manage your API keys in the Stripe Dashboard.

Test mode secret keys have the prefix sk_test_ and live mode secret keys have the prefix sk_live_. Alternatively, you can use restricted API keys for granular permissions.

Your API keys carry many privileges, so be sure to keep them secure! Do not share your secret API keys in publicly accessible areas such as GitHub, client-side code, and so forth.

All API requests must be made over HTTPS. Calls made over plain HTTP will fail. API requests without authentication will also fail.

Authenticated Request
curl https://api.stripe.com/v1/charges \
-u sk_test_4eC39Hq...arjtT1zdp7dcsk_test_4eC39HqLyjWDarjtT1zdp7dc:
# The colon prevents curl from asking for a password.
Your API Key

A sample test API key is included in all the examples here, so you can test any example right away. Do not submit any personally identifiable information in requests made with this key.

To test requests using your account, replace the sample API key with your actual API key or sign in.

To act as connected accounts, clients can issue requests using the Stripe-Account special header. Make sure that this header contains a Stripe account ID, which usually starts with the acct_ prefix.

The value is set per-request as shown in the adjacent code sample. Methods on the returned object reuse the same account ID.

Per-Request Account
curl https://api.stripe.com/v1/charges/ch_3LmjFA2eZvKYlo2C09TLIsrw \
-u sk_test_4eC39Hq...arjtT1zdp7dcsk_test_4eC39HqLyjWDarjtT1zdp7dc: \
-H "Stripe-Account: acct_1032D82eZvKYlo2C" \
-G

Stripe uses conventional HTTP response codes to indicate the success or failure of an API request. In general: Codes in the 2xx range indicate success. Codes in the 4xx range indicate an error that failed given the information provided (e.g., a required parameter was omitted, a charge failed, etc.). Codes in the 5xx range indicate an error with Stripe’s servers (these are rare).

Some 4xx errors that could be handled programmatically (e.g., a card is declined) include an error code that briefly explains the error reported.

Attributes

  • typeenum

    The type of error returned. One of api_error, card_error, idempotency_error, or invalid_request_error

    Possible enum values
    api_error
    card_error
    idempotency_error
    invalid_request_error
  • codenullable string

    For some errors that could be handled programmatically, a short string indicating the error code reported.

  • decline_codenullable string

    For card errors resulting from a card issuer decline, a short string indicating the card issuer’s reason for the decline if they provide one.

  • messagenullable string

    A human-readable message providing more details about the error. For card errors, these messages can be shown to your users.

  • paramnullable string

    If the error is parameter-specific, the parameter related to the error. For example, you can use this to display a message near the correct form field.

  • payment_intentnullable object

    The PaymentIntent object for errors returned on a request involving a PaymentIntent.

More

  • chargenullable string

  • payment_method_typenullable string

  • doc_urlnullable string

  • request_log_urlnullable string

  • setup_intentnullable object

  • sourcenullable object

  • payment_methodnullable object

HTTP Status Code Summary
200OKEverything worked as expected.
400Bad RequestThe request was unacceptable, often due to missing a required parameter.
401UnauthorizedNo valid API key provided.
402Request FailedThe parameters were valid but the request failed.
403ForbiddenThe API key doesn’t have permissions to perform the request.
404Not FoundThe requested resource doesn’t exist.
409ConflictThe request conflicts with another request (perhaps due to using the same idempotent key).
429Too Many RequestsToo many requests hit the API too quickly. We recommend an exponential backoff of your requests.
500, 502, 503, 504Server ErrorsSomething went wrong on Stripe’s end. (These are rare.)
Error Types
api_errorAPI errors cover any other type of problem (e.g., a temporary problem with Stripe’s servers), and are extremely uncommon.
card_errorCard errors are the most common type of error you should expect to handle. They result when the user enters a card that can’t be charged for some reason.
idempotency_errorIdempotency errors occur when an Idempotency-Key is re-used on a request that does not match the first request’s API endpoint and parameters.
invalid_request_errorInvalid request errors arise when your request has invalid parameters.

Our Client libraries raise exceptions for many reasons, such as a failed charge, invalid parameters, authentication errors, and network unavailability. We recommend writing code that gracefully handles all possible API exceptions.

# Select a client library to see examples of
# handling different kinds of errors.

Many objects allow you to request additional information as an expanded response by using the expand request parameter. This parameter is available on all API requests, and applies to the response of that request only. You can expand responses in two ways.

In many cases, an object contains the ID of a related object in its response properties. For example, a Charge might have an associated Customer ID. You can expand these objects in line with the expand request parameter. The expandable label in this documentation indicates ID fields that you can expand into objects.

Some available fields aren’t included in the responses by default, such as the number and cvc fields for the Issuing Card object. You can request these fields as an expanded response by using the expand request parameter.

You can expand recursively by specifying nested fields after a dot (.). For example, requesting invoice.subscription on a charge expands the invoice property into a full Invoice object, then expands the subscription property on that invoice into a full Subscription object.

You can use the expand parameter on any endpoint that returns expandable fields, including list, create, and update endpoints.

Expansions on list requests start with the data property. For example, you can expand data.customers on a request to list charges and associated customers. Performing deep expansions on numerous list requests might result in slower processing times.

Expansions have a maximum depth of four levels (for example, the deepest expansion allowed when listing charges is data.invoice.subscription.default_source).

You can expand multiple objects at the same time by identifying multiple items in the expand array.

curl https://api.stripe.com/v1/charges/ch_3LmzzQ2eZvKYlo2C0XjzUzJV \
-u sk_test_4eC39Hq...arjtT1zdp7dcsk_test_4eC39HqLyjWDarjtT1zdp7dc: \
-d "expand[]"=customer \
-d "expand[]"="invoice.subscription" \
-G
Response
{
"id": "ch_3LmzzQ2eZvKYlo2C0XjzUzJV",
"object": "charge",
"customer": {
"id": "cu_14HOpH2eZvKYlo2CxXIM7Pb2",
"object": "customer",
// ...
},
"invoice": {
"id": "in_1LmzzQ2eZvKYlo2CpyWn8szu",
"object": "invoice",
"subscription": {
"id": "su_1LmzoG2eZvKYlo2Cpw6S7dAq",
"object": "subscription",
// ...
},
// ...
},
// ...
}

The API supports idempotency for safely retrying requests without accidentally performing the same operation twice. When creating or updating an object, use an idempotency key. Then, if a connection error occurs, you can safely repeat the request without risk of creating a second object or performing the update twice.

To perform an idempotent request, provide an additional IdempotencyKey element to the request options.

Stripe’s idempotency works by saving the resulting status code and body of the first request made for any given idempotency key, regardless of whether it succeeds or fails. Subsequent requests with the same key return the same result, including 500 errors.

A client generates an idempotency key, which is a unique key that the server uses to recognize subsequent retries of the same request. How you create unique keys is up to you, but we suggest using V4 UUIDs, or another random string with enough entropy to avoid collisions. Idempotency keys are up to 255 characters long.

You can remove keys from the system automatically after they’re at least 24 hours old. We generate a new request if a key is reused after the original is pruned. The idempotency layer compares incoming parameters to those of the original request and errors if they’re the same to prevent accidental misuse.

We save results only after the execution of an endpoint begins. If incoming parameters fail validation, or the request conflicts with another request that’s executing concurrently, we don’t save the idempotent result because no API endpoint initiates the execution. You can retry these requests. Learn more about when you can retry idempotent requests.

All POST requests accept idempotency keys. Don’t send idempotency keys in GET and DELETE requests because it has no effect. These requests are idempotent by definition.

curl https://api.stripe.com/v1/customers \
-u sk_test_4eC39Hq...arjtT1zdp7dcsk_test_4eC39HqLyjWDarjtT1zdp7dc: \
-H "Idempotency-Key: KG5LxwFBepaKHyUD" \
-d description="My First Test Customer (created for API docs at https://docs.stripe.com/api)"

Updateable Stripe objects—including Account, Charge, Customer, PaymentIntent, Refund, Subscription, and Transfer have a metadata parameter. You can use this parameter to attach key-value data to these Stripe objects.

You can specify up to 50 keys, with key names up to 40 characters long and values up to 500 characters long.

You can use metadata to store additional, structured information on an object. For example, you could store your user’s full name and corresponding unique identifier from your system on a Stripe Customer object. Stripe doesn’t use metadata—for example, we don’t use it to authorize or decline a charge and it won’t be seen by your users unless you choose to show it to them.

Some of the objects listed above also support a description parameter. You can use the description parameter to annotate a charge-for example, a human-readable description such as 2 shirts for test@example.com. Unlike metadata, description is a single string, which your users might see (for example, in email receipts Stripe sends on your behalf).

Don’t store any sensitive information (bank account numbers, card details, and so on) as metadata or in the description parameter.

Sample metadata use cases

  • Link IDs: Attach your system’s unique IDs to a Stripe object to simplify lookups. For example, add your order number to a charge, your user ID to a customer or recipient, or a unique receipt number to a transfer.
  • Refund papertrails: Store information about the reason for a refund and the individual responsible for its creation.
  • Customer details: Annotate a customer by storing an internal ID for your future use.
POST /v1/customers
curl https://api.stripe.com/v1/customers \
-u "sk_test_4eC39Hq...arjtT1zdp7dcsk_test_4eC39HqLyjWDarjtT1zdp7dc:" \
-d "metadata[order_id]"=6735
{
"id": "cus_123456789",
"object": "customer",
"address": {
"city": "city",
"country": "US",
"line1": "line 1",
"line2": "line 2",
"postal_code": "90210",
"state": "CA"
},
"balance": 0,
"created": 1483565364,
"currency": null,
"default_source": null,
"delinquent": false,
"description": null,
"discount": null,
"email": null,
"invoice_prefix": "C11F7E1",
"invoice_settings": {
"custom_fields": null,
"default_payment_method": null,
"footer": null,
"rendering_options": null
},
"livemode": false,
"metadata": {
"order_id": "6735"
},
"name": null,
"next_invoice_sequence": 1,
"phone": null,
"preferred_locales": [],
"shipping": null,
"tax_exempt": "none"
}

All top-level API resources have support for bulk fetches through “list” API methods. For example, you can list charges, list customers, and list invoices. These list API methods share a common structure and accept, at a minimum, the following three parameters: limit, starting_after, and ending_before.

Stripe’s list API methods use cursor-based pagination through the starting_after and ending_before parameters. Both parameters accept an existing object ID value (see below) and return objects in reverse chronological order. The ending_before parameter returns objects listed before the named object. The starting_after parameter returns objects listed after the named object. These parameters are mutually exclusive. You can use either the starting_after or ending_before parameter, but not both simultaneously.

Our client libraries offer auto-pagination helpers to traverse all pages of a list.

Parameters

  • limitoptional, default is 10

    This specifies a limit on the number of objects to return, ranging between 1 and 100.

  • starting_afteroptional object ID

    A cursor to use in pagination. starting_after is an object ID that defines your place in the list. For example, if you make a list request and receive 100 objects, ending with obj_foo, your subsequent call can include starting_after=obj_foo to fetch the next page of the list.

  • ending_beforeoptional object ID

    A cursor to use in pagination. ending_before is an object ID that defines your place in the list. For example, if you make a list request and receive 100 objects, starting with obj_bar, your subsequent call can include ending_before=obj_bar to fetch the previous page of the list.

List Response Format

  • objectstring, value is "list"

    A string that provides a description of the object type that returns.

  • dataarray

    An array containing the actual response elements, paginated by any request parameters.

  • has_moreboolean

    Whether or not there are more elements available after this set. If false, this set comprises the end of the list.

  • urlurl

    The URL for accessing this list.

Response
{
"object": "list",
"url": "/v1/customers",
"has_more": false,
"data": [
{
"id": "cus_4QFJOjw2pOmAGJ",
"object": "customer",
"address": null,
"balance": 0,
"created": 1405641735,
"currency": "usd",
"default_source": "card_14HOpG2eZvKYlo2Cz4u5AJG5",
"delinquent": false,
"description": "New customer",
"discount": null,
"email": null,
"invoice_prefix": "7D11B54",
"invoice_settings": {
"custom_fields": null,
"default_payment_method": null,
"footer": null,
"rendering_options": null
},
"livemode": false,
"metadata": {
"order_id": "6735"
},
"name": "cus_4QFJOjw2pOmAGJ",
"next_invoice_sequence": 25,
"phone": null,
"preferred_locales": [],
"shipping": null,
"tax_exempt": "none",
"test_clock": null
},
]
}

Some top-level API resource have support for retrieval via “search” API methods. For example, you can search charges, search customers, and search subscriptions.

Stripe’s search API methods utilize cursor-based pagination via the page request parameter and next_page response parameter. For example, if you make a search request and receive "next_page": "pagination_key" in the response, your subsequent call can include page=pagination_key to fetch the next page of results.

Our client libraries offer auto-pagination helpers to easily traverse all pages of a search result.

Search request format

  • queryrequired

    The search query string. See search query language.

  • limitoptional

    A limit on the number of objects returned. Limit can range between 1 and 100, and the default is 10.

  • pageoptional

    A cursor for pagination across multiple pages of results. Don’t include this parameter on the first call. Use the next_page value returned in a previous response to request subsequent results.

Search response format

  • objectstring, value is "search_result"

    A string describing the object type returned.

  • urlstring

    The URL for accessing this list.

  • has_moreboolean

    Whether or not there are more elements available after this set. If false, this set comprises the end of the list.

  • dataarray

    An array containing the actual response elements, paginated by any request parameters.

  • next_pagestring

    A cursor for use in pagination. If has_more is true, you can pass the value of next_page to a subsequent call to fetch the next page of results.

  • total_countoptional positive integer or zero

    The total number of objects that match the query, only accurate up to 10,000. This field isn’t included by default. To include it in the response, expand the total_count field.

Response
{
"object": "search_result",
"url": "/v1/customers/search",
"has_more": false,
"data": [
{
"id": "cus_4QFJOjw2pOmAGJ",
"object": "customer",
"address": null,
"balance": 0,
"created": 1405641735,
"currency": "usd",
"default_source": "card_14HOpG2eZvKYlo2Cz4u5AJG5",
"delinquent": false,
"description": "someone@example.com for Coderwall",
"discount": null,
"email": null,
"invoice_prefix": "7D11B54",
"invoice_settings": {
"custom_fields": null,
"default_payment_method": null,
"footer": null,
"rendering_options": null
},
"livemode": false,
"metadata": {
"foo": "bar"
},
"name": "fakename",
"next_invoice_sequence": 25,
"phone": null,
"preferred_locales": [],
"shipping": null,
"tax_exempt": "none",
"test_clock": null
}
]
}

Our libraries support auto-pagination. This feature allows you to easily iterate through large lists of resources without having to manually perform the requests to fetch subsequent pages.

# The auto-pagination feature is specific to Stripe's
# libraries and cannot be used directly with curl.

Each API request has an associated request identifier. You can find this value in the response headers, under Request-Id. You can also find request identifiers in the URLs of individual request logs in your Dashboard.

To expedite the resolution process, provide the request identifier when you contact us about a specific request.

curl https://api.stripe.com/v1/customers \
-u sk_test_4eC39Hq...arjtT1zdp7dcsk_test_4eC39HqLyjWDarjtT1zdp7dc: \
-D "-" \
-X POST

Each major release, such as Acacia, includes backwards-incompatible changes. Each monthly release adds new backwards-compatible changes and uses the same name as the last major release, indicating that it’s safe to upgrade without adopting any backwards-incompatible changes. The current version is 2024-11-20.acacia. Learn more about API upgrades and backwards compatibility For information on all API updates, view our API changelog.

You can upgrade your API version in Workbench. As a precaution, use API versioning to test a new API version before committing to an upgrade.

curl https://api.stripe.com/v1/charges \
-u sk_test_4eC39Hq...arjtT1zdp7dcsk_test_4eC39HqLyjWDarjtT1zdp7dc: \
-H "Stripe-Version: 2024-11-20.acacia"

This is an object representing your Stripe balance. You can retrieve it to see the balance currently on your Stripe account.

You can also retrieve the balance history, which contains a list of transactions that contributed to the balance (charges, payouts, and so forth).

The available and pending amounts for each currency are broken down further by payment source types.

Related guide: Understanding Connect account balances

Balance transactions represent funds moving through your Stripe account. Stripe creates them for every type of transaction that enters or leaves your Stripe account balance.

Related guide: Balance transaction types

The Charge object represents a single attempt to move money into your Stripe account. PaymentIntent confirmation is the most common way to create Charges, but transferring money to a different Stripe account through Connect also creates Charges. Some legacy payment flows create Charges directly, which is not recommended for new integrations.

This object represents a customer of your business. Use it to create recurring charges, save payment and contact information, and track payments that belong to the same customer.

A Customer Session allows you to grant Stripe’s frontend SDKs (like Stripe.js) client-side access control over a Customer.

Related guides: Customer Session with the Payment Element, Customer Session with the Pricing Table, Customer Session with the Buy Button.

A dispute occurs when a customer questions your charge with their card issuer. When this happens, you have the opportunity to respond to the dispute with evidence that shows that the charge is legitimate.

Related guide: Disputes and fraud

Events are our way of letting you know when something interesting happens in your account. When an interesting event occurs, we create a new Event object. For example, when a charge succeeds, we create a charge.succeeded event, and when an invoice payment attempt fails, we create an invoice.payment_failed event. Certain API requests might create multiple events. For example, if you create a new subscription for a customer, you receive both a customer.subscription.created event and a charge.succeeded event.

Events occur when the state of another API resource changes. The event’s data field embeds the resource’s state at the time of the change. For example, a charge.succeeded event contains a charge, and an invoice.payment_failed event contains an invoice.

As with other API resources, you can use endpoints to retrieve an individual event or a list of events from the API. We also have a separate webhooks system for sending the Event objects directly to an endpoint on your server. You can manage webhooks in your account settings. Learn how to listen for events so that your integration can automatically trigger reactions.

When using Connect, you can also receive event notifications that occur in connected accounts. For these events, there’s an additional account attribute in the received Event object.

We only guarantee access to events through the Retrieve Event API for 30 days.

Events are generated to keep you informed of activity in your business account. APIs in the /v2 namespace generate thin events which have small, unversioned payloads that include a reference to the ID of the object that has changed. The Events v2 API returns these new thin events. Retrieve the event object for additional data about the event. Use the related object ID in the event payload to fetch the API resource of the object associated with the event. Comparatively, events generated by most API v1 include a versioned snapshot of an API object in their payload.

This object represents files hosted on Stripe’s servers. You can upload files with the create file request (for example, when uploading dispute evidence). Stripe also creates files independently (for example, the results of a Sigma scheduled query).

Related guide: File upload guide

A Mandate is a record of the permission that your customer gives you to debit their payment method.

A PaymentIntent guides you through the process of collecting a payment from your customer. We recommend that you create exactly one PaymentIntent for each order or customer session in your system. You can reference the PaymentIntent later to see the history of payment attempts for a particular session.

A PaymentIntent transitions through multiple statuses throughout its lifetime as it interfaces with Stripe.js to perform authentication flows and ultimately creates at most one successful charge.

Related guide: Payment Intents API

A SetupIntent guides you through the process of setting up and saving a customer’s payment credentials for future payments. For example, you can use a SetupIntent to set up and save your customer’s card without immediately collecting a payment. Later, you can use PaymentIntents to drive the payment flow.

Create a SetupIntent when you’re ready to collect your customer’s payment credentials. Don’t maintain long-lived, unconfirmed SetupIntents because they might not be valid. The SetupIntent transitions through multiple statuses as it guides you through the setup process.

Successful SetupIntents result in payment credentials that are optimized for future payments. For example, cardholders in certain regions might need to be run through Strong Customer Authentication during payment method collection to streamline later off-session payments. If you use the SetupIntent with a Customer, it automatically attaches the resulting payment method to that Customer after successful setup. We recommend using SetupIntents or setup_future_usage on PaymentIntents to save payment methods to prevent saving invalid or unoptimized payment methods.

By using SetupIntents, you can reduce friction for your customers, even as regulations change over time.

Related guide: Setup Intents API

A SetupAttempt describes one attempted confirmation of a SetupIntent, whether that confirmation is successful or unsuccessful. You can use SetupAttempts to inspect details of a specific attempt at setting up a payment method using a SetupIntent.

A Payout object is created when you receive funds from Stripe, or when you initiate a payout to either a bank account or debit card of a connected Stripe account. You can retrieve individual payouts, and list all payouts. Payouts are made on varying schedules, depending on your country and industry.

Related guide: Receiving payouts

Refund objects allow you to refund a previously created charge that isn’t refunded yet. Funds are refunded to the credit or debit card that’s initially charged.

Related guide: Refunds

ConfirmationTokens help transport client side data collected by Stripe JS over to your server for confirming a PaymentIntent or SetupIntent. If the confirmation is successful, values present on the ConfirmationToken are written onto the Intent.

To learn more about how to use ConfirmationToken, visit the related guides:

Tokenization is the process Stripe uses to collect sensitive card or bank account details, or personally identifiable information (PII), directly from your customers in a secure manner. A token representing this information is returned to your server to use. Use our recommended payments integrations to perform this process on the client-side. This guarantees that no sensitive card data touches your server, and allows your integration to operate in a PCI-compliant way.

If you can’t use client-side tokenization, you can also create tokens using the API with either your publishable or secret API key. If your integration uses this method, you’re responsible for any PCI compliance that it might require, and you must keep your secret API key safe. Unlike with client-side tokenization, your customer’s information isn’t sent directly to Stripe, so we can’t determine how it’s handled or stored.

You can’t store or use tokens more than once. To store card or bank account information for later use, create Customer objects or External accounts. Radar, our integrated solution for automatic fraud protection, performs best with integrations that use client-side tokenization.

PaymentMethod objects represent your customer’s payment instruments. You can use them with PaymentIntents to collect payments or save them to Customer objects to store instrument details for future payments.

Related guides: Payment Methods and More Payment Scenarios.

PaymentMethodConfigurations control which payment methods are displayed to your customers when you don’t explicitly specify payment method types. You can have multiple configurations with different sets of payment methods for different scenarios.

There are two types of PaymentMethodConfigurations. Which is used depends on the charge type:

Direct configurations apply to payments created on your account, including Connect destination charges, Connect separate charges and transfers, and payments not involving Connect.

Child configurations apply to payments created on your connected accounts using direct charges, and charges with the on_behalf_of parameter.

Child configurations have a parent that sets default values and controls which settings connected accounts may override. You can specify a parent ID at payment time, and Stripe will automatically resolve the connected account’s associated child configuration. Parent configurations are managed in the dashboard and are not available in this API.

Related guides:

A payment method domain represents a web domain that you have registered with Stripe. Stripe Elements use registered payment method domains to control where certain payment methods are shown.

Related guide: Payment method domains.

These bank accounts are payment methods on Customer objects.

On the other hand External Accounts are transfer destinations on Account objects for connected accounts. They can be bank accounts or debit cards as well, and are documented in the links above.

Related guide: Bank debits and transfers

A customer’s Cash balance represents real funds. Customers can add funds to their cash balance by sending a bank transfer. These funds can be used for payment and can eventually be paid out to your bank account.

Customers with certain payments enabled have a cash balance, representing funds that were paid by the customer to a merchant, but have not yet been allocated to a payment. Cash Balance Transactions represent when funds are moved into or out of this balance. This includes funding by the customer, allocation to payments, and refunds to the customer.

You can store multiple cards on a customer in order to charge the customer later. You can also store multiple debit cards on a recipient in order to transfer to those cards later.

Related guide: Card payments with Sources

Sources Deprecated

Source objects allow you to accept a variety of payment methods. They represent a customer’s payment instrument, and can be used with the Stripe API just like a Card object: once chargeable, they can be charged, or can be attached to customers.

Stripe doesn’t recommend using the deprecated Sources API. We recommend that you adopt the PaymentMethods API. This newer API provides access to our latest features and payment method types.

Related guides: Sources API and Sources & Customers.

Products describe the specific goods or services you offer to your customers. For example, you might offer a Standard and Premium version of your goods or service; each version would be a separate Product. They can be used in conjunction with Prices to configure pricing in Payment Links, Checkout, and Subscriptions.

Related guides: Set up a subscription, share a Payment Link, accept payments with Checkout, and more about Products and Prices

Prices define the unit cost, currency, and (optional) billing cycle for both recurring and one-time purchases of products. Products help you track inventory or provisioning, and prices help you track payment terms. Different physical goods or levels of service should be represented by products, and pricing options should be represented by prices. This approach lets you change prices without having to change your provisioning scheme.

For example, you might have a single “gold” product that has prices for $10/month, $100/year, and €9 once.

Related guides: Set up a subscription, create an invoice, and more about products and prices.

A coupon contains information about a percent-off or amount-off discount you might want to apply to a customer. Coupons may be applied to subscriptions, invoices, checkout sessions, quotes, and more. Coupons do not work with conventional one-off charges or payment intents.

A Promotion Code represents a customer-redeemable code for a coupon. It can be used to create multiple codes for a single coupon.

A discount represents the actual application of a coupon or promotion code. It contains information about when the discount began, when it will end, and what it is applied to.

Related guide: Applying discounts to subscriptions

Tax codes classify goods and services for tax purposes.

Shipping rates describe the price of shipping presented to your customers and applied to a purchase. For more information, see Charge for shipping.

A Checkout Session represents your customer’s session as they pay for one-time purchases or subscriptions through Checkout or Payment Links. We recommend creating a new Session each time your customer attempts to pay.

Once payment is successful, the Checkout Session will contain a reference to the Customer, and either the successful PaymentIntent or an active Subscription.

You can create a Checkout Session on your server and redirect to its URL to begin Checkout.

Related guide: Checkout quickstart

Each customer has a Balance value, which denotes a debit or credit that’s automatically applied to their next invoice upon finalization. You may modify the value directly by using the update customer API, or by creating a Customer Balance Transaction, which increments or decrements the customer’s balance by the specified amount.

Related guide: Customer balance

The Billing customer portal is a Stripe-hosted UI for subscription and billing management.

A portal configuration describes the functionality and features that you want to provide to your customers through the portal.

A portal session describes the instantiation of the customer portal for a particular customer. By visiting the session’s URL, the customer can manage their subscriptions and billing details. For security reasons, sessions are short-lived and will expire if the customer does not visit the URL. Create sessions on-demand when customers intend to manage their subscriptions and billing details.

Related guide: Customer management

Invoices are statements of amounts owed by a customer, and are either generated one-off, or generated periodically from a subscription.

They contain invoice items, and proration adjustments that may be caused by subscription upgrades/downgrades (if necessary).

If your invoice is configured to be billed through automatic charges, Stripe automatically finalizes your invoice and attempts payment. Note that finalizing the invoice, when automatic, does not happen immediately as the invoice is created. Stripe waits until one hour after the last webhook was successfully sent (or the last webhook timed out after failing). If you (and the platforms you may have connected to) have no webhooks configured, Stripe waits one hour after creation to finalize the invoice.

If your invoice is configured to be billed by sending an email, then based on your email settings, Stripe will email the invoice to your customer and await payment. These emails can contain a link to a hosted page to pay the invoice.

Stripe applies any customer credit on the account before determining the amount due for the invoice (i.e., the amount that will be actually charged). If the amount due for the invoice is less than Stripe’s minimum allowed charge per currency, the invoice is automatically marked paid, and we add the amount due to the customer’s credit balance which is applied to the next invoice.

More details on the customer’s credit balance are here.

Related guide: Send invoices to customers

Invoice Items represent the component lines of an invoice. An invoice item is added to an invoice by creating or updating it with an invoice field, at which point it will be included as an invoice line item within invoice.lines.

Invoice Items can be created before you are ready to actually send the invoice. This can be particularly useful when combined with a subscription. Sometimes you want to add a charge or credit to a customer, but actually charge or credit the customer’s card only at the end of a regular billing cycle. This is useful for combining several charges (to minimize per-transaction fees), or for having Stripe tabulate your usage-based billing totals.

Related guides: Integrate with the Invoicing API, Subscription Invoices.

Invoice Line Items represent the individual lines within an invoice and only exist within the context of an invoice.

Each line item is backed by either an invoice item or a subscription item.

Invoice Rendering Templates are used to configure how invoices are rendered on surfaces like the PDF. Invoice Rendering Templates can be created from within the Dashboard, and they can be used over the API when creating invoices.

A billing alert is a resource that notifies you when a certain usage threshold on a meter is crossed. For example, you might create a billing alert to notify you when a certain user made 100 API requests.

Meters specify how to aggregate meter events over a billing period. Meter events represent the actions that customers take in your system. Meters attach to prices and form the basis of the bill.

Related guide: Usage based billing

Meter events represent actions that customers take in your system. You can use meter events to bill a customer based on their usage. Meter events are associated with billing meters, which define both the contents of the event’s payload and how to aggregate those events.

Meter events are used to report customer usage of your product or service. Meter events are associated with billing meters, which define the shape of the event’s payload and how those events are aggregated. Meter events are processed asynchronously, so they may not be immediately reflected in aggregates or on upcoming invoices.

A billing meter event adjustment is a resource that allows you to cancel a meter event. For example, you might create a billing meter event adjustment to cancel a meter event that was created in error or attached to the wrong customer.

A billing meter event adjustment is a resource that allows you to cancel a meter event. For example, you might create a billing meter event adjustment to cancel a meter event that was created in error or attached to the wrong customer.

You can send a higher-throughput of meter events using meter event streams. For this flow, you must first create a meter event session, which will provide you with a session token. You can then create meter events through the meter event stream endpoint, using the session token for authentication. The session tokens are short-lived and you will need to create a new meter event session when the token expires.

A billing meter event summary represents an aggregated view of a customer’s billing meter events within a specified timeframe. It indicates how much usage was accrued by a customer for that period.

Indicates the billing credit balance for billing credits granted to a customer.

A credit balance transaction is a resource representing a transaction (either a credit or a debit) against an existing credit grant.

You can now model subscriptions more flexibly using the Prices API. It replaces the Plans API and is backwards compatible to simplify your migration.

Plans define the base price, currency, and billing cycle for recurring purchases of products. Products help you track inventory or provisioning, and plans help you track pricing. Different physical goods or levels of service should be represented by products, and pricing options should be represented by plans. This approach lets you change prices without having to change your provisioning scheme.

For example, you might have a single “gold” product that has plans for $10/month, $100/year, €9/month, and €90/year.

Related guides: Set up a subscription and more about products and prices.

A Quote is a way to model prices that you’d like to provide to a customer. Once accepted, it will automatically create an invoice, subscription or subscription schedule.

Attributes

  • idstring

    Unique identifier for the object.

  • line_itemsobjectExpandable

    A list of items the customer is being quoted for.

  • metadataobject

    Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format.

More attributes

  • objectstring

  • amount_subtotalinteger

  • amount_totalinteger

  • applicationnullable stringExpandableConnect only

  • application_fee_amountnullable integerConnect only

  • application_fee_percentnullable floatConnect only

  • automatic_taxobject

  • collection_methodenum

  • computedobject

  • createdtimestamp

  • currencynullable string

  • customernullable stringExpandable

  • default_tax_ratesarray of stringsExpandable

  • descriptionnullable string

  • discountsarray of stringsExpandable

  • expires_attimestamp

  • footernullable string

  • from_quotenullable object

  • headernullable string

  • invoicenullable stringExpandable

  • invoice_settingsobject

  • livemodeboolean

  • numbernullable string

  • on_behalf_ofnullable stringExpandableConnect only

  • statusenum

  • status_transitionsobject

  • subscriptionnullable stringExpandable

  • subscription_dataobject

  • subscription_schedulenullable stringExpandable

  • test_clocknullable stringExpandable

  • total_detailsobject

  • transfer_datanullable objectConnect only

The Quote object
{
"id": "qt_1Mr7wVLkdIwHu7ixJYSiPTGq",
"object": "quote",
"amount_subtotal": 2198,
"amount_total": 2198,
"application": null,
"application_fee_amount": null,
"application_fee_percent": null,
"automatic_tax": {
"enabled": false,
"liability": null,
"status": null
},
"collection_method": "charge_automatically",
"computed": {
"recurring": null,
"upfront": {
"amount_subtotal": 2198,
"amount_total": 2198,
"total_details": {
"amount_discount": 0,
"amount_shipping": 0,
"amount_tax": 0
}
}
},
"created": 1680130691,
"currency": "usd",
"customer": "cus_NcMfB0SSFHINCV",
"default_tax_rates": [],
"description": null,
"discounts": [],
"expires_at": 1682722691,
"footer": null,
"from_quote": null,
"header": null,
"invoice": null,
"invoice_settings": {
"days_until_due": null,
"issuer": {
"type": "self"
}
},
"livemode": false,
"metadata": {},
"number": null,
"on_behalf_of": null,
"status": "draft",
"status_transitions": {
"accepted_at": null,
"canceled_at": null,
"finalized_at": null
},
"subscription": null,
"subscription_data": {
"description": null,
"effective_date": null,
"trial_period_days": null
},
"subscription_schedule": null,
"test_clock": null,
"total_details": {
"amount_discount": 0,
"amount_shipping": 0,
"amount_tax": 0
},
"transfer_data": null
}

A quote models prices and services for a customer. Default options for header, description, footer, and expires_at can be set in the dashboard via the quote template.

Parameters

  • line_itemsarray of objects

    A list of line items the customer is being quoted for. Each line item includes information about the product, the quantity, and the resulting cost.

  • metadataobject

    Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to metadata.

More parameters

  • application_fee_amountintegerConnect only

  • application_fee_percentfloatConnect only

  • automatic_taxobject

  • collection_methodenum

  • customerstring

  • default_tax_ratesarray of strings

  • descriptionstring

  • discountsarray of objects

  • expires_attimestamp

  • footerstring

  • from_quoteobject

  • headerstring

  • invoice_settingsobject

  • on_behalf_ofstringConnect only

  • subscription_dataobject

  • test_clockstring

  • transfer_dataobjectConnect only

Returns

Returns the quote object.

POST /v1/quotes
curl https://api.stripe.com/v1/quotes \
-u "sk_test_4eC39Hq...arjtT1zdp7dcsk_test_4eC39HqLyjWDarjtT1zdp7dc:" \
-d customer=cus_NcMfB0SSFHINCV \
-d "line_items[0][price]"=price_1Mr7wULkdIwHu7ixhPkIEN2w \
-d "line_items[0][quantity]"=2
Response
{
"id": "qt_1Mr7wVLkdIwHu7ixJYSiPTGq",
"object": "quote",
"amount_subtotal": 2198,
"amount_total": 2198,
"application": null,
"application_fee_amount": null,
"application_fee_percent": null,
"automatic_tax": {
"enabled": false,
"liability": null,
"status": null
},
"collection_method": "charge_automatically",
"computed": {
"recurring": null,
"upfront": {
"amount_subtotal": 2198,
"amount_total": 2198,
"total_details": {
"amount_discount": 0,
"amount_shipping": 0,
"amount_tax": 0
}
}
},
"created": 1680130691,
"currency": "usd",
"customer": "cus_NcMfB0SSFHINCV",
"default_tax_rates": [],
"description": null,
"discounts": [],
"expires_at": 1682722691,
"footer": null,
"from_quote": null,
"header": null,
"invoice": null,
"invoice_settings": {
"days_until_due": null,
"issuer": {
"type": "self"
}
},
"livemode": false,
"metadata": {},
"number": null,
"on_behalf_of": null,
"status": "draft",
"status_transitions": {
"accepted_at": null,
"canceled_at": null,
"finalized_at": null
},
"subscription": null,
"subscription_data": {
"description": null,
"effective_date": null,
"trial_period_days": null
},
"subscription_schedule": null,
"test_clock": null,
"total_details": {
"amount_discount": 0,
"amount_shipping": 0,
"amount_tax": 0
},
"transfer_data": null
}

A quote models prices and services for a customer.

Parameters

  • line_itemsarray of objects

    A list of line items the customer is being quoted for. Each line item includes information about the product, the quantity, and the resulting cost.

  • metadataobject

    Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Individual keys can be unset by posting an empty value to them. All keys can be unset by posting an empty value to metadata.

More parameters

  • application_fee_amountintegerConnect only

  • application_fee_percentfloatConnect only

  • automatic_taxobject

  • collection_methodenum

  • customerstring

  • default_tax_ratesarray of strings

  • descriptionstring

  • discountsarray of objects

  • expires_attimestamp

  • footerstring

  • headerstring

  • invoice_settingsobject

  • on_behalf_ofstringConnect only

  • subscription_dataobject

  • transfer_dataobjectConnect only

Returns

Returns the updated quote object.

POST /v1/quotes/:id
curl https://api.stripe.com/v1/quotes/qt_1Mr7wVLkdIwHu7ixJYSiPTGq \
-u "sk_test_4eC39Hq...arjtT1zdp7dcsk_test_4eC39HqLyjWDarjtT1zdp7dc:" \
-d "metadata[order_id]"=6735
Response
{
"id": "qt_1Mr7wVLkdIwHu7ixJYSiPTGq",
"object": "quote",
"amount_subtotal": 2198,
"amount_total": 2198,
"application": null,
"application_fee_amount": null,
"application_fee_percent": null,
"automatic_tax": {
"enabled": false,
"liability": null,
"status": null
},
"collection_method": "charge_automatically",
"computed": {
"recurring": null,
"upfront": {
"amount_subtotal": 2198,
"amount_total": 2198,
"total_details": {
"amount_discount": 0,
"amount_shipping": 0,
"amount_tax": 0
}
}
},
"created": 1680130691,
"currency": "usd",
"customer": "cus_NcMfB0SSFHINCV",
"default_tax_rates": [],
"description": null,
"discounts": [],
"expires_at": 1682722691,
"footer": null,
"from_quote": null,
"header": null,
"invoice": null,
"invoice_settings": {
"days_until_due": null,
"issuer": {
"type": "self"
}
},
"livemode": false,
"metadata": {
"order_id": "6735"
},
"number": null,
"on_behalf_of": null,
"status": "draft",
"status_transitions": {
"accepted_at": null,
"canceled_at": null,
"finalized_at": null
},
"subscription": null,
"subscription_data": {
"description": null,
"effective_date": null,
"trial_period_days": null
},
"subscription_schedule": null,
"test_clock": null,
"total_details": {
"amount_discount": 0,
"amount_shipping": 0,
"amount_tax": 0
},
"transfer_data": null
}

When retrieving a quote, there is an includable line_items property containing the first handful of those items. There is also a URL where you can retrieve the full (paginated) list of line items.

Parameters

No parameters.

More parameters

  • ending_beforestring

  • limitinteger

  • starting_afterstring

Returns

A dictionary with a data property that contains an array of up to limit quote line items, starting after Line Item starting_after. Each entry in the array is a separate Line Item object. If no more line items are available, the resulting array will be empty.

GET /v1/quotes/:id/line_items
curl https://api.stripe.com/v1/quotes/qt_1Mr7wVLkdIwHu7ixJYSiPTGq/line_items \
-u "sk_test_4eC39Hq...arjtT1zdp7dcsk_test_4eC39HqLyjWDarjtT1zdp7dc:"
Response
{
"object": "list",
"url": "/v1/quotes/qt_1Mr7wVLkdIwHu7ixJYSiPTGq/line_items",
"has_more": false,
"data": [
{
"id": "li_1Mr7wVLkdIwHu7ixBJJ8ww4j",
"object": "item",
"amount_discount": 0,
"amount_subtotal": 2198,
"amount_tax": 0,
"amount_total": 2198,
"currency": "usd",
"description": "T-shirt",
"price": {
"id": "price_1Mr7wULkdIwHu7ixhPkIEN2w",
"object": "price",
"active": true,
"billing_scheme": "per_unit",
"created": 1680130690,
"currency": "usd",
"custom_unit_amount": null,
"livemode": false,
"lookup_key": null,
"metadata": {},
"nickname": null,
"product": "prod_NcMfZX1FelgpZm",
"recurring": null,
"tax_behavior": "unspecified",
"tiers_mode": null,
"transform_quantity": null,
"type": "one_time",
"unit_amount": 1099,
"unit_amount_decimal": "1099"
},
"quantity": 2
}
]
}

When retrieving a quote, there is an includable computed.upfront.line_items property containing the first handful of those items. There is also a URL where you can retrieve the full (paginated) list of upfront line items.

Parameters

No parameters.

More parameters

  • ending_beforestring

  • limitinteger

  • starting_afterstring

Returns

A dictionary with a data property that contains an array of up to limit upfront line items, starting after Line Item starting_after. Each entry in the array is a separate Line Item object. If no more upfront line items are available, the resulting array will be empty.

GET /v1/quotes/:id/computed_upfront_line_items
curl https://api.stripe.com/v1/quotes/qt_1Mr7wVLkdIwHu7ixJYSiPTGq/computed_upfront_line_items \
-u "sk_test_4eC39Hq...arjtT1zdp7dcsk_test_4eC39HqLyjWDarjtT1zdp7dc:"
Response
{
"object": "list",
"data": [
{
"id": "li_1Mr7wVLkdIwHu7ixMMjVsIUH",
"object": "item",
"amount_discount": 0,
"amount_subtotal": 2198,
"amount_tax": 0,
"amount_total": 2198,
"currency": "usd",
"description": "T-shirt",
"price": {
"id": "price_1Mr7wULkdIwHu7ixhPkIEN2w",
"object": "price",
"active": true,
"billing_scheme": "per_unit",
"created": 1680130690,
"currency": "usd",
"custom_unit_amount": null,
"livemode": false,
"lookup_key": null,
"metadata": {},
"nickname": null,
"product": "prod_NcMfZX1FelgpZm",
"recurring": null,
"tax_behavior": "unspecified",
"tiers_mode": null,
"transform_quantity": null,
"type": "one_time",
"unit_amount": 1099,
"unit_amount_decimal": "1099"
},
"quantity": 2
}
],
"has_more": false,
"url": "/v1/quotes/qt_1Mr7wVLkdIwHu7ixJYSiPTGq/computed_upfront_line_items"
}

Retrieves the quote with the given ID.

Parameters

No parameters.

Returns

Returns a quote if a valid quote ID was provided. Raises an error otherwise.

GET /v1/quotes/:id
curl https://api.stripe.com/v1/quotes/qt_1Mr7wVLkdIwHu7ixJYSiPTGq \
-u "sk_test_4eC39Hq...arjtT1zdp7dcsk_test_4eC39HqLyjWDarjtT1zdp7dc:"
Response
{
"id": "qt_1Mr7wVLkdIwHu7ixJYSiPTGq",
"object": "quote",
"amount_subtotal": 2198,
"amount_total": 2198,
"application": null,
"application_fee_amount": null,
"application_fee_percent": null,
"automatic_tax": {
"enabled": false,
"liability": null,
"status": null
},
"collection_method": "charge_automatically",
"computed": {
"recurring": null,
"upfront": {
"amount_subtotal": 2198,
"amount_total": 2198,
"total_details": {
"amount_discount": 0,
"amount_shipping": 0,
"amount_tax": 0
}
}
},
"created": 1680130691,
"currency": "usd",
"customer": "cus_NcMfB0SSFHINCV",
"default_tax_rates": [],
"description": null,
"discounts": [],
"expires_at": 1682722691,
"footer": null,
"from_quote": null,
"header": null,
"invoice": null,
"invoice_settings": {
"days_until_due": null,
"issuer": {
"type": "self"
}
},
"livemode": false,
"metadata": {},
"number": null,
"on_behalf_of": null,
"status": "draft",
"status_transitions": {
"accepted_at": null,
"canceled_at": null,
"finalized_at": null
},
"subscription": null,
"subscription_data": {
"description": null,
"effective_date": null,
"trial_period_days": null
},
"subscription_schedule": null,
"test_clock": null,
"total_details": {
"amount_discount": 0,
"amount_shipping": 0,
"amount_tax": 0
},
"transfer_data": null
}

Returns a list of your quotes.

Parameters

  • customerstring

    The ID of the customer whose quotes will be retrieved.

  • statusenum

    The status of the quote.

More parameters

  • ending_beforestring

  • limitinteger

  • starting_afterstring

  • test_clockstring

Returns

A dictionary with a data property that contains an array of up to limit quotes, starting after quote starting_after. Each entry in the array is a separate quote object. If no more quotes are available, the resulting array will be empty.

GET /v1/quotes
curl -G https://api.stripe.com/v1/quotes \
-u "sk_test_4eC39Hq...arjtT1zdp7dcsk_test_4eC39HqLyjWDarjtT1zdp7dc:" \
-d limit=3
Response
{
"object": "list",
"url": "/v1/quotes",
"has_more": false,
"data": [
{
"id": "qt_1Mr7SqLkdIwHu7ixpI1ClZ6z",
"object": "quote",
"amount_subtotal": 2198,
"amount_total": 2198,
"application": null,
"application_fee_amount": null,
"application_fee_percent": null,
"automatic_tax": {
"enabled": false,
"liability": null,
"status": null
},
"collection_method": "charge_automatically",
"computed": {
"recurring": null,
"upfront": {
"amount_subtotal": 2198,
"amount_total": 2198,
"total_details": {
"amount_discount": 0,
"amount_shipping": 0,
"amount_tax": 0
}
}
},
"created": 1680128852,
"currency": "usd",
"customer": "cus_NcMBZUWCIOEgEW",
"default_tax_rates": [],
"description": null,
"discounts": [],
"expires_at": 1682720852,
"footer": null,
"from_quote": null,
"header": null,
"invoice": null,
"invoice_settings": {
"days_until_due": null,
"issuer": {
"type": "self"
}
},
"livemode": false,
"metadata": {},
"number": "QT-5B9DA057-0001-1",
"on_behalf_of": null,
"status": "open",
"status_transitions": {
"accepted_at": null,
"canceled_at": null,
"finalized_at": 1680128853
},
"subscription": null,
"subscription_data": {
"description": null,
"effective_date": null,
"trial_period_days": null
},
"subscription_schedule": null,
"test_clock": null,
"total_details": {
"amount_discount": 0,
"amount_shipping": 0,
"amount_tax": 0
},
"transfer_data": null
}
]
}

Accepts the specified quote.

Parameters

No parameters.

Returns

Returns an accepted quote and creates an invoice, subscription or subscription schedule. Raises an error otherwise.

POST /v1/quotes/:id/accept
curl -X POST https://api.stripe.com/v1/quotes/qt_1Mr7YsLkdIwHu7ixoRgFs97D/accept \
-u "sk_test_4eC39Hq...arjtT1zdp7dcsk_test_4eC39HqLyjWDarjtT1zdp7dc:"
Response
{
"id": "qt_1Mr7YsLkdIwHu7ixoRgFs97D",
"object": "quote",
"amount_subtotal": 2198,
"amount_total": 2198,
"application": null,
"application_fee_amount": null,
"application_fee_percent": null,
"automatic_tax": {
"enabled": false,
"liability": null,
"status": null
},
"collection_method": "charge_automatically",
"computed": {
"recurring": null,
"upfront": {
"amount_subtotal": 2198,
"amount_total": 2198,
"total_details": {
"amount_discount": 0,
"amount_shipping": 0,
"amount_tax": 0
}
}
},
"created": 1680129226,
"currency": "usd",
"customer": "cus_NcMHflMGStIAoB",
"default_tax_rates": [],
"description": null,
"discounts": [],
"expires_at": 1682721226,
"footer": null,
"from_quote": null,
"header": null,
"invoice": "in_1Mr7YtLkdIwHu7ixzgJJpJ3L",
"invoice_settings": {
"days_until_due": null,
"issuer": {
"type": "self"
}
},
"livemode": false,
"metadata": {},
"number": "QT-7F68F7D2-0001-1",
"on_behalf_of": null,
"status": "accepted",
"status_transitions": {
"accepted_at": 1680129227,
"canceled_at": null,
"finalized_at": 1680129227
},
"subscription": null,
"subscription_data": {
"description": null,
"effective_date": null,
"trial_period_days": null
},
"subscription_schedule": null,
"test_clock": null,
"total_details": {
"amount_discount": 0,
"amount_shipping": 0,
"amount_tax": 0
},
"transfer_data": null
}

Cancels the quote.

Parameters

No parameters.

Returns

Returns a canceled quote. Raises an error otherwise.

POST /v1/quotes/:id/cancel
curl -X POST https://api.stripe.com/v1/quotes/qt_1Mr7ZYLkdIwHu7ixvsdZr97I/cancel \
-u "sk_test_4eC39Hq...arjtT1zdp7dcsk_test_4eC39HqLyjWDarjtT1zdp7dc:"
Response
{
"id": "qt_1Mr7ZYLkdIwHu7ixvsdZr97I",
"object": "quote",
"amount_subtotal": 2198,
"amount_total": 2198,
"application": null,
"application_fee_amount": null,
"application_fee_percent": null,
"automatic_tax": {
"enabled": false,
"liability": null,
"status": null
},
"collection_method": "charge_automatically",
"computed": {
"recurring": null,
"upfront": {
"amount_subtotal": 2198,
"amount_total": 2198,
"total_details": {
"amount_discount": 0,
"amount_shipping": 0,
"amount_tax": 0
}
}
},
"created": 1680129268,
"currency": "usd",
"customer": "cus_NcMIIkPfQZQEHR",
"default_tax_rates": [],
"description": null,
"discounts": [],
"expires_at": 1682721268,
"footer": null,
"from_quote": null,
"header": null,
"invoice": null,
"invoice_settings": {
"days_until_due": null,
"issuer": {
"type": "self"
}
},
"livemode": false,
"metadata": {},
"number": "QT-FF4741D9-0001-1",
"on_behalf_of": null,
"status": "canceled",
"status_transitions": {
"accepted_at": null,
"canceled_at": 1680129269,
"finalized_at": 1680129269
},
"subscription": null,
"subscription_data": {
"description": null,
"effective_date": null,
"trial_period_days": null
},
"subscription_schedule": null,
"test_clock": null,
"total_details": {
"amount_discount": 0,
"amount_shipping": 0,
"amount_tax": 0
},
"transfer_data": null
}

Download the PDF for a finalized quote. Explanation for special handling can be found here

Parameters

No parameters.

Returns

The PDF file for the quote.

GET /v1/quotes/:id/pdf
curl https://files.stripe.com/v1/quotes/qt_0J1EnX589O8KAxCGEdmhZY3r/pdf \
-u "sk_test_4eC39Hq...arjtT1zdp7dcsk_test_4eC39HqLyjWDarjtT1zdp7dc:"
Response
{}

Finalizes the quote.

Parameters

No parameters.

More parameters

  • expires_attimestamp

Returns

Returns an open quote. Raises an error otherwise.

POST /v1/quotes/:id/finalize
curl -X POST https://api.stripe.com/v1/quotes/qt_1Mr7SqLkdIwHu7ixpI1ClZ6z/finalize \
-u "sk_test_4eC39Hq...arjtT1zdp7dcsk_test_4eC39HqLyjWDarjtT1zdp7dc:"
Response
{
"id": "qt_1Mr7SqLkdIwHu7ixpI1ClZ6z",
"object": "quote",
"amount_subtotal": 2198,
"amount_total": 2198,
"application": null,
"application_fee_amount": null,
"application_fee_percent": null,
"automatic_tax": {
"enabled": false,
"liability": null,
"status": null
},
"collection_method": "charge_automatically",
"computed": {
"recurring": null,
"upfront": {
"amount_subtotal": 2198,
"amount_total": 2198,
"total_details": {
"amount_discount": 0,
"amount_shipping": 0,
"amount_tax": 0
}
}
},
"created": 1680128852,
"currency": "usd",
"customer": "cus_NcMBZUWCIOEgEW",
"default_tax_rates": [],
"description": null,
"discounts": [],
"expires_at": 1682720852,
"footer": null,
"from_quote": null,
"header": null,
"invoice": null,
"invoice_settings": {
"days_until_due": null,
"issuer": {
"type": "self"
}
},
"livemode": false,
"metadata": {},
"number": "QT-5B9DA057-0001-1",
"on_behalf_of": null,
"status": "open",
"status_transitions": {
"accepted_at": null,
"canceled_at": null,
"finalized_at": 1680128853
},
"subscription": null,
"subscription_data": {
"description": null,
"effective_date": null,
"trial_period_days": null
},
"subscription_schedule": null,
"test_clock": null,
"total_details": {
"amount_discount": 0,
"amount_shipping": 0,
"amount_tax": 0
},
"transfer_data": null
}

Subscription items allow you to create customer subscriptions with more than one plan, making it easy to represent complex billing relationships.

Test Clocks Test helper

A test clock enables deterministic control over objects in testmode. With a test clock, you can create objects at a frozen time in the past or future, and advance to a specific future time to observe webhooks and state changes. After the clock advances, you can either validate the current state of your scenario (and test your assumptions), change the current state of your scenario (and test more complex scenarios), or keep advancing forward in time.

Usage records allow you to report customer usage and metrics to Stripe for metered billing of subscription prices.

Related guide: Metered billing

This is our legacy usage-based billing API. See the updated usage-based billing docs.

A usage record summary represents an aggregated view of how much usage was accrued for a subscription item within a subscription billing period.

Financing Offer Preview feature

This is an object representing an offer of financing from Stripe Capital to a Connect subaccount.

Financing Summary Preview feature

A financing object describes an account’s current financing state. Used by Connect platforms to read the state of Capital offered to their connected accounts.

This is an object representing a Stripe account. You can retrieve it to see properties on the account like its current requirements or if the account is enabled to make live charges or receive payouts.

For accounts where controller.requirement_collection is application, which includes Custom accounts, the properties below are always returned.

For accounts where controller.requirement_collection is stripe, which includes Standard and Express accounts, some properties are only returned until you create an Account Link or Account Session to start Connect Onboarding. Learn about the differences between accounts.

An AccountSession allows a Connect platform to grant access to a connected account in Connect embedded components.

We recommend that you create an AccountSession each time you need to display an embedded component to your user. Do not save AccountSessions to your database as they expire relatively quickly, and cannot be used more than once.

Related guide: Connect embedded components

When you collect a transaction fee on top of a charge made for your user (using Connect), an Application Fee object is created in your account. You can list, retrieve, and refund application fees.

Related guide: Collecting application fees

Application Fee Refund objects allow you to refund an application fee that has previously been created but not yet refunded. Funds will be refunded to the Stripe account from which the fee was originally collected.

Related guide: Refunding application fees

This is an object representing a capability for a Stripe account.

Related guide: Account capabilities

Stripe needs to collect certain pieces of information about each account created. These requirements can differ depending on the account’s country. The Country Specs API makes these rules available to your integration.

You can also view the information from this API call as an online guide.

External bank accounts are financial accounts associated with a Stripe platform’s connected accounts for the purpose of transferring funds to or from the connected account’s Stripe balance.

External account cards are debit cards associated with a Stripe platform’s connected accounts for the purpose of transferring funds to or from the connected accounts Stripe balance.

This is an object representing a person associated with a Stripe account.

A platform cannot access a person for an account where account.controller.requirement_collection is stripe, which includes Standard and Express accounts, after creating an Account Link or Account Session to start Connect onboarding.

See the Standard onboarding or Express onboarding documentation for information about prefilling information and account onboarding steps. Learn more about handling identity verification with the API.

To top up your Stripe balance, you create a top-up object. You can retrieve individual top-ups, as well as list all top-ups. Top-ups are identified by a unique, random ID.

Related guide: Topping up your platform account

A Transfer object is created when you move funds between Stripe accounts as part of Connect.

Before April 6, 2017, transfers also represented movement of funds from a Stripe account to a card or bank account. This behavior has since been split out into a Payout object, with corresponding payout endpoints. For more information, read about the transfer/payout split.

Related guide: Creating separate charges and transfers

Stripe Connect platforms can reverse transfers made to a connected account, either entirely or partially, and can also specify whether to refund any related application fees. Transfer reversals add to the platform’s balance and subtract from the destination account’s balance.

Reversing a transfer that was made for a destination charge is allowed only up to the amount of the charge. It is possible to reverse a transfer_group transfer only if the destination account has enough balance to cover the reversal.

Related guide: Reverse transfers

Secret Store is an API that allows Stripe Apps developers to securely persist secrets for use by UI Extensions and app backends.

The primary resource in Secret Store is a secret. Other apps can’t view secrets created by an app. Additionally, secrets are scoped to provide further permission control.

All Dashboard users and the app backend share account scoped secrets. Use the account scope for secrets that don’t change per-user, like a third-party API key.

A user scoped secret is accessible by the app backend and one specific Dashboard user. Use the user scope for per-user secrets like per-user OAuth tokens, where different users might have different permissions.

Related guide: Store data between page reloads

An early fraud warning indicates that the card issuer has notified us that a charge may be fraudulent.

Related guide: Early fraud warnings

Reviews can be used to supplement automated fraud detection with human expertise.

Learn more about Radar and reviewing payments here.

Value lists allow you to group values together which can then be referenced in rules.

Related guide: Default Stripe lists

Value list items allow you to add specific values to a given Radar value list, which can then be used in rules.

Related guide: Managing list items

An Issuing Cardholder object represents an individual or business entity who is issued cards.

Related guide: How to create a cardholder

As a card issuer, you can dispute transactions that the cardholder does not recognize, suspects to be fraudulent, or has other issues with.

Related guide: Issuing disputes

Funding Instructions contain reusable bank account and routing information. Push funds to these addresses via bank transfer to top up Issuing Balances.

A Physical Bundle represents the bundle of physical items - card stock, carrier letter, and envelope - that is shipped to a cardholder when you create a physical card.

Tokens Preview feature

An issuing token object is created when an issued card is added to a digital wallet. As a card issuer, you can view and manage these tokens through Stripe.

A Connection Token is used by the Stripe Terminal SDK to connect to a reader.

Related guide: Fleet management

Terminal Hardware Product Preview feature

A TerminalHardwareProduct is a category of hardware devices that are generally similar, but may have variations depending on the country it’s shipped to.

TerminalHardwareSKUs represent variations within the same Product (for example, a country specific device). For example, WisePOS E is a TerminalHardwareProduct and a WisePOS E - US and WisePOS E - UK are TerminalHardwareSKUs.

Terminal Hardware SKU Preview feature

A TerminalHardwareSKU represents a SKU for Terminal hardware. A SKU is a representation of a product available for purchase, containing information such as the name, price, and images.

A TerminalHardwareShipping represents a Shipping Method for Terminal hardware. A Shipping Method is a country-specific representation of a way to ship hardware, containing information such as the country, name, and expected delivery date.

Stripe Treasury provides users with a container for money called a FinancialAccount that is separate from their Payments balance. FinancialAccounts serve as the source and destination of Treasury’s money movement APIs.

Encodes whether a FinancialAccount has access to a particular Feature, with a status enum and associated status_details. Stripe or the platform can control Features via the requested field.

TransactionEntries represent individual units of money movements within a single Transaction.

Use OutboundTransfers to transfer funds from a FinancialAccount to a PaymentMethod belonging to the same entity. To send funds to a different party, use OutboundPayments instead. You can send funds over ACH rails or through a domestic wire transfer to a user’s own external bank account.

Simulate OutboundTransfer state changes with the /v1/test_helpers/treasury/outbound_transfers endpoints. These methods can only be called on test mode objects.

Related guide: Moving money with Treasury using OutboundTransfer objects

ReceivedCredits represent funds sent to a FinancialAccount (for example, via ACH or wire). These money movements are not initiated from the FinancialAccount.

ReceivedDebits represent funds pulled from a FinancialAccount. These are not initiated from the FinancialAccount.

You can reverse some ReceivedCredits depending on their network and source flow. Reversing a ReceivedCredit leads to the creation of a new object known as a CreditReversal.

You can reverse some ReceivedDebits depending on their network and source flow. Reversing a ReceivedDebit leads to the creation of a new object known as a DebitReversal.

A feature represents a monetizable ability or functionality in your system. Features can be assigned to products, and when those products are purchased, Stripe will create an entitlement to the feature for the purchasing customer.

A product_feature represents an attachment between a feature and a product. When a product is purchased that has a feature attached, Stripe will create an entitlement to the feature for the purchasing customer.

An active entitlement describes access to a feature for a customer.

If you have scheduled a Sigma query, you’ll receive a sigma.scheduled_query_run.created webhook each time the query runs. The webhook contains a ScheduledQueryRun object, which you can use to retrieve the query results.

The Report Run object represents an instance of a report type generated with specific run parameters. Once the object is created, Stripe begins processing the report. When the report has finished running, it will give you a reference to a file where you can retrieve your results. For an overview, see API Access to Reports.

Note that certain report types can only be run based on your live-mode data (not test-mode data), and will error when queried without a live-mode API key.

The Report Type resource corresponds to a particular type of report, such as the “Activity summary” or “Itemized payouts” reports. These objects are identified by an ID belonging to a set of enumerated values. See API Access to Reports documentation for those Report Type IDs, along with required and optional parameters.

Note that certain report types can only be run based on your live-mode data (not test-mode data), and will error when queried without a live-mode API key.

Describes an owner of an account.

A Financial Connections Session is the secure way to programmatically launch the client-side Stripe.js modal that lets your users link their accounts.

A Transaction represents a real transaction that affects a Financial Connections Account balance.

A Tax Calculation allows you to calculate the tax to collect from your customer.

Related guide: Calculate tax in your custom payment flow

A Tax Registration lets us know that your business is registered to collect tax on payments within a region, enabling you to automatically collect tax.

Stripe doesn’t register on your behalf with the relevant authorities when you create a Tax Registration object. For more information on how to register to collect tax, see our guide.

Related guide: Using the Registrations API

You can use Tax Settings to manage configurations used by Stripe Tax calculations.

Related guide: Using the Settings API

A VerificationSession guides you through the process of collecting and verifying the identities of your users. It contains details about the type of verification, such as what verification check to perform. Only create one VerificationSession for each verification in your system.

A VerificationSession transitions through multiple statuses throughout its lifetime as it progresses through the verification flow. The VerificationSession contains the user’s verified data after verification checks are complete.

Related guide: The Verification Sessions API

A VerificationReport is the result of an attempt to collect and verify data from a user. The collection of verification checks performed is determined from the type and options parameters used. You can find the result of each verification check performed in the appropriate sub-resource: document, id_number, selfie.

Each VerificationReport contains a copy of any data collected by the user as well as reference IDs which can be used to access collected images through the FileUpload API. To configure and create VerificationReports, use the VerificationSession API.

Related guide: Accessing verification results.

A Crypto Onramp Session represents your customer’s session as they purchase cryptocurrency through Stripe. Once payment is successful, Stripe will fulfill the delivery of cryptocurrency to your user’s wallet and contain a reference to the crypto transaction ID.

You can create an onramp session on your server and embed the widget on your frontend. Alternatively, you can redirect your users to the standalone hosted onramp.

Related guide: Integrate the onramp

Crypto Onramp Quotes are estimated quotes for onramp conversions into all the different cryptocurrencies on different networks. The Quotes API allows you to display quotes in your product UI before directing the user to the onramp widget.

Related guide: Quotes API

Orders represent your intent to purchase a particular Climate product. When you create an order, the payment is deducted from your merchant balance.

A Climate product represents a type of carbon removal unit available for reservation. You can retrieve it to see the current price and availability.

Instructs Stripe to make a request on your behalf using the destination URL. The destination URL is activated by Stripe at the time of onboarding. Stripe verifies requests with your credentials provided during onboarding, and injects card details from the payment_method into the request.

Stripe redacts all sensitive fields and headers, including authentication credentials and card numbers, before storing the request and response data in the forwarding Request object, which are subject to a 30-day retention period.

You can provide a Stripe idempotency key to make sure that requests with the same key result in only one outbound request. The Stripe idempotency key provided should be unique and different from any idempotency keys provided on the underlying third-party request.

Forwarding Requests are synchronous requests that return a response or time out according to Stripe’s limits.

Related guide: Forward card details to third-party API endpoints.

You can configure webhook endpoints via the API to be notified about events that happen in your Stripe account or connected accounts.

Most users configure webhooks from the dashboard, which provides a user interface for registering and testing your webhook endpoints.

Related guide: Setting up webhooks

Stripe Shell
Test mode
Welcome to the Stripe Shell! Stripe Shell is a browser-based shell with the Stripe CLI pre-installed. Log in 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.
$