Handling Consumer Disputes via the API
Consumer disputes must be handled within strict FCRA timelines. This guide covers the API endpoints, compliance codes, and documentation practices you need for dispute management.
1. FCRA Timeline Requirements
Warning
Missing the 30-day investigation deadline is an FCRA violation. Repeated violations can result in regulatory action and statutory damages of $100-$1,000 per consumer.
The Fair Credit Reporting Act (FCRA) imposes strict deadlines on how data furnishers must handle consumer disputes:
Direct Disputes (consumer contacts you directly)
- • 30 days to investigate and respond
- • Clock starts when you receive the dispute
- • Must report results to all bureaus you furnished to
Indirect Disputes (consumer disputes via a bureau)
- • 30 days to investigate (extendable to 45 days if the consumer provides additional information)
- • Clock starts when the bureau forwards the dispute (ACDV)
- • Must respond to the bureau with investigation results
After Investigation
- • 5 business days to notify the consumer of results (direct disputes)
- • Correct or delete inaccurate information immediately
- • Update all bureaus within the next reporting cycle
2. Using the Disputes API
The Disputes API provides endpoints for creating, tracking, and resolving consumer disputes programmatically.
Create a Dispute
POST /v1/disputes
Content-Type: application/json
Authorization: Bearer live_sk_abc123def456
{
"recordId": "rec_abc123",
"source": "direct",
"consumerStatement": "I was never 30 days late in November 2024",
"disputedFields": ["accountStatus", "paymentHistoryProfile"],
"receivedDate": "2025-01-10",
"consumerContact": {
"name": "John Doe",
"email": "john@example.com"
}
}
// Response (201 Created)
{
"disputeId": "dsp_xyz789",
"status": "open",
"deadline": "2025-02-09",
"daysRemaining": 30,
"createdAt": "2025-01-10T14:30:00Z"
}List Disputes
GET /v1/disputes?status=open&sort=deadline
Authorization: Bearer live_sk_abc123def456
// Response (200 OK)
{
"disputes": [
{
"disputeId": "dsp_xyz789",
"recordId": "rec_abc123",
"status": "open",
"source": "direct",
"deadline": "2025-02-09",
"daysRemaining": 12,
"createdAt": "2025-01-10T14:30:00Z"
},
...
],
"total": 5,
"page": 1
}Resolve a Dispute
PATCH /v1/disputes/dsp_xyz789
Content-Type: application/json
Authorization: Bearer live_sk_abc123def456
{
"status": "resolved",
"resolution": "corrected",
"resolutionDetails": "Payment history corrected for November 2024",
"corrections": {
"accountStatus": "11",
"paymentHistoryProfile": "000100000000000000000000"
},
"investigationNotes": "Bank records confirmed payment received on time"
}
// Response (200 OK)
{
"disputeId": "dsp_xyz789",
"status": "resolved",
"resolution": "corrected",
"resolvedAt": "2025-01-25T09:15:00Z",
"bureauNotificationStatus": "pending"
}3. Compliance Condition Code XB
Compliance Condition Code XB (Field 39) indicates that an account is currently in dispute. This code must be set when a consumer files a dispute and cleared when the investigation is complete.
// When a dispute is received, set XB on the record
PATCH /v1/records/rec_abc123
{
"complianceConditionCode": "XB"
}
// The XB code tells credit bureaus:
// - Account information is being disputed by the consumer
// - Investigation is in progress
// - Score models may treat the account differently during dispute
// When the investigation is complete, clear the code
PATCH /v1/records/rec_abc123
{
"complianceConditionCode": ""
}
// Or if correcting the record, apply corrections and clear XB simultaneouslyWhen to Use XB
- • Set XB the same day you receive the dispute
- • Keep XB active during the entire investigation period
- • Remove XB when the investigation concludes and results are reported
- • If the consumer disputes again, set XB again immediately
4. Dispute Lifecycle States
Every dispute progresses through a defined lifecycle. Your system must track these states and take appropriate action at each transition.
Investigation complete. Possible resolutions:
- corrected — Data was inaccurate; record updated
- verified — Data confirmed accurate; no changes made
- deleted — Record removed entirely
5. Webhook Integration for Dispute Notifications
Configure webhooks to receive real-time notifications about dispute events. This is critical for meeting FCRA deadlines — you cannot afford to miss an incoming dispute.
// Webhook payload: dispute.received
POST https://your-app.com/webhooks/metro2
Content-Type: application/json
X-Metro2-Signature: sha256=abc123...
{
"event": "dispute.received",
"data": {
"disputeId": "dsp_xyz789",
"recordId": "rec_abc123",
"source": "bureau",
"bureau": "equifax",
"disputedFields": ["accountStatus", "paymentHistoryProfile"],
"deadline": "2025-02-09",
"receivedAt": "2025-01-10T14:30:00Z"
}
}
// Webhook payload: dispute.deadline_approaching
{
"event": "dispute.deadline_approaching",
"data": {
"disputeId": "dsp_xyz789",
"daysRemaining": 5,
"deadline": "2025-02-09"
}
}Available Dispute Webhook Events
dispute.received— New dispute received (start the clock)dispute.deadline_approaching— 5 days before deadlinedispute.resolved— Dispute resolution submitteddispute.overdue— Deadline has passed without resolution
6. Documentation Best Practices for CFPB Readiness
The Consumer Financial Protection Bureau (CFPB) can audit your dispute handling process at any time. Maintain thorough documentation for every dispute.
What to Document
- • Date and method the dispute was received
- • Consumer's specific claims (what they say is wrong)
- • All records reviewed during the investigation
- • Source documents used to verify information
- • Investigation findings and reasoning
- • Actions taken (corrections, deletions, or verification)
- • Date the consumer was notified of results
- • Date corrections were reported to bureaus
Retention Requirements
- • Keep all dispute records for a minimum of 5 years
- • Store the original consumer communication
- • Maintain an audit trail of all status changes
- • The Disputes API automatically timestamps and logs all actions
// Retrieve full dispute audit trail
GET /v1/disputes/dsp_xyz789/audit-trail
Authorization: Bearer live_sk_abc123def456
// Response
{
"disputeId": "dsp_xyz789",
"events": [
{
"timestamp": "2025-01-10T14:30:00Z",
"action": "dispute_created",
"details": "Direct dispute received from consumer"
},
{
"timestamp": "2025-01-10T14:30:01Z",
"action": "compliance_code_set",
"details": "XB set on record rec_abc123"
},
{
"timestamp": "2025-01-15T10:00:00Z",
"action": "status_changed",
"details": "Status changed to investigating"
},
{
"timestamp": "2025-01-25T09:15:00Z",
"action": "dispute_resolved",
"details": "Resolved as corrected. Payment history updated."
},
{
"timestamp": "2025-01-25T09:15:01Z",
"action": "compliance_code_cleared",
"details": "XB removed from record rec_abc123"
},
{
"timestamp": "2025-01-25T09:20:00Z",
"action": "consumer_notified",
"details": "Results sent to john@example.com"
}
]
}