{"article":{"id":36323745939863,"url":"https://plaid.zendesk.com/api/v2/help_center/en-us/articles/36323745939863.json","html_url":"https://support.plaid.com/hc/en-us/articles/36323745939863-How-to-troubleshoot-Consumer-Reports","author_id":5390778350871,"comments_disabled":true,"draft":false,"promoted":false,"position":0,"vote_sum":0,"vote_count":0,"section_id":36311990432791,"created_at":"2025-11-13T21:48:01Z","updated_at":"2026-06-01T01:59:14Z","name":"How to troubleshoot Consumer Reports","title":"How to troubleshoot Consumer Reports","source_locale":"en-us","locale":"en-us","outdated":false,"outdated_locales":[],"edited_at":"2026-06-01T01:59:14Z","user_segment_id":null,"permission_group_id":1121794,"content_tag_ids":[],"label_names":[],"body":"<p>This guide will help you troubleshoot common issues with <a href=\"https://plaid.com/docs/check/\">Plaid Consumer Reports</a>, including tips on using the <code style=\"border:none;background:#f1f3f5;padding:1px 4px;border-radius:3px;font-size:0.9em;\">USER_CHECK_REPORT_READY</code> and <code style=\"border:none;background:#f1f3f5;padding:1px 4px;border-radius:3px;font-size:0.9em;\">USER_CHECK_REPORT_FAILED</code> webhooks, and handling errors like <code style=\"border:none;background:#f1f3f5;padding:1px 4px;border-radius:3px;font-size:0.9em;\">DATA_UNAVAILABLE</code>.</p>\n<p>This guide describes the current webhook names. Integrations created before December 10, 2025 receive the legacy <code style=\"border:none;background:#f1f3f5;padding:1px 4px;border-radius:3px;font-size:0.9em;\">CHECK_REPORT_READY</code> / <code style=\"border:none;background:#f1f3f5;padding:1px 4px;border-radius:3px;font-size:0.9em;\">CHECK_REPORT_FAILED</code> webhooks instead — see the <strong>Legacy webhook reference</strong> section at the bottom of this article.</p>\n<h2>1. How Consumer Report generation works</h2>\n<p>After you request a Check Report for a user, the process is <strong>asynchronous</strong>:</p>\n<ul>\n<li>\n<strong>When the Check Report is ready:</strong> Plaid fires a <code style=\"border:none;background:#f1f3f5;padding:1px 4px;border-radius:3px;font-size:0.9em;\">USER_CHECK_REPORT_READY</code> webhook to your listener.</li>\n<li>\n<strong>If report generation fails:</strong> Plaid fires a <code style=\"border:none;background:#f1f3f5;padding:1px 4px;border-radius:3px;font-size:0.9em;\">USER_CHECK_REPORT_FAILED</code> webhook.</li>\n</ul>\n<p>Your backend should be set up to handle these webhooks and respond accordingly.</p>\n<h2>2. Webhooks</h2>\n<h3><code style=\"border:none;background:#f1f3f5;padding:1px 4px;border-radius:3px;font-size:0.9em;\">USER_CHECK_REPORT_READY</code></h3>\n<ul>\n<li>\n<strong>When:</strong> Fired when the Check Report is ready to be retrieved (available for 24 hours).</li>\n<li>\n<strong>What to do:</strong> Call one or more of the Consumer Report endpoints, commonly:<ul>\n<li><code style=\"border:none;background:#f1f3f5;padding:1px 4px;border-radius:3px;font-size:0.9em;\">/cra/check_report/base_report/get</code></li>\n<li><code style=\"border:none;background:#f1f3f5;padding:1px 4px;border-radius:3px;font-size:0.9em;\">/cra/check_report/income_insights/get</code></li>\n</ul>\n</li>\n<li>\n<strong>Action:</strong> Retrieve the report for your user.</li>\n</ul>\n<p>Example webhook payload:</p>\n<pre><code style=\"display:block;border:none;background:transparent;padding:8px;\">{\n  \"webhook_type\": \"CHECK_REPORT\",\n  \"webhook_code\": \"USER_CHECK_REPORT_READY\",\n  \"user_id\": \"usr_wz666MBjYWTp2PDzzggYhM6oWWmBb\",\n  \"successful_products\": [\"cra_base_report\"],\n  \"environment\": \"production\"\n}\n</code></pre>\n<h3><code style=\"border:none;background:#f1f3f5;padding:1px 4px;border-radius:3px;font-size:0.9em;\">USER_CHECK_REPORT_FAILED</code></h3>\n<ul>\n<li>\n<strong>When:</strong> Fired if report generation fails.</li>\n<li>\n<strong>What to do:</strong><ol>\n<li>Call <code style=\"border:none;background:#f1f3f5;padding:1px 4px;border-radius:3px;font-size:0.9em;\">/user/items/get</code> to diagnose which Items are in a bad state.</li>\n<li>If needed, use <a href=\"https://plaid.com/docs/link/update-mode/\">Link's update mode</a> to prompt the user to fix their connection (such as updating credentials or re-authenticating MFA).</li>\n</ol>\n</li>\n<li>\n<strong>Action:</strong> Initiate troubleshooting — see error codes below.</li>\n</ul>\n<p>Example webhook payload:</p>\n<pre><code style=\"display:block;border:none;background:transparent;padding:8px;\">{\n  \"webhook_type\": \"CHECK_REPORT\",\n  \"webhook_code\": \"USER_CHECK_REPORT_FAILED\",\n  \"user_id\": \"usr_wz666MBjYWTp2PDzzggYhM6oWWmBb\",\n  \"environment\": \"production\"\n}\n</code></pre>\n<h2>3. Troubleshooting report errors</h2>\n<p>When fetching a report, you might encounter certain API errors. These responses often now include a <code style=\"border:none;background:#f1f3f5;padding:1px 4px;border-radius:3px;font-size:0.9em;\">causes</code> field for additional detail on what went wrong.</p>\n<h3><code style=\"border:none;background:#f1f3f5;padding:1px 4px;border-radius:3px;font-size:0.9em;\">DATA_UNAVAILABLE</code></h3>\n<p>Plaid couldn't retrieve enough data from the user's financial institutions.</p>\n<p>Example API error:</p>\n<pre><code style=\"display:block;border:none;background:transparent;padding:8px;\">{\n  \"error_type\": \"CHECK_REPORT_ERROR\",\n  \"error_code\": \"DATA_UNAVAILABLE\",\n  \"error_message\": \"The Check Report you are trying to pull does not have sufficient transactions data to generate a report.\",\n  \"causes\": [\n    {\n      \"error_type\": \"ITEM_ERROR\",\n      \"error_code\": \"ITEM_LOGIN_REQUIRED\",\n      \"error_message\": \"The login details of this item have changed (credentials, MFA, or required user action) and a user login is required to update this information. Use Link's update mode to restore the Item to a good state.\",\n      \"item_id\": \"pZ942ZA0npFEa0BgLCV9DAQv3Zq8ErIZhc81F\"\n    }\n  ],\n  \"request_id\": \"HNTDNrA8F1shFEW\"\n}\n</code></pre>\n<p><strong>Common causes (<code style=\"border:none;background:#f1f3f5;padding:1px 4px;border-radius:3px;font-size:0.9em;\">causes</code> field):</strong></p>\n<ul>\n<li>\n<strong>No transactions returned</strong> — the user has no transaction history for the required period, or the account type doesn't support transaction data.</li>\n<li>\n<strong>No identity data returned</strong> — the user's institution does not provide identity data, or the account is not eligible.</li>\n<li>\n<strong>Issues connecting to financial institution</strong> — credentials or MFA settings have changed; the user needs to update their login.</li>\n</ul>\n<p><strong>Remediation:</strong></p>\n<ul>\n<li>Check the <code style=\"border:none;background:#f1f3f5;padding:1px 4px;border-radius:3px;font-size:0.9em;\">causes</code> field for actionable error codes and messages.</li>\n<li>If the cause is <code style=\"border:none;background:#f1f3f5;padding:1px 4px;border-radius:3px;font-size:0.9em;\">ITEM_LOGIN_REQUIRED</code>, send the user through <a href=\"https://plaid.com/docs/link/update-mode/\">Link's update mode</a> to fix their connection.</li>\n<li>If there is insufficient data, let the user know — sometimes a different account may be required.</li>\n</ul>\n<h3>Other common error codes</h3>\n<h4><code style=\"border:none;background:#f1f3f5;padding:1px 4px;border-radius:3px;font-size:0.9em;\">CONSUMER_REPORT_EXPIRED</code></h4>\n<p>The report was not retrieved within 24 hours. Re-initiate report generation for a fresh report.</p>\n<h4><code style=\"border:none;background:#f1f3f5;padding:1px 4px;border-radius:3px;font-size:0.9em;\">PRODUCT_NOT_READY</code></h4>\n<p>You tried to fetch before the report finished generating. Wait for the <code style=\"border:none;background:#f1f3f5;padding:1px 4px;border-radius:3px;font-size:0.9em;\">USER_CHECK_REPORT_READY</code> webhook.</p>\n<h4><code style=\"border:none;background:#f1f3f5;padding:1px 4px;border-radius:3px;font-size:0.9em;\">INSTITUTION_TRANSACTION_HISTORY_NOT_SUPPORTED</code></h4>\n<p>The institution cannot provide the requested history length. Reduce the number of days of data you request.</p>\n<h4><code style=\"border:none;background:#f1f3f5;padding:1px 4px;border-radius:3px;font-size:0.9em;\">INSUFFICIENT_TRANSACTION_DATA</code></h4>\n<p>Not enough transactions for income or cash-flow insights. Ask the user to link additional accounts, or try again later.</p>\n<h4><code style=\"border:none;background:#f1f3f5;padding:1px 4px;border-radius:3px;font-size:0.9em;\">NO_ACCOUNTS</code></h4>\n<p>No eligible accounts linked. Confirm accounts are present with the user.</p>\n<h2>Legacy webhook reference</h2>\n<p>Integrations created <strong>before December 10, 2025</strong> receive the legacy <code style=\"border:none;background:#f1f3f5;padding:1px 4px;border-radius:3px;font-size:0.9em;\">CHECK_REPORT_READY</code> / <code style=\"border:none;background:#f1f3f5;padding:1px 4px;border-radius:3px;font-size:0.9em;\">CHECK_REPORT_FAILED</code> webhooks instead of the <code style=\"border:none;background:#f1f3f5;padding:1px 4px;border-radius:3px;font-size:0.9em;\">USER_*</code> variants documented above. Differences:</p>\n<ul>\n<li>\n<code style=\"border:none;background:#f1f3f5;padding:1px 4px;border-radius:3px;font-size:0.9em;\">user_id</code> values are unprefixed (no <code style=\"border:none;background:#f1f3f5;padding:1px 4px;border-radius:3px;font-size:0.9em;\">usr_</code> prefix).</li>\n<li>\n<code style=\"border:none;background:#f1f3f5;padding:1px 4px;border-radius:3px;font-size:0.9em;\">webhook_type</code> is <code style=\"border:none;background:#f1f3f5;padding:1px 4px;border-radius:3px;font-size:0.9em;\">\"CHECK_REPORT\"</code> in both legacy and current (only <code style=\"border:none;background:#f1f3f5;padding:1px 4px;border-radius:3px;font-size:0.9em;\">webhook_code</code> and <code style=\"border:none;background:#f1f3f5;padding:1px 4px;border-radius:3px;font-size:0.9em;\">user_id</code> format differ).</li>\n<li>The lifecycle is identical.</li>\n<li>During migration, integrations may receive both legacy and current events in parallel.</li>\n</ul>\n<p>For the full set of legacy-vs-current differences (idempotency, identity object naming, <code style=\"border:none;background:#f1f3f5;padding:1px 4px;border-radius:3px;font-size:0.9em;\">/user/create</code> response shape), see the <a href=\"https://plaid.com/docs/api/users/user-apis/\">New User APIs overview</a>.</p>","user_segment_ids":[]}}