<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: rmccharles</title>
    <description>The latest articles on DEV Community by rmccharles (@rmccharles).</description>
    <link>https://dev.to/rmccharles</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3824334%2F156f2e04-5803-4b54-879f-dac53efd3488.png</url>
      <title>DEV Community: rmccharles</title>
      <link>https://dev.to/rmccharles</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rmccharles"/>
    <language>en</language>
    <item>
      <title>The IEEPA Era Is Over</title>
      <dc:creator>rmccharles</dc:creator>
      <pubDate>Sun, 15 Mar 2026 20:18:25 +0000</pubDate>
      <link>https://dev.to/rmccharles/the-ieepa-era-is-over-fin</link>
      <guid>https://dev.to/rmccharles/the-ieepa-era-is-over-fin</guid>
      <description>&lt;p&gt;Three weeks ago, the US tariff landscape changed more dramatically than at any point in the past year. If you move goods across the US–Canada border and haven’t had time to work through the implications, this issue is for you.&lt;/p&gt;

&lt;p&gt;Here’s what happened, what it means, and what’s coming next.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What Happened&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;On February 20, 2026, the US Supreme Court ruled 6–3 in Learning Resources, Inc. v. Trump that the International Emergency Economic Powers Act (IEEPA) does not authorize the president to impose tariffs. Within hours, President Trump signed an executive order terminating all IEEPA-based tariffs, effective February 24 at 12:00am ET.&lt;/p&gt;

&lt;p&gt;This ended the tariff regime that had been in place since March 2025 — including the 25% tariffs on Canadian goods and the so-called “Liberation Day” reciprocal tariffs on most other countries.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Replaced It (Immediately)
&lt;/h2&gt;

&lt;p&gt;One minute after IEEPA tariffs terminated, a new 10% global import surcharge took effect under Section 122 of the Trade Act of 1974. Key facts about Section 122:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Rate&lt;/strong&gt;: 10% on all countries (Trump has signalled intent to raise to 15%, not yet implemented as of this writing)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Expiry&lt;/strong&gt;: 150 days from February 24 — expires approximately July 23, 2026, unless extended by Congress&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Canada/Mexico exception&lt;/strong&gt;: CUSMA/USMCA-qualifying goods are exempt. If your goods meet CUSMA origin rules, the 10% does not apply.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Section 232 exception&lt;/strong&gt;: Goods already subject to Section 232 tariffs (steel, aluminum, autos, copper, timber, lumber) are excluded from the 10% surcharge — but the Section 232 duties themselves remain fully in effect.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Section 301 exception&lt;/strong&gt;: Existing Section 301 tariffs on Chinese goods are unaffected and remain in force.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;For most CUSMA-compliant Canadian exporters to the US&lt;/strong&gt;: the effective tariff picture improved significantly on February 24. Goods that previously faced a 25% IEEPA tariff now face 0% (if CUSMA-qualifying) or 10% (if not).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What’s Coming Next&lt;/strong&gt;&lt;br&gt;
Section 122 is a temporary bridge. On March 11, the USTR launched new Section 301 investigations targeting over 15 countries — including China, Mexico, the EU, Vietnam, South Korea, and others — for “structural excess capacity and production in manufacturing sectors.” Canada was not named in the initial round.&lt;/p&gt;

&lt;p&gt;Section 301 investigations take months — public comment periods, hearings, USTR findings — before any tariffs can be imposed. Treasury Secretary Bessent has predicted tariffs will return to pre-ruling levels by August 2026. The most likely sequence: Section 122 expires in July, Section 301 tariffs kick in around the same time for the named countries.&lt;/p&gt;

&lt;p&gt;The CUSMA review — the scheduled renegotiation of the US–Canada–Mexico trade agreement — is ongoing in parallel. The outcome of that review will significantly shape Canada’s long-term tariff exposure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Refund Question&lt;/strong&gt;&lt;br&gt;
The Supreme Court ruling did not address refunds of IEEPA tariffs already paid. The court acknowledged it would be a “mess.” CBP has been ordered to re-liquidate unliquidated entries without IEEPA duties, but the refund process for liquidated entries is being litigated. If your business paid significant IEEPA duties on Canadian or other imports in 2025 and early 2026, this is worth reviewing with your customs broker. File a protest to preserve your refund rights while the process plays out.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What This Means for Compliance Teams&lt;/strong&gt;&lt;br&gt;
Three practical actions worth taking this week:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Verify your CUSMA origin documentation. The exemption from the 10% Section 122 surcharge hinges on CUSMA qualification. If your certificates of origin are outdated or your classification has changed, you may be paying 10% unnecessarily.&lt;/li&gt;
&lt;li&gt;Audit any goods subject to Section 232. Steel, aluminum, auto parts, copper, timber, and lumber face their own duty stack that is entirely separate from the IEEPA-to-Section 122 transition. These have not changed and will not be refunded.&lt;/li&gt;
&lt;li&gt;Plan for July. Section 122 expires in approximately 130 days. Section 301 tariffs on the named countries are likely to be in place by then. If you source from China, Mexico, the EU, or any of the 15+ named economies, build that scenario into your Q3 cost planning now.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;The Data Picture&lt;/strong&gt;&lt;br&gt;
For those tracking HTS codes: as of this week, the TradeFacts.io nightly diff shows no structural changes to the US HTS schedule since the ruling. The MFN rates and special program rates in the schedule itself are unchanged — the Section 122 surcharge applies on top of existing rates via a separate proclamation, not as a change to the tariff schedule. This means your classification-based rate lookups remain valid; the additional 10% is an overlay.&lt;/p&gt;

&lt;p&gt;On the Canadian side: one minor CBSA code removal was detected in early March (a legacy yarn classification). The 2026 CBSA schedule is otherwise stable. CUSMA preferential rates (the UST column in the Canadian tariff) are unaffected.&lt;/p&gt;

&lt;p&gt;About Tariff Wire&lt;br&gt;
Tariff Wire is a free weekly digest of US &amp;amp; Canadian tariff changes, published by &lt;a href="https://tradefacts.io/" rel="noopener noreferrer"&gt;TradeFacts.io &lt;/a&gt;— the only API combining live US HTS and Canadian Customs Tariff data with nightly change detection. If someone forwarded this to you, subscribe free &lt;a href="https://tradefacts.io/" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How to Get US and Canadian Tariff Data via API (The Complete Developer Guide)</title>
      <dc:creator>rmccharles</dc:creator>
      <pubDate>Sat, 14 Mar 2026 17:50:29 +0000</pubDate>
      <link>https://dev.to/rmccharles/how-to-get-us-and-canadian-tariff-data-via-api-the-complete-developer-guide-1o71</link>
      <guid>https://dev.to/rmccharles/how-to-get-us-and-canadian-tariff-data-via-api-the-complete-developer-guide-1o71</guid>
      <description>&lt;p&gt;If you're building anything that touches cross-border trade — a landed cost calculator, a customs compliance tool, a Shopify app that shows import duty rates — you're going to need programmatic access to tariff data. This guide walks through every option, including the free government APIs, their limitations, and what to do when those limitations matter.&lt;/p&gt;




&lt;h2&gt;
  
  
  The data sources
&lt;/h2&gt;

&lt;p&gt;There are two datasets you need for US/Canada cross-border work:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;US Harmonized Tariff Schedule (HTS)&lt;/strong&gt; — maintained by the US International Trade Commission (USITC). 32,295 records covering every importable product category.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Canadian Customs Tariff&lt;/strong&gt; — maintained by the Canada Border Services Agency (CBSA). 22,461 records including MFN rates and preferential rates under CUSMA (the successor to NAFTA).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both are public. Neither is particularly developer-friendly out of the box.&lt;/p&gt;




&lt;h2&gt;
  
  
  Option 1: The USITC REST API (free, US only)
&lt;/h2&gt;

&lt;p&gt;The USITC publishes a REST API at &lt;code&gt;hts.usitc.gov&lt;/code&gt;. It's real data and it's free. Here's how to use it:&lt;/p&gt;

&lt;h3&gt;
  
  
  Search by keyword
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://hts.usitc.gov/reststop/api/details/sectionJSON&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;query&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;aluminum&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;offset&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;limit&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;HTSDetails&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[]):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;htsno&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;general&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Lookup by HTS code
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://hts.usitc.gov/reststop/api/details/htsnoJSON/0101.30.00.00&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;detail&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;detail&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;htsno&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;       &lt;span class="c1"&gt;# 0101.30.00.00
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;detail&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="c1"&gt;# Asses
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;detail&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;general&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;     &lt;span class="c1"&gt;# 6.8%
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;detail&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;special&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;     &lt;span class="c1"&gt;# Free (A+,AU,BH,CL...)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Get an entire chapter
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://hts.usitc.gov/reststop/api/details/sectionJSON&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;query&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;chapter:84&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;limit&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This works. The data is accurate. But there are real limitations you'll hit quickly.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where the USITC API falls short
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;No Canadian data.&lt;/strong&gt; The USITC API covers US imports only. If you need to show what a US exporter pays when shipping &lt;em&gt;into&lt;/em&gt; Canada — the CUSMA/UST preferential rate, the MFN rate, the over-quota rate on dairy — you're on your own. The CBSA publishes the Canadian tariff as a PDF and an Excel file. There is no CBSA REST API.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No change detection.&lt;/strong&gt; The USITC updates the HTS schedule — sometimes significantly, especially in a volatile tariff environment. The API doesn't tell you what changed. If you cache HTS data (and you should, for performance), you have no reliable signal for when to invalidate your cache.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Schema instability.&lt;/strong&gt; The USITC has changed its API response format without notice. If you build a production integration directly on it, plan to babysit it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No SLA.&lt;/strong&gt; It's a government endpoint. It goes down. There's no uptime commitment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rate limits are unpublished.&lt;/strong&gt; Hammer it and you'll get throttled, with no clear documentation on what the limits are.&lt;/p&gt;

&lt;p&gt;For a side project or internal tool, these tradeoffs are often fine. For a production integration where your customers depend on rate accuracy, they're not.&lt;/p&gt;




&lt;h2&gt;
  
  
  Option 2: Parsing the CBSA Canadian Tariff yourself
&lt;/h2&gt;

&lt;p&gt;The CBSA publishes the Canadian Customs Tariff as a downloadable Excel file each year. Here's how to parse it in Python:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;openpyxl&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;io&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BytesIO&lt;/span&gt;

&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://www.cbsa-asfc.gc.ca/trade-commerce/tariff-tarif/2026/html/tblmod-1-eng.xlsx&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;wb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;openpyxl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load_workbook&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;BytesIO&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;data_only&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ws&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;wb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;active&lt;/span&gt;

&lt;span class="n"&gt;records&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ws&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;iter_rows&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;min_row&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;values_only&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;tariff_code&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mfn_rate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ust_rate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;tariff_code&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;records&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tariff&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tariff_code&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mfn&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;mfn_rate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ust&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ust_rate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Loaded &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;records&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; records&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This works — once. The problems start when you need to maintain it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The CBSA changes the Excel column layout between releases without documentation&lt;/li&gt;
&lt;li&gt;The file URL changes each year&lt;/li&gt;
&lt;li&gt;Supply management goods (dairy, poultry) have over-quota rates of 200–400% that need special handling&lt;/li&gt;
&lt;li&gt;There are 6,229 duplicate records where &lt;code&gt;.00&lt;/code&gt; suffix variants exist alongside base codes&lt;/li&gt;
&lt;li&gt;You're now responsible for storing, serving, and updating this data in your application&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Option 3: Use a purpose-built tariff API
&lt;/h2&gt;

&lt;p&gt;If you need both US HTS and Canadian Customs Tariff data with a stable schema and change detection, &lt;a href="https://tradefacts.io" rel="noopener noreferrer"&gt;TradeFacts.io&lt;/a&gt; is a REST API built specifically for this. It pulls nightly from USITC and CBSA, normalizes both datasets into consistent JSON, diffs each nightly run to detect changes, and delivers webhook alerts when rates change.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;X-API-Key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your_api_key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# US HTS lookup
&lt;/span&gt;&lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://tradefacts.io/api/hts/0101.30.00.00&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

&lt;span class="c1"&gt;# Canadian tariff lookup
&lt;/span&gt;&lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://tradefacts.io/api/ca/0401.10.10&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

&lt;span class="c1"&gt;# Search CA dataset
&lt;/span&gt;&lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://tradefacts.io/api/ca/search&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;q&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dairy&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# What changed in the last 7 days?
&lt;/span&gt;&lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://tradefacts.io/api/changes&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;days&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No-auth demo endpoint for evaluation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="s2"&gt;"https://tradefacts.io/api/demo/search?q=steel&amp;amp;ds=us"&lt;/span&gt;
curl &lt;span class="s2"&gt;"https://tradefacts.io/api/demo/search?q=dairy&amp;amp;ds=ca"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;30-day free trial at &lt;a href="https://tradefacts.io" rel="noopener noreferrer"&gt;tradefacts.io&lt;/a&gt; — no credit card required.&lt;/p&gt;




&lt;h2&gt;
  
  
  Choosing the right approach
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;USITC API&lt;/th&gt;
&lt;th&gt;CBSA Excel&lt;/th&gt;
&lt;th&gt;TradeFacts.io&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;US tariff data&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Canadian tariff data&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✓ (manual)&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Change detection&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Webhook alerts&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✓ (Pro)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Schema stability&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Uptime SLA&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;Paid&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you only need US data for a low-stakes integration: use the USITC API directly. If you need Canada, need both, or are building something production-critical: the maintenance cost of rolling your own will exceed the API cost fairly quickly.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Tariff data is genuinely messy infrastructure. The government sources are authoritative but not production-ready. If you're building something that needs to stay current as rates change — especially with the current pace of tariff policy changes — plan for that maintenance cost up front rather than discovering it six months in when a client's landed cost calculations are wrong.&lt;/p&gt;

</description>
      <category>showdev</category>
    </item>
  </channel>
</rss>
