Sandbox-Umgebung und Fixtures
Zielgruppe: Integrationen gegen
https://api.hiobuy.com(Workers-Gateway) — dieselbe Basis-URL wie in Production.
Auth: Deterministische Fixtures gelten nur für API-Schlüssel mit Präfix hio_test_* (key_type: test). hio_live_* Production-Schlüssel beachten nie die Regeln dieser Seite — sie rufen Upstream-Marktplätze / Warehouses stets normal auf.
Verwandte Docs: Authentication · Response format · Errors · Rate limits · Products · Orders · Fulfillment · Webhooks
Wichtig: Warehouse-Fulfillment-Tests
Die Sandbox API (hio_test_*) ist für Mock- und Fixture-basierte Integrationstests gedacht.
Wenn HIOBuy Ihrer Anwendung einen WH-DEV Warehouse Developer Code zugewiesen hat, verwenden Sie nicht den Sandbox API Key, um Ihre zugewiesene Lagerkonfiguration zu testen.
Verwenden Sie:
Production API Key (hio_live_*) + WH-DEV
WH-DEV ist weiterhin eine Test-Lagerkonfiguration. Ein Production API Key mit WH-DEV bedeutet nicht, dass Ihre Anwendung Live-Warehouse-Fulfillment ausführt.
| Konfiguration | Zweck |
|---|---|
hio_test_* | Mock / Fixture API-Tests |
hio_live_* + WH-DEV | Integrationstests mit zugewiesenem Lager und Testdaten |
hio_live_* + Production-Lager-Autorisierung | Live-Warehouse-Fulfillment |
Sandbox-Fulfillment-Endpunkte liefern vordefinierte oder simulierte Daten. Sandbox-Lagerstandorte, Salden, Pakete, Versandrouten und Paketstatus können von der WH-DEV-Konfiguration Ihrer Anwendung abweichen.
Validieren Sie WH-DEV-Integrationen immer mit Ihrem Production API Key.
Public-API-Abdeckung (Überblick)
| Bereich | Sandbox |
|---|---|
| Global | response_format: upstream abgelehnt (nur standard). currency-Body-Feld abgelehnt wie in prod. sandbox_trigger erlaubt für Test-Schlüssel (Plattform-Fixtures). Channel-OAuth als autorisiert behandelt für hio_test_*. Quotas & Rate Limits übersprungen für Test-Schlüssel. |
/v1/products/* | Search, Detail, Parse, Upload-Image, Search-by-Image, Freight Estimate, Batch-Check, 1688-Analytics-Endpunkte gemockt wie unten dokumentiert. OpenAPI-only-Erweiterungen außerhalb des Handoff-Sets dieser Site nicht gemockt. |
/v1/orders/* | Preview, Create, Detail, Pay, Cancel, Logistics Trace, List, Purchase Query gemockt mit Magic-/Dynamic-IDs. |
/v1/fulfillment/* | Balance, Quotes, Shipments, Inbounds, Packages, Unclaimed, Returns, Locations, VAS, Service-Requests, Finance gemockt mit Magic-/Dynamic-IDs (siehe unten). |
/v1/support/tickets | List/Detail/Reply gemockt mit tkt_*-Fixtures. |
| Webhooks | Sandbox-Ressourcen senden keine Webhooks automatisch. Nutzen Sie Portal Send test (livemode: false) zur Prüfung von Empfänger und Signatur. |
Designziele
| Ziel | Bedeutung |
|---|---|
| Wiederholbar | Gleiche Anfrage → gleiche Antwort (keine Zufälligkeit in Ergebnissen). |
| Dokumentiert | Jedes Szenario hat eine stabile ID oder ein Keyword zum Suchen auf dieser Seite. |
| Vertragskonform | JSON entspricht standard-Schemafeldern aus Production; Werte unterscheiden sich. |
| Happy Path Standard | Unbekannte IDs fallen auf generische Erfolgs-Mocks zurück. |
| Expliziter Fehler | Verwenden Sie sb_*-IDs oder sandbox_trigger für erzwungene Fehler / Grenzzustände. |
Benennung: sb_{domain}_{scenario}
| Segment | Regel | Beispiele |
|---|---|---|
| Präfix | Immer sb_ | sb_prod_not_found |
domain | Substantiv in Kleinbuchstaben (prod, search, ord, shp, pkg, plat, …) | — |
scenario | snake_case | not_found, pay_declined |
Zeichen: [a-z0-9_], Länge ≤ ~48. Nicht echte Upstream-IDs mit sb_ präfixen, es sei denn, Sie wollen die Fixture. Einige Fulfillment-Ressourcen nutzen auch stabile Nicht-sb_-IDs (ret_*, ucp_*, svc_*, tkt_*, inv_*).
Zwei Fehlerschichten
Unterscheiden Sie Transport-/API-Fehler von HTTP-200-Geschäftszuständen:
- API-Fehler → HTTP 4xx/5xx +
error.code(z. B.NOT_FOUND,PAYMENT_DECLINED). - HTTP 200 mit Zustand → z. B.
variants[].stock = 0,status: wait_payment.
Produkt-Fixtures (Überblick)
POST /v1/products/detail
Siehe Product detail. Format upstream in Sandbox nicht unterstützt.
Auslöser, wenn id, product_id, geparste url, mi_id oder tao_password zu einer sb_*-ID aufgelöst wird.
| Fixture id | Ergebnis | HTTP |
|---|---|---|
(jede Nicht-sb_-ID) | Standard-Mock-Produkt | 200 |
sb_prod_not_found | NOT_FOUND | 404 |
sb_prod_offline | PRODUCT_UNAVAILABLE | 422 |
sb_prod_no_stock | Detail ok, stock: 0 | 200 |
curl https://api.hiobuy.com/v1/products/detail \
-H "Authorization: Bearer hio_test_..." \
-H "Content-Type: application/json" \
-d '{"channel":"1688","product_id":"sb_prod_not_found","language":"en"}'POST /v1/products/search
channel, keyword, page, page_size, language gelten. 1688 filter / sort / Preisfilter akzeptiert, aber für Mock-Zeilen ignoriert.
keyword (exakt) | Ergebnis |
|---|---|
| gewöhnlicher Text | Mock-Liste mit Treffern |
sb_search_empty | items: [], total: 0 |
sb_search_not_found | Alias für leer |
Parse / upload-image / search-by-image / freight / analytics
| Endpoint | Sandbox-Hinweis |
|---|---|
| Parse URL | URL-Query/Pfad mit sb_* spiegelt Detail-Verhalten. |
| Upload image | Immer { "image_id": "img_sandbox_mock" } nach bestandener Validierung. |
| Image search | Optionales keyword: sb_search_empty liefert leere Liste; mit upload-image für Flow-Tests kombinieren. |
| Advanced — freight estimate | Standard-Inlandsfracht-Mock 800 Minor Units, abgestimmt mit Preview. |
| Advanced — batch-check | Liefert Upstream-Style-Envelope mit Mock mpProducts; sb_prod_not_found in mi_id/item_id für Ausschlusslisten. |
| Advanced — top keywords/list / daily-sales-trend | sb_search_empty auf category_id / rank_id wo dokumentiert für leere Listen oder 404-Detail-Fälle. |
Bestell- und Zahlungs-Fixtures (Magic-IDs)
POST /v1/orders/detail
order_id | Typischer status | Hinweise |
|---|---|---|
sb_ord_unpaid | wait_payment | — |
sb_ord_paid | wait_shipment | — |
sb_ord_shipped | wait_receive | — |
sb_ord_completed | completed | — |
sb_ord_cancelled | cancelled | — |
sb_ord_refunding | wait_shipment (refund_status in progress) | — |
sb_ord_not_found | — | 404 |
POST /v1/orders/pay
order_id | Ergebnis | HTTP |
|---|---|---|
sb_ord_unpaid | Zahlung erfolgreich → logischer Paid-Zustand | 200 |
sb_ord_pay_declined | PAYMENT_DECLINED | 402 |
sb_ord_pay_insufficient | PAYMENT_INSUFFICIENT_FUNDS | 402 |
sb_ord_paid | ORDER_ALREADY_PAID | 409 |
sb_ord_cancelled | ORDER_CANCELLED | 409 |
sb_ord_upstream_timeout | CHANNEL_UPSTREAM_ERROR | 502 |
Preview / create
Preview liefert feste illustrative Summen (Beispielzeile ~4500 + Fracht ~800 in Minor Units). Create erzeugt dynamische order_id-Werte mit Präfix sbo_*, persistiert in Sandbox-Storage — Zeilen mit offer_id: sb_prod_offline / sb_prod_no_stock liefern 422 wie Production-Semantik.
Cancel / logistics / list / purchase query
Laut cancel, trace, detail list: unbezahlte sb_ord_* und dynamische unbezahlte sbo_* stornierbar; Paid/Shipped/etc.-Fixtures liefern ORDER_NOT_CANCELLABLE. Logistics liefert Packages für sb_ord_shipped / completed-Mocks; unpaid/paid-await-shipment liefern packages: []. Käuferliste respektiert product_name: sb_ord_list_empty für leere Mocks. Purchase query liefert Upstream-Envelopes; omitieren Sie entsprechend not-found-Pseudo-IDs.
Fulfillment-Fixtures
Hinweis: Die Fixtures unten gelten nur für Sandbox-API-Tests. Sie repräsentieren nicht die WH-DEV-Lagerkonfiguration Ihrer Anwendung. Für WH-DEV-Tests verwenden Sie einen Production API Key (
hio_live_*).
Alle Endpunkte unten erfordern einen hio_test_*-Schlüssel. Dynamische IDs aus Create (pkg_*, sbs_*, sbi_*, …) werden in der Sandbox-Storage für den Schlüssel persistiert.
Balance · Quotes · Locations · VAS-Katalog
| Endpoint | Sandbox-Hinweis |
|---|---|
GET /v1/fulfillment/balance | Mock verfügbares Guthaben 500000 CNY Minor Units. |
POST /v1/fulfillment/shipping/quotes | Benötigt destination.country_code + Gewicht oder Maße; Legacy …/shipments/freight/estimate funktioniert weiterhin. |
GET /v1/fulfillment/locations | loc_wh_001 (Weihai), loc_sz_001 (Shenzhen, pausiert), loc_yw_001 (Yiwu). |
GET /v1/fulfillment/value-added-services | Stabile CODE-Preisliste; LEGACY_PHOTO_PRINT ist INACTIVE → bei Anfrage nicht verfügbar. |
Shipments
Live warehouse Public id is the numeric PK as a string (e.g. "115"); order_sn is the warehouse order number. Sandbox create returns sbs_*; fixtures below use sb_shp_*.
| Fixture / id | Behavior |
|---|---|
sb_shp_unpaid | List + detail PENDING; intercept → SHIPMENT_NOT_INTERCEPTABLE |
sb_shp_shipped | Shipped detail: split boxes, first/last-mile legs, packing files; plus international tracking events. Intercept → REQUESTED |
sb_shp_not_found | Detail 404 |
sb_shp_pay_insufficient | POST …/shipments/sb_shp_pay_insufficient/pay → INSUFFICIENT_BALANCE |
sb_shp_not_cancellable | Cancel → SHIPMENT_NOT_CANCELLABLE; intercept is allowed (WAIT_SHIP) |
sb_shp_signed | Signed; intercept → SHIPMENT_NOT_INTERCEPTABLE |
sb_shp_intercepted | Detail SHIPPED + interception.status: INTERCEPTED; intercept again → SHIPMENT_INTERCEPTION_ALREADY_REQUESTED |
Dynamic sbs_* | Create / pay / list / detail / cancel / intercept against sandbox storage |
sb_parcel_not_found | Create → 422 PARCEL_NOT_FOUND |
List path: GET /v1/fulfillment/shipments. Tracking path: GET /v1/fulfillment/shipments/{id}/tracking (language query).
Inbounds (create / cancel)
Create liefert dynamische package_id (pkg_*) — es gibt keine separate inbound_id.
| Trigger-Wert | Feld | HTTP | error.code |
|---|---|---|---|
sb_inbound_shipped | tracking_number | 409 | INBOUND_TRACKING_ALREADY_SHIPPED |
sb_inbound_exists | tracking_number | 409 | INBOUND_TRACKING_ALREADY_EXISTS |
sb_inbound_bad_tracking | tracking_number | 422 | INVALID_TRACKING_NUMBER |
sb_inbound_external_exists | external_order_id | 409 | EXTERNAL_ORDER_ID_ALREADY_EXISTS |
sb_vas_missing | services[].service_code | 422 | VALUE_ADDED_SERVICE_NOT_FOUND |
sb_vas_unavailable | services[].service_code | 422 | VALUE_ADDED_SERVICE_UNAVAILABLE |
sb_vas_outbound | services[].service_code | 422 | VALUE_ADDED_SERVICE_INVALID_STAGE |
| Cancel-ID | HTTP | error.code |
|---|---|---|
Dynamisch sbi_* (nach create) | 200 | Storniert; zugehöriges Package verworfen |
Dieselbe sbi_* erneut | 409 | INBOUND_NOT_EDITABLE |
sb_inb_not_found | 404 | INBOUND_NOT_FOUND |
sb_inb_received | 409 | INBOUND_ALREADY_RECEIVED |
sb_inb_shipped / sb_inb_consolidated / sb_inb_cancelled | 409 | INBOUND_NOT_EDITABLE |
Packages · Tracking · List
package_id | Detail / Tracking |
|---|---|
Dynamisch pkg_* | PENDING; Tracking startet bei INBOUND_CREATED |
sb_pkg_pending | PENDING |
sb_pkg_received | RECEIVED + PHOTO-Timeline |
sb_pkg_exception | RECEIVED + condition.EXCEPTION |
sb_pkg_shipped | SHIPPED volle Outbound-Timeline |
sb_pkg_not_found | 404 PACKAGE_NOT_FOUND |
Unclaimed packages
| Id / Trigger | Verhalten |
|---|---|
ucp_01K2ABCDEF1234567890 | Claimable; echte Tracking-Nr. SF123456789012 (Liste maskiert) |
ucp_01K2ABCDEF9876543210 | Claimable; YT738800001148 |
sb_ucp_not_found | 404 UNCLAIMED_PACKAGE_NOT_FOUND |
sb_ucp_already_claimed | 409 PACKAGE_ALREADY_CLAIMED |
sb_ucp_not_claimable | 409 PACKAGE_NOT_CLAIMABLE |
| Falsches Tracking ×5 auf derselben ucp | 429 CLAIM_ATTEMPTS_EXCEEDED |
Returns
| Id | Verhalten |
|---|---|
ret_pending_001 | PENDING; fee=18; Confirm erfolgreich |
ret_pending_002 | PENDING; fee=20; Confirm mit 18 → RETURN_FEE_CHANGED |
ret_returned_001 | RETURNED + Tracking |
ret_cancelled_001 | CANCELLED |
sb_ret_not_found | 404 RETURN_NOT_FOUND |
sb_ret_fee_not_ready | Confirm → RETURN_FEE_NOT_READY |
sb_ret_insufficient | Confirm → INSUFFICIENT_BALANCE |
Create auf sb_pkg_shipped | 409 PACKAGE_NOT_RETURNABLE |
Service requests
| Id | Verhalten |
|---|---|
svc_photo_completed | PHOTO COMPLETED + Images |
svc_inspection_failed | BASIC_INSPECTION FAILED |
svc_video_processing | VIDEO PROCESSING |
svc_reinforce_pending | PACKAGE_REINFORCEMENT PENDING |
svc_wooden_awaiting | WOODEN_FRAME wartet auf Bestätigung |
sb_svc_not_found | 404 |
sb_svc_fee_not_ready / sb_svc_insufficient | Confirm-Grenzfälle |
Finance (transactions / invoices)
| Fixture | Hinweis |
|---|---|
txn_01K2ABC001…006 | TOP_UP / VAS / RETURN / SHIPPING / REFUND / STORAGE |
inv_01K2ABC001 | ISSUED (downloadbar) |
inv_01K2ABC002 | PENDING |
inv_01K2ABC003 | REJECTED |
Siehe Fulfillment finance.
Support-Ticket-Fixtures
| Fixture id | Szenario |
|---|---|
tkt_01K2ABCDEF1234567890 | PACKAGE · NORMAL · WAITING_FOR_HIOBUY |
tkt_01K2ABCDEF9876543210 | RETURN · URGENT · WAITING_FOR_CUSTOMER |
tkt_01K2ABCDEFAPIRESOLVED | API · NORMAL · RESOLVED |
tkt_01K2ABCDEFSHIPCLOSED | SHIPMENT · NORMAL · CLOSED (keine Replies) |
tkt_not_found | 404 TICKET_NOT_FOUND |
Siehe Support tickets.
Plattform-Trigger: sandbox_trigger
Nur auf hio_test_* erlaubt; Production-Schlüssel ignorieren das Feld still.
sandbox_trigger | HTTP | error.code |
|---|---|---|
sb_plat_quota_exceeded | 429 | QUOTA_EXCEEDED |
sb_plat_rate_limited | 429 | RATE_LIMIT_EXCEEDED |
sb_plat_upstream_error | 502 | CHANNEL_UPSTREAM_ERROR |
Mit harmlosen IDs kombinieren, damit realistische Bodies validieren:
{
"channel": "1688",
"product_id": "123456",
"language": "en",
"sandbox_trigger": "sb_plat_quota_exceeded"
}Spezielle Auth-Fixture sb_auth_channel_required mit Triggern kann CHANNEL_AUTH_REQUIRED (403) für UI-Regressionen erzeugen trotz der Regel „authorized by default“.
Implementierungsstatus (Snapshot)
| Phase | Abdeckung | Hinweise |
|---|---|---|
| Shipped | Products, Procurement Orders, Fulfillment (Balance/Quotes/Shipments/Inbounds/Packages/Unclaimed/Returns/Locations/VAS/Service-Requests/Finance), Support Tickets | Spiegelt Public-API-Teilmenge auf dieser Site. |
| Not yet | Automatisch emittierte Sandbox-Webhooks; unveröffentlichte OpenAPI-only-Katalog-Erweiterungen | Portal Send test für Webhook-CI bevorzugen; nicht annehmen, dass alle Live-Events aktiviert sind, bis angekündigt. |
Kurz-Spickzettel
sb_prod_not_found → 404 product missing
sb_prod_offline → 422 unavailable
sb_prod_no_stock → 200 detail with zero stock
sb_search_empty → empty search/items
sb_ord_list_empty → empty buyer order list filter
img_sandbox_mock → stable upload-image id
sb_ord_unpaid → detail wait_payment • pay succeeds • cancel ok
sb_ord_pay_declined → pay 402 PAYMENT_DECLINED
sb_ord_paid → pay 409 ALREADY_PAID • trace maybe empty until shipped fixtures
sb_ord_shipped → detail wait_receive • trace populated
sb_ord_cancelled → cancelled state • pay conflicts
sb_shp_unpaid / sb_shp_shipped / sb_shp_signed / sb_shp_intercepted → shipment list / detail / intercept
sb_pkg_received / sb_pkg_shipped → package detail / fulfillment timeline
sb_inbound_exists → inbound create 409 tracking exists
ret_pending_001 → return confirm happy path
ucp_01K2ABCDEF1234567890 → unclaimed claimable
svc_photo_completed → VAS request completed
tkt_01K2ABCDEF1234567890 → support ticket open
sb_plat_quota_exceeded → sandbox_trigger → 429 QUOTA_EXCEEDEDBeim internen Hinzufügen von Fixtures dieses Nummerierungsschema in Regressionstests spiegeln — niemals standard-JSON-Formen in Mocks verändern.
Get Support
Need integration help? Contact Developer Support at support@hiobuy.com · Response within 1–2 business days