AI HTS Classification Accuracy: What We Measured and How
One test, its method, its two results, and what they mean when you use the API. No other accuracy figure for the current classifier exists.
The measurement (2026-10-01)
We took 54 products from CBP rulings issued in 2024 or later: not revoked, one HTS code each, and that code still valid in today's schedule. For each one we wrote a product description from the facts in the ruling, then asked the classifier, with the source ruling hidden from the agent so it could not simply look the answer up. We ran the whole set twice against the current version.
| Level | Run 1 | Run 2 |
|---|---|---|
| Exact 10-digit code | 37 of 54 (69%) | 41 of 54 (76%) |
| Right 6-digit subheading | 45 of 54 (83%) | 48 of 54 (89%) |
| Right 4-digit heading | 46 of 54 (85%) | 49 of 54 (91%) |
Read these as ranges, not as one number. From one run to the next the same 54 products move by about four either way, and 54 is a small set: a few products shift the percentage by several points.
What high and medium confidence mean
Every candidate carries a confidence of high, medium or low. On this test:
- High: the answer was the exact 10-digit code 35 times out of 40.
- Medium: right at 10 digits about half the time. Treat it as a strong lead to check, not an answer.
- Low: a starting point for your own research.
Read the answer block, not just the top code
The response leads with answer. Its code goes only as deep as the facts you gave support: 4, 6, 8 or 10 digits. When that is short of 10 digits, answer lists the options beneath it, each with the condition that leads to it, and the question whose answer decides between them. "Rubber or plastics outer sole?" is a typical one. Answer the question and classify again, or have a person decide.
Below that, candidates holds one to three codes, each with its confidence, rationale, the CBP ruling it relied on, the schedule duty, Census duty figures and trimmed legal notes. confident_to gives the deepest level no answer to the question could change.
Some products are structurally hard
The agent still struggles with:
- Chemicals with IUPAC names: "4[N-(2,4-Diamino-6-Pteridinylmethyl)-N-Methylamino] Benzoic Acid"
- Function-based classifications: "parts suitable for use with machines of heading 84.71"
- Multi-material composites: products requiring GRI 3 essential character analysis
- Stale ruling codes: CBP rulings from 2006 may reference 10-digit codes that have since been restructured. The agent checks codes against the current schedule, but can still be misled.
How it works
An AI agent (OpenAI GPT-6 Luna since 2026-10-01) works with these tools:
search_rulings: search over 220,000+ CBP CROSS rulings by meaningread_ruling: pull full CBP ruling text when a search snippet isn't enoughget_chapter_headings: list 4-digit headings for a chapter to compare alternativesget_chapter_notes: read the section and chapter legal notes that exclude or include productsget_codes_under_heading: see the 6/8/10-digit codes under a heading in the current schedule
Each classification call:
- Reads the product description and searches CBP rulings for similar products
- Reads ruling text when search snippets aren't conclusive
- Compares headings and reads legal notes when ruling out alternatives
- Checks the code against the current schedule (rulings often reference obsolete codes)
- Answers: candidates with confidence and rationale, the ruling it relied on, and a question if a missing fact decides the code
- The response adds the schedule duty, Census duty-collected figures for the 6-digit subheading and legal notes
A classification typically takes 15 to 35 seconds, sometimes up to about 60.
About other benchmarks
ATLAS (arXiv:2509.18400): 259 real CBP rulings, public. An earlier version of htsapi.dev, built on a different model and design, scored 59.1% exact 10-digit on it. That figure describes the earlier version, not the current one.