API versioning and changelog
Keep track of changes and updates to the Plaid API
API versioning
This page covers backwards-incompatible, versioned API changes. For a list of all API updates, including non-versioned ones, see the changelog.
Whenever we make a backwards-incompatible change to a general availability, non-beta product, we release a new API version to avoid causing breakages for existing developers. You can then continue to use the old API version, or update your application to upgrade to the new Plaid API version. APIs for beta products are subject to breaking changes without versioning, with 30 days notice.
We consider the following changes to be backwards compatible:
- Adding new API endpoints
- Adding new optional parameters to existing endpoints
- Adding new data elements to existing response schemas or webhooks
- Adding new enum values, including
error_typesanderror_codes - Subdividing existing
error_codesinto more precise errors, and changing the http response code as necessary, as long as the error cannot be resolved via developer action (such as retries) during runtime. For example, changingPRODUCT_NOT_READYerrors to a differenterror_codewould be a breaking change, since that error can be resolved by retrying later, but converting an existingINTERNAL_SERVER_ERRORto a more specific error would not be. - Adding new
webhook_typesandwebhook_codes - Changing the length or content of any API identifier
How to set your API version
The default version of the API used in any requests you make can be configured in the Dashboard and will be used when version information is not otherwise specified. You can also manually set the Plaid-Version header to use a specific version for a given API request.
If you're using one of the Plaid client libraries, they should all be pinned to the latest version of the API at the time when they were released. This means that you can change the API version you're using by updating to a newer version of the client library.
Select group for content switcher1const { Configuration, PlaidApi, PlaidEnvironments } = require('plaid');23const configuration = new Configuration({4 basePath: PlaidEnvironments[process.env.PLAID_ENV],5 baseOptions: {6 headers: {7 'PLAID-CLIENT-ID': process.env.PLAID_CLIENT_ID,8 'PLAID-SECRET': process.env.PLAID_SECRET,9 'Plaid-Version': '2020-09-14',10 },11 },12});1314const client = new PlaidApi(configuration);Version 2020-09-14
This version includes several changes to improve authentication, streamline and simplify the API, and improve international support.
To improve authentication, the
public_keyhas been fully removed from the API. Endpoints that previously accepted apublic_keyfor authentication, namely/institutions/get_by_idand/institutions/search, now require aclient_idandsecretfor authentication instead./item/removeno longer returns aremovedboolean. This field created developer confusion, because it was never possible for it to returnfalse. A failed/item/removecall will result in an error being returned instead.Several undocumented and unused fields have been removed from the
institutionobject returned by the institutions endpoints/institutions/get,/institutions/get_by_id, and/institutions/search. The removed fields are:input_spec,credentials,include_display_data,has_mfa,mfa, andmfa_code_type.The institutions endpoints
/institutions/get,/institutions/get_by_id, and/institutions/searchnow require the use of acountry_codesparameter and no longer useUSas a default value ifcountry_codesis not specified, as this behavior caused confusion and unexpected behavior for non-US developers. As part of this change, thecountry_codesparameter has been moved out of theoptionsobject and is now a top-level parameter.To support international payments, the response schema for the partner-only
/processor/auth/getendpoint has changed. The 2018-05-22 and 2019-05-29 API releases previously extended the response schema for/auth/getin order to support international accounts, but these changes were never extended to the/processor/auth/getendpoint. This release brings the response for/processor/auth/getin line with the/auth/getresponse, allowing Plaid partners to extend support for using non-ACH payment methods, such as EFT payments (Canada) or SEPA credit and direct debit (Europe). Accommodating this change does not require any code changes from Plaid developers who use partnership integrations, only from the Plaid partners themselves.
1"numbers": [{2 "account": "9900009606",3 "account_id": "vzeNDwK7KQIm4yEog683uElbp9GRLEFXGK98D",4 "routing": "011401533",5 "wire_routing": "021000021"6}]1"numbers": {2 "ach": [{3 "account": "9900009606",4 "account_id": "vzeNDwK7KQIm4yEog683uElbp9GRLEFXGK98D",5 "routing": "011401533",6 "wire_routing": "021000021"7 }],8 "eft":[{9 "account": "111122223333",10 "account_id": "vzeNDwK7KQIm4yEog683uElbp9GRLEFXGK98D",11 "institution": "021",12 "branch": "01140"13 }],14 "international":[{15 "account_id": "vzeNDwK7KQIm4yEog683uElbp9GRLEFXGK98D",16 "bic": "NWBKGB21"17 "iban": "GB29NWBK60161331926819",18 }],19 "bacs":[{20 "account": "31926819",21 "account_id": "vzeNDwK7KQIm4yEog683uElbp9GRLEFXGK98D",22 "sort_code": "601613"23 }]24}Version 2019-05-29
- The Auth
numbersschema has been extended to support BACS (UK) and other international (IBAN and BIC) account numbers used across the EU. - Renamed the
zipfield topostal_codeand thestatefield toregionin all Identity and Transactions responses to be more international friendly. - Identity objects in Identity responses are now embedded on the
ownersfield of the corresponding account. - Address data fields for Identity responses are now nullable and are returned with a null value when they aren’t available rather than an empty string.
- Added a ISO-3166-1 alpha-2
countryfield to all Identity and Transactions responses. - The account type
brokeragehas been renamed toinvestment.
These changes are meant to enable access to International institutions for Plaid’s launch in Europe and add support for investment accounts. Test in the Sandbox with the new API version to see the new Schema and enable support for International institutions from the Dashboard in order to create Items for these institutions.
Auth
Before, numbers only had fields for ach (US accounts) and eft (Canadian accounts) accounts numbers:
1"numbers": {2 "ach": [{3 "account": "9900009606",4 "account_id": "vzeNDwK7KQIm4yEog683uElbp9GRLEFXGK98D",5 "routing": "011401533",6 "wire_routing": "021000021"7 }],8 "eft":[{9 "account": "111122223333",10 "account_id": "vzeNDwK7KQIm4yEog683uElbp9GRLEFXGK98D",11 "institution": "021",12 "branch": "01140"13 }]14}Now, the structure of numbers hasn’t changed, but it can have ach, eft, bacs (UK accounts), or international
(currently EU accounts) numbers. Note that the schema for each of these numbers are different from one another. It is
possible for multiple networks to be present in the response.
1"numbers": {2 "ach": [{3 "account": "9900009606",4 "account_id": "vzeNDwK7KQIm4yEog683uElbp9GRLEFXGK98D",5 "routing": "011401533",6 "wire_routing": "021000021"7 }],8 "eft":[{9 "account": "111122223333",10 "account_id": "vzeNDwK7KQIm4yEog683uElbp9GRLEFXGK98D",11 "institution": "021",12 "branch": "01140"13 }],14 "international":[{15 "account_id": "vzeNDwK7KQIm4yEog683uElbp9GRLEFXGK98D",16 "bic": "NWBKGB21"17 "iban": "GB29NWBK60161331926819",18 }],19 "bacs":[{20 "account": "31926819",21 "account_id": "vzeNDwK7KQIm4yEog683uElbp9GRLEFXGK98D",22 "sort_code": "601613"23 }]24}Identity
The previous version of Identity had US specific field names and did not include a country as part of the location. Furthermore, the identity data was not scoped to a specific account.
1"identity": {2 "addresses": [{3 "accounts": [4 "Plaid Checking 0000",5 "Plaid Saving 1111",6 "Plaid CD 2222"7 ],8 "data": {9 "city": "Malakoff",10 "state": "NY",11 "street": "2992 Cameron Road",12 "zip": "14236"13 },14 "primary": true15 }],16 ...17}Now, identity has international friendly field names of region and postal_code instead of zip and state as
well as a ISO-3166-1 alpha-2 country field. Address data fields (city, region, street, postal_code, and
country) are now nullable and are returned with a null value when they aren’t available rather than as an empty
string. The identity object is now available on the "owners" key of the account, which represents ownership of specific
accounts.
1"accounts": [{2 ...3 "owners": [{4 "addresses": [{5 "data": {6 "city": "Malakoff",7 "region": "NY",8 "street": "2992 Cameron Road",9 "postal_code": "14236",10 "country": "US",11 },12 "primary": true13 }]14 }],15 ...16}]Transactions
When no transactions are returned from a request, the transactions object will now be null rather than an empty array.
In addition, the same changes to Identity were also made to Transactions.
1"transactions": [{2 ...3 "location": {4 "address": "300 Post St",5 "city": "San Francisco",6 "state": "CA",7 "zip": "94108",8 "lat": null,9 "lon": null10 },11 ...12]}1"transactions": [{2 ...3 "location": {4 "address": "300 Post St",5 "city": "San Francisco",6 "region": "CA",7 "postal_code": "94108",8 "country": "US",9 "lat": null,10 "lon": null11 },12 ...13]}Institutions
Changes to the institutions schema effects responses from all of the institutions API endpoints:
- POST
/institutions/search - POST
/institutions/get - POST
/institutions/get_by_id
The previous version of the Institution schema did not include the country of the institution as part of the response.
1"institution": {2 "credentials": [{3 "label": "User ID",4 "name": "username",5 "type": "text"6 }, {7 "label": "Password",8 "name": "password",9 "type": "password"10 }],11 "has_mfa": true,12 "institution_id": "ins_109512",13 "mfa": [14 "code",15 "list",16 "questions",17 "selections"18 ],19 "name": "Houndstooth Bank",20 "products": [21 "auth",22 "balance",23 "identity",24 "transactions"25 ],26 // included when options.include_status is true27 "status": {object}28}1"institution": {2 "country_codes": ["US"],3 "credentials": [{4 "label": "User ID",5 "name": "username",6 "type": "text"7 }, {8 "label": "Password",9 "name": "password",10 "type": "password"11 }],12 "has_mfa": true,13 "institution_id": "ins_109512",14 "mfa": [15 "code",16 "list",17 "questions",18 "selections"19 ],20 "name": "Houndstooth Bank",21 "products": [22 "auth",23 "balance",24 "identity",25 "transactions"26 ],27 // included when options.include_status is true28 "status": {object}29}Version 2018-05-22
- The Auth
numbersschema has changed to support ACH (US-based) and EFT (Canadian-based) account numbers - Added the
iso_currency_codeandunofficial_currency_codefields to all Accounts and Transactions responses
Enable support for Canadian institutions from the Dashboard and then test in the Sandbox using
the test Canadian institution, Tartan-Dominion Bank of Canada (institution ID ins_43).
Before, numbers was a list of objects, each one representing the account and routing number for an ACH-eligible US
checking or savings account:
1"numbers": [{2 "account": "9900009606",3 "account_id": "vzeNDwK7KQIm4yEog683uElbp9GRLEFXGK98D",4 "routing": "011401533",5 "wire_routing": "021000021"6}]New Auth response (2018-05-22 version)
Now, numbers can have either ach (US accounts) or eft (Canadian accounts) numbers. Note that the schema for ach
numbers and eft numbers are different from one another.
1"numbers": {2 "ach": [{3 "account": "9900009606",4 "account_id": "vzeNDwK7KQIm4yEog683uElbp9GRLEFXGK98D",5 "routing": "011401533",6 "wire_routing": "021000021"7 }],8 "eft": []9}1"numbers": {2 "ach":[],3 "eft":[{4 "account": "111122223333",5 "account_id": "vzeNDwK7KQIm4yEog683uElbp9GRLEFXGK98D",6 "institution": "021",7 "branch": "01140"8 }]9}Version 2017-03-08
The 2017-03-08 version was the first versioned release of the API.