Item (chapter 01 §3), Contact and Money, so its outputs drop straight into a shipment.
The no-invention rule still applies. The engine suggests. It never writes export_hs_code or import_hs_code onto a shipment unless the client explicitly applies a result (§2.3).
This sequence shows how the trade resources feed a DDP shipment, from item classification to the duty collection after import.
1. Common inputs
Trade requests take a trade context. It is a subset of a shipment, so a client can send what it already has:shipment: "shp_...", and the context is read from it, with items taken from handling_units[].items[].
2. Classification
2.1 Create
2.2 The classification object
statusispending,completedorfailed. Requests with more than 100 items MAY be asynchronous and emitclassification.completed.confidenceis 0–1. Below the implementer’s published threshold,requires_reviewistrue, and the result MUST NOT be applied automatically by any implementer-side automation.rationaleis human-readable and is never a substitute for the code.
2.3 Apply and feedback
apply with { "product": "prod_..." } writes into the product’s hs_codes instead (chapter 20). With a shipment, apply writes export_hs_code and import_hs_code to the matching items, matched by sku, then by index, on a draft shipment, and records system_metadata.classification on each one. feedback records corrections that implementers MAY use to improve future suggestions.
3. Compliance screening
decisionisclear,revieworblocked. The worst item or party decides the overall result. An item restriction ofprohibitedmeansblocked.restricted,license_requiredandagency_reviewmeanreview. A party match at or above the implementer’s published threshold meansreview, and an exact match on a sanctions list meansblocked.- At purchase,
blockedfails the purchase, andreviewlets it proceed with acompliance_reviewwarning inmessages[], unless the account settingcompliance.block_on_reviewistrue. restrictions[].levelisprohibited,restricted(allowed with conditions),license_required, oragency_review(FDA, USDA, CITES…). It may carrylicense_types[]anddocuments_required[].- When
tradeis implemented, implementers SHOULD screen automatically at purchase and fail with422 carrier_error/compliance_blocked, giving the screening ID inerror.details.
4. Landed cost
service (a service code, because some fees are carrier-specific) and currency.
The landed_cost object
regime.typeisstandard,eu_ioss,uk_low_value,no_voec,au_lvg,ch_low_value,us_section_321, orother. It also says whether tax is collected at checkout or at import.duties[].measurerecords the legal basis (MFN,section_301,anti_dumping,countervailing,retaliatory), andpreferentialrecords any trade-agreement rate applied.- Guarantees. If
guaranteedistrue, the issuer commits to these totals for a DDP shipment purchased beforeexpires_atthat cites this quote incustoms_declaration.landed_cost: "lc_...". Rates reuse the object:rate.landed_costis alanded_cost(withid), so buying a DDP rate binds its quote.
landed_cost build on each other, from customs value to the guaranteed total.
5. Tariff lookup
trade.tariffs.
6. Duty and tax collections
For carriers and 3PLs that pay import duties and taxes on the shipper’s behalf under DDP, and then collect them from the shipper.statusispending_assessment,due,paid,disputed, orwaived.varianceis the assessed total minus the guaranteed quote. For guaranteed quotes the issuer absorbs it, so the shipper’s total stays at the quote.POST /v1/duty_collections/{id}/paywith{ "payment_method": "..." }settles a collection, with the payment method’s details handled outside this spec.POST /v1/duty_collections/exportproduces a CSVfile. This is capabilitytrade.collections.
duty_collection statuses and the events that mark each transition. Transitions without a label have no event in §7.
7. Events
classification.completed, classification.failed, compliance_screening.completed, landed_cost.created, duty_collection.created, duty_collection.assessed, duty_collection.paid, duty_collection.disputed.