BorderLive API
Read-only JSON for ports, current waits, recent raw observations, and stored hourly averages.
Authentication
Pass your key as the x-api-key header. Keys are issued to Business-tier accounts.
Default rate limit is 60 requests per minute per key.
Without a key you can make rate-limited public requests by IP. For history, use recent observations or the hourly averages endpoint; historical guidance is rebuilding from new live observations.
BorderLive MCP
The Streamable HTTP endpoint is /mcp. Search, current waits, and comparisons are anonymous; alerts require Pro and history/exports require Business through Auth0 OAuth.
https://borderlive.us/mcp
The ChatGPT app powered by this server is under OpenAI review. View integration
Endpoints
GET /api/v1/ports
All land ports of entry. Optional `?border=mx|ca`.
curl https://borderlive.us/api/v1/ports?border=mx
GET /api/v1/port-current
Latest wait per port and lane. `?include=ports` joins port metadata.
curl 'https://borderlive.us/api/v1/port-current?include=ports'
GET /api/v1/wait-observations
Recent raw observations, capped at 14 days. Requests above 336 hours are clamped and return `retentionHours: 336`.
curl 'https://borderlive.us/api/v1/wait-observations?port_id=PORT_ID&hours=24'
GET /api/v1/port-hourly-averages
Stored historical endpoint: hour-of-day × day-of-week averages. Returns an empty list when no stored aggregates are available.
curl 'https://borderlive.us/api/v1/port-hourly-averages?port_id=PORT_ID'
JavaScript example
const res = await fetch(
"https://borderlive.us/api/v1/port-current?include=ports"
);
const { ports } = await res.json();
const sanYsidro = ports.find((p) => p.slug === "san-ysidro");
console.log(sanYsidro.current);Attribution
Current data comes from the public U.S. Customs and Border Protection (CBP) and Canada Border Services Agency (CBSA) feeds. If you publish anything built on this API, a link back to borderlive.us is appreciated.