Pro · demonstrations

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 value country measure applies; no Section 301 line 1 Chapter 99 line adds duty; 5 more reach the entry but add no duty
Our answer 27.90% $2,790.00 duty on $10,000.00 · 2 duty lines
SimplyDuty 10.00% $53.68 duty on $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
ProvisionKind Rate Amount Source row
7326.90.86Column 1 (MFN) general rate2.90%$290.00data/hts.json:1/records/17029
9903.01.01IEEPA block25.00%$2,500.00data/ch99_ieepa_blocks_1029f.json:116/blocks/9903.01.01
captures/ours_tariff_7326.90.86_MX.json /rate/ad_valorem_pct captures/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.html sha256 339509d02be656cd…, line 346
competitor/ch99_verdicts.json /verdicts/7/duty_rate_pct
HS 7601.10.60 · RU → US · $10,000.00 declared value country measure applies; no Section 301 line 1 Chapter 99 line adds duty; 4 more reach the entry but add no duty
Our answer 10.00% $1,000.00 duty on $10,000.00 · 2 duty lines
SimplyDuty 11.00% $13.42 duty on $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
ProvisionKind Rate Amount Source row
7601.10.60Column 1 (MFN) general rate0.00%$0.00data/hts.json:1/records/17231
9903.01.25IEEPA block10.00%$1,000.00data/ch99_ieepa_blocks_1029f.json:607/blocks/9903.01.25
captures/ours_tariff_7601.10.60_RU.json /rate/ad_valorem_pct captures/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.html sha256 81b924b99668f1fe…, line 346
competitor/ch99_verdicts.json /verdicts/6/duty_rate_pct

02

Six products priced in one request

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
#HSOrigin Duty %MPFHMF LandedComplete Competitor rateIts landed total
19613.10.00.00CN21.50%$34.64$12.50$2,462.14yes24.35%$1,243.50
28471.30.01CN10.00%$34.64$12.50$1,312.14yes0.35%$1,003.50
36109.10.00CN34.00%$34.64$12.50$3,712.14yes36.85%$1,368.50
49403.60.80VN20.00%$34.64$12.50$2,312.14yesnot priceddeclined — the rate depends on the 10-digit statistical suffix
53926.90.99IN30.30%$34.64$12.50$3,342.14yes15.65%$1,156.50
68703.23.01DE2.50%$34.64$12.50$562.14yes15.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
batch/02_ours_paid_gate.json /max_rows_pro batch/01_ours_batch.json /results/0/result/landed_cost/total_usd

03

A bill amount, solved back to a value

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 code0101.21.00.10
OriginCA
Basisduty
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 bill reverse_run.json /cases/1/response/value_usd captures/ours_forward_roundtrip.json /rate/total_duty_usd

Anonymous call

HTTP answerIDENTITY_REQUIRED
Featurereverse-duty
the inverse sits behind Pro; the forward calculator stays free and unlimited captures/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
ServiceIts answer Call · UTC · raw capture
dutifyOffers 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 holdhttps://dutify.com/api/v1/reverse_landed_cost2026-11-08T19:59:01Zcompetitor/dutify_live_401.body
simplydutyNo 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)https://www.simplyduty.com/importCalculatorAPI/index.php2026-11-08T19:59:18Zcompetitor/simplyduty_calculator_form.html
tariffsapiNo inverseHTTP 200 · not applicablethe API documentation page lists 10 endpoints and 0 of them mention reversehttps://tariffsapi.com/api-documentation2026-11-08T19:59:22Zcompetitor/tariffsapi_api_documentation.html
zonosOffers 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 againsthttps://zonos.com/api2026-11-08T19:59:14Zcompetitor/zonos_api_root.out

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.

  1. Re-derive every number on this page cd projects/web-biz && python3 scripts/gen_pro_demos.py --check
  2. Re-run the per-line split for any code and origin python3 scripts/paid_demo_ch99.py --hs 7326.90.86 --origin MX --value 10000
  3. Re-run the batch quote (network) python3 scripts/paid_demo_bulk_landed_cost.py --out /tmp/batch
  4. Re-run the inverse solver python3 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.