Trucking data API

Trucking Leads API and Webhooks

Two ways to get CallerTracer trucking leads into your own systems: webhooks, on every plan, push each saved search’s new leads and your monitoring changes to your URL every morning; the REST API, on the Business plan, lets you search leads and look up carriers whenever you want. Both return the same lead fields as the CSV export, from FMCSA public records.

Authentication and limits

Create a key on your trucking dashboard (Business plan) and send it with every request as Authorization: Bearer <key>. Each key allows 60 requests a minute and 10,000 a day (UTC). Over the limit you get HTTP 429 with a Retry-After header. Errors come back as { "error": { "message": "…" } } with status 400, 401, 403, 404, 429 or 500.

Search leads

GET https://callertracer.com/api/v1/trucking/leads?types=authority_granted,new_usdot&days=7&states=TX,OK&page=1&page_size=100

Takes the same filters as the lead search (build a search there and copy its query string): types, days (1, 7, 30 or 90), states, operation, minUnits, maxUnits, cargo, hazmat, hasEmail, hasCell, lineType, q (name), reach, insured, insurer, minLiability, safety and hideContacted. Each carrier appears once, at its newest matching event, newest first, up to 100 per page.

{
  "total": 214,
  "page": 1,
  "page_size": 100,
  "leads": [
    {
      "usdot": "4538217",
      "docket": "MC-1800602",
      "event": { "type": "authority_granted", "label": "Authority granted", "date": "2026-10-27", "authority_type": "Motor Carrier of Property" },
      "other_events": [{ "type": "new_usdot", "label": "New USDOT registration", "date": "2026-09-30" }],
      "legal_name": "EXAMPLE TRANSPORT LLC",
      "address": { "street": "…", "city": "COLTON", "state": "CA", "zip": "92324" },
      "phone": "9096456248", "phone_line_type": "mobile", "phone_valid": true,
      "cell_phone": null, "email": "[email protected]", "email_domain_receives_mail": true,
      "reach_grade": "A",
      "officers": ["JANE DOE"],
      "power_units": 2, "drivers": 2, "operation": "A", "hazmat": false, "cargo": ["genfreight"],
      "insurance": { "insurer": "…", "insurer_as_of": null, "liability_amount": 750000, "estimated_renewal": "2027-10-06" },
      "safety": { "rating": null, "inspections_24m": 3, "vehicle_out_of_service": 1, "crashes_24m": 0, "out_of_service_order": null, "linked_carriers": [] },
      "profile_url": "https://callertracer.com/dot/4538217"
    }
  ]
}

Look up a carrier

GET https://callertracer.com/api/v1/trucking/carriers/{usdot}

Returns the carrier’s census record with contacts, its operating authorities with the liability required and on file, current liability filings, the estimated renewal, any pending suspension notice and the safety record (inspections and out-of-service counts for 24 months, recordable crashes, out-of-service orders, linked carriers). Carriers that opted out return no email, cell phone or officer names.

Webhooks

Add up to 1 webhook on Starter, 3 on Pro and 10 on Business, and on the free trial up to 3. We send POST requests with a JSON body:

  • leads.daily: a saved search’s new leads, sent with its daily email. Fields: id, created_at, search (id, name, query), total, and leads in the format above. Results over 500 leads arrive in several requests with part and parts.
  • monitoring.changes: the day’s changes at carriers you monitor, as carriers with usdot, legal_name, state and changes.
  • test: sent when you press Send test on the dashboard.

Answer with any 2xx status within 10 seconds. We do not follow redirects (except the one a Google Apps Script web app answers with), and we turn a webhook off after 10 failed deliveries in a row; you can turn it back on from the dashboard. Every request carries X-CallerTracer-Event and X-CallerTracer-Signature, an HMAC-SHA256 of <t>.<body> with your webhook’s secret:

import { createHmac, timingSafeEqual } from 'node:crypto';

// header: X-CallerTracer-Signature: t=1793200000,v1=5f2c…
function verify(rawBody, header, secret) {
  const { t, v1 } = Object.fromEntries(header.split(',').map((p) => p.split('=')));
  if (Math.abs(Date.now() / 1000 - Number(t)) > 300) return false; // older than 5 minutes
  const expected = createHmac('sha256', secret).update(`${t}.${rawBody}`).digest('hex');
  return v1.length === expected.length && timingSafeEqual(Buffer.from(v1), Buffer.from(expected));
}

To collect leads in Google Sheets, the dashboard has a ready-made Apps Script: paste it into your sheet, deploy it as a web app and add its URL as a webhook.

Use of the data

API and webhook data falls under section 6 of our Terms of Service, like the lead search and CSV exports: use it for your own business, do not resell it, and honor carrier opt-outs and the TCPA, Do Not Call and CAN-SPAM rules when you reach out.