API Upgrades
Keep track of changes and upgrades to the Stripe API.
Your API version controls the API and webhook behavior you see (e.g., what properties you see in responses, what parameters you’re permitted to send in requests, etc.). Your version gets set the first time you make an API request. When we change the API in a backwards-incompatible way, we release a new dated version, but to avoid breaking your code, we don’t change your version until you’re ready to upgrade.
If you make requests on behalf of other users using Connect, we’ll use your application’s API version, making it easy for you to write code that works for all your users no matter what API versions they’re individually running.
Backwards-compatible changes
Stripe considers the following changes to be backwards-compatible:
- Adding new API resources.
- Adding new optional request parameters to existing API methods.
- Adding new properties to existing API responses.
- Changing the order of properties in existing API responses.
- Changing the length or format of object IDs or other opaque strings.
This includes adding or removing fixed prefixes (such asch_on charge IDs).
You can safely assume object IDs we generate will never exceed 255 characters, but you should be able to handle IDs of up to that length. If for example you’re using MySQL, you should store IDs in aVARCHAR(255) COLLATE utf8_bincolumn (theCOLLATEconfiguration ensures case-sensitivity in lookups). - Adding new event types.
Your webhook listener should gracefully handle unfamiliar events types.
Upgrading your API version
If you’re running an older version, you’ll want to upgrade to take advantage of the latest and greatest API, whether that means new functionality or streamlining the responses so the API is faster for you. To see what version you’re running and upgrade to the latest, visit your Dashboard.
Upgrading your API version will affect:
- The API calls you make without a
Stripe-Versionheader: the parameters you can send and the structure of objects returned. - The structure of objects sent to your webhook endpoints (both Account and Connect ones.)
Testing a newer version for API calls can be made by setting the Stripe-Version header (in test or live mode). Read about Stripe’s support for versioning.
For webhooks, you can override the version of a single test webhook endpoint in your Dashboard. In order to safely upgrade your webhooks, Stripe recommends:
- Check the API changelog to see which objects will be structured differently.
- Update your webhook code to handle both the old and the new version of each objects.
- Change the version of a test webhook endpoint to the version you want to test.
- Trigger the event in test mode and validate that your code works for the new structure.
Once you are confident your code can handle the latest version, click the Upgrade version button in your Dashboard. This switches the version used by API calls with no Stripe-Version header as well as the version used to render objects sent to your webhooks.
Starting your upgrade will also switch the version of all your test webhook endpoints to the latest.
Rolling back your API version
For 72 hours after you’ve upgraded your API version, you can safely roll back to the version you were upgrading from in your Dashboard.
After you’ve rolled back, webhooks that were sent with the new object structure and failed will be retried with the old structure.
Stay informed
We send information on new additions and changes to Stripe’s API and language libraries to the API announce mailing list. Be sure to subscribe to stay informed.
API changelog
The changelog is a list of backwards-incompatible updates in the API. As described above, new additions and forwards-compatible changes don’t need a new API version and will not appear in this list.
2018-05-21
- Products no longer have SKU lists embedded.
- MajorThe
idfield of invoice line items oftype=subscriptionno longer can be interpreted as a subscription ID, but instead is a unique invoice line item ID. It can be used for pagination. - Coupon, SKU, customer, product and plan
ids may only contain alphanumeric and_-characters on creation. - MajorWhen creating or updating subscriptions, the default value of
trial_from_planis nowfalse, meaning that a subscription will not automatically inherit a plan’strial_period_days. We recommend setting an explicit trial per subscription instead of setting trials on plans. - When changing the plan on a subscription to a new plan with a trial (together with
trial_from_plan=true), the new plan’s full trial period will be added to the subscription, without subtracting already-used time from previous trials.
2018-02-28
- Updating a subscription set to cancel on a future date no longer clears the cancellation status. In order to clear the cancellation status, specify
cancel_at_period_end=falsewhen updating a subscription.
2018-02-06
- For a Source’s
card[three_d_secure]property, addsrecommendedas a possible value. Previously, the only valid values werenot supported,optional, andrequired.
2018-02-05
- MajorEach plan object is now linked to a product object with
type=service. The plan object fieldsstatement_descriptorandnameattributes have been moved to product objects. Creating a plan now requires passing aproductattribute toPOST /v1/plans. This may be either an existing product ID or a dictionary of product fields, so that you may continue to create plans without separately creating products. - Products now have a required
type,goodfor products used with Orders SKUs orservicefor products used with Subscriptions and Plans. Previous API versions will create agoodtype product if this field is omitted. - MajorAllows a new subscription’s first full invoice to be on a future date, by specifying
billing_cycle_anchor, with an optional proration up to that date.billing_cycle_anchoron its own is available retroactively to past versions, and starting in this version,billing_cycle_anchorcan be combined with a trial, enabling a free trial to be followed by a prorated period, followed by a fixed billing cycle. - Prorations on free plans now create $0 invoices. In past versions, these did not create invoices.
2018-01-23
- When being viewed by a platform, cards and bank accounts created on behalf of connected accounts will have a fingerprint that is universal across all connected accounts. For accounts that are not connect platforms, there will be no change.
2017-12-14
- Updates invoice payment attempts to return a
card_errorwhen the charge is declined. This aligns/v1/invoices/{INVOICE_ID}/paywith/v1/charges. - Updates invoice line items to always have a
descriptionset, including invoice line items generated from subscription items.
2017-08-15
- Adds
not_requiredas a possibleredirect[status]value on theSourceobject. Previously, optional redirects were marked assucceeded.
2017-06-05
- Adds
under_reviewas a possibleverification[disabled_reason]value on theAccountobject. Previously, an under review status used the valueother.
2017-05-25
- Replaces the
managedBoolean property onAccountobjects withtype, whose possible values are:standard,express, andcustom. Amanagedvalue is required when creating accounts. - Updates the
previous_attributesproperty onEventobjects to show entire sub-arrays when those arrays have changes. Previously, those sub-arrays only showed the specific fields that changed. - Updates the
requestproperty on theEventobject to be a hash containing the request ID and the idempotency key. Previously,requestwas just the ID. - Renames the
user_idproperty on Connect-related event objects toaccount.
2017-04-06
- MajorSplits the
Transferobject intoPayoutandTransfer. ThePayoutobject represents money moving from a Stripe account to an external account (bank or debit card). TheTransferobject now only represents money moving between Stripe accounts on a Connect platform. For more details, see https://stripe.com/docs/transfer-payout-split.
2017-02-14
- Updates the
disputeproperty on theChargeobject to contain the ID of an associated dispute. Previously,disputecontained the entireDisputeobject. You can expand this property when retrieving charges to render the fullDisputeobject as before. - Updates the
outcome[rule]property on theChargeobject to contain the ID of the rule that blocked the charge. Previously,outcome[rule]contained the entireRuleobject. You can expand this property when retrieving charges to render the fullRuleobject as before.
2017-01-27
- Removes the
sourced_transfersproperty from theBalance Transactionobject.
2016-10-19
- Returns the status code 403 when an API request is made with insufficient permission. Previously, the API returned a 401 status code.
2016-07-06
- Updates the list all subscriptions call to also return canceled subscriptions. The endpoint now supports fetching only canceled subscriptions by specifying
status=canceled. You can now retrieve a single canceled subscription by providing its ID.
2016-06-15
- Updates the
activeproperty on theProductobject so that settingactiveto false no longer marks the product’s SKUs as inactive.
2016-03-07
- Removes the
currencies_supportedproperty from theAccountobject. You can find a list of supported currencies by retrieving aCountry Specobject for the country of the account.
2016-02-29
- Adds postal code validation for legal entity addresses when creating and updating accounts.
2016-02-23
- Updates the behavior of orders so that changing an order from
paidorfulfilledtocanceledorreturnedautomatically refunds the associated charge. Previously, attempting to change an order frompaidorfulfilledtocanceledorreturnedraised an error if the associated charge had not already been refunded.
2016-02-22
- Returns an error on attempts to add more than 250 invoice items to an invoice.
2016-02-19
- Renames the
nameproperty on theBank Accountobject toaccount_holder_name.
2016-02-03
- Updates the returned
Accountobject to only show sub-properties oflegal_entitythat are applicable to the account’s country, or that were previously provided.
2015-10-16
- Returns an error if a
tax_percentis provided without aplanduring a customer update or creation.
2015-10-12
- MajorReturns an error when invalid parameters are passed in the card or bank account hash during token, source, or external account creation. Changes the error code returned for missing required parameters in the card or bank account hash to 400. Previously, a 402 code was returned.
2015-10-01
- Replaces the
bank_accountsproperty on theAccountobject withexternal_accounts. Replaces thebank_accountvalue in thefields_neededproperty withexternal_account.
2015-09-23
- Updates the
chargeproperty on theInvoiceobject to always show the invoice’s latest charge, regardless of the charge’s source (e.g, a card or a bank account). Removes thepaymentproperty, which previously reflected a non-card charge. - MajorUpdates the list all charges call to return all charges, including those made to bank accounts and other non-card sources. Previously, it only returned charges made to cards. Updates the deprecated
offsetparameter to only be supported when filtering by source type.
2015-09-08
- Updates API rate limit errors to return a 429 HTTP status code instead of 400. They also no longer return a
rate_limiterror code.
2015-09-03
- Returns an error if a request reuses an idempotency token with different parameters than the original request. Previously, errors were only returned for reusing the same idempotency token across different API endpoints.
2015-08-19
- Updates the
Balance Transactionobject to provide the refund ID or dispute ID as thesourcevalue when the balance transaction is associated with a refund or dispute. Previously, the original charge ID was shown.
2015-08-07
- Adds date validation to the
tos_acceptance[date]property on theAccountobject. Accepted values are timestamps after 2009 and before the current moment.
2015-07-28
- The
balance.availableevent is now triggered when immediate transfers are processed.
2015-07-13
- Replaces the
verification[contacted]Boolean property on theAccountobject with averification[disabled_reason]string that describes why the account is unable to make transfers or charges.
2015-07-07
- Updates the
statusproperty on theTransferobject so that transfers not yet submitted to the bank are stillpendingand transfers submitted to the bank that have not yet arrived arein_transit. Previously, both states were described aspending.
2015-06-15
- Updates the
payout_schedule[delay_days]property on theAccountobject to return an error if provided when theintervalis set tomanual. Manual payouts always use the minimumdelay_daysvalue.
2015-04-07
- Updates the
period[end]property on proration invoice line items to reflect the subscription’scurrent_period_endproperty when the update and proration was made. A proration invoice line item’speriod[start]andperiod[end]properties now represent the prorated adjustment interval. Previously,period[end]marked the time at which the proration was made, and was the same asperiod[start]. - Updates the
Invoiceobject to change the order of thelineslist: first invoice items in reverse chronological order, followed by the subscription, if applicable.
2015-03-24
- Updates coupons so they no longer apply to negative invoice items by default. Previously, coupons applied to all non-proration invoice items. To allow a coupon to apply to a negative invoice item, pass
discountable=truewhen creating or updating the invoice item.
2015-02-18
- Updates the
statusproperty on theChargeobject to have a value ofsucceededfor successful charges. Previously, thestatusproperty would bepaidfor successful charges. - MajorReplaces the
cardproperty on theChargeobject withsource. Provide this parameter with aCardtoken, as before, or with aSourcetoken that has anobjectvalue ofcard. Older API versions return both thecardandsourceproperties onCharge. - MajorReplaces the
cardsanddefault_cardproperties on theCustomerobject withsourcesanddefault_source. Both properties can representCardobjects, as before, andSourceobjects with anobjectvalue ofcard. Older API versions return both the new and old properties onCustomer. Replaces thecustomer.card.*andcustomer.bank_account.*events withcustomer.source.*.
2015-02-16
- Renames the
transfer.canceledevent totransfer.reversed.
2015-02-10
- Adds the value
warning_closedto thestatusproperty on theDisputeobject. - Updates test mode transfers to require sufficient funds in your available test mode balance (for consistency with live mode transfers). Add funds directly to your available test mode balance—bypassing the pending balance—by creating a charge using the special test card number 4000 0000 0000 0077.
2015-01-26
- Updates the presentation of nested hashes in the
previous_attributesproperty of events to only show the difference. For example, a change from{address: {line1: "Foo", line2: "Bar"}}to{address: {line1: "Foo", line2: "Baz"}}is represented as{previous_attributes: {address: {line2: "Baz"}}}. Previously, it was represented as{previous_attributes: {address: {line1: "Foo", line2: "Baz"}}}. - Updates the
canceled_atproperty on theSubscriptionobject to always be the timestamp from the API call or invoice payment failure that canceled the subscription. Previously,canceled_atreflected “at period end” subscription cancellations, too. Theended_atproperty still reflects the time that the subscription actually stopped.
2015-01-11
- Removes the
mimetypeproperty from theFile Uploadobject. Returns simplified file types in thetypeproperty and uses simpler naming conventions than mimetypes (e.g.,typecontains pdf instead of application/pdf).
2014-12-22
- Updates the
Cardobject so a value ofuncheckedfor theaddress_line1_check,address_zip_check, orcvc_checkproperties means the property has not been checked. Previously, it meant the issuing bank does not support the particular check. That state now shows asunavailable. Unchecked properties are checked when a card is charged or added to aCustomerobject. - Removes the
customerproperty from theCardobject that appears on theTokenobject.
2014-12-17
- Replaces the
statement_descriptionproperty on theCharge,Invoice,Plan, andTransferobjects withstatement_descriptor. To determine what appears on a customer’s transaction,statement_descriptionis appended to your Stripe account’s statement descriptor whilestatement_descriptorsets the full statement value. If not on this API version or newer, providing astatement_descriptorstill triggers thestatement_descriptionbehavior. - Updates the Accounts API to require API version 2014-12-17 or newer.
2014-12-08
- Updates the
Disputeobject so evidence can be provided as a hash of typed fields rather than a single block of text. Replaces theevidence_due_byproperty with theevidence_detailshash, which includesdue_byandsubmission_count(for the number of times a dispute has been submitted).
2014-11-20
- Updates disputes that are won to return the status
woneven if the charge was refunded. Previously, a dispute won that had a refunded charge would transition tocharge_refunded. - Updates the
metadataproperty of theInvoice Itemobject with a type ofsubscriptionto show the subscription’s metadata. Previously, it showed the plan’s metadata.
2014-11-05
- Renames the
charge_enabledandtransfer_enabledproperties on theAccountobject tocharges_enabledandtransfers_enabled.
2014-10-07
- Prevents publishable keys from retrieving
Tokenobjects. When a card or bank account token is created with a publishable key, thefingerprintproperty is not included in the response.
2014-09-08
- Replaces the
disabled,validated, andverifiedproperties on theBank Accountobject with astatusenum property.
2014-08-20
- Adds three values to the
statusproperty on theDisputeobject:warning_needs_response,warning_under_review, andcharge_refunded. Replaces thebalance_transactionproperty of theDisputeobject withbalance_transactions(this provides greater detail around funds withdrawn and reinstated as a result of disputes).
2014-08-04
- Removes the
other_transfers,summary, andtransactionsproperties from automatic transfer responses in favor of the balance history endpoint (/v1/balance/history).
2014-07-26
- Changes the
refundsproperty on theApplication Feeobject from an array to a sublist object, which contains thedata,has_more, andurlproperties. This makes application fee refunds consistent with charge refunds.
2014-07-22
- Updates proration line items on invoices to include the associated subscription’s plan and quantity.
2014-06-17
- Changes the
refundsproperty on theChargeobject from an array to a sublist object, which contains thedata,has_more, andurlproperties.
2014-06-13
- Renames the
typeproperty on theCardobject tobrand.
2014-05-19
- Replaces the
accountproperty on theTransferobject withbank_account. Thebank_accountproperty is only included when the transfer is made to a bank account.
2014-03-28
- MajorRemoves the
countproperty from list responses.
2014-03-13
- Renames the
statement_descriptorproperty on theTransferobject tostatement_description.
2014-01-31
- MajorReplaces the
subscriptionproperty on theCustomerobject with thesubscriptionsproperty, as customers can have multiple subscriptions. - Ignores trial dates on canceled subscriptions when automatically computing trial end dates for new subscriptions.
2013-12-03
- Replaces the
useranduser_emailproperties on theApplication Feeobject with an expandableaccountproperty. - Updates the refunding of application fees to be proportional to the amount of the charge refunded (when setting
refund_application_fee=true). Previously, the entire application fee was refunded even when only part of the charge was.
2013-10-29
- MajorChanges coupon behavior so that applying an amount-off coupon to an invoice does not increase the
Customeraccount balance if the discount is greater than the invoice amount. Coupons are ignored—and not counted as redeemed—when applied to zero-cost invoices. This change does not apply to coupons created on earlier API version.
2013-08-13
- Removes the
feeandfee_detailsproperties from theChargeandTransferobjects. Fee information is in the corresponding balance transaction.
2013-08-12
- Allows the
descriptionproperty onCustomer,Charge,InvoiceItem, andRecipientobjects, and theemailproperty onCustomerandRecipientobjects, to be set to null by providing empty string values in POST requests.
2013-07-05
- MajorReplaces the
active_cardproperty on theCustomerobject with acardssublist and adefault_cardID property.
2013-02-13
- Updates the
Chargeobject so disputed charges include anotherstripe_feeobject in thefee_detailsarray, representing the dispute fees. Includes the dispute fees in the fee total on theChargeobject.
2013-02-11
- MajorUpdates the pay invoice call to return an error when the charge is not successful. Previously, the API would return a 200 status and set the invoice’s
paidproperty to false.
2012-11-07
- Replaces the
disputedproperty on theChargeobject withdispute.
2012-10-26
- Updates the
Invoiceobject format. Thelinesproperty is now a sublist, a paginated list of all items that contribute to the invoice.
2012-09-24
- Removes the extraneous
idproperty from theDiscountobject.
2012-07-09
- Removes the
uncapturedproperty from theCustomerobject.
2012-06-28
- (Changes introduced in this version have since been removed.)
2012-06-18
- Removes the
amountandcurrencyproperties from theTokenobject.
2012-03-25
- Removes the
next_recurring_chargeproperty from theCustomerobject. Use the upcoming invoice call instead.
2012-02-23
- Shows all response fields, even those with null values. Previously, the API hid fields with null values.
2011-11-17
- (Changes introduced in this version have since been removed.)
2011-09-15
- Updates the card validation behavior when creating tokens.
2011-08-01
- Updates the list format. New list objects have a
dataproperty that represents an array of objects (by default, 10) and acountproperty that represents the total count.
2011-06-28
- Removes the
identifierproperty (duplicate ofid) from thePlanobject.
2011-06-21
- Raises exceptions on unrecognized parameters passed to the API instead of silently allowing and ignoring them.