Export Compliance
HS Code Lookup
POST
/v1/compliance/hs-lookup$0.05 per callLook up HS/HTS tariff codes by commodity description or HS code prefix using USITC database with AI-powered classification.
Send an Idempotency-Key header to retry safely.
Request body
| Field | Type | Description |
|---|---|---|
| commodityDescriptionoptional | string | At least one of commodityDescription or hsCode is required max length 2000 |
| hsCodeoptional | string | max length 20 |
| countryoptional | string | max length 3 |
| useAIoptional | boolean | Enable AI-powered classification default false |
| maxResultsoptional | integer | min 1 · max 50 · default 10 |
| aiModeoptional | string | Send "off" to forbid all LLM processing for this request. An account-level setting can also turn AI off; a request can never turn it back on. one of "on", "off" · default "on" |
Response fields
| Field | Type | Description |
|---|---|---|
| success | boolean | e.g. true |
| data | object | |
| data.id | string | e.g. hsl_9a774f23bf255378 |
| data.query | string | e.g. laptop computer |
| data.method | string | e.g. KEYWORD_SEARCH |
| data.totalMatches | number | e.g. 6 |
| data.matches | array | |
| data.matches[].htsCode | string | e.g. 9017.20.80.40 |
| data.matches[].description | string | e.g. Hand operated input devices which transmit position data to c… |
| data.matches[].chapter | number | e.g. 90 |
| data.matches[].chapterDescription | string | e.g. |
| data.matches[].section | number | e.g. 0 |
| data.matches[].sectionDescription | string | e.g. |
| data.matches[].generalDutyRate | string | e.g. 4.6% |
| data.matches[].unit | string | e.g. No. |
| data.matches[].confidence | number | e.g. 1 |
| data.matches[].matchType | string | e.g. KEYWORD |
| data.aiClassification | null | |
| data.dataSource | object | |
| data.dataSource.name | string | e.g. USITC Harmonized Tariff Schedule (PostgreSQL) |
| data.dataSource.edition | string | e.g. current USITC revision as last synced |
| data.dataSource.totalEntries | number | e.g. 29861 |
| data.dataSource.lastUpdated | string | e.g. 2026-10-20 |
| data.processedAt | string | e.g. 2026-11-04T09:01:10.012Z |
| meta | object | |
| meta.requestId | string | e.g. hsl_9a774f23bf255378 |
| meta.timestamp | string | e.g. 2026-11-04T09:01:10.012Z |
| meta.processingTimeMs | number | e.g. 285 |
| meta.dataSource | object | |
| meta.dataSource.name | string | e.g. USITC Harmonized Tariff Schedule (PostgreSQL) |
| meta.dataSource.provenance | string | e.g. database |
Fields are read from a real response captured 2026-11-04, shortened. Optional fields may be absent in other responses.
Errors
- 400 invalid request
- 401 missing or bad key
- 403 not in your plan
- 429 rate limited, see Retry-After
- 402 payment required
- 5xx retry with backoff
Error bodies and codes are described in Error codes and troubleshooting.