Consent API
Read and revoke FDX consent grants programmatically
The Consent API is in beta. Behavior may change before general availability. If you run into an issue, contact your Plaid solutions engineering team.
Overview
The Consent API represents each of your customers' authorizations as an FDX consent grant: a record of which application has access, which of the customer's resources it can read, which data clusters are in scope, and how long that access lasts.
Use it to build a consumer-facing consent portal, to answer support requests about a customer's connections, and to revoke access when a customer withdraws consent. Single-institution accounts can read the same data with no code in the Data Partner Dashboard; this page covers the API, which is available to every integration model, including platforms.
For conceptual background on authorization records, revocation, and the webhooks that accompany these endpoints, see Consent management.
Authentication
Find your client_id and secret on the Developer > Keys tab of the Data Partner Dashboard and include both as the PLAID-CLIENT-ID and PLAID-SECRET headers, or as client_id and secret in the request body. All requests must be made over HTTPS.
Customer identifiers
Every consent grant is scoped to a customerId, which must be the same persistent, unique identifier you use as the sub claim in your OIDC ID token. See Unique user identifier (consistency key).
If you are a platform or gateway serving multiple institutions, Plaid assumes customerId is unique across all of them. If you reuse a customer identifier across institutions, contact your Plaid solutions engineering team before you integrate.
Data clusters
A consent grant covers a set of resources, each with a list of FDX data clusters. resources is omitted entirely when a grant covers none. resourceType is one of ACCOUNT, CUSTOMER, or DOCUMENT, and the clusters Plaid may request are:
| Data cluster | Includes |
|---|---|
ACCOUNT_BASIC | Account name, type, and masked account number |
ACCOUNT_DETAILED | Everything in ACCOUNT_BASIC, plus credit limits, due dates, and interest rates |
BALANCES | Current and available balances |
PAYMENT_SUPPORT | Account and routing numbers and other stored payment methods |
SCHEDULED_PAYMENTS | Future-dated single and recurring payments, with amounts and frequency |
TRANSACTIONS | Transaction amounts, dates, descriptions, and merchants |
STATEMENTS | PDF statements |
INVESTMENTS | Investment holdings, securities details, quantities, and market values |
CUSTOMER_CONTACT | Account owner name, email, phone, and postal address |
TAX | Tax forms such as 1099s and W-2s |
Plaid uses a different, consumer-facing taxonomy for these clusters in the Link flow. Contact your Plaid solutions engineering team if you need the mapping between the two.
Plaid does not use the BILLS, CUSTOMER_PERSONAL, IMAGES, and REWARDS clusters, so they will not appear on a consent grant Plaid brokers. The FDXDataCluster enum also defines ACCOUNT_PAYMENTS and NOTIFICATIONS.
Endpoints
| Endpoint | Functionality |
|---|---|
GET /fdx/consents | List a customer's consent grants |
GET /fdx/consents/{consentId} | Get a single consent grant |
PUT /fdx/consents/{consentId}/revocation | Revoke a consent grant |
GET /fdx/consents/{consentId}/revocation | Get a consent grant's revocation history |
List a customer's consent grants
Fetch this list each time a customer opens your consent portal rather than serving a cached copy, so that revocations made elsewhere in the ecosystem are reflected immediately. Omit status to return grants in every state, which is useful for an audit view.
List FDX Consent Grants for a customer
Returns zero or more consent grants associated with the given data provider customer, optionally filtered by status.
Request fields
Data provider customer identifier whose consent grants to return.
queryOptional filter restricting results to a single consent grant status. One of ACTIVE, REVOKED, EXPIRED.
ACTIVE, REVOKED, EXPIRED querycurl -X GET 'https://production.plaid.com/fdx/consents?customerId=<customer_id>&status=ACTIVE' \
-H 'PLAID-CLIENT-ID: <client_id>' \
-H 'PLAID-SECRET: <secret>'Response fields
Consent grants matching the customerId (and optional status) filter.
The persistent identifier of the consent grant
Current status of a consent grant. One of ACTIVE, REVOKED, EXPIRED.
ACTIVE, REVOKED, EXPIREDWhen the consent was initially granted
date-time When the consent grant was last updated
date-time When the consent grant will expire. Omitted when the grant has no expiration.
date-time Non-end-user parties participating in the consent grant (Data Recipient, Data Provider, Data Access Platform).
Human recognizable common name
Identifies the type of a party
DATA_ACCESS_PLATFORM, DATA_PROVIDER, DATA_RECIPIENT, INDIVIDUAL, MERCHANT, VENDORURI for party, where an end user could learn more about the company or application involved in the data sharing chain
uri URI for a logo asset to be displayed to the end user
uri The registry containing the party's registration with name and id
FDX, GLEIF, ICANN, PRIVATERegistered name of party
Registered id of party
Permissioned resource entries. Omitted when there are no resources.
Type of resource permissioned on a consent grant.
ACCOUNT, CUSTOMER, DOCUMENTIdentifier of the resource permissioned.
Names of clusters of data elements permissioned.
ACCOUNT_BASIC, ACCOUNT_DETAILED, ACCOUNT_PAYMENTS, BILLS, CUSTOMER_CONTACT, CUSTOMER_PERSONAL, IMAGES, INVESTMENTS, NOTIFICATIONS, PAYMENT_SUPPORT, REWARDS, STATEMENTS, TAX, TRANSACTIONS, BALANCES, SCHEDULED_PAYMENTS{
"consent_grants": [
{
"id": "9585694d-3ae5-8863-1234-567890abcdef",
"status": "ACTIVE",
"createdTime": "2026-01-01T00:00:00Z",
"updatedTime": "2026-01-01T00:00:00Z",
"parties": [
{
"name": "My Example Client",
"type": "DATA_RECIPIENT",
"homeUri": "https://example.com",
"registry": "PRIVATE",
"registeredEntityName": "My Example Client LLC",
"registeredEntityId": "549300A0B1C2D3E4F5G6"
},
{
"name": "First Platypus Bank",
"type": "DATA_PROVIDER",
"homeUri": "https://www.platypus.com"
},
{
"name": "Plaid",
"type": "DATA_ACCESS_PLATFORM",
"homeUri": "https://plaid.com"
}
],
"resources": [
{
"resourceType": "ACCOUNT",
"resourceId": "b14e1e714693bc00",
"dataClusters": [
"ACCOUNT_BASIC",
"ACCOUNT_DETAILED",
"STATEMENTS"
]
}
]
},
{
"id": "1a2b3c4d-5e6f-7890-abcd-ef0123456789",
"status": "REVOKED",
"createdTime": "2026-01-03T00:00:00Z",
"updatedTime": "2026-01-04T00:00:00Z",
"parties": [
{
"name": "Another Example Client",
"type": "DATA_RECIPIENT",
"homeUri": "https://another-example.com",
"registry": "PRIVATE",
"registeredEntityName": "Another Example Client LLC",
"registeredEntityId": "549300Z9Y8X7W6V5U4T3"
},
{
"name": "First Platypus Bank",
"type": "DATA_PROVIDER",
"homeUri": "https://www.platypus.com"
},
{
"name": "Plaid",
"type": "DATA_ACCESS_PLATFORM",
"homeUri": "https://plaid.com"
}
],
"resources": [
{
"resourceType": "ACCOUNT",
"resourceId": "c25f2f825704cd11",
"dataClusters": [
"ACCOUNT_BASIC",
"ACCOUNT_DETAILED"
]
}
]
}
]
}Get a single consent grant
Use the parties array to identify the application: the entry with type of DATA_RECIPIENT is the connected app, DATA_PROVIDER is you, and DATA_ACCESS_PLATFORM is Plaid.
If you have an existing live integration and need the consentId values for connections that predate it, contact your Plaid solutions engineering team to coordinate a backfill.
Get FDX Consent Grant
Returns a consent grant by its identifier
Request fields
Consent Grant Identifier. Uniquely identifies the consent grant
pathcurl -X GET 'https://production.plaid.com/fdx/consents/<consent_id>' \
-H 'PLAID-CLIENT-ID: <client_id>' \
-H 'PLAID-SECRET: <secret>'Response fields
The persistent identifier of the consent grant
Current status of a consent grant. One of ACTIVE, REVOKED, EXPIRED.
ACTIVE, REVOKED, EXPIREDWhen the consent was initially granted
date-time When the consent grant was last updated
date-time When the consent grant will expire. Omitted when the grant has no expiration.
date-time Non-end-user parties participating in the consent grant (Data Recipient, Data Provider, Data Access Platform).
Human recognizable common name
Identifies the type of a party
DATA_ACCESS_PLATFORM, DATA_PROVIDER, DATA_RECIPIENT, INDIVIDUAL, MERCHANT, VENDORURI for party, where an end user could learn more about the company or application involved in the data sharing chain
uri URI for a logo asset to be displayed to the end user
uri The registry containing the party's registration with name and id
FDX, GLEIF, ICANN, PRIVATERegistered name of party
Registered id of party
Permissioned resource entries. Omitted when there are no resources.
Type of resource permissioned on a consent grant.
ACCOUNT, CUSTOMER, DOCUMENTIdentifier of the resource permissioned.
Names of clusters of data elements permissioned.
ACCOUNT_BASIC, ACCOUNT_DETAILED, ACCOUNT_PAYMENTS, BILLS, CUSTOMER_CONTACT, CUSTOMER_PERSONAL, IMAGES, INVESTMENTS, NOTIFICATIONS, PAYMENT_SUPPORT, REWARDS, STATEMENTS, TAX, TRANSACTIONS, BALANCES, SCHEDULED_PAYMENTS{
"id": "9585694d-3ae5-8863-1234-567890abcdef",
"status": "ACTIVE",
"createdTime": "2026-01-01T00:00:00Z",
"updatedTime": "2026-01-01T00:00:00Z",
"parties": [
{
"name": "My Example Client",
"type": "DATA_RECIPIENT",
"homeUri": "https://example.com",
"registry": "PRIVATE",
"registeredEntityName": "My Example Client LLC",
"registeredEntityId": "549300A0B1C2D3E4F5G6"
},
{
"name": "First Platypus Bank",
"type": "DATA_PROVIDER",
"homeUri": "https://www.platypus.com"
},
{
"name": "Plaid",
"type": "DATA_ACCESS_PLATFORM",
"homeUri": "https://plaid.com"
}
],
"resources": [
{
"resourceType": "ACCOUNT",
"resourceId": "b14e1e714693bc00",
"dataClusters": [
"ACCOUNT_BASIC",
"BALANCES",
"TRANSACTIONS",
"SCHEDULED_PAYMENTS"
]
}
]
}Revoke a consent grant
Call this endpoint as soon as a customer disconnects an application in your portal, or when your own risk or compliance systems terminate access. Plaid then notifies the application and stops serving it data, which is what keeps your portal, Plaid, and the application in sync. See Revocation and ecosystem sync for what happens if you skip this call.
Set initiator to the party that triggered the revocation, usually DATA_PROVIDER. Set reason to USER_ACTION when a customer disconnects the app themselves, or BUSINESS_RULE or SECURITY_EVENT when you revoke on your own initiative. If you pass OTHER, describe the circumstances in otherReason.
A successful revocation returns 204 No Content with an empty body. Revocation is not idempotent: a grant that is already revoked or expired returns 409 CONFLICT rather than succeeding again. Revocation is also per grant, so a customer with several grants for the same application needs a call for each consentId.
Revoke FDX Consent Grant
Appends a REVOKED status record to the named consent grant
Request fields
Consent Grant Identifier. Uniquely identifies the consent grant
pathIdentifies the type of a party
DATA_ACCESS_PLATFORM, DATA_PROVIDER, DATA_RECIPIENT, INDIVIDUAL, MERCHANT, VENDORReason for lifecycle event status change
BUSINESS_RULE, SECURITY_EVENT, USER_ACTION, OTHERAdditional information or description of an OTHER reason
When the revocation was effected on the initiator's side
date-time curl -X PUT 'https://production.plaid.com/fdx/consents/<consent_id>/revocation' \
-H 'PLAID-CLIENT-ID: <client_id>' \
-H 'PLAID-SECRET: <secret>' \
-H 'Content-Type: application/json' \
-d '{
"initiator": "DATA_PROVIDER",
"reason": "USER_ACTION"
}'Revoking a consent grant stops the application from requesting new data. It does not delete data the application has already received; a customer who wants that data deleted has to ask the application directly.
Retrieve a consent grant's revocation history
Use this endpoint to show a customer when and why access ended, and to keep an audit record of who initiated it. Records are returned most recent first, and the array is empty for a grant that has never been revoked.
Retrieve FDX Consent Grant revocation records
Returns the revocation history of a consent grant
Request fields
Consent Grant Identifier. Uniquely identifies the consent grant
pathcurl -X GET 'https://production.plaid.com/fdx/consents/<consent_id>/revocation' \
-H 'PLAID-CLIENT-ID: <client_id>' \
-H 'PLAID-SECRET: <secret>'Response fields
Revocation records for the consent grant, most recent first. Empty when the grant has never been revoked.
Current status of a consent grant. One of ACTIVE, REVOKED, EXPIRED.
ACTIVE, REVOKED, EXPIREDReason for lifecycle event status change
BUSINESS_RULE, SECURITY_EVENT, USER_ACTION, OTHERIdentifies the type of a party
DATA_ACCESS_PLATFORM, DATA_PROVIDER, DATA_RECIPIENT, INDIVIDUAL, MERCHANT, VENDORWhen the consent grant was revoked
date-time {
"revocations": [
{
"status": "REVOKED",
"reason": "USER_ACTION",
"initiator": "DATA_PROVIDER",
"updatedTime": "2026-01-03T00:00:00Z"
}
]
}Testing in Sandbox
A consent grant is normally created when a customer authorizes an application through your OAuth flow. To exercise these endpoints in Sandbox without a live connection, seed a grant with /sandbox/fdx/consent/seed and then list, retrieve, and revoke it as you would in production.
Pass consent_id to control the identifier of the seeded grant, which makes tests deterministic; omit it and Plaid generates one. Seeding fails if a grant with that identifier already exists.
Revoking a consent grant is permanent. To test reconnection, seed a second grant for the same customer_id and application_id; it is issued a new consent_id, and the original stays in the customer's history as REVOKED.
Seed an FDX consent grant for a sandbox data partner
/sandbox/fdx/consent/seed creates a test FDX consent grant (and a backing Item) for a data provider's customer in Sandbox, so the FDX Consent API endpoints can be exercised end-to-end without a live data provider connection.
customer_id is the data provider's identifier for the end user and application_id identifies the data recipient application the consent is granted to; both are required. Optionally provide consent_id (a UUIDv4) to control the seeded grant's identifier; one is generated when omitted. The seeded grant is returned by /fdx/consents and /fdx/consents/{consentId}, and can be revoked via /fdx/consents/{consentId}/revocation.
Request fields
Your Plaid API client_id. The client_id is required and may be provided either in the PLAID-CLIENT-ID header or as part of a request body.
Your Plaid API secret. The secret is required and may be provided either in the PLAID-SECRET header or as part of a request body.
The data provider's identifier for the end user to associate the seeded consent grant with.
This field will map to the application ID that is returned from /item/application/list, or provided to the institution in an oauth redirect.
Optional UUIDv4 identifier for the seeded consent grant. If omitted, one is generated. Seeding fails if a grant with this identifier already exists.
curl -X POST 'https://sandbox.plaid.com/sandbox/fdx/consent/seed' \
-H 'Content-Type: application/json' \
-d '{
"client_id": "<client_id>",
"secret": "<secret>",
"customer_id": "consentapi-example-1",
"application_id": "5d16db26-b759-4d3e-ab8f-e01e8c494eae"
}'Response fields
The identifier of the newly seeded FDX consent grant.
A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive.
{
"consent_id": "9cfe04b5-6d04-45ce-897e-45f2580bf013",
"request_id": "m8MDnv9okwxFNBV"
}Plaid provides demo applications to grant consent to when seeding:
| Demo application | application_id |
|---|---|
| Budget Works | 5cfef3f0-e405-4597-991d-057ac558e3d5 |
| Incremental Investing | 09f9befa-acb6-4575-93c7-b64ef523641e |
| My Peer Payer | 5d16db26-b759-4d3e-ab8f-e01e8c494eae |
Seeded grants are never deleted, so repeatedly seeding and revoking the same customer_id and application_id pair grows that customer's result set from /fdx/consents indefinitely. Account for this in automated tests.
Errors
These endpoints use the FDX error format rather than Plaid's standard error object. The body contains error_type, error_code, and error_message only — there is no display_message or request_id. error_type and error_code are stable and safe to branch on; error_message is not.
| Status | error_type | error_code | Returned when |
|---|---|---|---|
| 400 | BAD_REQUEST | 32 | customerId is missing when listing grants, or the revocation body cannot be parsed or names an unsupported reason or initiator |
| 404 | NOT_FOUND | 1107 | The consent grant does not exist, or belongs to another institution |
| 409 | CONFLICT | 409 | Revocation was requested for a grant that is already revoked or expired |
| 500 | INTERNAL_SERVER_ERROR | 01 | An unexpected error occurred |
A 404 deliberately does not distinguish a grant that does not exist from one belonging to another institution, so you cannot use it to probe for grants you do not own.
Because a failure here surfaces inside your own consent portal, treat these responses as internal diagnostics rather than something to pass through to the customer. A lookup that returns 404 is better rendered as an empty state than as an error.