COOPCHECK
API
Query carrier safety scores, chameleon cluster detection, and FMCSA crash and inspection data programmatically. One endpoint. One key. JSON.
Overview
The CoopCheck API exposes a single read endpoint that returns a carrier's full safety profile — Chameleon Score grade, cluster membership, FMCSA crash and inspection summary, and out-of-service rate — in a single JSON response.
Data is sourced from FMCSA public records and refreshed monthly. The Chameleon Score is CoopCheck's proprietary composite risk model. See About & Methodology for scoring details.
Authentication
Pass your API key as a query parameter on every request. There are no headers required beyond a standard HTTP GET.
Test Key
Use test_coop_dev for sandbox testing. The test key returns real data but has a low monthly limit and is not suitable for production.
Rate Limits
Each key has a monthly request limit that resets on the first of every month (UTC). When you exceed the limit, the API returns 429 rate_limit_exceeded with the limit in the response body.
| Header / Field | Description |
|---|---|
| monthly_limit | Your key's monthly cap (returned in 429 response body) |
| requests_this_month | Not exposed in responses — check your dashboard or contact us |
GET /v1/carrier
Returns the full safety profile for a single carrier by FMCSA DOT number.
Parameters
| Param | Type | Required | Description |
|---|---|---|---|
| dot | string | required | FMCSA DOT number (numeric digits only, e.g. 1747093) |
| key | string | required | Your API key. Use test_coop_dev for sandbox testing. |
Example Request
curl "https://coopcheck-api.quiet-wood-44ba.workers.dev/v1/carrier?dot=1747093&key=test_coop_dev"
Example Response — Grade F with Crashes
{
"dot_number": "1747093",
"carrier_name": "NATIONAL DRAYAGE SERVICES DE LLC",
"state": "PA",
"grade": "F", // A · B · C · D · F
"total_score": 78, // 0 (safest) → 100 (most dangerous)
"cluster_id": null, // phone shared by cluster, or null
"cluster_size": null,
"active_cluster_members": null,
"last_crash_date": "31-DEC-25",
"total_crashes": 78,
"total_fatalities": 3,
"oos_rate": null, // null when inspections = 0
"total_inspections": 0,
"data_as_of": "31-DEC-25"
}
Example Response — Chameleon Carrier (Clustered)
{
"dot_number": "2418577",
"carrier_name": "INCIDENT MANAGEMENT OF TEXAS LLC",
"state": "TX",
"grade": "D",
"total_score": 50,
"cluster_id": "(405) 283-0698", // shared phone → chameleon cluster
"cluster_size": 1468, // 1,468 carriers share this phone
"active_cluster_members": 1468,
"last_crash_date": "25-JUL-25",
"total_crashes": 9,
"total_fatalities": 0,
"oos_rate": null,
"total_inspections": 0,
"data_as_of": "25-JUL-25"
}
Response Fields
| Field | Type | Description |
|---|---|---|
| dot_number | string | FMCSA-assigned DOT number. |
| carrier_name | string | null | Legal name on file with FMCSA. |
| state | string | null | Two-letter state code of physical address. |
| grade | string | null | Chameleon Score letter grade. A ≤15 B ≤22 C ≤50 D ≤70 F >70. Null if insufficient data. |
| total_score | number | null | Composite risk score, 0–100. Higher = more dangerous. Null if insufficient data. |
| cluster_id | string | null | The shared phone number that identifies the chameleon cluster this carrier belongs to. Null if no cluster detected. |
| cluster_size | number | null | Total carriers in the cluster (including inactive). Null if no cluster. |
| active_cluster_members | number | null | Active carriers currently in the cluster. Null if no cluster. |
| last_crash_date | string | null | Date of most recent FMCSA-reported crash. Format: DD-MON-YY. |
| total_crashes | number | Total crash incidents on record in FMCSA data. |
| total_fatalities | number | Total fatalities across all recorded crashes. |
| oos_rate | number | null | Out-of-service rate as a percentage (0–100). Null when total_inspections is 0. |
| total_inspections | number | Total FMCSA roadside inspections on record. |
| data_as_of | string | null | Date of the most recent FMCSA record used. Format: DD-MON-YY. |
grade: null and total_score: null. These carriers are not necessarily safe — they may be newly registered or have not yet been inspected.Error Codes
All errors return JSON with an error field and the appropriate HTTP status code.
| HTTP | error | Cause |
|---|---|---|
| 400 | missing_dot | No ?dot= parameter provided. |
| 400 | invalid_dot | DOT parameter contains non-numeric characters. |
| 401 | missing_key | No ?key= parameter provided. |
| 401 | invalid_key | Key not found in the database. |
| 401 | key_inactive | Key has been deactivated. Contact us to reactivate. |
| 404 | not_found | DOT number not found in the CoopCheck database (2M+ carriers indexed). |
| 429 | rate_limit_exceeded | Monthly request limit reached. Response includes monthly_limit. Resets 1st of next month. |
| 500 | auth_error | Internal error validating the key. Retry once; if it persists, contact support. |
{ "error": "rate_limit_exceeded", "monthly_limit": 500 }
Live Sandbox
Query the live API directly from your browser. Uses test_coop_dev by default — swap in your own key to test rate-limit behavior.
Plans
- Full response schema
- Real data, shared key
- No SLA
- Dedicated key
- Priority support
- Monthly usage report
- Bulk DOT screening
- Webhook alerts
- Custom data exports
Get a Key
API keys are issued manually during the beta. Send your use case and expected request volume and we'll provision a key within one business day.
Request API Access
Freight brokers, insurers, safety software vendors, and researchers welcome.