# ImportYeti Scraper - US Customs Import Records (`dami_studio/importyeti-scraper`) Actor

Every ocean shipment into the US arrives with a manifest naming the importer and its shipper. ImportYeti indexes them: shipment counts, products, HS codes, origin and destination ports, first and last shipment dates. One row per partner, bill of lading or company.

- **URL**: https://apify.com/dami\_studio/importyeti-scraper.md
- **Developed by:** [Dami's Studio](https://apify.com/dami_studio) (community)
- **Categories:** Lead generation, E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.03 / 1,000 results

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/actors/running/actors-in-store.md#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

## ImportYeti Scraper — US customs import records

The importer and the shipper named on a US inward vessel manifest are disclosable to anyone who asks
CBP for them, unless that importer has filed a biennial certification claiming confidential
treatment. That default is the reason an outsider can see who supplies whom at all.

[ImportYeti](https://www.importyeti.com) indexes those records, and this actor reads them: which
American companies import, who ships to them, how many shipments, what the goods were, the HS code,
the ports at both ends, and the first and last shipment dates.

It's a plain HTTP scraper. No browser, no login, no ImportYeti account. One request per company page.

### What you get

`resultType` picks the row shape:

| Mode | One row is | Rows per company |
|---|---|---|
| `partners` (default) | one supplier ↔ buyer relationship | usually 30 to 50, sometimes 80-odd |
| `shipments` | one bill of lading | up to 100 |
| `profiles` | one wide row, partners and lanes nested | 1 |
| `search` | one match from ImportYeti's index, no profile page opened | — |

A trading-partner row from a real run:

```json
{
  "profileType": "company",
  "profileName": "Nike",
  "profileUrl": "https://www.importyeti.com/company/nike",
  "profileAddress": "1 Bowerman Dr, Beaverton, Or 97005, Us",
  "profileCountry": "United States of America",
  "profileCountryCode": "US",
  "profileTotalShipments": 560,
  "rowType": "partner",
  "counterpartRole": "supplier",
  "counterpartName": "Apl Logistics Vietnam",
  "counterpartUrl": "https://www.importyeti.com/supplier/apl-logistics-vietnam",
  "counterpartAddress": "C O Apl-Nol Vietnam Limited 17 Ba Huyen Thanh Quan Dist 3 Hcmc Vietnam",
  "counterpartCountry": "Vietnam",
  "counterpartCountryCode": "VN",
  "counterpartLocation": "Xa Ba Thanh",
  "shipments": 189,
  "shipmentsLast12Months": 0,
  "weightKg": 584921,
  "teu": 86,
  "productDescription": "Roll Gka Nike Off Dock Cargo Dest Footwear, Women Polyester Top, Sports",
  "hsCode": "6402.99",
  "hsCodes": ["6402.99", "6404.11", "6101.10", "6403.99", "6109.10"],
  "topProductCategory": "Footwear",
  "originPort": "Vung Tau",
  "originPortCountry": "Vietnam",
  "destinationPort": "Long Beach, Ca",
  "destinationPortCountry": "United States of America",
  "destinationPortRegion": "California",
  "firstShipmentDate": "2015-01-09",
  "lastShipmentDate": "2023-04-01",
  "isRelatedParty": false,
  "counterpartTopBuyers": [
    { "name": "Apl Logistics", "shipments": 52390 },
    { "name": "New Balance Athletics", "shipments": 2602 }
  ],
  "scrapedAt": "2026-08-21T16:20:14.087Z"
}
```

Shipment rows add `shipmentDate`, `billOfLading`, `masterBillOfLading`, `billTypeCode`, `quantity`,
`quantityUnit`, `containers`, `declaredValueUsd` and `shippingRoute`.

Profile rows add `alsoKnownAs`, `website`, `email`, `phone`, `estimatedShippingCostUsd`,
`topCountries`, and nested `tradingPartners[]`, `tradeLanes[]`, `hsCodes[]`, `recentShipments[]`.

Across the 1,000-row run priced below, HS code, product description, last shipment date and the
counterparty's ImportYeti URL were on 100% of rows, and origin port on 90.7%.

### Input

```json
{
  "searchQueries": ["solar panels"],
  "startUrls": ["https://www.importyeti.com/company/nike-usa"],
  "resultType": "partners",
  "maxItems": 200,
  "maxProfilesPerQuery": 3
}
```

Search terms work on brands (`Nike`), importer legal names (`Nike Usa`), supplier names and products
(`lithium battery`). ImportYeti files one brand under many name variants, so `maxProfilesPerQuery`
controls how many of those variants actually get opened.

`includeUnnamedPartners` is off by default. US manifests are sometimes filed with the counterparty
blank and ImportYeti shows those as "Missing in source document"; leaving it off means you're not
charged for rows with no name on them.

### Price

| Event | Price | When |
|---|---|---|
| Result | $0.000025 ($0.025 / 1,000) | per row in the dataset |
| ImportYeti profile opened | $0.0005 | per company page that returned data |
| Actor start | $0.0005 | once per run |

Two events instead of one because the two costs are genuinely different. Opening a company page
means fetching and parsing about a megabyte of HTML; writing a row costs almost nothing. Charging
everything per row would mean overcharging you for the 45 partner rows that come out of a single
page.

Real numbers from real runs:

- Nike USA's full supplier list — 1 page, 45 rows: **$0.002125**
- 1,000 partner rows across 37 companies: **$0.044**
- 40 Home Depot bills of lading: **$0.002**
- A run that finds nothing: **$0.0005**, with no result or profile events charged

Blocked pages, 404s, empty tables and bad URLs return a diagnostic row and are never charged.

### What it doesn't do

- **No air freight, no exports.** ImportYeti covers US *sea* import manifests from Customs and Border
  Protection. Trucking, rail, air and outbound shipments aren't in there.
- **Top partners and recent bills of lading, not the full history.** That's what ImportYeti's own
  page carries. Home Depot USA has 230,803 shipments on record; the page lists its 48 largest
  supplier relationships and the 100 most recent BOLs.
- **Ports are per-lane, not per-shipment.** ImportYeti publishes port pairs for a company, not for
  each relationship. A row's `originPort` is the busiest lane on that company leaving the
  counterparty's country. Where ImportYeti lists no lane out of that country the field is `null`
  rather than a guess — 9.3% of rows in the 1,000-row run above.
- **Names are as filed.** US manifests are typed by hand, so you get `Wal Mart`, `Nike Usa`,
  `Apl Logistics Vietnam`. Match on the ImportYeti URL, not the name.
- **Email and phone are mostly withheld.** ImportYeti masks contact details behind its own paid plan
  (`XXX-XXX-X319`). The fields are returned when the page shows them, which isn't often.
- **Throughput has a ceiling.** ImportYeti meters company page loads per IP address — roughly 25
  before it starts serving a stripped page, and the cut-off lasts several minutes. The actor rotates
  addresses on every request, which is what lets a run read hundreds of profiles, but a very large
  run can still hit the wall. It says so in the log and charges you nothing for it.

### Questions

**What is ImportYeti?** A free search engine over US Customs and Border Protection bill-of-lading
records. It shows which US companies import by sea, which overseas factories ship to them, and what
they ship.

**How do I find a company's suppliers?** Put the brand in `searchQueries` and leave `resultType` on
`partners`. Each row is one supplier, with its country, shipment count, HS code, product description
and ImportYeti profile URL.

**How do I find a factory's customers?** Paste a supplier URL
(`https://www.importyeti.com/supplier/...`) into `startUrls`. On a supplier page the same table runs
the other way, so `counterpartRole` comes back as `buyer`.

**Do I need an ImportYeti account?** No. Everything here comes from public pages.

**Is scraping ImportYeti legal?** The underlying records are US government customs data, published by
CBP. This reads pages ImportYeti serves publicly and takes nothing from behind its login. What you do
with the data afterwards is on you.

**What is an HS code?** The Harmonized System code that classifies the goods — `6402.99` is footwear,
`9403.60` is wooden furniture. `hsCode` is the code that counterparty declares most often; `hsCodes`
lists the top five.

**Why is a port missing on some rows?** See above. A null means ImportYeti's lane table has no route
out of that counterparty's country, and a guessed port would be worse than none.

**Can I get more suppliers for one company?** Not from one page. The partner table is as long as
ImportYeti makes it, which was 45 rows for Nike USA and 48 for Home Depot USA. Raise
`maxProfilesPerQuery` instead: large importers file under several names (`Nike`, `Nike Usa`,
`Nike Canada`) and each has its own page and its own partner table.

### Output fields

`profileName` · `profileType` · `profileUrl` · `profileAddress` · `profileCountry` ·
`profileCountryCode` · `profileTotalShipments` · `rowType` · `counterpartRole` · `counterpartName` ·
`counterpartUrl` · `counterpartAddress` · `counterpartCountry` · `counterpartCountryCode` ·
`counterpartLocation` · `shipments` · `shipmentsLast12Months` · `weightKg` · `teu` ·
`productDescription` · `hsCode` · `hsCodes` · `topProductCategory` · `originPort` ·
`originPortCountry` · `destinationPort` · `destinationPortCountry` · `destinationPortRegion` ·
`firstShipmentDate` · `lastShipmentDate` · `isRelatedParty` · `counterpartTopBuyers` · `searchQuery` ·
`scrapedAt`

# Actor input Schema

## `searchQueries` (type: `array`):

What to look up on ImportYeti. A brand or importer name ("Nike", "Home Depot"), a supplier name, or a product ("solar panels", "lithium battery"). One per line.

## `startUrls` (type: `array`):

Optional. Paste ImportYeti company pages (https://www.importyeti.com/company/nike), supplier pages (https://www.importyeti.com/supplier/apl-logistics-vietnam) or search pages (https://www.importyeti.com/search?q=nike). Works alongside the search terms above.

## `resultType` (type: `string`):

Trading partners = one row per supplier/buyer relationship (about 45 per company). Shipments = one row per bill of lading, with dates and BOL numbers. Company profiles = one wide row per company with the partner list, ports and HS codes nested. Search results = just the matching companies, no profile pages opened.

## `maxItems` (type: `integer`):

Hard cap on rows returned across the whole run. You are charged per row returned; failed and skipped profiles are never charged.

## `maxProfilesPerQuery` (type: `integer`):

ImportYeti returns many name variants for one brand (Nike, Nike Usa, Nike Canada...). This is how many of them to actually open. Ignored when "What each row should be" is set to search results.

## `includeUnnamedPartners` (type: `boolean`):

US customs manifests are sometimes filed with the counterparty blank, and ImportYeti shows those as "Missing in source document". Off by default so you are not charged for rows with no name.

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

Optional. The actor already rotates its own egress, which is what keeps ImportYeti's per-address page limit from stopping the run. Only set this if you must exit from a specific network.

## Actor input object example

```json
{
  "searchQueries": [
    "solar panels"
  ],
  "startUrls": [],
  "resultType": "partners",
  "maxItems": 200,
  "maxProfilesPerQuery": 3,
  "includeUnnamedPartners": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

One row per importer-supplier relationship (or per shipment) in the default dataset: counterpart name and country, shipment counts, product descriptions, HS codes, origin and destination ports and the last shipment date. Empty or blocked runs return a single uncharged row instead.

# 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 = {
    "searchQueries": [
        "solar panels"
    ],
    "startUrls": [],
    "maxItems": 200,
    "maxProfilesPerQuery": 3,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("dami_studio/importyeti-scraper").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 = {
    "searchQueries": ["solar panels"],
    "startUrls": [],
    "maxItems": 200,
    "maxProfilesPerQuery": 3,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("dami_studio/importyeti-scraper").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 '{
  "searchQueries": [
    "solar panels"
  ],
  "startUrls": [],
  "maxItems": 200,
  "maxProfilesPerQuery": 3,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call dami_studio/importyeti-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,dami_studio/importyeti-scraper"
        }
    }
}

```

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/SxIHDxeto6gur0NiQ/builds/fc1fNXWIrHlsOpLy8/openapi.json
