Plaid logo
Docs
ALL DOCS

Consumer Report (by Plaid Check)

  • Introduction
  • Implementation
  • CRA Servicing
  • Migrate from Assets
  • Migrate from Income
  • Migrate from Transactions
  • Migrate from Cash Flow Updates
  • Onboard users with Plaid Layer
  • Share data with partners
Plaid logo
Docs
Plaid.com
Log in
Get API Keys
Open nav
Close search modal
Ask Bill!
Ask Bill!
Hi! I'm Bill! You can ask me all about the Plaid API. Try asking questions like:
    Pssst -- I also moonlight as your IDE's research librarian! Plug me in via the Plaid MCP Server.
    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.

    CRA Servicing

    Receive recurring Consumer Report updates for a user after origination

    CRA Servicing keeps a Consumer Report current after a loan has been originated. You subscribe a user once, and Plaid regenerates their report on a recurring cadence and notifies you each time new data is available.

    Reports are delivered through the same /cra/check_report/base_report/get and /cra/check_report/income_insights/get endpoints used at origination.

    CRA Servicing became generally available on August 20, 2026, replacing Cash Flow Updates. Integrations built on the earlier /cra/monitoring_insights/* endpoints should see Migrate from Cash Flow Updates. Those endpoints are deprecated and will stop functioning on August 20, 2027.

    Before you begin

    CRA Servicing requires an existing Plaid Check integration. If you have not onboarded users to Plaid Check yet, start with Add Consumer Report to your app.

    You will also need CRA Servicing enabled on your account. To request access, contact your account manager.

    Integration overview

    1. Configure a webhook listener and register its URL with Plaid.
    2. Create a subscription for a user, specifying the products to include in each report.
    3. Receive a CRA_REPORT_UPDATED webhook each time Plaid generates a new report for that user.
    4. Fetch the updated report by calling Consumer Report /get endpoints.

    When you subscribe, every CRA Item the user has linked is included, and Items the user links later are picked up automatically. Each generation aggregates across all healthy Items into a single report; if some Items fail, the report is still generated from the Items that succeeded.

    Duplicate Items are deduplicated: if Plaid detects multiple copies of the same bank connection, only one is included in the report.

    A report can include a maximum of 25 Items.

    Configure webhook listener

    Manage webhook destinations for CRA Servicing from the Plaid Dashboard: on a CRA-enabled account, go to Webhooks and configure a destination for the CRA Report Updated event.

    Configuring the destination in the Dashboard lets you move every active subscription to a new URL in a single action, rather than updating subscriptions one at a time. If you prefer to configure this per subscription (e.g. to use different webhook URLs for different environments), pass an override URL in the webhook field when you create the subscription.

    Create a subscription

    Call /cra/servicing/subscription/create with a user_id and the products to include in each report. Currently, supported products are cra_base_report and cra_income_insights, the only valid cadence is DAILY, and the only valid scope is CLIENT_USER.

    Subscribe a user to CRA Servicing
    curl -X POST https://sandbox.plaid.com/cra/servicing/subscription/create \
    -H 'Content-Type: application/json' \
    -d '{
      "client_id": "${PLAID_CLIENT_ID}",
      "secret": "${PLAID_SECRET}",
      "user_id": "usr_9nSp2KuZ2x4JDw",
      "scope": "CLIENT_USER",
      "cadence": "DAILY",
      "products": [
        { "product": "cra_base_report", "version": "V1" },
        { "product": "cra_income_insights", "version": "V1" }
      ]
    }'

    The response returns a subscription_id in the format cra-sub-<env>-<uuid>. Store this value.

    Reports are generated once every 24 hours; the first report is generated 24 hours after the subscription is created.

    Handle the webhook

    Each generation fires a single CRA_REPORT_UPDATED webhook for the user, covering every product on the subscription. There is no separate webhook for failures: success, partial success, and total failure are all delivered as the same event. If the error_code on the webhook is absent or null, at least one product generated successfully.

    Successful generation
    {
      "webhook_type": "CRA_REPORT",
      "webhook_code": "CRA_REPORT_UPDATED",
      "user_id": "usr_9nSp2KuZ2x4JDw",
      "scope": "CLIENT_USER",
      "successful_products": [
        { "product": "cra_base_report", "version": "V1" },
        { "product": "cra_income_insights", "version": "V1" }
      ],
      "failed_products": [],
      "generated_time": "2026-08-21T14:03:22Z",
      "error_code": null,
      "report_id": "cra-report-production-6f8b1e0c-4d2a-4c7e-9a3b-2f1d8e5a7c90",
      "environment": "production"
    }
    Total failure
    {
      "webhook_type": "CRA_REPORT",
      "webhook_code": "CRA_REPORT_UPDATED",
      "user_id": "usr_9nSp2KuZ2x4JDw",
      "scope": "CLIENT_USER",
      "successful_products": [],
      "failed_products": [
        { "product": "cra_base_report", "version": "V1" },
        { "product": "cra_income_insights", "version": "V1" }
      ],
      "generated_time": null,
      "error_code": "NO_ELIGIBLE_ITEMS",
      "report_id": null,
      "environment": "production"
    }

    A subscription that repeatedly fails with NO_ELIGIBLE_ITEMS indicates the user has no Item that can produce a report. Prompt the user to relink, or delete the subscription.

    Fetch the updated report

    For each product in the webhook's successful_products field, call that product's /get endpoint: /cra/check_report/base_report/get for cra_base_report, and /cra/check_report/income_insights/get for cra_income_insights. Pass the following parameters:

    • report_id, taken from the CRA_REPORT_UPDATED webhook. Without it, the endpoints return the most recently generated report for the user, which could be a report from an origination /cra/check_report/create call or another subscription rather than the one this webhook is about.

    • consumer_report_permissible_purpose, set to a servicing-compliant purpose: either ACCOUNT_REVIEW_CREDIT, for the review or collection of an account under FCRA Section 604(a)(3)(A), or WRITTEN_INSTRUCTION_OTHER, in accordance with the written instructions of the consumer under FCRA Section 604(a)(2).

    Fetch a report generated by a subscription
    curl -X POST https://sandbox.plaid.com/cra/check_report/base_report/get \
    -H 'Content-Type: application/json' \
    -d '{
      "client_id": "${PLAID_CLIENT_ID}",
      "secret": "${PLAID_SECRET}",
      "user_id": "usr_9nSp2KuZ2x4JDw",
      "report_id": "cra-report-production-6f8b1e0c-4d2a-4c7e-9a3b-2f1d8e5a7c90",
      "consumer_report_permissible_purpose": "ACCOUNT_REVIEW_CREDIT"
    }'

    Reports generated by a subscription can be retrieved only for the two servicing-compliant purposes above. Decisioning purposes accepted at origination, such as EXTENSION_OF_CREDIT, are not accepted for CRA Servicing. To generate a report you can use for a credit decision, call /cra/check_report/create with a decisioning permissible purpose instead.

    Currently, only /cra/check_report/base_report/get and /cra/check_report/income_insights/get can retrieve a report generated by a subscription. Other Consumer Report endpoints, including /cra/check_report/pdf/get, are not supported.

    Manage subscriptions

    EndpointDescription
    /cra/servicing/subscription/getRetrieve the current configuration of a subscription.
    /cra/servicing/subscription/listList a user's subscriptions, to recover a subscription_id you did not persist.
    /cra/servicing/subscription/updateChange the products or webhook override on an active subscription.
    /cra/servicing/subscription/deleteEnd the subscription. No further reports are generated and no webhooks fire.

    Testing in Sandbox

    Use /sandbox/cra/servicing/simulate to trigger a report generation for a subscription without waiting. The endpoint generates a report, returns its report_id, and fires the resulting CRA_REPORT_UPDATED webhook.

    Simulate a report generation in Sandbox
    curl -X POST https://sandbox.plaid.com/sandbox/cra/servicing/simulate \
    -H 'Content-Type: application/json' \
    -d '{
      "client_id": "${PLAID_CLIENT_ID}",
      "secret": "${PLAID_SECRET}",
      "subscription_id": "cra-sub-sandbox-8f2b1c0a-3d4e-5f60-7a8b-9c0d1e2f3a4b",
      "options": {
        "transactions_end_date": "2026-09-01"
      }
    }'

    To simulate a report changing over time, advance options.transactions_end_date on successive calls. To simulate failures, use options.error_webhook_code.

    Billing

    CRA Servicing is billed per subscribed user. While a subscription is active, fetching that user's Base Report or Income Insights does not incur a separate report charge. For details, see Plaid Check fee model.

    Developer community
    GitHub
    GitHub
    Stack Overflow
    Stack Overflow
    YouTube
    YouTube
    Discord
    Discord