← Guides

How-to

How to run ImportYeti US Customs Records & Supplier Scraper

Step-by-step: the exact input, what each field does, and the rows that come back from ImportYeti.

Sourcing teams, procurement analysts and B2B lead generators all want the same thing from US customs data: the list of factories a given importer actually buys from. Every ocean shipment into the US generates a bill of lading, and those manifests are public — importer, supplier, weight, container count, the lot. ImportYeti publishes them on a readable company page, and for one company you should just go and look. The problem is that the page is a report, not a dataset: there is no export, the supplier name and its country are welded into a single table cell, and the shipment list resets every time you reload. Copying fifty shipments by hand for one importer is half an hour of careful transcription, and you will do it again next quarter. For a shortlist of twenty competitors it is not a task anyone finishes.

What you’ll need

Nothing but an Apify account. The actor talks to ImportYeti directly.

No ImportYeti account and no API key. Leave the proxy off — it is off by default, and measured from inside an Apify run on 8 September 2026 the container’s own address, Apify datacenter proxy and residential all returned the full page equally. A proxy only adds latency here. It stays available for one reason: ImportYeti rate-limits per IP, and if your own runs start getting refused, a different address is the fix.

Step 1 — Open the actor

Open ImportYeti US Customs Records & Supplier Scraper on the Apify Store and press Try for free. The actor’s own page on this site lists its live health and pricing.

The ImportYeti US Customs Records & Supplier Scraper listing on the Apify Store
The listing on the Apify Store. Pricing and the nightly health record are both public.

Step 2 — Fill in the input

The input form for ImportYeti US Customs Records & Supplier Scraper in the Apify Console
The input form, as it appears in the Apify Console.
FieldTypeRequiredWhat it does
companystringnoThe US company whose imports you want, e.g. ‘nike’, ‘home depot’, ‘lululemon usa inc’. A bare ImportYeti slug (‘wal-mart’) or a full ImportYeti company URL both work. Kept…
companiesarraynoLook up several importers in ONE run instead of a run each. Combined with ‘US importer’ if you fill both, and duplicates are removed. ‘Maximum results’ applies PER importer, so… (default [])
supplierCountrystringnoKeep only shipments from suppliers in this country, e.g. ‘Vietnam’, ‘China’, ‘Netherlands’. Matched against the country ImportYeti names on each shipment. Leave empty for every…
maxResultsintegernoCap on shipments returned PER importer. ImportYeti’s public company page serves at most 50 recent shipments per company and has no page 2 — deeper history is behind its paid… (default 50)

The importer name is the one that decides everything. ImportYeti keys its company pages on the name as it appears on the customs manifest, which is very often a legal entity rather than a brand — lululemon usa inc, not lululemon. The actor turns whatever you type into that URL form, so home depot, Home Depot and home-depot all land on the same page, and you can paste a full ImportYeti company URL instead if you already have one. When no page exists you get a free row naming the exact slug it tried, so you can correct it rather than guess.

supplierCountry is a filter on the results, not a search. It keeps only shipments whose supplier is in that country, which is how you size the China or Vietnam side of a supply chain without reading the whole list.

A working input:

{
  "company": "nike",
  "maxResults": 50
}

Step 3 — Run it

Press Start. Rows are pushed to the dataset as they’re found, so the run log fills in as it works.

One importer is one page fetch: 50 shipments came back in 5.2 seconds on the Apify platform on 8 September 2026. A batch is paced about three seconds apart on purpose, because ImportYeti throttles after roughly seven rapid requests, so ten importers is closer to forty seconds than to five.

You will never get a silently empty run. If ImportYeti has no page for that name you get a no_results row naming the slug; if it rate-limits you get a blocked row; if the page structure changes you get source_changed. All three are free.

Step 4 — Read the output

Each run returns a labelled table, not raw JSON:

The output fields returned by ImportYeti US Customs Records & Supplier Scraper
The output view — every field the actor returns, named and typed.

Every row looks like this — a real row from a real run:

{
  "source_url": "https://www.importyeti.com/company/nike",
  "shipment_date": "04/27/2023",
  "bill_of_lading": "HLCUSGN230386021",
  "master_bill_of_lading": null,
  "bill_type": "R",
  "carrier": "Hapag-Lloyd",
  "carrier_tracking_url": null,
  "supplier_name": "Apl Logistics Vietnam Company Ltd",
  "supplier_country": "Vietnam",
  "supplier_city": "Xa Long An",
  "supplier_url": "https://www.importyeti.com/supplier/apl-logistics-vietnam",
  "weight": 27062.0,
  "weight_unit": "kg",
  "quantity": 3699.0,
  "quantity_unit": "pcs",
  "container_count": 4.0,
  "freight_route": "Asia US Pacific",
  "estimated_freight_cost_usd": 5058.32,
  "company_name": "Nike",
  "company_address": "1 Bowerman Dr, Beaverton, Or 97005, Us",
  "company_hs_codes": [
    "6110.20.2069",
    "6110.30.3053",
    "8479.89.97"
  ],
  "requested_company": "nike"
}
FieldExample valueMeaning
shipment_date04/27/2023Date of the customs entry
bill_of_ladingHLCUSGN230386021House bill-of-lading number, as badged by the source
master_bill_of_ladingMaster bill-of-lading number - only on house/master rows, 2 of 50 measured; null on regular rows
bill_typeRHow the source badges the row - R (regular), IR (in-bond regular) or H/M (house plus master)
carrierHapag-LloydThe ocean carrier named on the shipment - present on 38 of 50 shipments measured
carrier_tracking_urlLink into the carrier’s own cargo-tracking page - only on house/master bill rows, 2 of 50 measured
supplier_nameApl Logistics Vietnam Company LtdThe exporting supplier on the manifest
supplier_countryVietnamThe supplier’s country, read from the country link

supplier_name and supplier_country are the answer to “who do they buy from”, and both are populated on all 50 shipments. They are read from their own links rather than from the cell text, which matters more than it sounds: the raw cell reads Stadium Grow Lighting B VNetherlands, with no separator, and some rows link a town before the country — so a naive parse files a Vietnamese shipment under “Xa Long An”.

Watch the coverage on the rest, because the source genuinely does not have it all. Measured across one importer’s 50 shipments: carrier 38/50, estimated_freight_cost_usd 21/50, master_bill_of_lading and carrier_tracking_url 2/50, supplier_city 1/50. Those low numbers are not a parsing failure — the source badges 37 of those rows R (regular) and 11 IR, and only the 2 badged H/M carry a house-plus-master pair and a carrier tracking link. bill_type tells you which kind of row you are looking at. Date, supplier, country, weight, quantity, container count, lane and HS codes are all 50/50.

There is no per-shipment product description, and there cannot be: ImportYeti renders that column in the browser, so the server HTML holds a loading placeholder rather than the text.

Step 5 — Export it

Open the Dataset tab and export to CSV, JSON, or Excel — or pull the same rows from the API, which is what you want if this is going to run on a schedule.

What it costs

$0.005 per importer, however many shipments come back. Looking up one company costs half a cent; twenty competitors in one run costs $0.10.

Billing per importer rather than per row is deliberate. The alternative — charging for each of the 50 shipment rows — would have made the same question cost roughly fourteen times what the category’s leading tool charges for the same data. Marker rows explaining a block, an unknown importer or a filter that matched nothing are free.

Where the data comes from

This reads ImportYeti directly. The target is Server-rendered HTML tables on the public company page. ImportYeti’s own JSON API (data.importyeti.com/v1.0) answers 401 without a subscription, so the HTML is the whole parse path. The shipment table is found by its HEADERS, not its index - a company page carries 8 or 9 tables depending on the company. Every night a canary runs this actor against that live source and diffs the result against a frozen fixture — what “verified” means.

ImportYeti’s own JSON API answers 401 without a subscription, so the public company page is the whole parse path. That page is server-rendered and easy to read, with three traps: the shipment table has to be found by its column headers rather than its position (a company page carries eight or nine tables depending on the company), the bill-of-lading cell holds two numbers and two one-letter badges styled identically, and email and phone are paywalled placeholders — Unlock, XXXXXXX453 — which this actor drops rather than shipping as a column of fake data.

The rate limit is the part worth knowing about. A throttled address gets HTTP 200 carrying an unrendered ~54 KB shell where a real page is ~690 KB: no error, no redirect, nothing in the body that says refused, and it parses to zero shipments — which on an import lookup reads as “this company imports nothing”. It does not clear by waiting either; a refused address was still being shelled four minutes later. The actor detects it structurally (a real page always has a page title, the shell has none), retries once from a fresh address, and otherwise tells you plainly.

See it used

Use-case articles for this actor are still being written. The input above is the whole workflow for one importer, and the batch field turns it into a shortlist in a single run.

Once you have the supplier and importer names, reach for Business Email & Phone Contact Details Scraper — this actor deliberately does not return the paywalled contact fields, so that is where outreach details come from.

Last updated 2026-09-08