USITC HTS Tariff Data Scraper
Pricing
Pay per event
USITC HTS Tariff Data Scraper
Extract official current U.S. Harmonized Tariff Schedule records by keyword, HTS code, chapter, or range. Get duty rates, units, footnotes, release metadata, and audit-ready raw fields. Export through Apify in JSON, CSV, or Excel.
Pricing
Pay per event
Rating
0.0
(0)
Developer
Stas Persiianenko
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Search and export the current official U.S. Harmonized Tariff Schedule (HTS) from the United States International Trade Commission.
Use a product keyword, an HTS code or chapter, or an inclusive code range. Get normalized duty rates, units, hierarchy, structured footnotes, and current release metadata without an API key or browser.
- π Search descriptions such as
headphones,lithium batteries, orcoffee - π§Ύ Look up a heading such as
8518or a full 10-digit HTS number - π¦ Export a chapter such as
85or a bounded range such as8501β8502 - ποΈ Read data directly from the official public USITC JSON service
- π Schedule repeat runs to refresh customs and landed-cost datasets
What does USITC HTS Tariff Data Scraper do?
USITC HTS Tariff Data Scraper turns the official Harmonized Tariff Schedule into clean dataset rows. It supports three practical workflows: keyword discovery, code/chapter lookup, and range export.
Each record includes the formatted HTS number, description, statistical units, Column 1 General/MFN rate, special-program rate, Column 2 rate, hierarchy indent, footnotes, and release identity. Rates and descriptions are normalized to plain text while structured footnotes remain available for compliance review.
Unlike browser crawlers, this Actor uses the official anonymous JSON endpoints. That means fast starts, low memory use, no login, no proxy, and deterministic source URLs.
Who is this HTS tariff data scraper for?
Customs brokers and trade-compliance analysts
- Find candidate headings from product descriptions.
- Export a chapter for classification research.
- Preserve official footnotes and release references in case files.
Importers and ecommerce operators
- Add current general and special duty text to product catalogs.
- Refresh landed-cost inputs after a new USITC revision.
- Review Column 2 rates and additional-duty notes before escalation.
Freight-tech and landed-cost teams
- Ingest structured HTS rows into internal APIs.
- Schedule range refreshes instead of maintaining manual spreadsheets.
- Keep source URLs and extraction timestamps for lineage.
Data engineers and researchers
- Export JSON, CSV, Excel, XML, or RSS through Apify datasets.
- Send tariff rows to a warehouse, Google Sheets, or a webhook.
- Compare release identifiers across scheduled runs.
Why use this USITC HTS scraper?
- Official source β records come from public USITC HTS services.
- No API key β the useful v1 workflow requires no login or paid data provider.
- Three query modes β keyword, code/chapter, and range.
- Current release metadata β every row identifies the schedule revision used.
- Plain-text rates β embedded HTML footnote markers are removed from rate strings.
- Structured notes β footnote columns, markers, types, and values stay machine-readable.
- Optional raw fields β preserve the original official object when auditability matters.
- Low overhead β direct HTTP extraction runs with 256 MB of memory.
- Automation ready β use schedules, webhooks, API calls, Make, Zapier, or MCP.
What US tariff data can you extract?
| Category | Output fields | Example |
|---|---|---|
| Identity | htsno, htsCode | 8501.10.20.00, 8501102000 |
| Classification | description, indent | Product text and hierarchy depth |
| Units | units | No., kg, mΒ² |
| Duty rates | generalRate, specialRate, column2Rate | 6.7%, Free (...), 90% |
| Notes | footnotes, additionalDuties | Section 301 references and additional duty text |
| Quotas | quotaQuantity | Official quota quantity when supplied |
| Release | releaseName, releaseDescription, releaseTitle | 2026HTSRev12 |
| Provenance | queryMode, queryValue, sourceUrl, scrapedAt | Reproducible query lineage |
| Audit data | raw | Original USITC object when enabled |
Empty official fields are returned as empty strings or arrays rather than invented values. The Actor does not calculate a numeric landed cost or decide the legally correct classification for a product.
How much does it cost to scrape USITC HTS tariff data?
This Actor uses pay-per-event pricing. It charges $0.005 per run plus a tiered price per returned HTS record. The formula-derived Starter/BRONZE rate is $0.000022228 per record; higher Apify plans receive volume discounts.
| Plan tier | Per HTS record | 1,000 records plus start |
|---|---|---|
| Free | $0.000025562 | $0.030562 |
| Starter / BRONZE | $0.000022228 | $0.027228 |
| Scale / SILVER | $0.000017338 | $0.022338 |
| Business / GOLD | $0.000013337 | $0.018337 |
| Platinum | $0.000010000 | $0.015000 |
| Diamond | $0.000010000 | $0.015000 |
The default input asks for only 20 records, keeping a first run small. Final live prices are shown by Apify before a run starts and include platform infrastructure.
How to search USITC HTS codes by keyword
- Open USITC HTS Tariff Data Scraper.
- Choose Keyword search.
- Enter a product phrase such as
headphones. - Set the maximum number of records.
- Click Start.
- Open the dataset to inspect or export tariff rows.
Example input:
{"mode": "keyword","keyword": "headphones","maxItems": 20,"includeRawFields": false}
Keyword search uses the wording in official tariff descriptions. Try a broader product noun when a commercial brand or internal SKU returns no matches.
How to look up an HTS code or chapter
Choose code mode to export one code prefix or a complete two-digit chapter. Dots, spaces, and hyphens are accepted and normalized.
{"mode": "code","htsCode": "8518","maxItems": 500,"includeRawFields": false}
Accepted code lengths are:
- 2 digits for a chapter, for example
85 - 4 digits for a heading, for example
8518 - 6 digits for a subheading
- 8 digits for a tariff line
- 10 digits for a statistical reporting number
Code mode includes descendant rows under the supplied prefix until maxItems is reached.
Chapter 99 is supported through the official export service rather than the less reliable chapter-rate endpoint.
How to export an HTS code range
Range mode is useful for warehouse refreshes, classification catalogs, and bounded compliance datasets. Both bounds must contain 4, 6, 8, or 10 digits.
{"mode": "range","rangeStart": "8501","rangeEnd": "8502","maxItems": 1000,"includeRawFields": true}
The end bound includes its descendant tariff lines.
The Actor validates that the start does not sort after the end and fails closed on malformed values.
Use maxItems to control output volume during experiments.
Input parameters
| Parameter | Type | Default | Required | Description |
|---|---|---|---|---|
mode | string | keyword | Yes | keyword, code, or range |
keyword | string | β | In keyword mode | Product phrase with at least two characters |
htsCode | string | β | In code mode | 2-, 4-, 6-, 8-, or 10-digit code |
rangeStart | string | β | In range mode | 4-, 6-, 8-, or 10-digit start |
rangeEnd | string | β | In range mode | 4-, 6-, 8-, or 10-digit end |
maxItems | integer | 20 | Yes | Maximum 1β10,000 records |
includeRawFields | boolean | false | No | Include the original official object under raw |
Only the fields for the selected mode are used. Invalid mode-specific input stops the run with a clear error instead of silently broadening the request.
USITC HTS output example
{"queryMode": "code","queryValue": "8501","htsno": "8501.10.20.00","htsCode": "8501102000","description": "Synchronous, valued not over $4 each","indent": 3,"units": ["No."],"generalRate": "6.7% 1/","specialRate": "Free (A,AU,B,BH,CL,CO,D,E,IL,JO,KR,MA,OM,P,PA,PE,S,SG)","column2Rate": "90%","footnotes": [{"columns": ["general"],"marker": "1","value": "See 9903.88.02.","type": "endnote"}],"quotaQuantity": "","additionalDuties": "","releaseName": "2026HTSRev12","releaseDescription": "2026 HTS Revision 12","releaseTitle": "Revision 12 (2026)","sourceUrl": "https://hts.usitc.gov/reststop/exportList?...","scrapedAt": "2026-07-23T00:00:00.000Z"}
The exact release and tariff text change when USITC publishes revisions. Always rely on the release metadata included in your run rather than this static example.
Understanding general, special, and Column 2 rates
generalRate represents the official Column 1 General/MFN text for the row.
specialRate contains free-trade-program or other special-treatment text when USITC supplies it.
column2Rate contains the official Column 2 rate.
These are strings because rates can contain compound wording, cents per unit, links to notes, or formulas rather than one percentage. Do not parse every value as a simple number.
Footnotes may point to Chapter 99 provisions or other schedule notes. A rate in a dataset is not a substitute for reviewing all applicable general notes, special programs, quotas, exclusions, and current legal measures.
Tips for reliable tariff data workflows
- Start with
maxItems: 20while refining a keyword or code. - Prefer code or range mode for repeatable database refreshes.
- Store
releaseNamewith every imported row. - Compare release IDs before calculating a revision diff.
- Enable raw fields only when downstream users need source-level audit details.
- Keep rates as strings unless your own reviewed parser supports the exact rate form.
- Schedule runs after expected USITC revisions rather than polling continuously.
- Review Chapter 99 references and footnotes before using a base rate in landed-cost calculations.
Automate HTS data with Apify integrations
USITC HTS β Google Sheets
Schedule a chapter export and append the latest tariff rows to a compliance workbook.
Use releaseName to label each refresh.
USITC HTS β Slack or Microsoft Teams
Send a webhook when a scheduled run reports a new release identifier. Link analysts directly to the run dataset and official source URL.
USITC HTS β Make or Zapier
Trigger a range export, transform records, and update product master data. Route rows with footnotes to a human compliance review queue.
USITC HTS β data warehouse
Use the API dataset endpoint to load JSON into Snowflake, BigQuery, PostgreSQL, or object storage.
Deduplicate on releaseName plus htsCode.
Scheduled monitoring
Run the same bounded input daily or weekly. Compare release metadata first, then process changed rows in your own pipeline.
Use the Apify API from Node.js
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('automation-lab/usitc-hts-tariff-data-scraper').call({mode: 'code',htsCode: '8518',maxItems: 100,includeRawFields: false,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
The call waits for completion and returns the run object. For long exports, start the run asynchronously and poll its status.
Use the Apify API from Python
import osfrom apify_client import ApifyClientclient = ApifyClient(os.environ['APIFY_TOKEN'])run = client.actor('automation-lab/usitc-hts-tariff-data-scraper').call(run_input={'mode': 'keyword','keyword': 'coffee','maxItems': 50,'includeRawFields': False,})items = client.dataset(run['defaultDatasetId']).list_items().itemsprint(items)
Dataset exports are also available directly in JSON, CSV, Excel, XML, and RSS formats.
Use the Apify API with cURL
curl -X POST \"https://api.apify.com/v2/acts/automation-lab~usitc-hts-tariff-data-scraper/runs?token=$APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"mode": "range","rangeStart": "8501","rangeEnd": "8502","maxItems": 500,"includeRawFields": false}'
Use the returned run ID to check status and retrieve the default dataset. Never commit your Apify token to source control.
Use USITC HTS data with AI agents via MCP
USITC HTS Tariff Data Scraper is available to assistants that support the Model Context Protocol.
For Claude Code:
$claude mcp add --transport http apify "https://mcp.apify.com?tools=automation-lab/usitc-hts-tariff-data-scraper"
For Claude Desktop, Cursor, or VS Code, add:
{"mcpServers": {"apify": {"url": "https://mcp.apify.com?tools=automation-lab/usitc-hts-tariff-data-scraper"}}}
Your client will ask you to authenticate with Apify through OAuth.
Example prompts:
- βUse
automation-lab/usitc-hts-tariff-data-scraperto find current HTS descriptions for lithium batteries.β - βExport HTS heading 8518 and summarize the General and Column 2 duty text.β
- βBuild a structured dataset for HTS 8501 through 8502 and flag records with Chapter 99 footnotes.β
Data freshness and source behavior
Every run requests currentRelease from USITC and attaches it to each row.
The Actor does not cache a historical tariff schedule or claim that an earlier run reflects todayβs rules.
Keyword search is limited by the official search service and may return fewer records than range export. The export endpoint is preferable for complete bounded code coverage.
The Actor retries temporary network, rate-limit, and server failures with bounded backoff. If the official service returns invalid content after retries, the run fails rather than saving fabricated or stale rows.
Is it legal to scrape USITC HTS data?
The Actor accesses publicly available U.S. government tariff data without bypassing login controls. Users remain responsible for complying with applicable laws, source terms, sanctions, privacy obligations, and internal governance.
HTS classification can carry legal and financial consequences. This Actor is a data extraction tool, not legal, tax, customs-brokerage, or tariff-classification advice. Consult a qualified customs professional and official current notices before making import decisions.
Do not use the output to misdeclare goods, evade duties, or bypass trade restrictions.
Limitations
- Keyword results depend on exact official description wording.
- The source may expose compound rate text that cannot be reduced to one percentage.
- Blank fields mean USITC supplied no value for that hierarchy row.
- The Actor does not determine country of origin or program eligibility.
- It does not combine base rates with every Chapter 99, Section 232, Section 301, quota, or antidumping measure.
- It returns the current release, not archived revision diffs.
- A
maxItemslimit intentionally truncates larger exports. - Official endpoint availability and schema can change.
For legal classification, review the complete HTS, relevant notes, rulings, and current agency notices.
Troubleshooting
Why did keyword search return no rows?
Try a broader generic product noun. Official descriptions may not include a brand, marketing phrase, model number, or internal SKU.
Why are some duty fields blank?
Parent hierarchy rows often contain descriptions but no duty rate. Inspect descendant tariff lines or use a more specific code.
Why does my code input fail validation?
Use 2, 4, 6, 8, or 10 digits in code mode. Range bounds accept 4, 6, 8, or 10 digits. Dots, spaces, and hyphens are allowed, but letters are rejected.
Why did the run stop before the complete range?
Increase maxItems up to 10,000.
The limit protects first-time users from unintentionally large datasets.
What should I do after a temporary USITC outage?
Read the run log for the final HTTP or JSON error and retry later. The Actor already performs bounded automatic retries, so repeated immediate runs are usually unnecessary.
Frequently asked questions
How fast is the USITC HTS scraper?
Small keyword and code runs usually finish in seconds because the Actor calls official JSON services directly and does not launch a browser. Large ranges take longer to download and save.
Can I download the results as CSV or Excel?
Yes. Open the Apify dataset and choose JSON, CSV, Excel, XML, or RSS. You can also request an export format through the dataset API.
Does this replace the official HTS website or a customs broker?
No. It makes official public records easier to automate, but classification and duty treatment require professional review and all applicable legal sources.
Can I monitor tariff schedule revisions?
Yes.
Schedule the same input and compare releaseName or releaseTitle between runs.
This Actor does not itself calculate row-by-row historical diffs.
Does it need a USITC API key or Apify proxy?
No USITC key, login, browser, or proxy is expected for the supported public endpoints. An Apify account and token are needed when using the Apify API.
Are rates numeric?
No. Rates remain normalized strings because the official schedule includes percentages, specific rates, compound rates, free-treatment codes, and formulas.
Related trade and compliance actors
Extend a customs or trade-data workflow with these Automation Labs tools:
- ImportYeti Trade Intelligence Scraper β supplier and shipment intelligence.
- Panjiva Trade Intelligence Scraper β structured global trade records.
- UN Comtrade Trade Data Scraper β official international trade statistics.
- OFAC Sanctions List Export Scraper β U.S. sanctions-list exports.
- OpenSanctions Entities Scraper β compliance entity records.
- EU Sanctions Map Scraper β European sanctions measures.
- ExportersIndia Suppliers Scraper β supplier discovery.
- TradeIndia Supplier Product Scraper β supplier and product catalog data.
Use each Actor according to its own source scope and legal guidance.
Support
For a reproducible support request, include:
- the run URL or run ID;
- the exact input mode and query;
- the expected HTS code or description;
- the
releaseNameshown in output; - a short explanation of the mismatch.
Do not include confidential product data, credentials, or personal information in a public issue.