Fulfillment API response models

Standard responses (response_format omitted or "standard") include a top-level field:

FieldValueMeaning
monetary_unit"CNY_minor"Every { amount, currency } in the response uses CNY fen (minor unit); 1 yuan = 100 fen

Present on money-bearing routes: balance, freight estimate, create, cancel (with refund), list, detail, services. Omitted on pay, logistics trace, item-attributes, and on response_format: "upstream".

Versandangebote — quotes[] {#freight-estimate-quotes}

Vollständige Anfrage/Antwort: Versandangebote. Kanalkatalog: Versandkanäle. Die Anzeigesprache ist der Header Language, kein Feld im Body oder in der Query.

FeldBeschreibung
channel.code / name / description / tagsStabile Kanalidentität. Beim Erstellen code verwenden, nicht name
available / quote_statusImmer beide lesen. UNAVAILABLE ist ein Angebotsergebnis, kein HTTP-Fehler
unavailable_reason{ code, message } oder null. code ist programmatisch
matched_region{ code, name, match_type }
packages / weightsDeklarierte Pakete; actual / volumetric / chargeable in KG
billing_quantity / pricing_selectorMenge und Einheit, die der Kanal abrechnet (KG / M3 / KG_PER_M3)
transit_timeReferenzlaufzeit
chargesbase_freight / channel_services / channel_rules / outbound_services / inbound_services / adjustments
display_chargesNur-UI-Zeilen; überspringen, wenn included_in_total false ist
total / known_totalVollständiges Budget vs. derzeit bekannte Gebühren. known_total nicht als vollständig behandeln, wenn total null ist
service_adjustment_possibleDie Lagerbearbeitung kann Dienste und Gebühren noch ändern
monetary_unitImmer CNY_minor

Preview / create — pricing {#preview-create-pricing}

FieldDescription
freightInternational line-haul
servicesValue-added services total
discountPromotional deduction
total / total.paymentfreight + services − discount
id / order_snCreate: Public id is warehouse numeric PK as a string; order_sn is the warehouse order number
statusPENDING, WAIT_PAYMENT, WAIT_SHIP, SHIPPED, SIGNED, CANCELLED

Shipment list {#shipment-list}

GET /v1/fulfillment/shipments returns lightweight rows. Example: Shipments · list.

FieldDescription
id / order_snPublic id is warehouse numeric PK as a string; order_sn is the warehouse order number
external_shipment_idISV business/reconciliation id from create; not the Idempotency-Key retry header; empty warehouse string → null
statusPENDING / WAIT_PAYMENT / WAIT_SHIP / SHIPPED / SIGNED / CANCELLED
international_tracking{ tracking_number, carrier }. No top-level tracking_number
receiver / shipping_channel / services[]Same shape as detail
totalDetail-style charges / discount / payable / paid / outstanding
payment_statusUNPAID / PAID / PARTIAL
timescreated_at / packed_at / paid_at / shipped_at / delivered_at / cancelled_at
paginationpage / page_size / total / total_pages

List omits boxes, timeline, files, charges, shipping_legs, source_packages, and interception.

Shipment detail {#shipment-detail}

GET /v1/fulfillment/shipments/{id} is the full shipment view. Create / pay still use summary total.freight / services / discount / payment. Amounts are fen. Example: Shipments · detail.

FieldDescription
id / order_snPublic id (path param) is warehouse numeric PK as a string; order_sn is the warehouse order number
external_shipment_idISV business/reconciliation id from create; not the Idempotency-Key retry header; empty warehouse string → null
statusPENDING / WAIT_PAYMENT / WAIT_SHIP / SHIPPED / SIGNED / CANCELLED
source_packages[]Inbound domestic packages (id may be null in a transition payload)
receiverInternational recipient; country_code is uppercase ISO; district / personal_code may be null. personal_code is the optional personal customs clearance code (e.g. Korea PCCC) from create
shipping_channel{ code, name }
multi_boxtrue when boxes.length > 1
boxes[]Outbound cartons: box_no (warehouse box_sn), source_package_ids (warehouse package_ids), weight / dimensions, optional tracking
international_tracking{ tracking_number, carrier }; empty warehouse strings → null
timeline[]Warehouse business events { code, status, title, occurred_at, details }; code is stable and non-null; details is {} when empty; newest first
shipping_legs[]FIRST_MILE / LAST_MILE when numbers exist; otherwise []
files[]PACKING_IMAGE / PACKING_VIDEO
services[]VAS on this shipment (service_code, name, quantity, status)
charges[]Line items. Discount rows are negative
totalcharges (positive fees) / discount (positive) / payable / paid / outstanding
payment_statusUNPAID / PAID / PARTIAL
timescreated_at / packed_at / paid_at / shipped_at / delivered_at / …; unused = null

charges[].type: FREIGHT, VALUE_ADDED_SERVICE, CHANNEL_SERVICE_FEE, CHANNEL_RULE_FEE, INSURANCE, DUTIES_AND_TAXES, PACKAGE_SERVICE, COUPON_DISCOUNT, POINTS_DISCOUNT.

Tracking numbers live on international_tracking / boxes[].tracking / shipping_legs. Warehouse business events (packed / paid) live on shipment detail timeline[]. Carrier scan nodes live on international tracking timeline[] (same { code, status, title, occurred_at, details } shape).

Balance {#balance}

FieldDescription
balance.availableSpendable for pay
balance.frozenHeld for pending shipments
balance.totalAvailable + frozen

International trace {#international-trace}

Subset of shipment detail — carrier scan nodes only.

FieldDescription
id / order_snSame as detail
shipping_channel{ code, name }
international_tracking{ tracking_number, carrier }; empty warehouse strings → null
statusPENDING / WAIT_PAYMENT / WAIT_SHIP / SHIPPED / SIGNED / CANCELLED
status_labelDisplay copy from warehouse
interceptionIndependent interception request state, or null; it does not replace shipment status
timeline[]{ code, status, title, occurred_at, details }; code is stable and non-null; title is localized display copy; timezone-aware ISO 8601; newest first

Detail timeline[] = warehouse business events. This route timeline[] = carrier scan events. Do not mix the two.

Get Support

Need integration help? Contact Developer Support at support@hiobuy.com · Response within 1–2 business days

Email support