Fourteen questions, ranging from "where do I start" to what a Chapter 99 provision is. For field-by-field detail, see the developer guide; for the boundary between a lookup and a classification, see what this does and does not do.
Get the product's HS code from your supplier — they usually know it, so just ask. Then send it with the country it ships from: /duty?hs=&from=China. You get back the estimated import-duty rate (one number, or a range if the code is rough). Sales tax is not included, and that is deliberate. You don't need to understand the code itself to get a number.
Send GET /duty?hs=
Eight pollers, all against primary government sources, on one nightly run. Two of them read CBSA's CARM API: the base schedule (tariff items, treatment rates, effective dates) and a separate reference table (country codes and tariff treatment entitlements), listed separately because either can fail on its own even though they share one authority. Canada Gazette Part II - newly registered federal orders. These are Governor in Council orders; nothing to do with purchase orders. 'Registered' is the precise word: a Statutory Order or Regulation gets its SOR number when it is registered, and Part II is where that happens. Justice Laws - the consolidated text and in-force date of each order, which is what the citation on an answer links back to. CBSA Customs Notices - the administrative guidance on how an order is actually applied at the border, which is often where the conditions live. CBSA SIMA measures in force - anti-dumping and countervailing measures, their tariff classification numbers, the co-operative exporter lists and the all-other rates. Global Affairs Canada and the Export and Import Controls reporting system - steel tariff-rate quota utilisation, by period, which is what decides whether a safeguard surtax bites. Finance Canada announcements - measures announced but not yet registered, so goods arriving after an announced date can be priced before the order legally exists. The live list is always at /measures. As of this build that is 23 registered instruments carried on a duty answer - 10 surtax orders, 10 surtax remission orders and 3 related regulations - plus 63 SIMA measures, which are reported separately because anti-dumping duty follows the exporter named on the customs documents rather than the goods. The live per-source freshness is always at /status.
You get the rate, plus a special_provision block explaining what the provision is, because the rate alone would mislead. A Chapter 99 item is not a description of goods - it is a relief provision claimed IN ADDITION TO your goods' own tariff item, and it normally reduces the duty otherwise owed: 9958 for original-equipment vehicle parts, 9948 for articles for use in listed machines, 9903 for surtax relief. So price your goods' actual classification to see what you would pay, then claim the provision against it. Chapter 98 is the non-commercial and admissibility side. Note that a prohibition there does not mean nobody can import the goods - it means not without authorisation, and the exception is usually written into the provision itself. Item 9897.00.00 admits a live mongoose where the Minister of Public Safety is satisfied on the written advice of the Canadian Wildlife Service. Somebody holding that permit imports it and is entitled to the rate, so we state the rate rather than deciding who is asking. Two things we do change for these chapters: no surtax is overlaid, because a surtax order names goods and not a special provision, and the entitlement question goes to your broker, because it turns on end use and on conditions in the provision's own text. resolve_duty also returns possible_relief on an ORDINARY code: Chapter 99 provisions whose own text references that code's chapter or heading, worth asking a broker about — candidates, never entitlements.
The non-recoverable charges triggered by bringing goods into Canada: base duty (the tariff), surtax orders, and SIMA anti-dumping or countervailing duty. If it's certain or conditional in the duty stack this service reports, it belongs here. It does NOT mean sales tax - GST, HST, QST, PST or whatever your province calls it - because a GST-registered business usually claims that back as an input tax credit; it is a recoverable cash-flow item, not a real cost of the shipment. Duty, surtax and anti-dumping are the opposite: nobody claims them back, so every dollar there is a dollar actually lost if the number goes the wrong way. That is the one definition this service uses everywhere the phrase "total import cost" appears; see the next question for why sales tax specifically is left out of the figures rather than guessed at. This framing assumes a commercial importer: this is a corporate costing tool, built for a business pricing a shipment, not a guide for an individual bringing in personal goods. An individual does not typically register for or recover GST at all, faces different personal-exemption and courier/postal thresholds, and is outside what this service was built to answer - talk to CBSA or a broker for that case.
No - see the previous question for what "total import cost" means here and why sales tax is a different kind of charge. Leaving it out is deliberate rather than an omission: there is no single import sales tax in Canada to quote, since it is 5% GST in some provinces, 13 to 15% HST in others, and GST plus a separate provincial tax elsewhere, so the number depends on the province of entry rather than on the goods. None of that is derivable from an HS code and a country of origin, so this service does not guess at it. Add sales tax yourself, or ask your accountant. Every response carries sales_tax.included: false so an integration cannot mistake silence for zero.
See /install for the URL, a copy button, and both connection methods (the Claude apps and Claude Code). It's free, needs no account, and any client speaking Model Context Protocol over Streamable HTTP can use the same URL. Once connected, ask about Canadian import duty in plain language and the answer comes back out of the published record rather than out of the model's memory.
Almost certainly because it is not a Canadian code. Only the first SIX digits of an HS code are international — every country in the World Customs Organization agrees on those. Everything after the 6th digit is set by the importing country. So a supplier in China who mostly ships to the United States will quote you a 10-digit US HTS number like 8481.80.40.90, and Canada has no such line: under 8481.80 the Canadian schedule has one tariff item, 8481.80.00, with its own statistical endings. The same applies to an EU CN code or any other national code. When that happens this service does not just fail — it falls back to the 6-digit international part, answers there, and tells you it did. To be certain, ask your supplier for the 6-digit HS rather than their full national code: that part is unambiguous and they can always give it. Your customs broker then confirms the Canadian ending.
Both, and this catches people out. Base duty and surtax orders depend on the goods and the country of origin. Anti-dumping duty under SIMA depends on the EXPORTER named on your customs documents — not the manufacturer on the mill certificate, and not the country alone. CBSA holds a 'normal value' for each co-operative exporter; if they sell at or above it, no anti-dumping duty is owed, and if you buy the identical goods through an exporter who is not on that list you can pay the all-other rate instead, which reaches 158.9% on some steel products. Where a measure applies, this service lists the co-operative exporters for your origin so you know who to ask. The exporter ID and model ID must appear on the customs documents or the shipment is assessed at the all-other rate regardless.
Inputs: hs is the product's Canadian tariff classification code (get it from the supplier; 4–10 digits, dots optional — a bare 2-digit chapter is too broad to price and is refused); from is the country of origin (an ISO2 code like US or CN, or a name like China) and is REQUIRED — origin decides the tariff treatment and whether a surtax applies, so there is no safe default. Response: duty_rate is a percent given as low/mid/high (all three equal when nothing is uncertain; a spread only when surtax orders may or may not stack — pick one for your costing). If your code matches several tariff lines carrying different rates you get rates_disagree and the candidate lines instead of a band, because averaging two unrelated rates is not a costing range; sales_tax is not a calculation - it is there so you cannot mistake silence for zero, and it always reports included: false. GST, HST, QST and PST are outside the scope of this service; measures_in_effect lists any surtax / remission orders that apply, with dates and a source link. You don't need customs knowledge — send hs + from, read duty_rate. See /developers for the full field guide.
Ask your supplier first — they can almost always provide or suggest the HS code (often a 6-digit international code, which is fine here), and that is more reliable than guessing or looking it up yourself. If you still need to find it, use the CBSA Customs Tariff (cbsa-asfc.gc.ca) or a customs broker. This service does not classify products — you provide the code; it accepts 4, 6, 8, or 10 digits (a bare 2-digit chapter, like '72' for all of iron and steel, is too broad to ever produce a costing answer and is refused). A short code is fine whenever every line it matches carries the same rate, which is usually the case; when they differ you are shown the lines and asked to pick one.
The Harmonized System code that identifies a product. The first 6 digits are international; Canada uses a 10-digit tariff number, e.g. 7208.10.00.00.
Think of the Customs Tariff as a big book and read the code left to right, getting more specific as you go. The first 2 digits are the Chapter of the tariff book (72 = iron and steel). The first 4 are the heading within that chapter (7208 = flat-rolled iron and steel). The first 6 are the subheading — this part is the international code that every country shares (7208.10). Canada then adds 2 more for its tariff item (7208.10.00), and 2 more for the full classification number with a statistical suffix on the end (7208.10.00.00). Periods go after the 4th, 6th, and 8th digits; you will also see the same code with no periods (7208100000). More digits = more exact. A shorter code still gets a straight answer whenever every tariff line beneath it carries the same rate — which is usually true, and always true at 8 digits. Only when those lines genuinely disagree does this API refuse to quote and show you the candidate lines to pick from, rather than averaging them into a meaningless spread. This API accepts either form. Note that trailing zeros are commonly dropped, so 7208.10.00.00 is often written just as 7208.10. Period placement also varies — you may see 72.08.10 (a dot after the 2-digit chapter, the WCO style), which is the same code as 7208.10. Because this API ignores periods, every spelling works the same: 7208.10, 72.08.10, or 720810.
It is only a punctuation convention — the digits are identical and, for the first six, internationally standardized. The World Customs Organization prints headings with a dot after the 2-digit chapter (72.08); Canada's Customs Tariff groups the full number as 4-2-2-2 (7208.10.00.00). The dots are cosmetic and never change the code. This API ignores them, so either style resolves the same.
The World Customs Organization (WCO) is the international body that maintains the Harmonized System — the global product-classification standard used by about 200 countries. The first six digits of a code mean the same thing everywhere; each country then adds its own further digits (Canada goes to 10). 'WCO style' just refers to how the WCO prints the codes in its official nomenclature: headings with a dot after the 2-digit chapter (72.08) and subheadings as four-then-two (7208.10). Same code, different spacing.
A tariff treatment is the rate column that applies based on the country of origin. MFN (Most-Favoured-Nation) is the default WTO rate; CUSMA/UST applies to United States origin; CPTPT, CETA and others apply to their partner countries.
Extra duty (or relief) added on top of the base tariff by a government order — for example the steel and aluminum surtaxes. This is the part that is not in the base tariff tables; it is tracked here from Canada Gazette Part II, Justice Laws, and CBSA Customs Notices.
If the HS code is not the full 10 digits it can match several tariff lines with different rates. The range bounds them; pick low, middle, or high for your costing, or send the 10-digit code for one figure.
This is a research project attempting to keep up to date, not a service promising that it is. Rebuilt nightly. Base rates come from CBSA CARM; the surtax, quota-utilisation and SIMA layers are re-polled on the same run. Rather than make a blanket claim, every response carries source_current_to - the date the underlying consolidation is actually current to - so you can see how fresh a given answer is before you act on it, including when it is behind. A federal order registered after that date will not appear yet. Judge each answer by the date it carries, not by a promise on this page. The service checks its own freshness at /health/data, which reports a problem whether or not anyone is watching. The honest position is that you can always see how stale an answer is, never that it is not stale. Every resolve_duty answer also carries its own expires_at, 24 hours out — a hard deadline on that JSON object itself, separate from source freshness, so a cached page or a remembered chat answer has a point past which it should not be repeated without asking again.