A free API for estimating import duty into Canada by HS code and country of origin: base duty, surtax / remission / SIMA layers, and GST (shown separately). Canada-import only.
Something we found useful for staying up to date on Canadian import duty — especially the surtaxes that change often — so we made it public. Free to use; it's small enough that accounts and billing aren't worth it.
HS code (2–10 digits, periods optional) and the country it ships from. Fewer digits return a range.
Try:
Provide an HS code and a country of origin:
GET https://daitk-tic.dibind.com/duty?hs=7208.10.00.00&from=US
The base duty, any surtax, and GST come back as JSON, dated. Or use the MCP tool resolve_duty at https://daitk-tic.dibind.com/mcp.
Example response shape:
{
"hs_input": "7208.10.00.00",
"from": "US",
"as_of": "2026-08-08",
"ambiguous": false,
"unit": "%",
"duty_rate": { "low": 0, "mid": 0, "high": 0 },
"gst": { "rate": 5, "applies": true, "recoverable": true },
"measures_in_effect": [
{ "source": "SOR/2025-148", "in_force_date": "2025-06-27", "applies_to_origin": "US" }
],
"notes": [ "..." ]
}
| Endpoint | Returns |
|---|---|
GET /duty?hs={code}&from={country} | estimated total import duty (rate or range) |
GET /tariff/{hs_code} | base duty rates + tracked trade measures |
GET /measures | surtax / remission / SIMA orders, with dates |
GET /changes?since=YYYY-MM-DD | recently changed measures |
GET /mcp | MCP (Streamable HTTP): resolve_duty, lookup_tariff, list_trade_measures, get_measure_detail, recent_changes, service_status |
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), plus 5% GST shown separately. You don't need to understand the code itself to get a number.
Send GET /duty?hs=
Inputs: hs is the product's Harmonized System code (get it from the supplier; 2–10 digits, dots optional); from is the country of origin (an ISO2 code like US or CN, or a name like China — omit it to get the default rate). Response: duty_rate is a percent given as low/mid/high (all three equal when the code is exact, a spread when it's imprecise — pick one for your costing); gst is the 5% sales tax, reported separately because it's usually recoverable; 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.
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 2, 4, 6, 8, or 10 digits (fewer digits return a range).
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 = one rate; fewer digits = broader = we return a range. This API accepts either form. Note that trailing zeros are commonly dropped, so 7208.10.00.00 is often written just as 7208.10 — if you send the short form you'll get a range; add the trailing digits (…00.00) to pin it to the single exact line. 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.
Base rates are synced from CBSA CARM periodically; the surtax / measure layer is updated as orders are registered. Every API response is dated.