Developer API
Audit-grade duty resolution and a verified measure-change feed. Every result is reproducible — input-hashed, engine-versioned, and pinned to checksummed government source files — and every change your software learns about is source-verified.
Honest scope: engine tariffos-resolver-m0.2.0 currently covers 16 verified HTS-code/origin routes (US Column 1 General base rates). Anything outside that returns a structured "unsupported" result instead of a guess. Coverage grows measure by measure; check /api/v1/coverage before integrating.
Authentication
Create an API key in Settings and send it with every request. Keys are shown once at creation and can be revoked at any time.
Authorization: Bearer tos_live_...Calls count against your plan's monthly API limit (free: 500, Pro: 1,000, Business: 10,000). Every response carries X-RateLimit-Limit and X-RateLimit-Remaining headers; exceeding the limit returns HTTP 429 with code API_QUOTA_EXCEEDED.
Response envelope
Every endpoint returns the same JSON envelope. Exactly one of data and error is non-null; errors carry a stable machine-readable code.
{ "data": { ... }, "error": null, "meta": { ... } }
{ "data": null, "error": { "code": "API_QUOTA_EXCEEDED", "message": "..." } }POST /api/v1/resolutions
Resolve up to 100 tariff requests per call. Each request needs a ten-digit US HTS code, an ISO origin country (never inferred), a USD customs value, an evaluation date, and an integrity hash of the inputs. Validation happens per request: an invalid or uncovered request yields a structured blocked result with a failure code; the rest of the batch still resolves.
curl -X POST https://tariffos.com/api/v1/resolutions \
-H "Authorization: Bearer tos_live_..." \
-H "Content-Type: application/json" \
-d '{
"requests": [{
"requestId": "req-001",
"externalVariantRef": "sku-123",
"destination": "US",
"origin": "JP",
"hsCode": "3924.10.4000",
"evaluationDate": "2026-07-29",
"valuationAmount": "1000.00",
"valuationCurrency": "USD",
"costBasis": "supplier_only",
"costBasisVersion": "v1",
"inputHash": "f85ceeb48558e1244fe04a44754f733d6ed53501ce8cc4e92f6993ec64cc2aa0"
}]
}'A supported route returns verified duty components with rate, amount, source URLs, and the exact government source version:
{
"data": {
"results": [{
"requestId": "req-001",
"coverage": "supported",
"verificationStatus": "verified",
"calculationStatus": "calculated",
"components": [{
"measureId": "us-hts-column-1-general",
"authority": "mfn",
"rateType": "ad_valorem",
"rateValue": "3.4",
"amount": "34.00",
"sourceUrls": ["https://hts.usitc.gov/search?query=3924.10.40"],
"sourceVersion": "USITC-2026HTSRev16"
}],
"estimatedDutyTotal": "34.00",
"effectiveRate": "3.4",
"engineVersion": "tariffos-resolver-m0.2.0",
"warnings": ["M0 covers only the listed Column 1 General base rate for this exact route."]
}]
},
"error": null,
"meta": { "engineVersion": "tariffos-resolver-m0.2.0", "requestCount": 1 }
}The inputHash field
inputHash is the lowercase hex SHA-256 of the JSON serialization of the canonicalized request fields below (uppercased country codes, HTS code without dots, canonical decimal amounts). It exists so a stored result can always be traced back to exactly the inputs that produced it. If the hash does not match the inputs, the request is rejected.
destination, origin, hsCode (dots removed), evaluationDate,
valuationAmount, valuationCurrency, costBasis, costBasisVersion,
quantity, customsQuantityUnit, netWeight, netWeightUnitGET /api/v1/measure-changes
Cursor-paginated feed of verified tariff-measure changes — the machine-readable answer to "tell my software when anything affecting my HTS codes changes." Poll with your last cursor; limit is 1–100 per page. Every record cites official sources and carries old and new state.
curl "https://tariffos.com/api/v1/measure-changes?limit=100" \
-H "Authorization: Bearer tos_live_..."The feed fails closed: it only ever serves records verified against official source snapshots. If verified data cannot be served, it returns HTTP 503 with code MEASURE_CHANGE_FEED_NOT_READY rather than guessing.
POST /api/v1/mcp
Model Context Protocol server (Streamable HTTP, stateless JSON-RPC over POST). Connect AI assistants like Claude Desktop or Cursor directly to the resolution engine, coverage matrix, and change feed — same key, same metering (one API call per request). Example client config:
{
"mcpServers": {
"tariffos": {
"url": "https://tariffos.com/api/v1/mcp",
"headers": { "Authorization": "Bearer tos_live_..." }
}
}
}Exposed tools: resolve_tariffs (batch resolution), get_coverage (the reviewed matrix — call it first), get_measure_changes (verified change feed).
GET /api/v1/coverage
The full machine-readable coverage matrix: supported routes, known-unsupported routes, rate types, source versions with SHA-256 checksums of the government source files, and the verified evaluation-date range. The currently supported routes:
curl https://tariffos.com/api/v1/coverage \
-H "Authorization: Bearer tos_live_..."| HTS code | Origins | Description | Base rate |
|---|---|---|---|
| 3924104000 | JP | Other plastic tableware and kitchenware | 3.40% |
| 8471300100 | JP | Portable automatic data processing machines | 0.00% |
| 8517130000 | JP | Smartphones | 0.00% |
| 9503000090 | JP | Other toys under heading 9503 | 0.00% |
| 4202124000 | JP | Cotton handbags and luggage with outer surface of textile materials | 6.30% |
| 6203113000 | JP | Men's or boys' worsted wool suits | 7.50% |
| 6403191000 | JP | Golf shoes with leather uppers | 5.00% |
| 6912004100 | JP | Ceramic steins, candy boxes and similar decorated household ware | 3.90% |
| 7113115000 | JP | Silver jewelry, other than rope/curb chain, over $18 per dozen | 5.00% |
| 8516310000 | JP | Electric hair dryers | 3.90% |
| 8518210000 | JP | Single loudspeakers mounted in their enclosures | 0.00% |
| 9006300000 | JP | Special-use cameras (underwater, aerial, medical) | 0.00% |
| 9504202000 | JP | Billiard balls | 0.00% |
| 9506116000 | JP | Ski parts and accessories | 0.00% |
| 3304100000 | JP | Lip make-up preparations | 0.00% |
| 8471602000 | JP | Computer keyboards | 0.00% |
Coverage matrix last verified 2026-08-17 against the cited government sources.
The TariffOS API is informational and is not a customs ruling, legal advice, or a substitute for a licensed customs broker. Every calculated result cites the government source and source version it was derived from; verify against the cited sources before relying on it for entry filings.