API docs
Every morning Haulflare flags the U.S. trucking companies that have to buy or switch commercial auto insurance, from public FMCSA filings. The API gives you that list as JSON, as CSV, or straight into a Google Sheet.
The API comes with every paid plan. Get your key on the API & Sheets page of your account; we show it once, there.
Quick start
Google Sheets
Paste this into cell A1 of a new sheet. It refreshes about once an hour.
=IMPORTDATA("https://haulflare.com/v1/triggers?format=csv&state=TX&api_key=YOUR_API_KEY")
curl
curl -H "x-api-key: YOUR_API_KEY" \
"https://haulflare.com/v1/triggers?state=TX&sort=deadline&limit=50"
JavaScript
const res = await fetch('https://haulflare.com/v1/triggers?state=TX&trigger=CANCELLATION_PENDING', {
headers: { 'x-api-key': process.env.HAULFLARE_KEY },
});
const { total, data } = await res.json();
Python
import requests
r = requests.get("https://haulflare.com/v1/triggers",
params={"state": "TX", "min_trucks": 5, "sort": "deadline"},
headers={"x-api-key": HAULFLARE_KEY})
leads = r.json()["data"]
Authentication
Send your key in the x-api-key header. Spreadsheets can't send headers, so the key also works as an api_key query parameter; use that only where you have to.
A key only returns the states and data your plan covers. Keep it private: anyone with it can pull your list. If it leaks, replace it on the API & Sheets page; the old key stops working at once.
Limits & freshness
- New FMCSA data is processed every morning; the day's list is ready by about 6 AM Eastern.
- Up to 120 requests a minute. Responses over the limit get
429; wait a minute and retry. - JSON pages hold up to 500 rows by default (
limitup to 10,000). CSV returns up to 10,000 rows in one go. - Dates are
YYYY-MM-DD; timestamps are ISO 8601 in UTC.
The daily list
Active triggers in your states, newest first unless you choose a sort. A carrier can appear once per signal.
| Parameter | Description |
|---|---|
| state | Two-letter codes, comma-separated: TX,OK. Defaults to all of your plan's states. |
| trigger | One or more signal types, comma-separated: CANCELLATION_PENDING,UNINSURED_DEADLINE. |
| q | Search: carrier name, DBA or city contains this, or an exact USDOT or MC number. |
| sort | urgent (most urgent signal, then soonest deadline), deadline (days left, soonest first), trucks (largest fleet first), newest. Default: newest, then urgency. |
| min_trucks max_trucks | Fleet size by power units. |
| since | YYYY-MM-DD: only triggers first flagged on or after this day (Eastern). Use today's date for "new today". |
| confidence | high, medium, estimated, low, comma-separated. See confidence. |
| limit | Rows per page, 1–10,000. Default 500 for JSON, 10,000 for CSV. |
| offset | Rows to skip, for paging. |
| format | csv for a CSV file with the same columns as the JSON fields. Default JSON. |
Response
{
"total": 1284,
"limit": 500,
"offset": 0,
"count": 500,
"data": [
{
"id": 48211,
"trigger": "CANCELLATION_PENDING",
"trigger_label": "Policy cancellation pending",
"dot_number": "3456789",
"mc_number": "MC1234567",
"legal_name": "LONE STAR HAULING LLC",
"dba_name": null,
"city": "DALLAS",
"state": "TX",
"zip": "75201",
"phone": "(214) 555-0193",
"cell_phone": null,
"email": "[email protected]",
"officer_name": "DAVID MILLER",
"power_units": 8,
"total_drivers": 9,
"is_hazmat": false,
"current_insurer": "ACME MUTUAL",
"policy_number": "CA-55120",
"policy_effective_date": "2025-11-14",
"target_action_date": "2026-11-14",
"confidence": "high",
"details": { "days_left": 19, "coverage_amount": 750, "form": "91X" },
"detected_at": "2026-10-26T10:04:12.000Z"
}
]
}
Insurer exit watchlist
Per-insurer cancellation rates for trucking liability policies, from the latest daily snapshot. Insurers cancelling far faster than the market are flagged; their policyholders show up in the list as INSURER_EXIT_RISK.
| Parameter | Description |
|---|---|
| flagged | true to return only flagged insurers. |
{
"snapshot_date": "2026-10-26",
"data": [
{
"insurer": "BADCO INSURANCE",
"book_size": 1840,
"cancels_30d": 212,
"baseline_monthly_cancels": 61,
"cancel_rate_30d": 0.115,
"market_cancel_rate_30d": 0.031,
"trend_ratio": 3.5,
"flagged": true,
"flag_reason": "cancelling 11.5% of its book in 30 days vs 3.1% market-wide"
}
]
}
Fields
| Field | Meaning |
|---|---|
| trigger, trigger_label | The signal and its plain-English name. |
| dot_number, mc_number | USDOT number and MC docket, as filed with FMCSA. |
| legal_name, dba_name | The carrier's legal and doing-business-as names. |
| city, state, zip | Physical address location. |
| phone, cell_phone, email | Contacts from the carrier's MCS-150 filing. Many are cell phones: follow TCPA and do-not-call rules. |
| officer_name | Company officer from the MCS-150, usually the owner. |
| power_units, total_drivers | Fleet size: trucks and drivers. |
| is_hazmat | Carries hazardous materials. |
| current_insurer, policy_number, policy_effective_date | The live auto liability (BIPD) filing on record, when there is one. |
| target_action_date | The date that makes the lead urgent: cancellation date, deadline or renewal. See each signal. |
| confidence | How sure the date is. See confidence. |
| details | Signal-specific extras, such as days_left or crash counts. |
| detected_at | When Haulflare first flagged this trigger. |
Signals
| trigger | What happened | target_action_date |
|---|---|---|
| CANCELLATION_PENDING | The insurer filed to cancel the carrier's liability coverage. | The day the cancellation takes effect. |
| SUSPENDED_NO_INSURANCE | FMCSA suspended or revoked the authority for missing insurance. | The deadline to file insurance and reinstate. |
| NEW_PENDING_AUTHORITY | A new authority application with no insurance on file yet. | When the application lapses without a filing. |
| UNINSURED_DEADLINE | A published authority still without insurance as its deadline nears. | The estimated lapse date. |
| RECENT_CRASH | A recent reportable crash: likely shopping at renewal. | The current policy's next renewal. |
| INSURER_EXIT_RISK | The carrier's insurer is shedding trucking policies (see watchlist). | The current policy's next renewal. |
| RENEWAL_WINDOW | The liability policy renews soon. | The renewal date. |
Confidence
| Value | Meaning |
|---|---|
| high | The date comes straight from an FMCSA filing. |
| medium | Derived from a filing, such as a renewal computed from the policy start date. |
| estimated | Worked out from a publication date because the exact date isn't filed. |
| low | Older or incomplete filings; check before you rely on it. |
Errors
Errors come back as JSON with a message that says what to fix.
| Status | When |
|---|---|
| 400 | A parameter is invalid, such as an unknown signal or a bad date. |
| 401 | The key is missing, wrong or was replaced. |
| 403 | The request is outside your plan: a state you don't have, the insurer watchlist on Producer, or a key with no states yet. |
| 429 | Too many requests; wait a minute. |
{ "statusCode": 403, "message": "Your plan does not include state(s): CA", "error": "Forbidden" }
Questions or something missing? Email [email protected].