Plaid logo
Core Exchange
ALL DOCS

Post-launch

  • Post-launch operations
  • Dashboard monitoring
  • Consent management
  • App Directory
  • Troubleshooting
Core Exchange
Close search modal
Ask Bill!
Ask Bill!
Hi! I'm Bill! You can ask me all about Core Exchange. Try asking questions like:
    Note: Bill isn't perfect. He's just a robot platypus that reads our docs for fun. You should treat his answers with the same healthy skepticism you might treat any other answer on the internet. This chat may be logged for quality and training purposes. Please don't send Bill any PII -- he's scared of intimacy. All chats with Bill are subject to Plaid's Privacy Policy.
    Plaid.comGet Started
    Open nav

    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 clusterIncludes
    ACCOUNT_BASICAccount name, type, and masked account number
    ACCOUNT_DETAILEDEverything in ACCOUNT_BASIC, plus credit limits, due dates, and interest rates
    BALANCESCurrent and available balances
    PAYMENT_SUPPORTAccount and routing numbers and other stored payment methods
    SCHEDULED_PAYMENTSFuture-dated single and recurring payments, with amounts and frequency
    TRANSACTIONSTransaction amounts, dates, descriptions, and merchants
    STATEMENTSPDF statements
    INVESTMENTSInvestment holdings, securities details, quantities, and market values
    CUSTOMER_CONTACTAccount owner name, email, phone, and postal address
    TAXTax 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

    EndpointFunctionality
    GET /fdx/consentsList a customer's consent grants
    GET /fdx/consents/{consentId}Get a single consent grant
    PUT /fdx/consents/{consentId}/revocationRevoke a consent grant
    GET /fdx/consents/{consentId}/revocationGet 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.

    /fdx/consents

    Request fields

    customerId
    stringstring

    Data provider customer identifier whose consent grants to return.

    Parameter type: query
    status
    stringstring

    Optional filter restricting results to a single consent grant status. One of ACTIVE, REVOKED, EXPIRED.

    Possible values: ACTIVE, REVOKED, EXPIRED
    Parameter type: query
    curl -X GET 'https://production.plaid.com/fdx/consents?customerId=<customer_id>&status=ACTIVE' \
      -H 'PLAID-CLIENT-ID: <client_id>' \
      -H 'PLAID-SECRET: <secret>'
    /fdx/consents

    Response fields

    consent_grants
    [object][object]

    Consent grants matching the customerId (and optional status) filter.

    id
    stringstring

    The persistent identifier of the consent grant

    status
    stringstring

    Current status of a consent grant. One of ACTIVE, REVOKED, EXPIRED.

    Possible values: ACTIVE, REVOKED, EXPIRED
    createdTime
    stringstring

    When the consent was initially granted

    Format: date-time
    updatedTime
    stringstring

    When the consent grant was last updated

    Format: date-time
    expirationTime
    stringstring

    When the consent grant will expire. Omitted when the grant has no expiration.

    Format: date-time
    parties
    [object][object]

    Non-end-user parties participating in the consent grant (Data Recipient, Data Provider, Data Access Platform).

    name
    stringstring

    Human recognizable common name

    type
    stringstring

    Identifies the type of a party

    Possible values: DATA_ACCESS_PLATFORM, DATA_PROVIDER, DATA_RECIPIENT, INDIVIDUAL, MERCHANT, VENDOR
    homeUri
    stringstring

    URI for party, where an end user could learn more about the company or application involved in the data sharing chain

    Format: uri
    logoUri
    stringstring

    URI for a logo asset to be displayed to the end user

    Format: uri
    registry
    stringstring

    The registry containing the party's registration with name and id

    Possible values: FDX, GLEIF, ICANN, PRIVATE
    registeredEntityName
    stringstring

    Registered name of party

    registeredEntityId
    stringstring

    Registered id of party

    resources
    [object][object]

    Permissioned resource entries. Omitted when there are no resources.

    resourceType
    stringstring

    Type of resource permissioned on a consent grant.

    Possible values: ACCOUNT, CUSTOMER, DOCUMENT
    resourceId
    stringstring

    Identifier of the resource permissioned.

    dataClusters
    [string][string]

    Names of clusters of data elements permissioned.

    Possible values: ACCOUNT_BASIC, ACCOUNT_DETAILED, ACCOUNT_PAYMENTS, BILLS, CUSTOMER_CONTACT, CUSTOMER_PERSONAL, IMAGES, INVESTMENTS, NOTIFICATIONS, PAYMENT_SUPPORT, REWARDS, STATEMENTS, TAX, TRANSACTIONS, BALANCES, SCHEDULED_PAYMENTS
    Response Object
    {
      "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

    /fdx/consents/{consentId}

    Request fields

    consentId
    stringstring

    Consent Grant Identifier. Uniquely identifies the consent grant

    Parameter type: path
    curl -X GET 'https://production.plaid.com/fdx/consents/<consent_id>' \
      -H 'PLAID-CLIENT-ID: <client_id>' \
      -H 'PLAID-SECRET: <secret>'
    /fdx/consents/{consentId}

    Response fields

    id
    stringstring

    The persistent identifier of the consent grant

    status
    stringstring

    Current status of a consent grant. One of ACTIVE, REVOKED, EXPIRED.

    Possible values: ACTIVE, REVOKED, EXPIRED
    createdTime
    stringstring

    When the consent was initially granted

    Format: date-time
    updatedTime
    stringstring

    When the consent grant was last updated

    Format: date-time
    expirationTime
    stringstring

    When the consent grant will expire. Omitted when the grant has no expiration.

    Format: date-time
    parties
    [object][object]

    Non-end-user parties participating in the consent grant (Data Recipient, Data Provider, Data Access Platform).

    name
    stringstring

    Human recognizable common name

    type
    stringstring

    Identifies the type of a party

    Possible values: DATA_ACCESS_PLATFORM, DATA_PROVIDER, DATA_RECIPIENT, INDIVIDUAL, MERCHANT, VENDOR
    homeUri
    stringstring

    URI for party, where an end user could learn more about the company or application involved in the data sharing chain

    Format: uri
    logoUri
    stringstring

    URI for a logo asset to be displayed to the end user

    Format: uri
    registry
    stringstring

    The registry containing the party's registration with name and id

    Possible values: FDX, GLEIF, ICANN, PRIVATE
    registeredEntityName
    stringstring

    Registered name of party

    registeredEntityId
    stringstring

    Registered id of party

    resources
    [object][object]

    Permissioned resource entries. Omitted when there are no resources.

    resourceType
    stringstring

    Type of resource permissioned on a consent grant.

    Possible values: ACCOUNT, CUSTOMER, DOCUMENT
    resourceId
    stringstring

    Identifier of the resource permissioned.

    dataClusters
    [string][string]

    Names of clusters of data elements permissioned.

    Possible values: ACCOUNT_BASIC, ACCOUNT_DETAILED, ACCOUNT_PAYMENTS, BILLS, CUSTOMER_CONTACT, CUSTOMER_PERSONAL, IMAGES, INVESTMENTS, NOTIFICATIONS, PAYMENT_SUPPORT, REWARDS, STATEMENTS, TAX, TRANSACTIONS, BALANCES, SCHEDULED_PAYMENTS
    Response Object
    {
      "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

    /fdx/consents/{consentId}/revocation

    Request fields

    consentId
    stringstring

    Consent Grant Identifier. Uniquely identifies the consent grant

    Parameter type: path
    initiator
    requiredstringrequired, string

    Identifies the type of a party

    Possible values: DATA_ACCESS_PLATFORM, DATA_PROVIDER, DATA_RECIPIENT, INDIVIDUAL, MERCHANT, VENDOR
    reason
    requiredstringrequired, string

    Reason for lifecycle event status change

    Possible values: BUSINESS_RULE, SECURITY_EVENT, USER_ACTION, OTHER
    otherReason
    stringstring

    Additional information or description of an OTHER reason

    updatedTime
    stringstring

    When the revocation was effected on the initiator's side

    Format: 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

    /fdx/consents/{consentId}/revocation

    Request fields

    consentId
    stringstring

    Consent Grant Identifier. Uniquely identifies the consent grant

    Parameter type: path
    curl -X GET 'https://production.plaid.com/fdx/consents/<consent_id>/revocation' \
      -H 'PLAID-CLIENT-ID: <client_id>' \
      -H 'PLAID-SECRET: <secret>'
    /fdx/consents/{consentId}/revocation

    Response fields

    revocations
    [object][object]

    Revocation records for the consent grant, most recent first. Empty when the grant has never been revoked.

    status
    stringstring

    Current status of a consent grant. One of ACTIVE, REVOKED, EXPIRED.

    Possible values: ACTIVE, REVOKED, EXPIRED
    reason
    stringstring

    Reason for lifecycle event status change

    Possible values: BUSINESS_RULE, SECURITY_EVENT, USER_ACTION, OTHER
    initiator
    stringstring

    Identifies the type of a party

    Possible values: DATA_ACCESS_PLATFORM, DATA_PROVIDER, DATA_RECIPIENT, INDIVIDUAL, MERCHANT, VENDOR
    updatedTime
    stringstring

    When the consent grant was revoked

    Format: date-time
    Response Object
    {
      "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.

    /sandbox/fdx/consent/seed

    Request fields

    client_id
    stringstring

    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.

    secret
    stringstring

    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.

    customer_id
    requiredstringrequired, string

    The data provider's identifier for the end user to associate the seeded consent grant with.

    application_id
    requiredstringrequired, string

    This field will map to the application ID that is returned from /item/application/list, or provided to the institution in an oauth redirect.

    consent_id
    stringstring

    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"
      }'
    /sandbox/fdx/consent/seed

    Response fields

    consent_id
    stringstring

    The identifier of the newly seeded FDX consent grant.

    request_id
    stringstring

    A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive.

    Response Object
    {
      "consent_id": "9cfe04b5-6d04-45ce-897e-45f2580bf013",
      "request_id": "m8MDnv9okwxFNBV"
    }

    Plaid provides demo applications to grant consent to when seeding:

    Demo applicationapplication_id
    Budget Works5cfef3f0-e405-4597-991d-057ac558e3d5
    Incremental Investing09f9befa-acb6-4575-93c7-b64ef523641e
    My Peer Payer5d16db26-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.

    Statuserror_typeerror_codeReturned when
    400BAD_REQUEST32customerId is missing when listing grants, or the revocation body cannot be parsed or names an unsupported reason or initiator
    404NOT_FOUND1107The consent grant does not exist, or belongs to another institution
    409CONFLICT409Revocation was requested for a grant that is already revoked or expired
    500INTERNAL_SERVER_ERROR01An 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.