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
- Configure a webhook listener and register its URL with Plaid.
- Create a subscription for a user, specifying the products to include in each report.
- Receive a
CRA_REPORT_UPDATEDwebhook each time Plaid generates a new report for that user. - Fetch the updated report by calling Consumer Report
/getendpoints.
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.
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.
{
"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"
}{
"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 theCRA_REPORT_UPDATEDwebhook. Without it, the endpoints return the most recently generated report for the user, which could be a report from an origination/cra/check_report/createcall or another subscription rather than the one this webhook is about.consumer_report_permissible_purpose, set to a servicing-compliant purpose: eitherACCOUNT_REVIEW_CREDIT, for the review or collection of an account under FCRA Section 604(a)(3)(A), orWRITTEN_INSTRUCTION_OTHER, in accordance with the written instructions of the consumer under FCRA Section 604(a)(2).
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
| Endpoint | Description |
|---|---|
/cra/servicing/subscription/get | Retrieve the current configuration of a subscription. |
/cra/servicing/subscription/list | List a user's subscriptions, to recover a subscription_id you did not persist. |
/cra/servicing/subscription/update | Change the products or webhook override on an active subscription. |
/cra/servicing/subscription/delete | End 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.
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.
