Developers
Webhooks and API
Every plan can push each morning's matches to your own endpoint as signed JSON. The Team plan adds a read API for any day's batch.
Webhook (every plan)
Set a URL in your settings. When your digest goes out we POST the same matches as JSON:
POST https://your-endpoint.example.com/ntc
Content-Type: application/json
X-NTC-Timestamp: 1790744888
X-NTC-Signature: sha256=<hex HMAC-SHA256 of "<timestamp>." + raw body>
X-NTC-Test: 0
The HMAC key is the webhook secret shown in your settings. X-NTC-Test: 1 marks the sample the "Test webhook" button sends. We wait up to 10 seconds for a 2xx and do not retry, so return quickly and queue your own work. Up to 2,000 events per call; the full list is always in the digest CSV.
Verify in Python
import hmac, hashlib
def verify(raw_body: bytes, headers: dict, secret: str) -> bool:
ts = headers["X-NTC-Timestamp"]
sent = headers["X-NTC-Signature"].removeprefix("sha256=")
mac = hmac.new(secret.encode(), ts.encode() + b"." + raw_body, hashlib.sha256)
return hmac.compare_digest(mac.hexdigest(), sent)
Verify in Node
const crypto = require("crypto");
function verify(rawBody, headers, secret) {
const ts = headers["x-ntc-timestamp"];
const sent = (headers["x-ntc-signature"] || "").replace("sha256=", "");
const mac = crypto.createHmac("sha256", secret)
.update(ts + ".").update(rawBody).digest("hex");
return crypto.timingSafeEqual(Buffer.from(mac), Buffer.from(sent));
}
Straight into a Google Sheet
No server needed: a Google Apps Script web app can be the webhook.
// Extensions > Apps Script in your Google Sheet, paste, then
// Deploy > New deployment > Web app (execute as you, access: anyone).
// Put the web app URL in your feed settings as the webhook URL.
function doPost(e) {
var body = JSON.parse(e.postData.contents);
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0];
if (sheet.getLastRow() === 0) {
sheet.appendRow(["Event", "Event date", "USDOT", "Docket", "Legal name",
"Email", "Phone", "Cell", "City", "State", "Power units", "Page"]);
}
(body.events || []).forEach(function (r) {
var c = r.carrier || {};
sheet.appendRow([r.event_label, r.event_date, c.dot, r.docket, c.legal_name,
c.email, c.phone, c.cell, c.city, c.state, c.power_units, r.url]);
});
return ContentService.createTextOutput("ok");
}
API (Team plan)
Create a key in your settings, then:
GET https://newtruckingcompanies.com/ntc/v1/events?date=2026-09-29
X-API-Key: ntc_...
date: the digest day (defaults to today, Eastern). Returns the batch that day's digest delivered, filtered by your watches.all=1: the whole national batch for that day, unfiltered.- Rate limit: 120 requests per hour per key. Errors: 401 bad or inactive key, 429 over the limit, 400 bad date.
Response
{
"date": "2026-09-29",
"count": 1,
"events": [{
"event": "authority_granted",
"event_label": "Authority granted",
"event_date": "2026-09-28",
"first_seen": "2026-09-29",
"docket": "MC70228171",
"detail": {"auth": "property"},
"carrier": {
"dot": "4588199", "legal_name": "Example Freight LLC", "dba_name": null,
"officers": ["Jane Example"], "email": "jane@example.com",
"email_shared": null, "email_mx": true,
"phone": "(555) 010-0000", "cell": null,
"street": "1 Main St", "city": "Dallas", "state": "TX", "zip": "75201",
"power_units": 1, "drivers": 1, "fleet": "0-1",
"operation": "interstate", "classes": ["for_hire"], "hazmat": false,
"cargo_groups": ["general"], "add_date": "2026-09-02",
"dockets": {"MC70228171": {"auth": "property", "status": "Active",
"bipd_on_file": true, "boc3": true}}
},
"url": "https://newtruckingcompanies.com/carrier/4588199/"
}]
}
Fields
event: one ofnew_usdot,authority_applied,authority_published,authority_granted,authority_reinstated,contact_update,insurance_filed,boc3_filed,suspension_notice,authority_suspended,authority_inactive.event_dateis FMCSA's date;first_seenis the day the record first appeared in the public files.email_shared: how many USDOT numbers in our 120-day window share this email (null below 3). A number here usually means a filing service's inbox.email_mx: false when the email's domain does not exist; null when unknown.fleet: power-unit bucket,0-1,2-5,6-20or21+.dockets: per docket, authority type, status, liability on file, BOC-3 on file.
Wire it into your CRM this week
Webhook on every plan. JSON API on Team. 7-day free trial.