API báo giá vận chuyển
POST /v1/fulfillment/shipping/quotes ước tính vận chuyển quốc tế từ điểm đến, cân nặng, kích thước, thuộc tính hàng và dịch vụ.
Dùng cú pháp tắt một kiện khi chưa biết cách kho tách thùng. Dùng packages[] khi đã biết số kiện và số đo từng kiện.
Endpoint này dùng cùng thuật ngữ kênh, khu vực, dịch vụ, tính cước và tiền tệ với API kênh vận chuyển.
https://api.hiobuy.com/v1/fulfillment/shipping/quotesBáo giá là ngân sách, không phải giá đã khóa. Cân nặng tại kho, đo thể tích, đóng gói lại và rà soát dịch vụ có thể thay đổi số tiền cuối cùng. Báo giá
COMPLETEvẫn không phải khóa giá.
Bí danh tương thích: POST /v1/fulfillment/shipments/freight/estimate (cùng hành vi). Ưu tiên /v1/fulfillment/shipping/quotes.
Tiền tệ và đơn vị {#units}
- Mọi giá trị tiền
amountđều là số nguyên fen CNY.5000nghĩa là ¥50.00. monetary_unitcấp cao nhất luôn làCNY_minor.- Đối tượng tiền dùng
{ "amount": 5000, "currency": "CNY" }. - Cân nặng yêu cầu luôn là
KG. Kích thước kiện luôn làCM. - Nhận diện kênh và dịch vụ bằng code ổn định, không dùng
name.
Header yêu cầu {#request}
POST /v1/fulfillment/shipping/quotes
Authorization: Bearer hio_live_xxx
Content-Type: application/json
Language: enNgôn ngữ hiển thị chỉ qua header Language. Giá trị hỗ trợ: en (mặc định), en-US, zh, zh-CN, zh-TW, cn, hk. Không đặt language trong JSON body hoặc query string.
Hai định dạng yêu cầu {#request-formats}
Không kết hợp các trường cú pháp tắt một kiện (
weight_kg,length_cm,width_cm,height_cm) vớipackages[]. API từ chối yêu cầu hỗn hợp bằng400 VALIDATION_ERROR.
Định dạng A — cú pháp tắt một kiện {#format-a}
Dùng khi bạn biết điểm đến và cân nặng tổng ước tính, nhưng chưa biết kho sẽ tách thùng thế nào.
Yêu cầu tối thiểu:
{
"destination": {
"country_code": "KR"
},
"weight_kg": 2.05
}Một kiện kèm kích thước:
{
"destination": {
"country_code": "KR",
"postal_code": "04524"
},
"weight_kg": 2.05,
"length_cm": 30,
"width_cm": 20,
"height_cm": 10,
"attributes": []
}weight_kglà cân nặng lô hàng ước tính tính bằngKG.length_cm,width_cmvàheight_cmtính bằngCM. Cung cấp cả ba hoặc bỏ cả ba.- Ưu tiên định dạng này khi chưa biết cách tách thùng cuối cùng tại kho. Thiếu kích thước có thể cho
PARTIALhoặcREVIEW_REQUIREDvới kênh tính theo thể tích.
Định dạng B — kiện đã biết {#format-b}
Dùng packages[] khi đã biết số thùng và dữ liệu từng thùng.
Một kiện khai báo:
{
"destination": {
"country_code": "KR"
},
"packages": [
{
"reference": "box-1",
"weight": {
"value": 2.05,
"unit": "KG"
},
"dimensions": {
"length": 30,
"width": 20,
"height": 10,
"unit": "CM"
}
}
]
}Nhiều kiện:
{
"destination": {
"country_code": "KR",
"postal_code": "04524"
},
"packages": [
{
"reference": "box-1",
"weight": {
"value": 1.25,
"unit": "KG"
},
"dimensions": {
"length": 30,
"width": 20,
"height": 10,
"unit": "CM"
}
},
{
"reference": "box-2",
"weight": {
"value": 0.8,
"unit": "KG"
},
"dimensions": {
"length": 20,
"width": 15,
"height": 8,
"unit": "CM"
}
}
]
}Quy tắc packages[] (OpenAPI):
- 1–200 kiện.
- Một phần tử là một kiện đơn tường minh. Nhiều phần tử là lô hàng nhiều kiện tường minh.
referencetùy chọn, nhưng phải duy nhất trong yêu cầu.packages[].weightbắt buộc.packages[].weight.unitphải làKG.packages[].dimensionstùy chọn. Khi có,length,width,heightvàunitđều bắt buộc.unitphải làCM.
Gateway ánh xạ định dạng A thành một kiện kho. Định dạng B được xác thực và ánh xạ như đã khai báo. Cách tách cuối cùng và kích thước đo được vẫn do xử lý tại kho quyết định.
Trường yêu cầu dùng chung {#shared-fields}
Cả hai định dạng đều có thể gồm các trường sau.
destination
| Trường | Bắt buộc | Mô tả |
|---|---|---|
country_code | Có | ISO 3166-1 alpha-2, hai chữ cái |
subdivision_code | Không | Ví dụ US-CA. Tiền tố quốc gia phải khớp country_code. |
region | Không | Tên hiển thị đơn vị hành chính. subdivision_code hợp lệ được ưu tiên. |
postal_code | Không | Chuỗi. Giữ các số 0 đứng đầu. |
declared_value
{
"amount": 5000,
"currency": "CNY"
}Giá trị khai báo cấp lô hàng bằng fen CNY nguyên. Bỏ trường khi chưa biết. Không gửi 0 để nghĩa là chưa biết.
attributes
Mảng mã thuộc tính hàng ổn định từ GET /v1/fulfillment/shipments/item-attributes. Chuỗi duy nhất, tối đa 100.
Báo giá trước tiên chỉ giữ các kênh áp dụng cho destination.country_code; kênh của quốc gia khác sẽ bị loại bỏ. Mỗi kênh còn lại đánh giá riêng các thuộc tính đã khai báo. Thuộc tính không được hỗ trợ khiến kênh trả UNAVAILABLE với ATTRIBUTE_NOT_SUPPORTED, trong khi các kênh phù hợp khác vẫn có thể trả báo giá.
services
{
"services": {
"channel": [
{
"code": "LINE_INSURANCE",
"quantity": 1
}
],
"outbound": [
{
"code": "VACUUM_PACKING",
"quantity": 1
}
],
"inbound": [
{
"code": "PHOTO",
"quantity": 3
}
]
}
}| Nhóm | Ý nghĩa |
|---|---|
channel | Dịch vụ giá trị gia tăng của kênh. Mã lấy từ kênh value_added_services[].code. |
outbound | Xử lý kho chiều đi |
inbound | Xử lý kho chiều đến |
Mỗi mục cần code và quantity. OpenAPI: quantity là số nguyên từ 1 đến 999. Mã phải duy nhất trong từng nhóm.
channel_codes
Mã kênh ổn định giới hạn tập báo giá. Bỏ để báo giá mọi kênh ứng viên. Không gửi mảng rỗng. Mã không xác định hoặc không truy cập được trả về 400 INVALID_SHIPPING_CHANNEL cho toàn bộ yêu cầu.
Ví dụ yêu cầu đầy đủ {#complete-request}
Định dạng A với điểm đến, kích thước, giá trị khai báo, thuộc tính, dịch vụ và bộ lọc kênh:
{
"destination": {
"country_code": "US",
"subdivision_code": "US-CA",
"region": "California",
"postal_code": "90001"
},
"weight_kg": 2.05,
"length_cm": 30,
"width_cm": 20,
"height_cm": 10,
"declared_value": {
"amount": 5000,
"currency": "CNY"
},
"attributes": [
"GENERAL_CARGO"
],
"services": {
"channel": [
{
"code": "LINE_INSURANCE",
"quantity": 1
}
],
"outbound": [
{
"code": "VACUUM_PACKING",
"quantity": 1
}
],
"inbound": [
{
"code": "PHOTO",
"quantity": 3
}
]
},
"channel_codes": [
"US-SEA"
]
}Phản hồi {#response}
{
"success": true,
"estimate_type": "DECLARED",
"completeness": {
"level": "HIGH",
"destination": "COMPLETE",
"package_dimensions": "COMPLETE",
"package_split": "DECLARED",
"declared_value": "PROVIDED",
"attributes": "DECLARED",
"services": "REQUESTED_ONLY"
},
"warnings": [
{
"code": "WAREHOUSE_REVIEW_REQUIRED",
"message": "Final charges require warehouse measurement, packing and service review.",
"affects": [
"FINAL_CHARGES"
]
}
],
"quotes": [
{
"channel": {
"code": "US-SEA",
"name": "US Ocean",
"description": "General cargo line",
"tags": [
"GREAT_VALUE"
],
"capabilities": {
"delivery_methods": [
"DOOR_DELIVERY",
"PICKUP"
]
}
},
"available": true,
"quote_status": "COMPLETE",
"unavailable_reason": null,
"attribute_evaluation": {
"status": "SUPPORTED",
"declared_attributes": [
{
"code": "GENERAL",
"name": "General cargo"
}
],
"accepted_attributes": [
{
"code": "GENERAL",
"name": "General cargo"
}
],
"unsupported_attributes": []
},
"matched_region": {
"code": "US-WEST",
"name": "US West",
"match_type": "COUNTRY_REGION"
},
"packages": [
{
"reference": "box-1",
"weight": {
"value": 2.05,
"unit": "KG"
},
"dimensions": {
"length": 30,
"width": 20,
"height": 10,
"unit": "CM"
},
"weights": {
"actual": {
"value": 2.05,
"unit": "KG"
},
"volumetric": {
"value": 1,
"unit": "KG"
},
"chargeable": {
"value": 2.5,
"unit": "KG"
}
}
}
],
"weights": {
"actual": {
"value": 2.05,
"unit": "KG"
},
"volumetric": {
"value": 1,
"unit": "KG"
},
"chargeable": {
"value": 2.5,
"unit": "KG"
}
},
"billing_quantity": {
"value": 2.5,
"unit": "KG"
},
"pricing_selector": {
"type": "WEIGHT",
"value": 2.5,
"unit": "KG",
"scope": "SHIPMENT"
},
"transit_time": {
"text": "15-18 business days",
"min_business_days": 15,
"max_business_days": 18
},
"charges": {
"base_freight": {
"amount": 10000,
"currency": "CNY"
},
"channel_services": {
"amount": 550,
"currency": "CNY",
"known_amount": 550,
"calculation_status": "CALCULATED",
"items": []
},
"channel_rules": {
"amount": 0,
"currency": "CNY",
"known_amount": 0,
"calculation_status": "CALCULATED",
"items": [],
"aggregation": "SUM_ALL",
"cap": null
},
"outbound_services": {
"amount": 800,
"currency": "CNY",
"known_amount": 800,
"calculation_status": "CALCULATED",
"items": []
},
"inbound_services": {
"amount": 300,
"currency": "CNY",
"known_amount": 300,
"calculation_status": "CALCULATED",
"items": []
},
"adjustments": {
"amount": 0,
"currency": "CNY",
"known_amount": 0,
"calculation_status": "CALCULATED",
"items": []
}
},
"display_charges": {
"addition": {
"amount": 0,
"currency": "CNY",
"included_in_total": false
},
"floor": {
"amount": 0,
"currency": "CNY",
"included_in_total": false
}
},
"total": {
"amount": 11650,
"currency": "CNY"
},
"known_total": {
"amount": 11650,
"currency": "CNY"
},
"warnings": [],
"service_adjustment_possible": true
}
],
"monetary_unit": "CNY_minor",
"generated_at": "2026-09-07T08:00:00Z",
"request_id": "req_xxx",
"disclaimer": "Estimated charges based on declared data."
}Trường cấp cao
| Trường | Mô tả |
|---|---|
success | true khi ước tính thành công, kể cả khi một số báo giá là UNAVAILABLE. |
estimate_type | DECLARED — dựa trên dữ liệu khai báo, không phải đo tại kho. |
completeness | Mức đầy đủ của đầu vào. Không phải bảo đảm giao được. |
warnings | Cảnh báo cấp lô hàng. |
quotes | Kết quả theo kênh: đầy đủ trước, rồi một phần/cần rà soát, rồi không khả dụng. |
monetary_unit | Luôn là CNY_minor. |
generated_at | Dấu thời gian phản hồi. |
request_id | Đối chiếu với x-request-id. |
disclaimer | Tuyên bố miễn trừ ước tính, dạng đọc được. |
completeness
| Trường | Ý nghĩa |
|---|---|
level | Độ phủ đầu vào tổng thể, ví dụ HIGH. |
destination | Điểm đến đầy đủ đến mức nào (COMPLETE khi có quốc gia). |
package_dimensions | Đã cung cấp dài/rộng/cao hay chưa. |
package_split | DECLARED khi bạn gửi packages[]; cú pháp tắt là giả định một kiện. |
declared_value | PROVIDED hoặc bỏ/chưa biết. |
attributes | Đã khai báo thuộc tính hàng hay chưa. |
services | REQUESTED_ONLY khi bạn gửi dịch vụ đã chọn; kho vẫn có thể thêm. |
Trạng thái báo giá {#quote-status}
Không quyết định chỉ từ available. Luôn đọc quote_status.
quote_status | available | total | Ý nghĩa |
|---|---|---|---|
COMPLETE | true | Đối tượng tiền | Ngân sách đầy đủ bạn có thể hiển thị. Vẫn chưa khóa. |
PARTIAL | true | thường null | Thiếu đầu vào. Đọc cảnh báo và bổ sung kích thước, mã bưu chính hoặc giá trị khai báo. |
REVIEW_REQUIRED | true | thường null | Cần đo tại kho hoặc rà soát thủ công. |
UNAVAILABLE | false | null | Kênh này không báo giá được. Yêu cầu HTTP vẫn thành công. |
totallà ngân sách đầy đủ khi đã biết.known_totallà tổng phí có thể tính ngay.- Khi
totallànull, không coiknown_totallà báo giá đầy đủ. unavailable_reason.codedùng cho xử lý chương trình.unavailable_reason.messagechỉ để hiển thị.
UNAVAILABLE trên một báo giá không phải lỗi HTTP.
Đối tượng báo giá {#quotes}
| Trường | Mô tả |
|---|---|
channel | { code, name, description, tags, capabilities } — cùng định danh với catalog kênh. |
channel.capabilities.delivery_methods | Mảng tùy chọn, tương thích ngược gồm các mã giao hàng ổn định: DOOR_DELIVERY, PICKUP, POST_OFFICE_PICKUP. Có thể xuất hiện ở mọi trạng thái; client cũ có thể bỏ qua. |
available | Kênh này có tạo ước tính dùng được hay không. Ghép với quote_status. |
quote_status | COMPLETE · PARTIAL · REVIEW_REQUIRED · UNAVAILABLE. |
unavailable_reason | { code, message } hoặc null. |
attribute_evaluation | Kết quả tùy chọn theo từng kênh: SUPPORTED, UNSUPPORTED hoặc NOT_DECLARED, kèm danh sách thuộc tính đã khai báo, được chấp nhận và không được hỗ trợ. |
matched_region | { code, name, match_type } hoặc null. |
packages | Kiện khai báo hoặc ánh xạ kèm cân nặng từng kiện. |
weights | actual / volumetric / chargeable cấp lô hàng tính bằng KG. |
billing_quantity | Số lượng kênh thực sự tính cước, đơn vị KG, M3 hoặc KG_PER_M3. |
pricing_selector | Cách số lượng đó chạm bậc bảng giá (type, value, unit, scope). |
transit_time | Thời gian vận chuyển tham chiếu. |
charges | Nhóm phí. Xem bên dưới. |
display_charges | Hàng chỉ dùng cho UI tùy chọn. Nếu included_in_total là false, không cộng vào total. |
total / known_total | Ngân sách đầy đủ so với phí đã biết hiện tại. |
warnings | Cảnh báo cấp kênh. |
service_adjustment_possible | true nếu xử lý tại kho vẫn có thể đổi dịch vụ và phí. |
Cân nặng và số lượng tính cước {#weights}
actual— cân nặng khai báo hoặc đo được.volumetric— cân nặng thể tích.chargeable— cân nặng dùng tính cước vận chuyển.billing_quantity— số lượng kênh tính cước (có thể là cân nặng, thể tích hoặc mật độ).pricing_selector— cách số lượng đó chọn hàng bảng giá. Kiểu khớp catalogWEIGHT/VOLUME/DENSITY.- Kênh nhiều kiện có thể làm tròn theo thùng rồi cộng. Khi
pricing_selector.scopelàPER_PACKAGE, đọc từngpackages[].pricing_selector.
Phí {#charges}
| Nhóm | Ý nghĩa |
|---|---|
base_freight | Cước quốc tế cơ bản |
channel_services | Dịch vụ kênh bắt buộc và do developer chọn |
channel_rules | Quá khổ, quá nặng, giá trị khai báo và quy tắc tuyến khác |
outbound_services | Dịch vụ giá trị gia tăng khi chuẩn bị / xử lý xuất kho |
inbound_services | Dịch vụ giá trị gia tăng khi tiếp nhận / xử lý nhập kho |
adjustments | Điều chỉnh |
Dịch vụ nhập kho và xuất kho
inbound_services và outbound_services thuộc hai giai đoạn khác nhau của dịch vụ giá trị gia tăng tại kho. Dịch vụ nhập kho được thực hiện khi kho tiếp nhận hàng, chẳng hạn chụp ảnh kiện hàng, quay video hoặc kiểm tra. Dịch vụ xuất kho được thực hiện khi chuẩn bị lô hàng, chẳng hạn gia cố kiện hàng, đóng gói hút chân không hoặc đóng khung/thùng gỗ. Các dịch vụ ở cả hai giai đoạn có thể cùng áp dụng và được tính phí hợp lệ cho một kiện hàng hoặc lô hàng.
Số tiền trong Shipping Quote chỉ là ước tính; việc yêu cầu báo giá không tạo ra một khoản phí dịch vụ bổ sung. Phí cuối cùng được xác định theo dịch vụ thực tế đã thực hiện cùng mức giá và quyết toán cuối cùng. Hãy dùng cả hai nhóm để ước tính tổng chi phí fulfillment và đối chiếu từng khoản ước tính với phí thực tế tương ứng. Không cộng lại khoản ước tính của cùng một dịch vụ lên trên phí cuối cùng của dịch vụ đó.
Ví dụ theo đơn vị nhỏ nhất CNY: ảnh kiện hàng 50 fen (¥0,50), kiểm tra 100 fen (¥1,00), đóng gói hút chân không 150 fen (¥1,50), gia cố kiện hàng 200 fen (¥2,00). Cả bốn khoản có thể cùng tồn tại vì đây là các dịch vụ khác nhau ở các giai đoạn fulfillment khác nhau.
Mỗi nhóm thường gồm:
| Trường | Ý nghĩa |
|---|---|
amount | Tổng nhóm tính bằng fen, hoặc null nếu chưa biết |
currency | CNY |
known_amount | Tổng các mục có thể tính ngay |
calculation_status | Ví dụ CALCULATED |
items | Các dòng phí |
channel_rules cũng có thể gồm aggregation và cap. Dùng tổng phụ của nhóm — không thay bằng cách cộng các mục quy tắc thô.
SUM_ALL cộng mọi phí khớp. HIGHEST_ONLY chỉ chọn mức cao nhất sau khi sắp xếp giảm dần; các quy tắc cùng giá là tương đương. cap=null nghĩa là không giới hạn. reason chỉ dùng để hiển thị. Với logic chương trình, dùng condition_match, matched_conditions, rule_type, charge_mode, charge_value, outcome và missing_fields. PENDING_INPUT, REVIEW_REQUIRED và các quy tắc chưa tính khác không được đưa vào tổng đã biết. amount=null không phải là 0 và charge_value đã cấu hình không phải khoản phí thực tế.
Mục phí
| Trường | Ý nghĩa |
|---|---|
code | Mã phí hoặc dịch vụ ổn định |
name | Tên hiển thị đã bản địa hóa |
category | Danh mục phí |
source | MANDATORY · DEVELOPER_SELECTED · RULE_ENGINE |
pricing_basis | Cách dòng được định giá |
quantity | Số lượng tính cước của dòng |
unit_price | Đơn giá bằng fen khi đã biết |
amount | Tổng dòng. null nghĩa là chưa biết, không phải số không. |
estimated | Dòng vẫn còn là ước tính hay không |
calculation_status | Trạng thái tính toán |
affected_by_packages | Số lượng/kích thước kiện có thể đổi dòng này hay không |
included_in_total | Nếu false, không cộng lại vào total |
display_charges có thể chỉ tồn tại cho trình bày frontend.
Lý do không khả dụng {#unavailable-reasons}
Các giá trị unavailable_reason.code thường gặp:
OUTSIDE_PRICING_RANGE
POSTAL_CODE_REQUIRED
POSTAL_CODE_NOT_SUPPORTED
DESTINATION_NOT_SUPPORTED
ATTRIBUTE_NOT_SUPPORTED
SERVICE_NOT_SUPPORTED
DIMENSIONS_REQUIRED
DECLARED_VALUE_REQUIRED
MULTI_PACKAGE_NOT_SUPPORTED
PRICING_MODE_UNSUPPORTED
CHANNEL_RULE_REJECTED
CHANNEL_PRICING_ERRORKênh không khả dụng vẫn nằm trong quotes[] để bạn giải thích lý do bị từ chối.
Thuật ngữ catalog {#catalog-terminology}
| Kênh vận chuyển | API này | Ý nghĩa |
|---|---|---|
items[].code/name/description/tags | quotes[].channel.* | Cùng một kênh |
regions[].code/name/match_type | quotes[].matched_region.* | Khu vực được báo giá chọn |
value_added_services[].code | services.channel[].code và code của phí | Mã dịch vụ ổn định |
billing.quantity_unit | billing_quantity.unit / pricing_selector.unit | Đơn vị tính cước |
rule_summary.aggregation | charges.channel_rules.aggregation | Cộng quy tắc |
rule_summary.cap | charges.channel_rules.cap | Giới hạn sau khi cộng; null nghĩa là không giới hạn |
Thuộc tính hàng {#item-attributes}
GET /v1/fulfillment/shipments/item-attributes trả về các mã attributes[] hợp lệ cho báo giá.
Lỗi {#errors}
| HTTP | error.code | Khi nào |
|---|---|---|
| 400 | VALIDATION_ERROR | Cấu trúc không hợp lệ, định dạng yêu cầu hỗn hợp, đơn vị KG/CM, mã trùng, hoặc channel_codes rỗng |
| 400 | INVALID_SHIPPING_CHANNEL | Một giá trị channel_codes được yêu cầu không xác định hoặc app không thấy |
| 401 | INVALID_API_KEY | Thiếu hoặc Bearer token không hợp lệ |
| 403 | FULFILLMENT_MODE_NOT_SUPPORTED | App dùng self fulfillment |
| 403 | WAREHOUSE_AUTH_INVALID | Ủy quyền kho thiếu, bị từ chối hoặc hết hạn |
| 422 | INVALID_COUNTRY_CODE | Quốc gia đích không hợp lệ |
| 422 | INVALID_ITEM_ATTRIBUTE | Một mã thuộc tính không hợp lệ |
| 502 | WAREHOUSE_UPSTREAM_ERROR | Dịch vụ kho thất bại; thử lại với backoff |
Không có mã công khai riêng AUTHENTICATION_ERROR, WAREHOUSE_AUTH_REQUIRED hay WAREHOUSE_SERVICE_UNAVAILABLE. Dùng 401 INVALID_API_KEY, 403 WAREHOUSE_AUTH_INVALID và 502 WAREHOUSE_UPSTREAM_ERROR.
Kênh không thể nhận lô hàng này là báo giá UNAVAILABLE, không phải thất bại HTTP.
Liên quan {#related}
- Kênh vận chuyển — khả năng, phủ sóng và mã dịch vụ
- Lô hàng — tạo lô hàng sau khi kiện đã nhập kho
- Tổng quan fulfillment
Get Support
Need integration help? Contact Developer Support at support@hiobuy.com · Response within 1–2 business days