# US Customs Broker & Freight Forwarder Leads Scraper (FMC + CBP) (`scrapesage/customs-broker-forwarder-leads`) Actor

Scrape every US customs broker (CBP) and FMC-licensed freight forwarder & NVOCC into one dataset: company, address, phone, email, named contacts, surety bond & amount, license number, renewal date + lead score. Filter by type, state & bond. International-trade B2B leads + monitoring.

- **URL**: https://apify.com/scrapesage/customs-broker-forwarder-leads.md
- **Developed by:** [Scrape Sage](https://apify.com/scrapesage) (community)
- **Categories:** Lead generation, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$8.00 / 1,000 trade intermediary lead records

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## US Customs Broker & Freight Forwarder Leads Scraper — FMC + CBP (Contacts, Bonds & Licenses)

Extract **every US customs broker and FMC-licensed freight forwarder / NVOCC** from two official government registries in one run — the **[CBP Permitted Customs Broker List](https://www.cbp.gov/about/contact/brokers-listing)** and the **[FMC Ocean Transportation Intermediary (OTI) List](https://www2.fmc.gov/oti/)**. Every record comes back as a ready-to-use **B2B lead**: company name + DBAs, full address, **phone, fax, e-mail**, **named officer contacts** (owner / president / CFO…), **surety bond company + amount + effective date**, license / filer number, **license renewal date**, country, and a derived **lead score**.

No login, no cookies, no browser, **no API key** — fast, reliable extraction straight from the federal source files.

### Why this customs broker & freight forwarder scraper?

Generic "find-a-forwarder" Google-Maps scrapers grab a name and a guessed e-mail and miss everything that lets you **qualify and time** an outreach. This actor reads the official CBP and FMC registries directly and ships the **richest dataset in the category** — firmographics **and** the regulatory detail (surety bond, license, renewal date, qualifying-individual contacts) in one clean table.

| Data | Maps / email scrapers | This actor |
|---|---|---|
| Company name, full address, country | partial | ✅ |
| **Phone + fax** | guessed / scraped | ✅ |
| **E-mail** (CBP customs brokers) | guessed | ✅ from the federal record |
| **Named officer contact** + title (OTI qualifying individuals) | ❌ | ✅ owner / president / CFO… |
| Intermediary type (Customs Broker / NVOCC / Ocean Freight Forwarder) | ❌ | ✅ |
| **Surety bond company + amount + effective date** | ❌ | ✅ (NVOCC & FF, separately) |
| License / organization number, **filer code** | ❌ | ✅ |
| **License renewal date** → re-licensing & bond-renewal timing | ❌ | ✅ |
| DBA / trade names | ❌ | ✅ |
| Derived **lead score + lead signals** | ❌ | ✅ |
| Only-new / changed **monitoring mode** | ❌ | ✅ |

### Who buys customs broker & freight forwarder data?

- **Surety bond & insurance providers** — every OTI must be bonded. See exactly **who their current surety is, the bond amount, and the effective date**, filter by competitor surety, and reach brokers/forwarders ahead of **license renewal** for bond and cargo / marine / E\&O insurance.
- **Logistics & freight software (TMS, customs, rate management)** — sell CargoWise-style platforms, customs filing, visibility and booking tools to active NVOCCs, forwarders and brokers, segmented by type and size.
- **Freight factoring & trade finance** — forwarders and brokers are recurring working-capital accounts.
- **Drayage, trucking, warehousing & port services** — find the intermediaries who control the freight and need domestic partners.
- **Trade-compliance & classification services** — target licensed customs brokers by port/state.
- **M\&A, market & competitive intelligence** — freight forwarding is consolidating fast; track new licenses, bond changes and the full competitive field.

### How to use

1. [Sign up for Apify](https://console.apify.com/sign-up) — the free plan is enough to try this actor.
2. Open the **US Customs Broker & Freight Forwarder Leads Scraper**, optionally pick **entity types** (customs broker / NVOCC / freight forwarder), set **states** or **US-based only**, add any filters, and choose your limit.
3. Click **Start** and watch records stream into the dataset table.
4. **Export** as JSON, CSV, Excel, XML, or RSS — or pull results programmatically via the [Apify API](https://docs.apify.com/api/v2).

### Input

```json
{
    "entityTypes": ["nvocc", "freightForwarder"],
    "states": ["CA", "NJ", "NY"],
    "usBasedOnly": true,
    "bondedOnly": true,
    "sortBy": "leadScore",
    "maxResults": 1000
}
```

- **entityTypes** — keep only `customsBroker`, `nvocc`, and/or `freightForwarder`. Leave empty for all.
- **includeCustomsBrokers / includeOTIs** *(default true)* — turn either source on/off.
- **states** — 2-letter US state codes (e.g. `["CA","NY","FL"]`). Leave empty for all.
- **usBasedOnly** — drop foreign-based OTIs (many FMC-licensed NVOCCs are based in China, India, Korea…). Customs brokers are always US-based.
- **nations / cities / nameQuery** — country, city and company/DBA-name filters.
- **suretyContains** — keep only OTIs whose **bond (surety) company** name contains this text — competitive intel for bond & insurance providers (e.g. `Lexon`, `Roanoke`, `Avalon`).
- **withPhoneOnly / withEmailOnly / withContactNameOnly / bondedOnly** — record filters.
- **minBondAmount** — minimum total surety bond amount (USD).
- **licenseRenewingWithinDays** — only OTIs whose license renews within N days (renewal-timing leads).
- **minLeadScore / maxResults / sortBy / deduplicateResults** — output controls. Sort by `leadScore` (default), `bondAmountHigh`, `renewalSoon`, `name`, or `source`.
- **monitorMode / monitorKey** — only return entities that are new or changed since the last run.
- **proxyConfiguration** — optional; the sources are public and need no proxy, so leave it off for the fastest queries.

### Output

By default you get **one clean, dense table** of trade intermediaries. An OTI (freight forwarder / NVOCC) record:

```json
{
    "recordType": "oti",
    "source": "FMC Ocean Transportation Intermediary (OTI) List",
    "entityType": "NVOCC & Ocean Freight Forwarder",
    "intermediaryTypes": ["NVOCC", "Ocean Freight Forwarder"],
    "isNVOCC": true,
    "isFreightForwarder": true,
    "name": "Quick Pick Logistics LLC",
    "dbaNames": ["Rich Road USA Logistics"],
    "organizationNumber": "033220",
    "licenseNumber": "033220",
    "street": "30 N Gould Street",
    "city": "Sheridan",
    "state": "WY",
    "zip": "82801",
    "nation": "United States",
    "isForeignBased": false,
    "fullAddress": "30 N Gould Street, Ste 36403, Sheridan, WY, 82801",
    "phone": "(617) 319-3648",
    "fax": "(617) 319-3648",
    "email": null,
    "primaryContactName": "James Hu",
    "primaryContactTitle": "Member/CEO",
    "contacts": [{ "name": "James Hu", "title": "Member/CEO" }],
    "licenseRenewalDate": "2026-10-31",
    "licenseRenewalInDays": 132,
    "licenseRenewingSoon": true,
    "isBonded": true,
    "suretyCompanies": ["GREAT AMERICAN INSURANCE COMPANY"],
    "totalBondAmount": 125000,
    "bonds": {
        "nvocc": { "surety": "GREAT AMERICAN INSURANCE COMPANY", "bondNumber": "F415106", "bondAmount": 75000, "bondEffectiveDate": "2025-12-17" },
        "ff": { "surety": "GREAT AMERICAN INSURANCE COMPANY", "bondNumber": "F415302", "bondAmount": 50000, "bondEffectiveDate": "2025-12-17" }
    },
    "leadScore": 91,
    "leadSignals": ["Named contact (Member/CEO)", "Bonded by GREAT AMERICAN INSURANCE COMPANY", "NVOCC + Freight Forwarder", "Bond $125,000", "License renews 2026-10-31"],
    "scrapedAt": "2026-06-21T04:40:20.000Z"
}
```

A customs-broker record (`recordType: "customsBroker"`) carries the **filer code**, company name, city/state, **phone** and **e-mail** from the CBP permitted-broker list. Every record also carries the raw source row under `sourceFields` unless you turn off **includeRawFields**. Switch the dataset view to **Leads**, **Contacts**, or **Bonds & licenses** for a focused table.

#### What to expect (field coverage)

Both sources are official regulatory files, so the core lead fields are near-complete — and each source has its own strengths.

| Field group | Coverage |
|---|---|
| Company name, type, state/country, license / filer number | ✅ ~100% |
| Phone | ✅ high |
| **E-mail** | ✅ present for CBP customs brokers (FMC OTIs don't publish e-mail) |
| **Named officer contact + title** | ✅ present for FMC OTIs (qualifying individuals) |
| **Surety bond company + amount + effective date** | ✅ present for FMC OTIs |
| License renewal date | ✅ present for FMC OTIs |
| Full street address | ✅ FMC OTIs (CBP carries city + state) |

A blank field means the source doesn't publish that signal for that record — not that scraping failed. Nothing is dropped, so you always get the richest record available.

### Automate & schedule

Run this actor on autopilot and pull results into your own stack:

- **[Apify API](https://docs.apify.com/api/v2)** — start runs, fetch datasets, and manage schedules over REST.
- **[apify-client for JavaScript](https://docs.apify.com/api/client/js/)** and **[apify-client for Python](https://docs.apify.com/api/client/python/)** — official SDKs.
- **[Schedules](https://docs.apify.com/platform/schedules)** — run it weekly/monthly with **monitoring mode** to capture newly-licensed forwarders and newly-permitted brokers as fresh leads (FMC posts new OTI licenses weekly; CBP refreshes the broker list quarterly).
- **[Webhooks](https://docs.apify.com/platform/integrations/webhooks)** — trigger downstream actions (CRM import, Slack alert, e-mail sequence) the moment a run finishes.

```js
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'MY_APIFY_TOKEN' });

const run = await client.actor('scrapesage/customs-broker-forwarder-leads').call({
    entityTypes: ['nvocc', 'freightForwarder'],
    usBasedOnly: true,
    bondedOnly: true,
    sortBy: 'leadScore',
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Got ${items.length} trade intermediaries`);
```

### Integrate with any app

Connect the dataset to 5,000+ apps — no code required:

- **[Make](https://docs.apify.com/platform/integrations/make)** — multi-step automation scenarios.
- **[Zapier](https://docs.apify.com/platform/integrations/zapier)** — push new forwarder & broker leads straight into your CRM.
- **[Slack](https://docs.apify.com/platform/integrations/slack)** — get notified when a monitored state or surety gets a new or changed intermediary.
- **[Google Drive / Sheets](https://docs.apify.com/platform/integrations/drive)** — auto-export every run to a spreadsheet.
- **[Airbyte](https://docs.apify.com/platform/integrations/airbyte)** — pipe results into your data warehouse.
- **[GitHub](https://docs.apify.com/platform/integrations/github)** — trigger runs from commits or releases.

### Use with AI assistants (MCP)

The output is clean, LLM-ready JSON. Call this actor from Claude, ChatGPT, or any agent framework through the **[Apify MCP server](https://docs.apify.com/platform/integrations/mcp)** — ask your assistant to "find every US-based NVOCC bonded by Lexon whose FMC license renews in the next 90 days, with a named contact and a lead score" and let it run the scraper for you.

### Agent-ready: autonomous payments (x402 & Skyfire)

This actor is **agent-ready** — AI agents can discover it, run it, and **pay for it autonomously**, with no Apify account and no human in the loop. It uses [pay-per-event](https://docs.apify.com/platform/actors/publishing/monetize/pay-per-event) pricing and [limited permissions](https://docs.apify.com/platform/actors/development/permissions), so it qualifies for Apify's agentic-payment standards:

- **[x402](https://docs.apify.com/platform/integrations/x402)** — an open, HTTP-native payment protocol. Agents pay per run in USDC on the Base network directly through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp) — no account, no API key.
- **[Skyfire](https://docs.apify.com/platform/integrations/skyfire)** — agent-to-service payments for fully autonomous AI-agent workflows.

Building an AI agent, MCP tool, or autonomous data pipeline? This scraper is ready to plug in and pay as it goes.

### More scrapers from scrapesage

Build a complete **trade, logistics & B2B lead-gen stack**:

- **[FMCSA Trucking Scraper](https://apify.com/scrapesage/fmcsa-trucking-scraper)** — US motor carriers & freight brokers with operating authority, insurance & contacts.
- **[ImportYeti Scraper](https://apify.com/scrapesage/importyeti-scraper)** — US importers and their overseas suppliers from customs bill-of-lading data.
- **[US Business Formation Scraper](https://apify.com/scrapesage/us-business-formation-scraper)** — newly-registered companies as fresh leads.
- **[US UCC Filings Scraper](https://apify.com/scrapesage/us-ucc-filings-scraper)** — secured-loan & lender filings (financing-intent leads).
- **[SBA Loan Leads Scraper](https://apify.com/scrapesage/sba-loan-leads-scraper)** — small businesses financed under SBA 7(a) & 504.
- **[USASpending Scraper](https://apify.com/scrapesage/usaspending-scraper)** — federal awards and the companies that win them.
- **[GSA eLibrary Scraper](https://apify.com/scrapesage/gsa-elibrary-scraper)** — federal-schedule contractors and their contacts.
- **[SAM.gov Scraper](https://apify.com/scrapesage/sam-gov-scraper)** — federal contract opportunities and contacts.

### Tips

- **Bond renewals**: set `licenseRenewingWithinDays: 120` (and optionally `bondedOnly: true`) and sort by `renewalSoon` to reach forwarders ahead of their FMC license & bond renewal — the highest-converting moment for surety and insurance.
- **Competitor intel**: set `suretyContains` to a surety company name to pull that surety's entire book of OTIs, with bond amounts.
- **E-mail-ready brokers**: set `entityTypes: ["customsBroker"]` + `withEmailOnly: true` for a clean, contactable customs-broker list.
- **US only**: turn on `usBasedOnly` to drop the many foreign-based NVOCCs and focus on domestic accounts.
- **Recurring monitoring**: combine [Schedules](https://docs.apify.com/platform/schedules) with `monitorMode` to capture only intermediaries added or changed since the last run — perfect for catching every new license and bond change.

### FAQ

**Where does the data come from?** From two official US government registries: the **CBP Permitted Customs Broker List** (published on [cbp.gov](https://www.cbp.gov/about/contact/brokers-listing)) and the **FMC Ocean Transportation Intermediary List** of licensed NVOCCs and ocean freight forwarders (published on [fmc.gov](https://www2.fmc.gov/oti/)).

**Does it need an API key or login?** No. Both sources are public — no key, no login, no browser.

**How fresh is it?** The FMC OTI list is generated live on every run; the CBP broker list is refreshed quarterly and always resolved to the newest published file automatically. Run on a [Schedule](https://docs.apify.com/platform/schedules) with monitoring mode to capture new licenses and bond changes.

**Does it include e-mails?** CBP customs brokers carry an e-mail address; FMC OTIs do not (they instead list named qualifying-individual contacts). We never fabricate contact data — everything in the record is straight from the federal source.

**What are NVOCC, OTI and freight forwarder?** An **OTI** (Ocean Transportation Intermediary) is the FMC's umbrella for two roles: an **NVOCC** (issues its own bills of lading and acts as a carrier to shippers) and an **Ocean Freight Forwarder** (arranges ocean shipments on behalf of shippers). Many firms hold both. **Customs brokers** are separately licensed by CBP to clear goods through customs.

**Why are some OTIs based in China or India?** Foreign-based NVOCCs that handle US ocean trade must be licensed or registered with the FMC, so they appear in the official list. Use `usBasedOnly` to exclude them.

**Can I export to Google Sheets, CSV, or Excel?** Yes — one click in the dataset view, or automatically on every run via the [Google Drive integration](https://docs.apify.com/platform/integrations/drive).

**Is scraping this data legal?** This actor collects publicly available U.S. government data. You're responsible for using it in compliance with applicable laws and each agency's terms.

### Need help?

Open an issue on the actor's **Issues** tab, or visit the [Apify help center](https://help.apify.com/). Feature requests are welcome — this actor is actively maintained.

# Actor input Schema

## `entityTypes` (type: `array`):

Keep only these intermediary types. Allowed values: customsBroker (CBP permitted customs broker), nvocc (FMC Non-Vessel-Operating Common Carrier), freightForwarder (FMC ocean freight forwarder). Leave empty for all.

## `includeCustomsBrokers` (type: `boolean`):

Include the CBP permitted customs broker list (filer code, phone, e-mail).

## `includeOTIs` (type: `boolean`):

Include the FMC Ocean Transportation Intermediary list (NVOCCs + ocean freight forwarders, with surety bond, license & named contacts).

## `states` (type: `array`):

Keep only entities in these US states (2-letter codes, e.g. \["CA","NY","FL"]). Leave empty for all states (and, unless 'US-based only' is on, foreign-based OTIs too).

## `usBasedOnly` (type: `boolean`):

Drop foreign-based OTIs (many FMC-licensed NVOCCs are based in China, India, Korea, etc.). Customs brokers are always US-based.

## `nations` (type: `array`):

Keep only entities based in these countries (case-insensitive, e.g. \["United States","China"]). Optional; leave empty for all.

## `cities` (type: `array`):

Keep only entities in these cities (case-insensitive exact match). Optional.

## `nameQuery` (type: `string`):

Keep only entities whose company or DBA name contains this text (case-insensitive). Optional.

## `suretyContains` (type: `string`):

Keep only OTIs whose surety (bond) company name contains this text — competitive intelligence for bond & insurance providers (e.g. "Avalon", "Lexon", "Roanoke"). Applies to FMC OTIs only.

## `withPhoneOnly` (type: `boolean`):

Keep only entities that have a phone number.

## `withEmailOnly` (type: `boolean`):

Keep only entities that have an e-mail address (CBP customs brokers carry e-mail; FMC OTIs do not).

## `withContactNameOnly` (type: `boolean`):

Keep only entities with a named qualifying-individual contact (FMC OTIs list owners/officers; CBP brokers do not).

## `bondedOnly` (type: `boolean`):

Keep only OTIs with an active surety bond on file.

## `minBondAmount` (type: `integer`):

Keep only OTIs whose total surety bond amount is at least this value (USD).

## `licenseRenewingWithinDays` (type: `integer`):

Keep only FMC OTIs whose license renews within the next N days — a re-licensing / bond-renewal timing signal. Leave empty to disable.

## `minLeadScore` (type: `integer`):

Keep only entities with a lead score at or above this value (0-100).

## `sortBy` (type: `string`):

Order of the output.

## `maxResults` (type: `integer`):

Maximum number of records to return.

## `deduplicateResults` (type: `boolean`):

Drop duplicate entities that share the same type, license/filer code, name and state.

## `includeRawFields` (type: `boolean`):

Attach the raw source row (all original FMC / CBP columns) under sourceFields on each record.

## `monitorMode` (type: `boolean`):

Only return entities that are new or whose bond, surety, renewal date or contact changed since the last run with the same monitor key. Ideal on a Schedule to catch newly-licensed forwarders & newly-permitted brokers as fresh leads.

## `monitorKey` (type: `string`):

Namespace for monitoring mode so independent monitors don't collide. Use a distinct key per saved configuration.

## `proxyConfiguration` (type: `object`):

Optional. The FMC and CBP sources are public government data and usually need no proxy, so leave this off for the fastest queries. Enable it only if CBP rate-limits your runs.

## Actor input object example

```json
{
  "entityTypes": [],
  "includeCustomsBrokers": true,
  "includeOTIs": true,
  "usBasedOnly": false,
  "withPhoneOnly": false,
  "withEmailOnly": false,
  "withContactNameOnly": false,
  "bondedOnly": false,
  "sortBy": "leadScore",
  "maxResults": 1000,
  "deduplicateResults": true,
  "includeRawFields": true,
  "monitorMode": false,
  "monitorKey": "default",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (type: `string`):

All scraped customs-broker and freight-forwarder / NVOCC records in the default dataset, each with firmographics, contacts, surety bond, license detail and a lead score.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "entityTypes": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapesage/customs-broker-forwarder-leads").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "entityTypes": [] }

# Run the Actor and wait for it to finish
run = client.actor("scrapesage/customs-broker-forwarder-leads").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "entityTypes": []
}' |
apify call scrapesage/customs-broker-forwarder-leads --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapesage/customs-broker-forwarder-leads"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/PzI2wcMXDsmVTPHF9/builds/aMMZlqW9Roy6zonkq/openapi.json
