Three things a single-number duty calculator cannot do
Every free calculator answers one question: this code, this
origin, this value — one duty rate. The three capabilities below are what our
paid tier adds on top of that answer. Each is shown with the numbers from a
real call captured on 8 November 2026, beside what a
free competitor answered for the same input.
Every figure is re-checked against the recorded response it
came from before this page is published, and the raw responses are published
alongside it — you can re-run any of them yourself.
01
Per-line split of the duty
A single percentage hides the only part a buyer can act on. The same entry below is answered twice: by us as one Column 1 line plus each Chapter 99 trade-remedy line that reaches it, and by a free competitor calculator given the same HS code, origin and declared value.
HS 7326.90.86 · MX → US ·
$10,000.00 declared valuecountry measure applies; no Section 301 line1 Chapter 99 line adds duty; 5 more reach the entry but add no duty
SimplyDuty10.00%$53.68 dutyon
$536.80 ·
1 duty line
On this entry SimplyDuty answers
10.00% and stops there.
27.90% is what the entry actually owes —
+17.90 pp more — and every part of
that figure is named and traced below. Its dollar amount is not comparable
with ours (it priced the number you type in the origin's own currency, so
the value it taxed is shown beside it); the rate is.
The same questions put to both calculators, from the same
inputs
Question
Our answer
SimplyDuty
Duty rate
27.90%
10.00%
Value taxed
$10,000.00
$536.80 (it priced its input of 10,000 MXN)
Duty owed
$2,790.00
$53.68
Duty rows
2
1
Split by provision
Yes
No
Our duty lines, each traced to its source row
Every duty line in this entry, and the tariff dataset row it
came from
captures/ours_tariff_7326.90.86_MX.json /rate/ad_valorem_pctcaptures/ours_tariff_7326.90.86_MX.json /rate/total_duty_usd
5 more Chapter 99 lines reach
this entry without adding duty — and why
9903.01.05 — in_force_but_goods_conditional
9903.01.35 — source_undetermined
9903.01.39 — source_undetermined
9903.02.01 — in_force_but_goods_conditional
9903.03.08 — not_applied_expired
SimplyDuty, quoted verbatim
Its own result page says:
Duty: 53.68 USD (Rate of 10 %) · VAT: 0 USD (Rate of 0 %) · Total: 53.68 USD
Request
POST https://www.simplyduty.com/importCalculatorAPI/index.php
Captured
2026-11-08T19:35:00Z
Raw response
competitor/simplyduty_73269086_MX.htmlsha256 339509d02be656cd…,
line 346
HS 7601.10.60 · RU → US ·
$10,000.00 declared valuecountry measure applies; no Section 301 line1 Chapter 99 line adds duty; 4 more reach the entry but add no duty
SimplyDuty11.00%$13.42 dutyon
$122.00 ·
1 duty line
On this entry SimplyDuty answers
11.00% and stops there.
10.00% is what the entry actually owes —
-1.00 pp more — and every part of
that figure is named and traced below. Its dollar amount is not comparable
with ours (it priced the number you type in the origin's own currency, so
the value it taxed is shown beside it); the rate is.
The same questions put to both calculators, from the same
inputs
Question
Our answer
SimplyDuty
Duty rate
10.00%
11.00%
Value taxed
$10,000.00
$122.00 (it priced its input of 10,000 RUB)
Duty owed
$1,000.00
$13.42
Duty rows
2
1
Split by provision
Yes
No
Our duty lines, each traced to its source row
Every duty line in this entry, and the tariff dataset row it
came from
captures/ours_tariff_7601.10.60_RU.json /rate/ad_valorem_pctcaptures/ours_tariff_7601.10.60_RU.json /rate/total_duty_usd
4 more Chapter 99 lines reach
this entry without adding duty — and why
9903.90.09 — section_232_russia
9903.01.35 — source_undetermined
9903.01.39 — source_undetermined
9903.02.01 — in_force_but_goods_conditional
SimplyDuty, quoted verbatim
Its own result page says:
Duty: 13.42 USD (Rate of 11 %) · VAT: 0 USD (Rate of 0 %) · Total: 13.42 USD
Request
POST https://www.simplyduty.com/importCalculatorAPI/index.php
Captured
2026-11-08T19:34:57Z
Raw response
competitor/simplyduty_76011060_RU.htmlsha256 81b924b99668f1fe…,
line 346
A product table is not six lookups: it is one upload whose rows must come
back with every fee named — base duty, each additional provision, MPF against
its floor and ceiling, HMF on ocean freight, plus your own freight and
insurance — and a verdict saying whether the row is complete. The table below
is the response to one POST carrying 6
rows at $10,000.00 each, freight $250.00,
insurance $15.00, mode ocean.
Rows in this request
6
Free ceiling (rows)
10
Pro ceiling (rows)
200
11 rows, no account
IDENTITY_REQUIRED
One batch call · our answer per row, and what a free competitor
demo returns for the same HS code and origin
#
HS
Origin
Duty %
MPF
HMF
Landed
Complete
Competitor rate
Its landed total
1
9613.10.00.00
CN
21.50%
$34.64
$12.50
$2,462.14
yes
24.35%
$1,243.50
2
8471.30.01
CN
10.00%
$34.64
$12.50
$1,312.14
yes
0.35%
$1,003.50
3
6109.10.00
CN
34.00%
$34.64
$12.50
$3,712.14
yes
36.85%
$1,368.50
4
9403.60.80
VN
20.00%
$34.64
$12.50
$2,312.14
yes
not priced
declined — the rate depends on the 10-digit statistical suffix
5
3926.90.99
IN
30.30%
$34.64
$12.50
$3,342.14
yes
15.65%
$1,156.50
6
8703.23.01
DE
2.50%
$34.64
$12.50
$562.14
yes
15.35%
$1,153.50
The competitor column is not a claim about whose rate is
legally right — that needs the Federal Register, not two HTTP responses. It is
a claim about what each service answers, and about whether the answer
names the fees: the free demo prices at its own fixed customs value, so only
the rate column is a like-for-like comparison. Where it declined to price a
row at all, the cell says so with its reason rather than showing a zero.
The exact competitor calls behind the
last two columns
https://tariffsapi.com/demo/resolve?hts=9613.10.00.00&origin=CN at 2026-11-08T20:26:02Z → batch/competitor_9613.10.00.00_CN.json
https://tariffsapi.com/demo/resolve?hts=8471.30.01&origin=CN at 2026-11-08T20:26:03Z → batch/competitor_8471.30.01_CN.json
https://tariffsapi.com/demo/resolve?hts=6109.10.00&origin=CN at 2026-11-08T20:26:05Z → batch/competitor_6109.10.00_CN.json
https://tariffsapi.com/demo/resolve?hts=9403.60.80&origin=VN at 2026-11-08T20:26:06Z → batch/competitor_9403.60.80_VN.json — declined — the rate depends on the 10-digit statistical suffix
https://tariffsapi.com/demo/resolve?hts=3926.90.99&origin=IN at 2026-11-08T20:26:07Z → batch/competitor_3926.90.99_IN.json
https://tariffsapi.com/demo/resolve?hts=8703.23.01&origin=DE at 2026-11-08T20:26:08Z → batch/competitor_8703.23.01_DE.json
Forward pricing answers "value in, duty out". The inverse answers the
question a buyer actually has when a broker's invoice lands: given the duty
on this bill, what was the declared value? It is solved against the same
forward engine, so the recovered value re-prices to the same bill — and where
the answer is not a point, the tool says so instead of inventing one.
Input
HS code
0101.21.00.10
Origin
CA
Basis
duty
Amount on the bill
$50.00
the only thing a buyer has: one number from the
invoice
Our answer
Declared value
$142.86
Interval
$142.84 – $142.87
Re-priced forward
$50.00
round-trips to the billreverse_run.json /cases/1/response/value_usdcaptures/ours_forward_roundtrip.json /rate/total_duty_usd
Anonymous call
HTTP answer
IDENTITY_REQUIRED
Feature
reverse-duty
the inverse sits behind Pro; the forward calculator
stays free and unlimitedcaptures/ours_reverse_anonymous.json /error
HS 0102.29.40.24 · CA · $120.00 on the
billa specific-rate line
This line is charged at
1¢/kg, not as a percentage of value, so no
value can be recovered from a dollar amount. The answer is
unsolvable with the reason
no reason given — not a guess.
reverse_run.json /cases/4/response/pricing/layers/0/rate_text
How each competitor answers the same question, and the call that
shows it
Service
Its answer
Call · UTC · raw capture
dutify
Offers an inverseHTTP 401 · no anonymous answerthe served OpenAPI document defines POST /api/v1/reverse_landed_cost and describes it as returning the base price; the live endpoint answered 401 with body {} because the documented auth scheme is an X-API-KEY header this demo does not hold
No inverseHTTP 200 · not applicablethe served calculator form has 16 named inputs and the only money input is ['ProductValue']; none of them accepts a duty amount, and the word 'reverse' does not occur in the served form (reverse_mentioned=False)
Offers an inverseHTTP 404 · no anonymous endpointthe docs page documents reverse inclusive pricing but marks it BETA=True and delivers it only through the GraphQL itemCreateWorkflow (graphql_only=True); the public calculator page carries no reverse input (reverse_mentioned_on_calculator_page=False) and https://zonos.com/api answered 404 body '{"message":"Not Found"}', so no anonymous same-query number exists to diff against
Two of the four ship an inverse of their own; both require a
paid key or an account before they answer a single number, which is why their
row shows the refusal rather than a figure. The inverse is not unique
to us. What differs is that the answer above names every layer and the
dataset row behind it, and that the same computation is re-runnable from the
captures published with this page.
Check it yourself
Nothing on this page is hand-typed. Each figure is re-derived from a capture
in evidence/pro-demos-1108/ by the page's own generator, which
fails if any of them disagrees with the file it came from.
Re-derive every number on this pagecd projects/web-biz && python3 scripts/gen_pro_demos.py --check
Re-run the per-line split for any code and originpython3 scripts/paid_demo_ch99.py --hs 7326.90.86 --origin MX --value 10000
Re-run the batch quote (network)python3 scripts/paid_demo_bulk_landed_cost.py --out /tmp/batch
Re-run the inverse solverpython3 scripts/paid_demo_reverse.py --json --no-competitor
Captured 2026-11-08T20:26:02Z. Competitor answers are
verbatim responses stored with their URL, UTC and sha256; where a competitor
refused to answer anonymously, this page says so rather than filling the gap.
Duty estimates are informational and not a binding customs ruling.
See pricing for what each plan includes, or
the free calculator for a single lookup.