# Disputes & reinvestigation

> Open a dispute on a furnished record, track it on the 30-day clock, and receive the outcome — with corrections sent to every partner that received the record.

- **HTML:** https://offendersearch.app/docs/fcra/disputes
- **Base URL:** https://api.offendersearch.app
- **Authentication:** `X-API-Key` request header, on an account with FCRA Partner Access
- **FCRA API reference as markdown:** https://offendersearch.app/docs/fcra.md

## Open a dispute

When a consumer disputes a record you received from us, open a reinvestigation on the order. Name the records, the reason, the consumer’s statement, and when the dispute reached you — the 30-day clock runs from that moment (15 U.S.C. § 1681i(a)(1)).

POST /v1/fcra/orders/{id}/disputes

```bash
curl -X POST https://api.offendersearch.app/v1/fcra/orders/fo_7c1e9b2a4d3f/disputes \
  -H "X-API-Key: $OFFENDERSEARCH_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "recordIds": ["crim:IL-SANGAMON:2021CR004417"],
    "reason": "not_me",
    "consumerStatement": "I have never lived in Sangamon County.",
    "receivedAt": "2026-10-03T09:12:00Z"
  }'
```

| Field | Required | Description |
| --- | --- | --- |
| `recordIds` | yes | One or more furnished `recordId` values from this order. |
| `reason` | yes | `not_me`, `inaccurate`, `incomplete`, `outdated` or `other`. |
| `consumerStatement` | no | What the consumer told you, in their words. |
| `receivedAt` | yes | When the dispute reached you. `dueAt` is 30 days later. |

## The dispute object

GET /v1/fcra/disputes/{id}

```json
{
  "id": "fd_9a0e44",
  "orderId": "fo_7c1e9b2a4d3f",
  "origin": "partner",
  "recordIds": ["crim:IL-SANGAMON:2021CR004417"],
  "reason": "not_me",
  "consumerStatement": "I have never lived in Sangamon County.",
  "status": "investigating",
  "receivedAt": "2026-10-03T09:12:00Z",
  "dueAt": "2026-11-02T09:12:00Z",
  "extendedAt": null,
  "overdue": false,
  "notes": null,
  "changes": null,
  "resolvedAt": null
}
```

| Status | Meaning |
| --- | --- |
| `received` | Logged; the clock is running. |
| `investigating` | The record is being checked with the authority that holds it. |
| `verified` | The record was confirmed as furnished. Nothing changes. |
| `modified` | The record was corrected. `changes` lists what changed. |
| `deleted` | The record was removed, or found not to be the consumer’s. |
| `unable_to_verify` | It could not be verified in time. It is treated as deleted. |

If the consumer sends new information during the investigation, add it with `POST /v1/fcra/disputes/{id}/information` and `{ "statement": "…" }`. That is the one 15-day extension (15 U.S.C. § 1681i(a)(1)(B)): `dueAt` moves and `extendedAt` records when. It returns `409 dispute_not_extendable` once the dispute is resolved, already extended or past due. `overdue` is true for an open dispute past `dueAt`.

## What an outcome does

- `deleted` and `unable_to_verify` suppress the record from every later order about the same consumer (`disputed_suppressed`).
- `modified` applies the correction to every later order.
- A `record.corrected` event goes to **every partner that received the record**, not only the one that opened the dispute.

## Disputes from the consumer portal

A consumer can also dispute directly through the consumer portal. That creates the same dispute object with `origin: "consumer_portal"`, and you receive `dispute.created` for your order. A dispute that reaches us through our consumer request form and concerns one of your orders appears with `origin: "consumer_request"`. `GET /v1/fcra/disputes?status=&orderId=` lists every dispute on your orders.

---

## Related

- Previous: [Controls & reason codes](https://offendersearch.app/docs/fcra/controls.md)
- Next: [The consumer portal](https://offendersearch.app/docs/fcra/consumer-portal.md)
- Index: [FCRA API reference](https://offendersearch.app/docs/fcra.md)
