Import Duty & Tariff Calculator, HS Code Lookup avatar

Import Duty & Tariff Calculator, HS Code Lookup

Pricing

Pay per usage

Go to Apify Store
Import Duty & Tariff Calculator, HS Code Lookup

Import Duty & Tariff Calculator, HS Code Lookup

Look up US import duty by HS code or product keyword, keyless. Rates resolved down to the 10-digit line, free trade agreement eligibility by origin country, duty estimate on a shipment value, Chapter 99 Section 301 and IEEPA lookups, and UN Comtrade trade flows.

Pricing

Pay per usage

Rating

0.0

(0)

Developer

Ken M

Ken M

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Share

Find out what it actually costs to import something into the US. Look up an HS code or a product name, get the duty rate that applies, check whether a trade agreement makes it cheaper, and estimate the duty on a real shipment value.

No login, no API key, no proxy. The actor reads the official keyless USITC Harmonized Tariff Schedule API and the keyless UN Comtrade API, so runs are fast and cheap.

The problem this solves

The tariff schedule publishes duty rates on the 8-digit subheading. The 10-digit statistical lines underneath it, which are the ones you actually declare at entry, come back with their rate cells empty because they inherit from the line above.

So if you look up 8541.43.00.10 on its own, the honest answer from the raw data is "no duty rate", and that is the case for most of the tariff schedule. This actor walks the tree, resolves the inherited rate, and tells you on every row whether the rate was stated on that line or inherited from a parent:

{
"htsCode": "8541.43.00.10",
"generalRateText": "Free",
"generalRateSource": "inherited",
"generalRateInheritedFrom": "8541.43.00"
}

What you get

One row per tariff line.

FieldDescription
htsCode / htsCodeDigitsDotted and digits-only form
codeLevel / isStatisticalLine4 heading, 6 international, 8 legal rate line, 10 US reporting line
description / descriptionPath / fullDescriptionThe line, its ancestry, and the two joined
unitsOfQuantityUnits you report at entry, e.g. ["No.", "W"]
generalRateTextNormal trade relations rate as published, e.g. Free, 16.5%, 90¢/pr. + 37.5%
generalRateAdValoremPctThe percentage part, or null if the duty is not charged on value
generalRateSpecific / generalRateIsCompoundThe per-unit part, and whether the rate has both
generalRateSource / generalRateInheritedFromown or inherited, and from which line
column2RateText / column2RateAdValoremPctThe rate for countries without normal trade relations
specialProgramsEvery trade agreement rate on the line, with its program code and name
originEligibleProgramsThe subset your origin country takes part in
appliedColumn / appliedRateText / appliedAdValoremPctWhich column applies and what it costs
estimatedDutyUsd / estimatedLandedCostUsdDuty on your shipment value, and value plus duty
dutyEstimateComplete / dutyEstimateNotesWhether the estimate is the whole bill, and what it leaves out
excludesChapter99TariffsAlways true. See below
scrapedAtRun timestamp, ISO 8601

The estimate tells you when it cannot answer

A duty rate is not always a percentage. Roughly a fifth of the schedule is charged per unit (86.5¢/kg, 90¢/pr.) or is compound (both). This actor is given a shipment value, not a weight or a piece count, so:

  • Ad valorem rate → full estimate, dutyEstimateComplete: true.
  • Compound rate → the percentage part is estimated, dutyEstimateComplete: false, and a note names the per-unit part that is still owed.
  • Per-unit rate onlyestimatedDutyUsd is null, never 0, with a note saying why.
{
"htsCode": "0402.21.25.00",
"generalRateText": "86.5¢/kg",
"generalRateAdValoremPct": null,
"estimatedDutyUsd": null,
"dutyEstimateComplete": false,
"dutyEstimateNotes": [
"Rate \"86.5¢/kg\" is charged per unit of quantity, not on value. Estimating it needs the shipment weight or piece count, which this actor is not given."
]
}

Reporting 0 there would tell you the goods enter duty free when they do not.

Section 301, Section 232 and IEEPA are not in the general rate

They are codified in Chapter 99 and applied on top of the rate above. Every duty row carries excludesChapter99Tariffs: true so the number is never mistaken for the whole bill. Run the actor in additionalTariffs mode to read those headings directly:

{
"htsCode": "9903.01.01",
"description": "Except for products described in headings 9903.01.02 ... articles the product of Mexico",
"rateText": "The duty provided in the applicable subheading + 25%",
"additionalAdValoremPct": 25,
"isNoAdditionalDuty": false
}

Which goods a Chapter 99 heading covers is written in prose in the US notes to the subchapter, so read the heading text before relying on it.

Modes

flowchart LR
A[HS code or keyword] --> B{mode}
B -->|duty| C[USITC tariff schedule]
B -->|additionalTariffs| D[Chapter 99: 301, 232, IEEPA]
B -->|tradeFlow| E[UN Comtrade bilateral flows]
C --> F[Rate resolved + FTA check + duty estimate]
D --> G[Additional duty on top]
E --> H[Who actually ships it, in USD]

Input

FieldDescription
modeduty (default), additionalTariffs, or tradeFlow
hsCodesCodes with or without dots: 8541, 8541.43.00, 8541430010. A 4-digit heading returns every line under it
keywordProduct search, e.g. solar panel. In additionalTariffs mode this filters Chapter 99 by country or product text
originCountryISO2 of where the goods are made, e.g. CN, MX, DE. Decides which column applies
shipmentValueUsdCustoms value. Adds the duty estimate and landed cost
forceColumnauto (default), general, special or other, to compare columns directly
includeStatisticalLinesInclude 10-digit lines (default true)
reporterCountry / partnerCountry / year / flowTrade flow mode only
maxRowsStop after N rows (default 200)

Examples

What do I pay on $50,000 of solar panels from Mexico?

{ "hsCodes": ["8541.43.00"], "originCountry": "MX", "shipmentValueUsd": "50000" }

What is the duty on sneakers from China vs Korea?

{ "hsCodes": ["6404.11.79"], "originCountry": "CN", "shipmentValueUsd": "20000" }
{
"htsCode": "6404.11.79",
"generalRateText": "90¢/pr. + 37.5%",
"appliedColumn": "general",
"appliedAdValoremPct": 37.5,
"estimatedDutyUsd": 7500,
"estimatedLandedCostUsd": 27500,
"dutyEstimateComplete": false,
"dutyEstimateNotes": [
"Rate \"90¢/pr. + 37.5%\" is compound. This covers only the 37.5% ad valorem part; the 90¢/pr. per-unit part is additional.",
"Excludes Chapter 99 tariffs (Section 301, Section 232, IEEPA), merchandise processing fee and harbor maintenance fee."
]
}

Switch originCountry to KR and the same line comes back appliedColumn: "special" at Free under KORUS.

Find the code for a product by name

{ "keyword": "lithium battery", "maxRows": 50 }

Who ships this to the US, and how much?

{ "mode": "tradeFlow", "hsCodes": ["854143"], "reporterCountry": "US", "year": 2023 }
{
"partnerName": "World",
"isWorldAggregate": true,
"hsCode": "854143",
"tradeValueUsd": 19272735842,
"netWeightKg": 3795667103.38,
"netWeightIsEstimated": true
}

The World row is an aggregate that sits alongside the bilateral rows, so it is flagged rather than left to double count your totals.

Who it's for

Importers and ecommerce sellers pricing landed cost before they commit to a supplier, customs brokers and freight forwarders classifying goods, sourcing teams comparing origin countries under tariff changes, and equity analysts modelling the margin hit on companies that import.

Pricing

Pay per row. The first 3 rows of every run are free so you can validate the output before you pay. Commercial trade databases charge $500 or more per month for the same lookups.

Limits worth knowing

  • This is not customs advice. Classification is a legal determination. Use it to narrow candidates and price scenarios, then confirm the code with a broker or a CBP ruling.
  • Trade agreement eligibility is not a ruling. originEligiblePrograms means the country takes part in that program. Qualifying also needs the agreement's rules of origin, which the tariff schedule does not publish. Every row says so.
  • Some programs need active authorization. GSP and ATPA codes stay printed in the schedule after the authorization lapses, so entries under them carry requiresActiveAuthorization: true. Check the program is live before claiming it.
  • Cross references are not rates. A special entry reading See 9822.04.15 (AU) states its rate in another heading. Those come back flagged isCrossReference: true with a null rate, not as duty free.
  • Comtrade runs about two years behind and reports at the 6-digit level, so 8 and 10-digit codes are truncated before the query. Its public endpoint also does not carry every commodity code: some return no rows for any reporting country. When that happens the run logs a warning and returns nothing rather than inventing a zero.
  • A missing value is always null, never 0.