# ImportYeti Scraper - US Import Records & Shipment Monitor (`neverempty/importyeti-scraper`) Actor

For sales pipelines, supplier sourcing and competitor watchlists: ImportYeti company and supplier pages - US customs bill of lading records, top suppliers or customers, the 50 latest shipments, HS/HTS codes, ports, trade lanes and carriers. Monitor: only companies with new shipments or suppliers.

- **URL**: https://apify.com/neverempty/importyeti-scraper.md
- **Developed by:** [NeverEmpty](https://apify.com/neverempty) (community)
- **Categories:** Lead generation, E-commerce, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $6.00 / 1,000 company returneds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## ImportYeti Scraper - US Import Records & Shipment Monitor

Get **ImportYeti company and supplier pages as clean JSON**: a US importer's total and last-12-month sea shipments from US customs bill of lading records, first and latest shipment dates, its **top suppliers** (country, shipments, HS codes, products, first and last shipment quarter), the **50 latest bills of lading** (date, bill of lading number, supplier, weight, containers, product description, route), HS and HTS codes, supplier countries, **trade lanes (port to port)** and carriers. Paste a supplier page instead and you get that supplier's **US customers**. Turn on **Monitor** and scheduled runs return **only companies with a new shipment or a new supplier since the last run**, with the new bills of lading listed, so a competitor watchlist or a sales pipeline does not re-download and pay for the same companies every day.

- **New-shipment monitor.** `onlyChanges` returns only companies that have a bill of lading this watch has not seen, or a new supplier (customer, on a supplier page) whose first shipment is in the quarter of the last check or later. The new ones are in `newShipments` and `newPartners`, with `previousTotalShipments` and `totalShipmentsChange`.
- **No fake "new" rows.** A shipment dated on or before the oldest one the last check saw is not called new (the public list of 50 can shrink or reorder, and many companies have dozens of shipments on one day), and a long-time supplier that moves into the top 50 is not called a new supplier.
- **Company or supplier pages, by URL or name.** `https://www.importyeti.com/company/tesla`, `https://www.importyeti.com/supplier/citic-dicastal`, or just `Tesla`.
- **Nothing guessed.** Values ImportYeti does not show are `null`. ImportYeti's own masked phone numbers and emails are not returned. A page that is only partly readable is not sold as complete.
- **No charge when ImportYeti cannot be read.** Missing pages, check pages, ImportYeti's page-view limit and unreadable pages come back as free rows that say why.

Unofficial. Reads the public ImportYeti company and supplier pages (`importyeti.com/company/...`, `/supplier/...`), the same pages a person sees without logging in. No login, no cookies, no API key. Search pages are not read (ImportYeti's robots.txt disallows `/search?q`).

### What you get

One row per company or supplier page. Example (production run on 2026-09-25, default input `https://www.importyeti.com/company/tesla`; the lists are shortened here: the row had 50 suppliers, 50 shipments, 30 HS codes, 10 HTS codes, 20 trade lanes and 12 carriers):

```json
{
  "status": "ok",
  "changeType": null,
  "pageType": "company",
  "name": "Tesla",
  "otherNamesCount": 220,
  "otherNames": [
    "Gigafactory 1",
    "Telsa",
    "Telsa Gigafactory"
  ],
  "address": "45500 Fremont Blvd 510-249, Fremont, Ca 94538, Us",
  "city": "Fremont",
  "region": "California",
  "country": "United States of America",
  "countryCode": "US",
  "website": null,
  "totalShipments": 50923,
  "shipmentsLast12Months": 17466,
  "firstShipmentDate": "2015-01-02",
  "mostRecentShipmentDate": "2026-09-20",
  "databaseUpdated": "2026-09-23",
  "avgTeuPerShipmentLast12Months": 3.16,
  "avgTeuPerMonthLast12Months": 4595.57,
  "estimatedShippingSpendUsd": 126137367,
  "shippingSpendCoveragePercent": 64.71,
  "manifestConfidentialNow": true,
  "confidentialPeriods": [
    {
      "from": "2015-02-01",
      "to": "2023-02-01"
    },
    {
      "from": "2023-09-01",
      "to": "2025-08-01"
    },
    {
      "from": "2026-03-01",
      "to": null
    }
  ],
  "uflpaListed": false,
  "fullContainerLoadShipments": 47627,
  "lessThanContainerLoadShipments": 3296,
  "partnerRole": "supplier",
  "tradingPartnersShown": 50,
  "tradingPartners": [
    {
      "name": "Missing in source document",
      "url": null,
      "country": "Vietnam",
      "countryCode": "VN",
      "address": null,
      "totalShipments": 912,
      "shipmentsLast12Months": 607,
      "totalWeightKg": 5026963,
      "totalTeu": 1732,
      "hsCodes": [
        "8708.29",
        "8536.90",
        "9405.10",
        "8708.99",
        "8504.50"
      ],
      "productDescription": "Vehicle Ensing Camera Pallet, Copper Bar Transmit Disperse Elshipper, Pch Mica Mica Insulation Sheet Heat, Antenna Tsl Amo Pca Shp, Steel Bolt Shp Covered Sgn Sgn Sgn Sgn",
      "firstShipmentQuarter": "2023-Q4",
      "lastShipmentQuarter": "2026-Q3",
      "internal": false
    }
  ],
  "recentShipmentsShown": 50,
  "recentShipments": [
    {
      "date": "2026-09-20",
      "billOfLading": "OOLU8882751130",
      "masterBillOfLading": "OOLU8882751130",
      "houseBillOfLading": null,
      "billType": "master",
      "partnerName": "Guangdong Manbin Logistics Supply C",
      "partnerUrl": "https://www.importyeti.com/supplier/guangdong-manbin-logistics-supply-c",
      "partnerCountry": "China",
      "partnerCountryCode": "CN",
      "partnerAddress": "No 2115 Zhongxi Times Building No Dongguan Gd China",
      "weightKg": 11600,
      "containers": 1,
      "quantity": 827,
      "quantityUnit": "CTN",
      "description": "Plastic Storage",
      "shippingRoute": "Asia,Pacific",
      "estimatedShippingCostUsd": 7675.46
    }
  ],
  "partnerCountries": [
    {
      "country": "China",
      "shipments": 25461
    },
    {
      "country": "South Korea",
      "shipments": 6150
    },
    {
      "country": "Taiwan, Republic of China",
      "shipments": 2840
    }
  ],
  "hsCodes": [
    {
      "hsCode": "8708.99",
      "chapter": "87",
      "description": "Other",
      "shipments": 8698,
      "weightKg": 71337231
    },
    {
      "hsCode": "8708.29",
      "chapter": "87",
      "description": "Other",
      "shipments": 4906,
      "weightKg": 26859530
    }
  ],
  "htsCodes": [
    {
      "htsCode": "3801.90.10",
      "description": "Other",
      "shipments": 418,
      "mostRecentShipmentDate": "2025-02-25",
      "exampleBillOfLading": "HLCUSZX2412DXAZ2",
      "exampleProductDescription": "Spherical Graphite Hs Code 2504109100. Surface Treated Spherical Graphite Hs Code 3801901000"
    }
  ],
  "tradeLanes": [
    {
      "exitPort": "Shanghai",
      "exitPortCountry": "China",
      "entryPort": "Oakland, Ca",
      "entryPortCountry": "United States of America",
      "entryPortRegion": "California",
      "shipments": 10333,
      "shipmentsLast12Months": 3164
    }
  ],
  "carriers": [
    {
      "scac": "CMDU",
      "name": "Compagnie Maritime Daffretemen",
      "shipments": 20090,
      "shipmentsLast12Months": 9109
    },
    {
      "scac": "MAEU",
      "name": "Maersk Line",
      "shipments": 5793,
      "shipmentsLast12Months": 1358
    }
  ],
  "newShipmentCount": null,
  "newShipments": null,
  "newPartnerCount": null,
  "newPartners": null,
  "previousTotalShipments": null,
  "totalShipmentsChange": null,
  "previousMostRecentShipmentDate": null,
  "previousCheckedAt": null,
  "input": "https://www.importyeti.com/company/tesla",
  "importYetiUrl": "https://www.importyeti.com/company/tesla",
  "watchName": null,
  "checkedAt": "2026-09-24T17:12:40.081Z"
}
```

| Column | Meaning |
|---|---|
| `status` | `ok` for a company row. Other values are free rows that say why nothing was returned (below) |
| `changeType` | `first-check` (first run of this watch), `added-to-watch` (company not seen by this watch before), `new-shipments`, `new-partners` or `unchanged`. `null` when neither `onlyChanges` nor `watchName` is set |
| `pageType`, `partnerRole` | `company` page (partners are its `supplier`s) or `supplier` page (partners are its US `customer`s) |
| `name`, `otherNamesCount`, `otherNames` | The name ImportYeti uses and the other spellings it merged into this page (up to 50) |
| `address`, `city`, `region`, `country`, `countryCode`, `website` | As shown on the page (`website` only when it is a full domain) |
| `totalShipments`, `shipmentsLast12Months` | Sea shipments in ImportYeti's US customs records |
| `firstShipmentDate`, `mostRecentShipmentDate`, `databaseUpdated` | ISO dates |
| `avgTeuPerShipmentLast12Months`, `avgTeuPerMonthLast12Months`, `estimatedShippingSpendUsd`, `shippingSpendCoveragePercent` | ImportYeti's estimates |
| `manifestConfidentialNow`, `confidentialPeriods` | Whether the company has asked US Customs to keep its manifests confidential now, and the periods. While confidential, few or no new shipments appear |
| `uflpaListed`, `fullContainerLoadShipments`, `lessThanContainerLoadShipments` | ImportYeti's UFLPA flag and FCL/LCL counts |
| `tradingPartnersShown`, `tradingPartners` | The page's top-50 table of suppliers (or customers): name, ImportYeti URL, country, address, total and last-12-month shipments, weight, TEU, HS codes, product description, first and last shipment quarter. ImportYeti writes "Missing in source document" when the bill of lading has no supplier name |
| `recentShipmentsShown`, `recentShipments` | The latest bills of lading shown on the public page (up to 50, newest first): date, bill of lading, master and house bill, bill type, partner, weight (kg), containers, quantity, description, route, estimated shipping cost |
| `partnerCountries` | Shipments by supplier (or customer) country |
| `hsCodes`, `htsCodes` | Top 6-digit HS codes (up to 30) and the 10-digit HTS codes ImportYeti lists with an example bill of lading |
| `tradeLanes`, `carriers` | Top port-to-port lanes (up to 20) and ocean carriers (SCAC) |
| `newShipmentCount`, `newShipments`, `newPartnerCount`, `newPartners` | Monitor: what is new since the last check of this watch. New shipments are counted among the (up to 50) latest bills of lading the page shows; a company with more new shipments than that shows at most 50, so use `totalShipmentsChange` for the full change |
| `previousTotalShipments`, `totalShipmentsChange`, `previousMostRecentShipmentDate`, `previousCheckedAt` | What this watch saw last time |
| `input`, `importYetiUrl`, `watchName`, `checkedAt` | What you entered, the page read (after ImportYeti's redirect, if any), your watch name, the time of the check |
| `note` | Free rows only: why nothing (or not everything) was returned |

#### Free rows (not charged)

| `status` | When |
|---|---|
| `no-change` | Monitor on: no company has a new shipment or new partner since the last run |
| `not-found` | ImportYeti has no page at this address. A name is turned into ImportYeti's page address (`Tesla` becomes `/company/tesla`); if ImportYeti names the page differently, paste the page URL |
| `bad-input` | The input could not be used (for example a search URL, or more than 20 pages) |
| `unreadable` | The page could not be read or was incomplete. Nothing is remembered, so a later run returns it |
| `blocked` | ImportYeti (Cloudflare) showed a check page. This Actor does not solve or bypass check pages; it stops, and the rest of the run is not requested |
| `page-view-limit` | ImportYeti asked for a login (it allows about 25 page views per IP address) or answered HTTP 429. This Actor does not log in and does not switch IP addresses to get around it; it stops |
| `budget-reached` | The run hit the maximum total charge you set. Companies not returned are not remembered, so the next monitor run returns them |

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `companies` | list of strings | - | ImportYeti company or supplier page URLs, or company names. Up to 20 per run. Empty: the example company Tesla |
| `maxRecentShipments` | integer 0-50 | 50 | Latest bills of lading to include per company (monitor mode always compares all shown) |
| `maxTradingPartners` | integer 0-50 | 50 | Rows of the top suppliers (or customers) table to include |
| `onlyChanges` | boolean | false | Monitor: return only companies with new shipments or new partners |
| `watchName` | string | - | Runs with the same watch name share what they have seen; give two schedules different names |
| `resetMonitoringState` | boolean | false | Forget what this watch remembered, so the run is a first check again |

### Examples

Suppliers and latest shipments of three importers:

```json
{ "companies": ["https://www.importyeti.com/company/tesla", "https://www.importyeti.com/company/wal-mart", "https://www.importyeti.com/company/ikea-supply"] }
```

Daily competitor monitor (schedule this; each run returns only the companies that received new shipments or a new supplier):

```json
{ "companies": ["https://www.importyeti.com/company/nike", "https://www.importyeti.com/company/casa-grande-p2"], "onlyChanges": true, "watchName": "competitors" }
```

Who buys from a supplier (a supplier page lists its US customers):

```json
{ "companies": ["https://www.importyeti.com/supplier/citic-dicastal"], "maxRecentShipments": 20 }
```

### How monitoring works

The Actor remembers, per `watchName`, the bills of lading each company page showed and its suppliers (in a named key-value store in your account). On the next run: a bill of lading it has not seen, dated after the oldest one it saw last time (a later day, not the same day), is new (if the last check saw the company's whole shipment history, any unseen bill of lading is new); a supplier it has not seen whose first shipment is in the quarter of the last check or later is new. With `onlyChanges` on, only companies with something new are returned and charged; if nothing changed you get one free `no-change` row. **The run start fee is still charged on a run with no changes** (it pays for the check). Companies that could not be read or returned are not remembered, so the next run returns them. Two runs with the same watch name at the same moment can overwrite each other's memory, so do not overlap schedules of one watch.

### Pricing

Pay per event: a small start fee per run that returned at least one company (in monitor mode: per run that read and compared at least one company page, even when nothing changed), plus a fee per company row returned. Free rows are never charged. A run where ImportYeti could not be read or asked for a login charges nothing. If your maximum total charge for a run has no room for the start fee plus one company, the run requests nothing and charges nothing.

### Limits

- ImportYeti's public page shows the **50 latest bills of lading** and the **top 50 suppliers**; older shipments and smaller suppliers are not on the page and are not returned. `totalShipments` is the full count.
- ImportYeti allows about 25 page views per IP address before it asks for a login, may answer HTTP 429 (too many requests), and Cloudflare may show a check page after a burst of requests. This Actor reads at most 20 pages per run, waits 3 seconds between pages, and stops (free row) at any of these answers instead of working around it. In production runs on 2026-09-25 with 20 pages, a check page came after 14 and after 15 pages (and once after 6); the pages not read were not charged or remembered, and a later run reads them. Runs of 1 to 5 companies were read in full in all 7 production runs.
- Companies with confidential manifests show few or no new shipments.
- A shipment that ImportYeti publishes late with the same date as the oldest one in the last list is not reported as new (so that no old shipment is sold as new).
- Data is ImportYeti's compilation of US customs vessel manifests; ImportYeti says errors and omissions may occur. A row is what the page showed at `checkedAt`.

### Support

Found a company where the output differs from the ImportYeti page? Open an issue on the Issues tab with the run ID and it will be looked at.

# Actor input Schema

## `companies` (type: `array`):

One per line: an ImportYeti company page URL (https://www.importyeti.com/company/tesla), a supplier page URL (https://www.importyeti.com/supplier/citic-dicastal) or a company name ("Tesla" is read as importyeti.com/company/tesla). Company pages list that US importer's suppliers; supplier pages list that supplier's US customers. Up to 20 pages per run: ImportYeti asks for a login after about 25 page views from one IP address, and this Actor does not work around that. Search pages are not read (ImportYeti's robots.txt disallows them), so a name that does not match ImportYeti's own page name comes back as a free not-found row; paste the page URL instead. If empty, the example company Tesla is used.

## `maxRecentShipments` (type: `integer`):

How many of the latest bills of lading shown on the page to include in recentShipments (date, bill of lading number, supplier or customer, weight, containers, product description, route). 0 to 50; ImportYeti shows up to 50 on the public page. Monitor mode always compares all of them.

## `maxTradingPartners` (type: `integer`):

How many rows of the page's supplier table (on a supplier page: customer table) to include in tradingPartners, largest first. 0 to 50; ImportYeti shows up to 50.

## `onlyChanges` (type: `boolean`):

Return only companies that have a new bill of lading, or a new supplier (customer on a supplier page) whose first shipment is in the quarter of the last check or later, since the last run with the same watch name. The new ones are listed in newShipments and newPartners (new shipments are counted among the up to 50 latest bills of lading the page shows; a shipment dated on or before the oldest one seen last time is not called new). The first run returns every company as the starting point. A run in which nothing changed returns a free row saying so and charges only the run start fee.

## `watchName` (type: `string`):

Name of the remembered state used to compare runs (letters, digits, dot, dash, underscore; up to 40). Setting it (or turning on monitor mode) fills changeType, newShipments and the previous columns. Use a different name for each list of companies you track on its own schedule. With monitor mode on and no name, the name "default" is used.

## `resetMonitoringState` (type: `boolean`):

Start this watch over: forget the remembered shipments before this run, so every company is returned as a first check.

## Actor input object example

```json
{
  "companies": [
    "https://www.importyeti.com/company/tesla"
  ],
  "maxRecentShipments": 50,
  "maxTradingPartners": 50,
  "onlyChanges": false,
  "resetMonitoringState": false
}
```

# Actor output Schema

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

One row per ImportYeti company or supplier page: total and last-12-month shipments, first and latest shipment dates, top suppliers or customers, the latest bills of lading, HS and HTS codes, partner countries, trade lanes (ports), carriers, and in monitor mode the new shipments and new trading partners since the last check. A missing page, no change, a check page, ImportYeti's page-view limit, an unreadable page or a run that hit its maximum charge comes back as a free row that says why.

# 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 = {
    "companies": [
        "https://www.importyeti.com/company/tesla"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("neverempty/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 = { "companies": ["https://www.importyeti.com/company/tesla"] }

# Run the Actor and wait for it to finish
run = client.actor("neverempty/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 '{
  "companies": [
    "https://www.importyeti.com/company/tesla"
  ]
}' |
apify call neverempty/importyeti-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,neverempty/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/j7jutzX8rXZcieO1d/builds/rDh2u15bR8JeKBFab/openapi.json
