User endpoints
API reference for user management endpoints
This page covers API endpoints related to user ids and user tokens, which are used by Plaid Check, Plaid Protect, and Income, as well as by the Multi-Item Link flow.
| Endpoints | |
|---|---|
/user/create | Create a user ID |
/user/get | Get user details |
/user/update | Update user data or enable an existing user for Plaid Check |
/user/remove | Remove the user and their associated Items |
/user/items/get | Return Items associated with a user |
| See also | |
|---|---|
/sandbox/user/reset_login | Force user into an error state for testing |
Plaid has switched from using the user_token to the user_id as of December 10, 2025. If you have an existing integration that uses the user_token, you should continue to use the user_token. New customers must use the user_id.
To accommodate both flows, many Plaid API endpoints use either a user_id or a user_token. In these API requests, you should provide a user_token only if you have one; otherwise, provide a user_id. You do not need to provide both fields.
For more details on this change, see New User APIs.
User identifiers
There are three identifiers Plaid uses when working with users:
client_user_id: The unique identifier you provide to Plaid for each end user in your application. This is determined by you and will typically correspond to your application's primary key for a user record. It must not contain PII, such as a phone number, Social Security number, or email address.
user_id: Plaid-generated identifier, prefixed by usr_ and returned in responses from the User APIs and /link/token/create. Each user_id corresponds to a single client_user_id; calling /user/create repeatedly with the same client_user_id returns the same user_id. The user_id is used by customers who integrated on December 10, 2025 or later.
user_token — A Plaid-generated token for accessing the user. Only applicable for customers who integrated with /user/create prior to December 10, 2025. Note that user_tokens can also have corresponding user_ids; these are not equivalent to the new usr_ user_ids mentioned above. For more details, see New User APIs.
/user/create
Create user
For Plaid products and flows that use the user object, /user/create provides you a single token to access all data associated with the user. You must call this endpoint before calling /link/token/create if you are using any of the following: Plaid Check, Income Verification, Multi-Item Link, or Plaid Protect.
For customers who began using this endpoint on or after December 10, 2025, this endpoint takes a client_user_id and an identity object and will return a user_id. For customers who began using it before that date, the endpoint takes a client_user_id and a consumer_report_user_identity object and will return a user_token and user_id. For more details, see New User APIs.
In order to create a Plaid Check Consumer Report for a user, the identity (new) or consumer_report_user_identity (legacy) object must be present. If it is not provided during the /user/create call, it can be added later by calling /user/update.
In order to generate a Plaid Check Consumer Report, the following identity fields, at minimum, are required and must be non-empty: name, date_of_birth, emails, phone_numbers, and addresses, (with at least one email, phone number, and address designated as primary). Plaid Check Consumer Reports can only be created for US-based users; the user's address country must be US. If creating a report for sharing with a GSE such as Fannie or Freddie, the user's full SSN must be provided via the id_numbers field. Providing at least a partial SSN is also strongly recommended for all use cases, since it improves the accuracy of matching user records during compliance processes such as file disclosure, dispute, or security freeze requests.
When using Plaid Protect, it is highly recommended that you provide an identity object to better identify and block fraud across your Link sessions.
Plaid will normalize identity fields before storing them and utilize the same identity across different user-based products.
Request fields
client_idclient_id. The client_id is required and may be provided either in the PLAID-CLIENT-ID header or as part of a request body.secretsecret. The secret is required and may be provided either in the PLAID-SECRET header or as part of a request body.client_user_idclient_user_id.128 1 identityid_number. Providing a partial SSN is strongly recommended, and improves the accuracy of matching user records during compliance processes such as file disclosure, dispute, or security freeze requests. If creating a report that will be shared with GSEs such as Fannie or Freddie, a full Social Security Number must be provided via the id_number field.namegiven_namefamily_namedate_of_birthdate phone_numbersaddressesid_numbersvaluetypear_dni, au_drivers_license, au_passport, br_cpf, ca_sin, cl_run, cn_resident_card, co_nit, dk_cpr, eg_national_id, es_dni, es_nie, hk_hkid, in_pan, it_cf, jo_civil_id, jp_my_number, ke_huduma_namba, kw_civil_id, mx_curp, mx_rfc, my_nric, ng_nin, nz_drivers_license, om_civil_id, ph_psn, pl_pesel, ro_cnp, sa_national_id, se_pin, sg_nric, tr_tc_kimlik, us_ssn, us_ssn_last_4, za_smart_idconsumer_report_user _identityidentity object instead. For more details, see new user APIs.
To create a Plaid Check Consumer Report for a user when using a user_token, this field must be present. If this field is not provided during user token creation, you can add it to the user later by calling /user/update. Once the field has been added to the user, you will be able to call /link/token/create with a non-empty consumer_report_permissible_purpose (which will automatically create a Plaid Check Consumer Report), or call /cra/check_report/create for that user.first_namelast_namephone_numbersemailsssn_fullFormat: "ddd-dd-dddd"
ssn_last_44 4 date_of_birthdate primary_addresscityregionstate.
Example: "NC"street"564 Main Street, APT 15"postal_codezip.countryconst request = {
client_user_id: "c0e2c4ee-b763-4af5-cfe9-46a46bce883d",
identity: {
name: {
given_name: "Carmen",
family_name: "Berzatto"
},
date_of_birth: "1987-01-31",
emails: [
{ data: "[email protected]", primary: true },
{ data: "[email protected]", primary: false }
],
phone_numbers: [
{ data: "+13125551212", primary: true }
],
addresses: [
{
street_1: "3200 W Armitage Ave",
street_2: null,
city: "Chicago",
region: "IL",
country: "US",
postal_code: "60657",
primary: true
}
],
id_numbers: [
{
value: "1234",
type: "us_ssn_last_4"
}
]
}
};
try {
const response = await client.userCreate(request);
} catch (error) {
}
Response fields
user_tokenuser_token field. All other customers should use the user_id instead. For more details, see New User APIs.user_id/user/create. Integrations that began using /user/create after December 10, 2025 use this field to identify a user instead of the user_token. For more details, see new user APIs.request_id{
"user_id": "usr_9nSp2KuZ2x4JDw",
"request_id": "Aim3b"
}/user/get
Retrieve user identity and information
Get user details using a user_id. This endpoint only supports users that were created on the new user API flow, without a user_token. For more details, see New User APIs.
Request fields
client_idclient_id. The client_id is required and may be provided either in the PLAID-CLIENT-ID header or as part of a request body.secretsecret. The secret is required and may be provided either in the PLAID-SECRET header or as part of a request body.user_id/user/create. Integrations that began using /user/create after December 10, 2025 use this field to identify a user instead of the user_token. For more details, see new user APIs.const request = {
user_id: "usr_9nSp2KuZ2x4JDw"
};
try {
const response = await client.userGet(request);
} catch (error) {
}
Response fields
request_iduser_id/user/create. Integrations that began using /user/create after December 10, 2025 use this field to identify a user instead of the user_token. For more details, see new user APIs.client_user_idcreated_atdate-time updated_atdate-time identityid_number. Providing a partial SSN is strongly recommended, and improves the accuracy of matching user records during compliance processes such as file disclosure, dispute, or security freeze requests. If creating a report that will be shared with GSEs such as Fannie or Freddie, a full Social Security Number must be provided via the id_number field.namegiven_namefamily_namedate_of_birthdate phone_numbersaddressesstreet_1street_2cityregioncountrypostal_codeprimaryid_numbersvaluetypear_dni, au_drivers_license, au_passport, br_cpf, ca_sin, cl_run, cn_resident_card, co_nit, dk_cpr, eg_national_id, es_dni, es_nie, hk_hkid, in_pan, it_cf, jo_civil_id, jp_my_number, ke_huduma_namba, kw_civil_id, mx_curp, mx_rfc, my_nric, ng_nin, nz_drivers_license, om_civil_id, ph_psn, pl_pesel, ro_cnp, sa_national_id, se_pin, sg_nric, tr_tc_kimlik, us_ssn, us_ssn_last_4, za_smart_id{
"user_id": "usr_8c6ZbDAYjacUXF",
"client_user_id": "uid_12345",
"created_at": "2019-02-15T15:51:39Z",
"updated_at": "2019-02-15T15:52:39Z",
"request_id": "m8MDnv9okwxFNBV",
"identity": {
"name": {
"given_name": "Alice",
"family_name": "Johnson"
},
"date_of_birth": "1988-07-22",
"emails": [
{
"data": "[email protected]",
"primary": true
},
{
"data": "[email protected]",
"primary": false
}
],
"phone_numbers": [
{
"data": "+15551234567",
"primary": true
},
{
"data": "+15559876543",
"primary": false
}
],
"addresses": [
{
"street_1": "123 Main St",
"street_2": "Apt 4B",
"city": "Anytown",
"region": "CA",
"country": "US",
"postal_code": "90210",
"primary": true
}
],
"id_numbers": [
{
"value": "1234",
"type": "us_ssn_last_4"
}
]
}
}/user/update
Update user information
This endpoint updates user information for an existing user_id or user_token. If an existing user_id or user_token is missing fields required for a given use case (e.g. creating a Consumer Report) use /user/update to add values for those fields.
Identity updates use merge semantics: provided fields overwrite existing ones; omitted fields remain unchanged.
Request fields
client_idclient_id. The client_id is required and may be provided either in the PLAID-CLIENT-ID header or as part of a request body.secretsecret. The secret is required and may be provided either in the PLAID-SECRET header or as part of a request body.user_id/user/create. Integrations that began using /user/create after December 10, 2025 use this field to identify a user instead of the user_token. For more details, see new user APIs.identityid_number. Providing a partial SSN is strongly recommended, and improves the accuracy of matching user records during compliance processes such as file disclosure, dispute, or security freeze requests. If creating a report that will be shared with GSEs such as Fannie or Freddie, a full Social Security Number must be provided via the id_number field.namegiven_namefamily_namedate_of_birthdate phone_numbersaddressesid_numbersvaluetypear_dni, au_drivers_license, au_passport, br_cpf, ca_sin, cl_run, cn_resident_card, co_nit, dk_cpr, eg_national_id, es_dni, es_nie, hk_hkid, in_pan, it_cf, jo_civil_id, jp_my_number, ke_huduma_namba, kw_civil_id, mx_curp, mx_rfc, my_nric, ng_nin, nz_drivers_license, om_civil_id, ph_psn, pl_pesel, ro_cnp, sa_national_id, se_pin, sg_nric, tr_tc_kimlik, us_ssn, us_ssn_last_4, za_smart_iduser_tokenuser_token field. All other customers should use the user_id instead. For more details, see New User APIs.consumer_report_user _identityidentity object instead. For more details, see new user APIs.
To create a Plaid Check Consumer Report for a user when using a user_token, this field must be present. If this field is not provided during user token creation, you can add it to the user later by calling /user/update. Once the field has been added to the user, you will be able to call /link/token/create with a non-empty consumer_report_permissible_purpose (which will automatically create a Plaid Check Consumer Report), or call /cra/check_report/create for that user.first_namelast_namephone_numbersemailsssn_fullFormat: "ddd-dd-dddd"
ssn_last_44 4 date_of_birthdate primary_addresscityregionstate.
Example: "NC"street"564 Main Street, APT 15"postal_codezip.countryconst request = {
user_id: 'usr_9nSp2KuZ2x4JDw',
identity: {
name: {
given_name: "Carmen",
family_name: "Berzatto"
},
date_of_birth: "1987-01-31",
emails: [
{ data: "[email protected]", primary: true },
{ data: "[email protected]", primary: false }
],
phone_numbers: [
{ data: "+13125551212", primary: true }
],
addresses: [
{
street_1: "3200 W Armitage Ave",
street_2: null,
city: "Chicago",
region: "IL",
country: "US",
postal_code: "60657",
primary: true
}
],
id_numbers: [
{
value: "1234",
type: "us_ssn_last_4"
}
]
}
};
try {
const response = await client.userUpdate(request);
} catch (error) {
// handle error
}
Response fields
request_id{
"request_id": "Aim3b"
}/user/remove
Remove user
/user/remove deletes a user_id or user_token and and associated information, including any Items associated with the user.
Request fields
client_idclient_id. The client_id is required and may be provided either in the PLAID-CLIENT-ID header or as part of a request body.secretsecret. The secret is required and may be provided either in the PLAID-SECRET header or as part of a request body.user_id/user/create. Integrations that began using /user/create after December 10, 2025 use this field to identify a user instead of the user_token. For more details, see new user APIs.user_tokenuser_token field. All other customers should use the user_id instead. For more details, see New User APIs.const request = {
user_id: 'usr_9nSp2KuZ2x4JDw'
};
try {
const response = await client.userRemove(request);
} catch (error) {
// handle error
}
Response fields
request_id{
"request_id": "Aim3b"
}/user/items/get
Get Items associated with a User
Returns Items associated with a user_id, along with their corresponding statuses. Plaid associates an Item with a User when it has been successfully connected within a Link session initialized with that user_id.
Request fields
client_idclient_id. The client_id is required and may be provided either in the PLAID-CLIENT-ID header or as part of a request body.secretsecret. The secret is required and may be provided either in the PLAID-SECRET header or as part of a request body.user_tokenuser_token field. All other customers should use the user_id instead. For more details, see New User APIs.user_id/user/create. Integrations that began using /user/create after December 10, 2025 use this field to identify a user instead of the user_token. For more details, see new user APIs.const request = {
user_id: 'usr_9nSp2KuZ2x4JDw'
};
try {
const response = await client.userItemsGet(request);
} catch (error) {
// handle error
}
Response fields
itemsitem_iditem_id is always unique; linking the same account at the same institution twice will result in two Items with different item_id values. Like all Plaid identifiers, the item_id is case-sensitive.institution_idnull for Items created without an institution connection, such as Items created via Same Day Micro-deposits.institution_namenull for Items created without an institution connection, such as Items created via Same Day Micro-deposits.webhookauth_methodnull otherwise. For info about the various flows, see our Auth coverage documentation.INSTANT_AUTH: The Item's Auth data was provided directly by the user's institution connection.INSTANT_MATCH: The Item's Auth data was provided via the Instant Match fallback flow.AUTOMATED_MICRODEPOSITS: The Item's Auth data was provided via the Automated Micro-deposits flow.SAME_DAY_MICRODEPOSITS: The Item's Auth data was provided via the Same Day Micro-deposits flow.INSTANT_MICRODEPOSITS: The Item's Auth data was provided via the Instant Micro-deposits flow.DATABASE_MATCH: The Item's Auth data was provided via the Database Match flow.DATABASE_INSIGHTS: The Item's Auth data was provided via the Database Insights flow.TRANSFER_MIGRATED: The Item's Auth data was provided via /transfer/migrate_account.INVESTMENTS_FALLBACK: The Item's Auth data for Investments Move was provided via a fallback flow.INSTANT_AUTH, INSTANT_MATCH, AUTOMATED_MICRODEPOSITS, SAME_DAY_MICRODEPOSITS, INSTANT_MICRODEPOSITS, DATABASE_MATCH, DATABASE_INSIGHTS, TRANSFER_MIGRATED, INVESTMENTS_FALLBACK, nullerrorerror_code and categorized by error_type. Use these in preference to HTTP status codes to identify and handle specific errors. HTTP status codes are set and provide the broadest categorization of errors: 4xx codes are for developer- or user-related errors, and 5xx codes are for Plaid-related errors, and the status will be 2xx in non-error cases. An Item with a non-null error object will only be part of an API response when calling /item/get to view Item status. Otherwise, error fields will be null if no error has occurred; if an error has occurred, an error code will be returned instead.error_typeINVALID_REQUEST, INVALID_RESULT, INVALID_INPUT, INSTITUTION_ERROR, RATE_LIMIT_EXCEEDED, API_ERROR, ITEM_ERROR, ASSET_REPORT_ERROR, RECAPTCHA_ERROR, OAUTH_ERROR, PAYMENT_ERROR, BANK_TRANSFER_ERROR, INCOME_VERIFICATION_ERROR, MICRODEPOSITS_ERROR, SANDBOX_ERROR, PARTNER_ERROR, SIGNAL_ERROR, TRANSACTIONS_ERROR, TRANSACTION_ERROR, TRANSFER_ERROR, CHECK_REPORT_ERROR, CONSUMER_REPORT_ERROR, USER_ERRORerror_codeerror_code_reasonnull will be returned otherwise. Safe for programmatic use.Possible values:
OAUTH_INVALID_TOKEN: The user’s OAuth connection to this institution has been invalidated.OAUTH_CONSENT_EXPIRED: The user's access consent for this OAuth connection to this institution has expired.OAUTH_USER_REVOKED: The user’s OAuth connection to this institution is invalid because the user revoked their connection.error_messagedisplay_messagenull if the error is not related to user action.This may change over time and is not safe for programmatic use.
request_idcausescauses will return an array of errors containing a breakdown of these errors on the individual Item level, if any can be identified.causes will be provided for the error_type ASSET_REPORT_ERROR or CHECK_REPORT_ERROR. causes will also not be populated inside an error nested within a warning object.statusdocumentation_urlsuggested_actionrequired_account _subtypesaccount_filters parameter in /link/token/create. Currently only populated for NO_ACCOUNTS errors from Items with investments_auth as an enabled product.provided_account _subtypesaccount_filters parameter in /link/token/create. Currently only populated for NO_ACCOUNTS errors from Items with investments_auth as an enabled product.available_productsbilled_products.assets, auth, balance, balance_plus, beacon, identity, identity_match, investments, investments_auth, liabilities, payment_initiation, identity_verification, transactions, credit_details, income, income_verification, standing_orders, transfer, employment, recurring_transactions, transactions_refresh, signal, statements, processor_payments, processor_identity, profile, cra_base_report, cra_income_insights, cra_partner_insights, cra_network_insights, cra_cashflow_insights, cra_monitoring, cra_lend_score, layer, pay_by_bank, protect_linked_bankbilled_productsavailable_products. Note - billed_products is populated in all environments but only requests in Production are billed. Also note that products that are billed on a pay-per-call basis rather than a pay-per-Item basis, such as balance, will not appear here.assets, auth, balance, balance_plus, beacon, identity, identity_match, investments, investments_auth, liabilities, payment_initiation, identity_verification, transactions, credit_details, income, income_verification, standing_orders, transfer, employment, recurring_transactions, transactions_refresh, signal, statements, processor_payments, processor_identity, profile, cra_base_report, cra_income_insights, cra_partner_insights, cra_network_insights, cra_cashflow_insights, cra_monitoring, cra_lend_score, layer, pay_by_bank, protect_linked_bankproductsbilled_products field. For some products, it is possible for the product to be added to an Item but not yet billed (e.g. Assets, before /asset_report/create has been called, or Auth or Identity when added as Optional Products but before their endpoints have been called), in which case the product may appear in products but not in billed_products.assets, auth, balance, balance_plus, beacon, identity, identity_match, investments, investments_auth, liabilities, payment_initiation, identity_verification, transactions, credit_details, income, income_verification, standing_orders, transfer, employment, recurring_transactions, transactions_refresh, signal, statements, processor_payments, processor_identity, profile, cra_base_report, cra_income_insights, cra_partner_insights, cra_network_insights, cra_cashflow_insights, cra_monitoring, cra_lend_score, layer, pay_by_bank, protect_linked_bankconsented_productsassets, auth, balance, balance_plus, beacon, identity, identity_match, investments, investments_auth, liabilities, transactions, income, income_verification, transfer, employment, recurring_transactions, signal, statements, processor_payments, processor_identity, cra_base_report, cra_income_insights, cra_lend_score, cra_partner_insights, cra_cashflow_insights, cra_monitoring, layerconsent_expiration _timenull. Currently, only institutions in Europe and a small number of institutions in the US have expiring consent. For a list of US institutions that currently expire consent, see the OAuth Guide.date-time update_typebackground - Item can be updated in the backgrounduser_present_required - Item requires user interaction to be updatedbackground, user_present_requiredrequest_id{
"items": [
{
"available_products": [
"balance",
"auth"
],
"billed_products": [
"identity",
"transactions"
],
"error": null,
"institution_id": "ins_109508",
"institution_name": "First Platypus Bank",
"item_id": "Ed6bjNrDLJfGvZWwnkQlfxwoNz54B5C97ejBr",
"update_type": "background",
"webhook": "https://plaid.com/example/hook",
"consent_expiration_time": null
},
{
"available_products": [
"balance",
"identity",
"payment_initiation",
"transactions"
],
"billed_products": [
"assets",
"auth"
],
"error": null,
"institution_id": "ins_109508",
"institution_name": "First Platypus Bank",
"item_id": "DWVAAPWq4RHGlEaNyGKRTAnPLaEmo8Cvq7na6",
"update_type": "background",
"webhook": "https://plaid.com/example/hook",
"consent_expiration_time": null
}
],
"request_id": "m8MDnv9okwxFNBV"
}