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.

KonfigurationZweck
hio_test_*Mock / Fixture API-Tests
hio_live_* + WH-DEVIntegrationstests mit zugewiesenem Lager und Testdaten
hio_live_* + Production-Lager-AutorisierungLive-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)

BereichSandbox
Globalresponse_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/ticketsList/Detail/Reply gemockt mit tkt_*-Fixtures.
WebhooksSandbox-Ressourcen senden keine Webhooks automatisch. Nutzen Sie Portal Send test (livemode: false) zur Prüfung von Empfänger und Signatur.

Designziele

ZielBedeutung
WiederholbarGleiche Anfrage → gleiche Antwort (keine Zufälligkeit in Ergebnissen).
DokumentiertJedes Szenario hat eine stabile ID oder ein Keyword zum Suchen auf dieser Seite.
VertragskonformJSON entspricht standard-Schemafeldern aus Production; Werte unterscheiden sich.
Happy Path StandardUnbekannte IDs fallen auf generische Erfolgs-Mocks zurück.
Expliziter FehlerVerwenden Sie sb_*-IDs oder sandbox_trigger für erzwungene Fehler / Grenzzustände.

Benennung: sb_{domain}_{scenario}

SegmentRegelBeispiele
PräfixImmer sb_sb_prod_not_found
domainSubstantiv in Kleinbuchstaben (prod, search, ord, shp, pkg, plat, …)
scenariosnake_casenot_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 idErgebnisHTTP
(jede Nicht-sb_-ID)Standard-Mock-Produkt200
sb_prod_not_foundNOT_FOUND404
sb_prod_offlinePRODUCT_UNAVAILABLE422
sb_prod_no_stockDetail ok, stock: 0200
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 TextMock-Liste mit Treffern
sb_search_emptyitems: [], total: 0
sb_search_not_foundAlias für leer

Parse / upload-image / search-by-image / freight / analytics

EndpointSandbox-Hinweis
Parse URLURL-Query/Pfad mit sb_* spiegelt Detail-Verhalten.
Upload imageImmer { "image_id": "img_sandbox_mock" } nach bestandener Validierung.
Image searchOptionales keyword: sb_search_empty liefert leere Liste; mit upload-image für Flow-Tests kombinieren.
Advanced — freight estimateStandard-Inlandsfracht-Mock 800 Minor Units, abgestimmt mit Preview.
Advanced — batch-checkLiefert Upstream-Style-Envelope mit Mock mpProducts; sb_prod_not_found in mi_id/item_id für Ausschlusslisten.
Advanced — top keywords/list / daily-sales-trendsb_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_idTypischer statusHinweise
sb_ord_unpaidwait_payment
sb_ord_paidwait_shipment
sb_ord_shippedwait_receive
sb_ord_completedcompleted
sb_ord_cancelledcancelled
sb_ord_refundingwait_shipment (refund_status in progress)
sb_ord_not_found404

POST /v1/orders/pay

order_idErgebnisHTTP
sb_ord_unpaidZahlung erfolgreich → logischer Paid-Zustand200
sb_ord_pay_declinedPAYMENT_DECLINED402
sb_ord_pay_insufficientPAYMENT_INSUFFICIENT_FUNDS402
sb_ord_paidORDER_ALREADY_PAID409
sb_ord_cancelledORDER_CANCELLED409
sb_ord_upstream_timeoutCHANNEL_UPSTREAM_ERROR502

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

EndpointSandbox-Hinweis
GET /v1/fulfillment/balanceMock verfügbares Guthaben 500000 CNY Minor Units.
POST /v1/fulfillment/shipping/quotesBenötigt destination.country_code + Gewicht oder Maße; Legacy …/shipments/freight/estimate funktioniert weiterhin.
GET /v1/fulfillment/locationsloc_wh_001 (Weihai), loc_sz_001 (Shenzhen, pausiert), loc_yw_001 (Yiwu).
GET /v1/fulfillment/value-added-servicesStabile 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 / idBehavior
sb_shp_unpaidList + detail PENDING; intercept → SHIPMENT_NOT_INTERCEPTABLE
sb_shp_shippedShipped detail: split boxes, first/last-mile legs, packing files; plus international tracking events. Intercept → REQUESTED
sb_shp_not_foundDetail 404
sb_shp_pay_insufficientPOST …/shipments/sb_shp_pay_insufficient/payINSUFFICIENT_BALANCE
sb_shp_not_cancellableCancel → SHIPMENT_NOT_CANCELLABLE; intercept is allowed (WAIT_SHIP)
sb_shp_signedSigned; intercept → SHIPMENT_NOT_INTERCEPTABLE
sb_shp_interceptedDetail SHIPPED + interception.status: INTERCEPTED; intercept again → SHIPMENT_INTERCEPTION_ALREADY_REQUESTED
Dynamic sbs_*Create / pay / list / detail / cancel / intercept against sandbox storage
sb_parcel_not_foundCreate → 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-WertFeldHTTPerror.code
sb_inbound_shippedtracking_number409INBOUND_TRACKING_ALREADY_SHIPPED
sb_inbound_existstracking_number409INBOUND_TRACKING_ALREADY_EXISTS
sb_inbound_bad_trackingtracking_number422INVALID_TRACKING_NUMBER
sb_inbound_external_existsexternal_order_id409EXTERNAL_ORDER_ID_ALREADY_EXISTS
sb_vas_missingservices[].service_code422VALUE_ADDED_SERVICE_NOT_FOUND
sb_vas_unavailableservices[].service_code422VALUE_ADDED_SERVICE_UNAVAILABLE
sb_vas_outboundservices[].service_code422VALUE_ADDED_SERVICE_INVALID_STAGE
Cancel-IDHTTPerror.code
Dynamisch sbi_* (nach create)200Storniert; zugehöriges Package verworfen
Dieselbe sbi_* erneut409INBOUND_NOT_EDITABLE
sb_inb_not_found404INBOUND_NOT_FOUND
sb_inb_received409INBOUND_ALREADY_RECEIVED
sb_inb_shipped / sb_inb_consolidated / sb_inb_cancelled409INBOUND_NOT_EDITABLE

Packages · Tracking · List

package_idDetail / Tracking
Dynamisch pkg_*PENDING; Tracking startet bei INBOUND_CREATED
sb_pkg_pendingPENDING
sb_pkg_receivedRECEIVED + PHOTO-Timeline
sb_pkg_exceptionRECEIVED + condition.EXCEPTION
sb_pkg_shippedSHIPPED volle Outbound-Timeline
sb_pkg_not_found404 PACKAGE_NOT_FOUND

Unclaimed packages

Id / TriggerVerhalten
ucp_01K2ABCDEF1234567890Claimable; echte Tracking-Nr. SF123456789012 (Liste maskiert)
ucp_01K2ABCDEF9876543210Claimable; YT738800001148
sb_ucp_not_found404 UNCLAIMED_PACKAGE_NOT_FOUND
sb_ucp_already_claimed409 PACKAGE_ALREADY_CLAIMED
sb_ucp_not_claimable409 PACKAGE_NOT_CLAIMABLE
Falsches Tracking ×5 auf derselben ucp429 CLAIM_ATTEMPTS_EXCEEDED

Returns

IdVerhalten
ret_pending_001PENDING; fee=18; Confirm erfolgreich
ret_pending_002PENDING; fee=20; Confirm mit 18 → RETURN_FEE_CHANGED
ret_returned_001RETURNED + Tracking
ret_cancelled_001CANCELLED
sb_ret_not_found404 RETURN_NOT_FOUND
sb_ret_fee_not_readyConfirm → RETURN_FEE_NOT_READY
sb_ret_insufficientConfirm → INSUFFICIENT_BALANCE
Create auf sb_pkg_shipped409 PACKAGE_NOT_RETURNABLE

Service requests

IdVerhalten
svc_photo_completedPHOTO COMPLETED + Images
svc_inspection_failedBASIC_INSPECTION FAILED
svc_video_processingVIDEO PROCESSING
svc_reinforce_pendingPACKAGE_REINFORCEMENT PENDING
svc_wooden_awaitingWOODEN_FRAME wartet auf Bestätigung
sb_svc_not_found404
sb_svc_fee_not_ready / sb_svc_insufficientConfirm-Grenzfälle

Finance (transactions / invoices)

FixtureHinweis
txn_01K2ABC001006TOP_UP / VAS / RETURN / SHIPPING / REFUND / STORAGE
inv_01K2ABC001ISSUED (downloadbar)
inv_01K2ABC002PENDING
inv_01K2ABC003REJECTED

Siehe Fulfillment finance.

Support-Ticket-Fixtures

Fixture idSzenario
tkt_01K2ABCDEF1234567890PACKAGE · NORMAL · WAITING_FOR_HIOBUY
tkt_01K2ABCDEF9876543210RETURN · URGENT · WAITING_FOR_CUSTOMER
tkt_01K2ABCDEFAPIRESOLVEDAPI · NORMAL · RESOLVED
tkt_01K2ABCDEFSHIPCLOSEDSHIPMENT · NORMAL · CLOSED (keine Replies)
tkt_not_found404 TICKET_NOT_FOUND

Siehe Support tickets.

Plattform-Trigger: sandbox_trigger

Nur auf hio_test_* erlaubt; Production-Schlüssel ignorieren das Feld still.

sandbox_triggerHTTPerror.code
sb_plat_quota_exceeded429QUOTA_EXCEEDED
sb_plat_rate_limited429RATE_LIMIT_EXCEEDED
sb_plat_upstream_error502CHANNEL_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)

PhaseAbdeckungHinweise
ShippedProducts, Procurement Orders, Fulfillment (Balance/Quotes/Shipments/Inbounds/Packages/Unclaimed/Returns/Locations/VAS/Service-Requests/Finance), Support TicketsSpiegelt Public-API-Teilmenge auf dieser Site.
Not yetAutomatisch emittierte Sandbox-Webhooks; unveröffentlichte OpenAPI-only-Katalog-ErweiterungenPortal 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_EXCEEDED

Beim 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

Email support