CBP API: Get border wait times
Gets current US land-border wait times for every crossing, or for crossings filtered by name, border and state. Lane values that are unavailable are null.
Unofficial. Not affiliated with or endorsed by CBP.
Inputs
Values from the run on Oct 23, 2026, shown under Output.
- State optional
state US state name, such as Texas.
(default)
- Border optional
border Border to include, such as mexico.
both (default)
One of
canada,mexico,both.- Crossing optional
crossing Crossing name or port city, such as San Ysidro or Detroit.
(default)
Input as JSON
{}Output
{ "crossings": [ { "city": "Alexandria Bay", "hours": "24 hrs/day" , "state": "New York", "border": "Canada", "status": "open", "page_url": "https://bwt.cbp.gov/details/04070801/POV" , "last_updated": "2026-10-23T05:36:47-04:00", "crossing_name": "Alexandria Bay - Thousand Islands Bridge", "commercial_fast_lanes_open": null, "passenger_ready_lanes_open": null, "pedestrian_ready_lanes_open": null, "commercial_fast_wait_minutes": null, "passenger_ready_wait_minutes": null, "passenger_standard_lanes_open": 1, "pedestrian_ready_wait_minutes": null, "commercial_standard_lanes_open": 1, "pedestrian_standard_lanes_open": null, "passenger_standard_wait_minutes": 10, "commercial_standard_wait_minutes": 10, "pedestrian_standard_wait_minutes": null, "passenger_sentri_nexus_lanes_open": null, "passenger_sentri_nexus_wait_minutes": null }, { "city": "Blaine", "hours": "24 hrs/day" , "state": "Washington", "border": "Canada", "status": "open", "page_url": "https://bwt.cbp.gov/details/02300401/POV" , "last_updated": "2026-10-23T02:36:47-07:00", "crossing_name": "Blaine - Pacific Highway", "commercial_fast_lanes_open": null, "passenger_ready_lanes_open": null, "pedestrian_ready_lanes_open": null, "commercial_fast_wait_minutes": null, "passenger_ready_wait_minutes": null, "passenger_standard_lanes_open": 1, "pedestrian_ready_wait_minutes": null, "commercial_standard_lanes_open": 1, "pedestrian_standard_lanes_open": null, "passenger_standard_wait_minutes": 5, "commercial_standard_wait_minutes": 5, "pedestrian_standard_wait_minutes": null, "passenger_sentri_nexus_lanes_open": null, "passenger_sentri_nexus_wait_minutes": null }, { "city": "Blaine", "hours": "24 hrs/day" , "state": "Washington", "border": "Canada", "status": "open", "page_url": "https://bwt.cbp.gov/details/02300402/POV" , "last_updated": "2026-10-23T02:36:47-07:00", "crossing_name": "Blaine - Peace Arch", "commercial_fast_lanes_open": null, "passenger_ready_lanes_open": null, "pedestrian_ready_lanes_open": null, "commercial_fast_wait_minutes": null, "passenger_ready_wait_minutes": null, "passenger_standard_lanes_open": 1, "pedestrian_ready_wait_minutes": null, "commercial_standard_lanes_open": null, "pedestrian_standard_lanes_open": null, "passenger_standard_wait_minutes": 5, "commercial_standard_wait_minutes": null, "pedestrian_standard_wait_minutes": null, "passenger_sentri_nexus_lanes_open": null, "passenger_sentri_nexus_wait_minutes": null } ]}Code
curl https://api.fous.com/v1/runs \ -H "Authorization: Bearer $FOUS_API_KEY" \ -H "Content-Type: application/json" \ -d '{"method":"cbp.gov/get_border_wait_times","input":{}}' # Save as fous.py, then run: python3 fous.pyimport json, os, timefrom urllib.error import HTTPErrorfrom urllib.request import Request, urlopenAPI = "https://api.fous.com/v1/runs" KEY = os.environ["FOUS_API_KEY"]HEADERS = { "Authorization": f"Bearer {KEY}", "Content-Type": "application/json" ,}def call(url, body=None): data = json.dumps(body).encode() if body else None request = Request(url, data, HEADERS) try: with urlopen(request, timeout=120) as r: return r.status, json.load(r) except HTTPError as error: message = json.load(error)["error"]["message"] raise RuntimeError(message) from errorstatus, run = call(API, { "method": "cbp.gov/get_border_wait_times" , "input": {}})# 202: still going after 30 s. Ask again until it ends.while status == 202: time.sleep(2) status, run = call(f"{API}/{run['id']}")print(json.dumps(run["data"], indent=2))// Save as fous.mjs, then run: node fous.mjsconst api = "https://api.fous.com/v1/runs" ;const headers = { Authorization: `Bearer ${process.env.FOUS_API_KEY}`, "Content-Type": "application/json" ,};let response = await fetch(api, { method: "POST", headers, body: JSON.stringify({ "method": "cbp.gov/get_border_wait_times" , "input": {} }), signal: AbortSignal.timeout(120_000),});let run = await response.json();// 202: still going after 30 s. Ask again until it ends.while (response.status === 202) { await new Promise((done) => setTimeout(done, 2_000)); response = await fetch(`${api}/${run.id}`, { headers }); run = await response.json();}if (!response.ok) throw new Error(run.error.message);console.log(run.data);# Connect your agent to Fous once, over MCP (Streamable HTTP):# https://api.fous.com/mcp# Set FOUS_API_KEY first: create a key at https://app.fous.com/keys.# Claude Codeclaude mcp add \ --scope user \ --transport http fous https://api.fous.com/mcp \ --header "Authorization: Bearer ${FOUS_API_KEY:?Set FOUS_API_KEY to your Fous API key}"# Codexcodex mcp add fous \ --url https://api.fous.com/mcp \ --bearer-token-env-var FOUS_API_KEY# Cursor, VS Code, Windsurf, Cline and morenpx -y add-mcp https://api.fous.com/mcp -g -n fous \ --header "Authorization: Bearer ${FOUS_API_KEY:?Set FOUS_API_KEY to your Fous API key}"# Then ask your agent:# "Use Fous to run cbp.gov/get_border_wait_times# with {}"Over HTTP, the answer’s data holds the output. A run still going after 30 seconds answers 202 with its id: ask GET /v1/runs/{id} until it ends.
Schema
Input schema
{ "type": "object", "required": [], "properties": { "state": { "type": "string", "default": "", "description": "US state name, such as Texas." }, "border": { "enum": [ "canada", "mexico", "both" ], "type": "string", "default": "both", "description": "Border to include, such as mexico." }, "crossing": { "type": "string", "default": "", "description": "Crossing name or port city, such as San Ysidro or Detroit." } }}Output schema
{ "type": "object", "required": [ "crossings" ], "properties": { "crossings": { "type": "array", "items": { "type": "object", "properties": { "city": { "type": "string" }, "hours": { "type": [ "string", "null" ] }, "state": { "type": [ "string", "null" ] }, "border": { "type": "string" }, "status": { "type": "string" }, "page_url": { "type": "string" }, "last_updated": { "type": [ "string", "null" ] }, "crossing_name": { "type": "string" }, "commercial_fast_lanes_open": { "type": [ "integer", "null" ] }, "passenger_ready_lanes_open": { "type": [ "integer", "null" ] }, "pedestrian_ready_lanes_open": { "type": [ "integer", "null" ] }, "commercial_fast_wait_minutes": { "type": [ "integer", "null" ] }, "passenger_ready_wait_minutes": { "type": [ "integer", "null" ] }, "passenger_standard_lanes_open": { "type": [ "integer", "null" ] }, "pedestrian_ready_wait_minutes": { "type": [ "integer", "null" ] }, "commercial_standard_lanes_open": { "type": [ "integer", "null" ] }, "pedestrian_standard_lanes_open": { "type": [ "integer", "null" ] }, "passenger_standard_wait_minutes": { "type": [ "integer", "null" ] }, "commercial_standard_wait_minutes": { "type": [ "integer", "null" ] }, "pedestrian_standard_wait_minutes": { "type": [ "integer", "null" ] }, "passenger_sentri_nexus_lanes_open": { "type": [ "integer", "null" ] }, "passenger_sentri_nexus_wait_minutes": { "type": [ "integer", "null" ] } } } } }}- Price
- 1 credit per completed run (1¢ with pay as you go); failed runs are free.
- Method
cbp.gov/get_border_wait_times- Returns
- crossing name, border, city, state, hours, status, last update, page URL, lane waits and open lanes
Use it from your agent
Give your agent this line. It reads SKILL.md, gets a Fous API key and connects the Fous MCP server. Its run then takes the method cbp.gov/get_border_wait_times with the inputs above.
Ask your agent
- What are the current wait times at the San Ysidro crossing on the Mexico border?
- Show me land border crossing waits along the Canadian border in Michigan.
- How long is the line to cross into the US at Laredo right now, and how many lanes are open?
- Any delays at the Detroit crossing this morning? I need the lane waits and last update time.
- Which US-Mexico border crossings in Texas have the shortest current wait times?
See more
Looks up today's crowd-sourced security wait estimate and hourly pattern for a US airport by name, city or code, with PreCheck status and checkpoints.
tsawaittimes.com/get_security_wait_timeReturns current UK government (FCDO) travel warnings, entry requirements for British passport holders, safety, health and emergency information for a country. Summaries are shortened; follow the link for full details.
gov.uk/get_travel_adviceLists active InciWeb fire incidents in a US state, newest table updates first, with size, containment, location, cause, dates and any evacuation or closure note. Prescribed fires and other fire-related incidents can appear.
inciweb.wildfire.gov/list_active_wildfiresGets the latest reported status and dated update for a named InciWeb wildfire, including evacuation and closure notices. Past notices may no longer apply; older fires not in InciWeb's index may not be found.
inciweb.wildfire.gov/get_wildfireGets current FAA delay and closure events for a US airport, found by name, city or code. A city with several airports resolves to one of them, and reported delays may not cover every flight.
faa.gov/get_airport_delaysChecks today's delayed and cancelled departures and arrivals at an airport on FlightAware, with current weather and any reported FAA delay status. Delay averages and ground programs are returned only when FlightAware shows them; counts can be null when no statistics row is displayed.
flightaware.com/get_airport_delaysGets the latest water height, flow, 24-hour trend and flood-stage status at the active USGS river gauge best matching a river or town and state. Flood stage is null when not published; gauges without recent stage, flow or 24-hour history are not returned.
waterdata.usgs.gov/get_river_levelReturns the latest public weekly Freightos Baltic Index (FBX) price per 40-foot container for one trade lane, or for the global composite and all twelve lanes.
freightos.com/get_container_freight_rates