# CBP API

> CBP returns U.S. land-border crossing waits and status as a workflow and API.

CBP, also known as U.S. Customs and Border Protection, returns published wait times and status for U.S. land-border crossings. Get border wait times returns crossing details, lane availability, and wait times; filter by state, border, or crossing, or request every crossing.

- Page: https://fous.com/tools/cbp
- Handle: `@cbp`
- Category: [Travel](https://fous.com/tools/category/travel)
- Source website: https://cbp.gov
- Last verified: Sep 29, 2026

## Methods

### Get border wait times

Operation `get_border_wait_times`, version 1. 1 credit per completed call. Failed calls without a completed billing receipt are free; completed work can remain charged if delivery is interrupted.

Get current US land-border waits for every crossing or filter by crossing, border and state. Lane values that are unavailable are null.

**Input**

| Field | Type | Required | Example | Description |
|---|---|---|---|---|
| `state` | string | no | `"California"` | US state name, such as Texas. |
| `border` | string | no | `"mexico"` | Border to include, such as mexico. |
| `crossing` | string | no | `"San Ysidro"` | Crossing name or port city, such as San Ysidro or Detroit. |

**Input schema**

```json
{
  "type": "object",
  "properties": {
    "state": {
      "type": "string",
      "default": "",
      "description": "US state name, such as Texas.",
      "examples": [
        "California",
        "Texas",
        "Michigan"
      ]
    },
    "border": {
      "enum": [
        "canada",
        "mexico",
        "both"
      ],
      "type": "string",
      "default": "both",
      "description": "Border to include, such as mexico.",
      "examples": [
        "mexico",
        "canada"
      ]
    },
    "crossing": {
      "type": "string",
      "default": "",
      "description": "Crossing name or port city, such as San Ysidro or Detroit.",
      "examples": [
        "San Ysidro",
        "Detroit",
        "Brownsville"
      ]
    }
  },
  "additionalProperties": false,
  "examples": [
    {},
    {
      "state": "California",
      "border": "mexico",
      "crossing": "San Ysidro"
    },
    {
      "state": "Texas"
    }
  ]
}
```

**Output**

| Field | Type | Example | Description |
|---|---|---|---|
| `crossings` | array |  | Border crossings in published order. |
| `crossings[].city` | string | `"Alexandria Bay"` | US port city. |
| `crossings[].hours` | string or null | `"24 hrs/day"` | Published operating hours. |
| `crossings[].state` | string or null | `"New York"` | US state. |
| `crossings[].border` | string | `"Canada"` | Canada or Mexico. |
| `crossings[].status` | string | `"open"` | Open or closed. |
| `crossings[].page_url` | string | `"https://bwt.cbp.gov/details/04070801/POV"` | Crossing details page. |
| `crossings[].last_updated` | string or null | `"2026-09-29T00:56:00-04:00"` | Local ISO 8601 update time with UTC offset. |
| `crossings[].crossing_name` | string | `"Alexandria Bay - Thousand Islands Bridge"` | Name of the crossing. |
| `crossings[].commercial_fast_lanes_open` | integer or null |  | Open commercial Fast lanes. |
| `crossings[].passenger_ready_lanes_open` | integer or null | `11` | Open passenger Ready lanes. |
| `crossings[].pedestrian_ready_lanes_open` | integer or null | `1` | Open pedestrian Ready lanes. |
| `crossings[].commercial_fast_wait_minutes` | integer or null |  | Commercial Fast lane wait, minutes. |
| `crossings[].passenger_ready_wait_minutes` | integer or null | `40` | Passenger Ready lane wait, minutes. |
| `crossings[].passenger_standard_lanes_open` | integer or null | `2` | Open passenger Standard lanes. |
| `crossings[].pedestrian_ready_wait_minutes` | integer or null | `5` | Pedestrian Ready lane wait, minutes. |
| `crossings[].commercial_standard_lanes_open` | integer or null | `1` | Open commercial Standard lanes. |
| `crossings[].pedestrian_standard_lanes_open` | integer or null | `14` | Open pedestrian Standard lanes. |
| `crossings[].passenger_standard_wait_minutes` | integer or null | `5` | Passenger Standard lane wait, minutes. |
| `crossings[].commercial_standard_wait_minutes` | integer or null | `5` | Commercial Standard lane wait, minutes. |
| `crossings[].pedestrian_standard_wait_minutes` | integer or null | `5` | Pedestrian Standard lane wait, minutes. |
| `crossings[].passenger_sentri_nexus_lanes_open` | integer or null | `1` | Open passenger Sentri/Nexus lanes. |
| `crossings[].passenger_sentri_nexus_wait_minutes` | integer or null | `5` | Passenger Sentri/Nexus lane wait, minutes. |

**Example input**

```json
{}
```

**Example output**

```json
{
  "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-09-29T00:56:00-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": null,
      "pedestrian_ready_wait_minutes": null,
      "commercial_standard_lanes_open": null,
      "pedestrian_standard_lanes_open": null,
      "passenger_standard_wait_minutes": null,
      "commercial_standard_wait_minutes": null,
      "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-09-28T21:56:00-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": 2,
      "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
    }
  ]
}
```

## Quick start

Replace `YOUR_API_KEY` with a Fous API key. To create one, open Developers at the bottom of Fous Studio, turn on Developer mode, then go to API keys (https://app.fous.com/keys). Change the values in `input` to run the same tool on new data.

```bash
curl 'https://api.fous.com/v1/query' \
  --fail-with-body --silent --show-error --max-time 180 \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  --data-raw '{
  "api": "@cbp",
  "visibility": "public",
  "operation": "get_border_wait_times",
  "version": 1,
  "input": {},
  "response": {
    "format": "json"
  }
}'
```

```python
# Save as fous.py and run with python3 fous.py. No packages needed.
import json
import urllib.error
import urllib.request

api_key = "YOUR_API_KEY"

body = json.loads("{\n  \"api\": \"@cbp\",\n  \"visibility\": \"public\",\n  \"operation\": \"get_border_wait_times\",\n  \"version\": 1,\n  \"input\": {},\n  \"response\": {\n    \"format\": \"json\"\n  }\n}")
request = urllib.request.Request(
    "https://api.fous.com/v1/query",
    data=json.dumps(body).encode("utf-8"),
    headers={
        "Authorization": f"Bearer {api_key}",
        "Content-Type": "application/json",
    },
    method="POST",
)
try:
    with urllib.request.urlopen(request, timeout=180) as response:
        result = json.load(response)
except urllib.error.HTTPError as error:
    raise RuntimeError(f"HTTP {error.code}: {error.read().decode('utf-8', errors='replace')}") from error
if result.get("success") is False:
    raise RuntimeError(result.get("error", {}).get("message", "Request failed"))
print(json.dumps(result["data"]["output"], indent=2))
```

```typescript
// Save as fous.mts and run with npx tsx fous.mts.
const apiKey = "YOUR_API_KEY";

const response = await fetch("https://api.fous.com/v1/query", {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${apiKey}`,
    "Content-Type": "application/json",
  },
  signal: AbortSignal.timeout(180_000),
  body: JSON.stringify({
  "api": "@cbp",
  "visibility": "public",
  "operation": "get_border_wait_times",
  "version": 1,
  "input": {},
  "response": {
    "format": "json"
  }
}),
});
type ApiResult = { success: boolean; data?: { output: unknown }; error?: { message: string } };
const result: ApiResult = await response.json();
if (!response.ok || result.success === false) {
  throw new Error(result.error?.message ?? `HTTP ${response.status}`);
}
if (!result.data) throw new Error("Missing API response data");
console.log(result.data.output);
```

## Use from an AI assistant

Connect this tool to Claude Code, Claude Desktop, Cursor, VS Code, Codex and any MCP client as its own MCP server. Each method is a typed tool whose arguments are the method’s input.

- Server URL: `https://api.fous.com/mcp/tools/cbp`
- Authorization: `Authorization: Bearer <Fous API key>`

**Tools**

- `get_border_wait_times`: Get border wait times. 1 credit per completed call. Failed calls without a completed billing receipt are free; completed work can remain charged if delivery is interrupted.
- `fous_get_run`: the result of a run that was still going, by its `request_id`. Free.

Claude Code:

```bash
claude mcp add --scope user --transport http fous-cbp https://api.fous.com/mcp/tools/cbp --header "Authorization: Bearer ${FOUS_API_KEY:?Set FOUS_API_KEY to your Fous API key}"
```

To give the assistant every tool, connect `https://api.fous.com/mcp`: it finds one with `fous_search_tools` and runs it with `fous_run_tool`. Setup for other clients: https://fous.com/llms-full.txt.

## Use cases

- Compare wait times across border crossings
- Check whether a crossing is open
- Plan passenger or pedestrian border travel
- Review commercial lane availability
- Filter crossings by state or border

## FAQ

### Can I run it with my own inputs?

Yes. Change the inputs in Studio and press Run, or send new inputs from your code, or ask a connected AI assistant.

### Can I call this CBP tool as an API?

Yes. Send a POST request to /v1/query with your Fous API key and the inputs, and get JSON back.

### How much does it cost?

Each completed run costs 1 credit. Failed runs without a completed receipt are free; completed work can remain charged if delivery is interrupted. With pay as you go, a credit costs 1¢. Monthly plans cost less per credit.

### Do I need a CBP account?

No. You only need a Fous account.

### How current is the data?

Fous gets the data from cbp.gov when you run it. Some results are reused for up to 24 hours, and results that use your account or key are never reused. It was last verified on Sep 29, 2026.

### What are the wait times at border crossings?

Get border wait times returns passenger, pedestrian, and commercial lane wait times for each crossing.

### Is a specific border crossing open?

Get border wait times returns each crossing’s open or closed status.

### Which crossings are in a particular state?

Get border wait times can filter crossings by state.

## Related

- [TSA Wait Times API](https://fous.com/tools/tsa-wait-times.md): Security wait time estimates at US airports.
- [US State Department API](https://fous.com/tools/us-state-department.md): US State Department provides current travel advisories, entry rules, embassy and consulate contacts, and published monthly visa bulletin dates; guidance may be incomplete; consular agencies are excluded.
- [USCIS API](https://fous.com/tools/uscis.md): USCIS returns case processing times showing when 80% of cases were completed and published receipt-date cutoffs, plus current case status and available case details.
- [National Park Service API](https://fous.com/tools/national-park-service.md): The National Park Service provides official park and site information, visiting details, and current alerts; schedules and booking rules can change, and alert update dates may be unavailable.
- [Passport Index API](https://fous.com/tools/passport-index.md): Passport Index provides passport and destination visa information, including entry guidance, permitted stays, rankings and mobility scores; travelers should confirm current entry rules with the embassy.
- [Bureau of Labor Statistics API](https://fous.com/tools/bureau-of-labor-statistics.md): Bureau of Labor Statistics provides latest occupation pay, employment, career outlooks, unemployment, category inflation (up to 24 months’ history), and CPI conversions from January 1913.
- [GOV.UK API](https://fous.com/tools/gov-uk.md): GOV.UK provides summarized current travel advice with linked details, published regional holidays (none for unpublished years), and possible matches on the current UK Sanctions List.
- [Freightos API](https://fous.com/tools/freightos.md): Ocean container freight rates by global index and trade lane.
- [All Travel tools](https://fous.com/tools/category/travel)
