Entorno sandbox y fixtures
Audiencia: integraciones desplegadas contra
https://api.hiobuy.com(gateway Workers) — misma URL base que en producción.
Auth: las fixtures deterministas aplican solo a claves API con prefijo hio_test_* (key_type: test). Las claves de producción hio_live_* nunca usan las reglas de esta página — siempre acceden a los marketplaces / almacenes upstream con normalidad.
Documentación relacionada: Authentication · Response format · Errors · Rate limits · Products · Orders · Fulfillment · Webhooks
Importante: pruebas de Warehouse Fulfillment
La Sandbox API (hio_test_*) está pensada para pruebas de integración con mock y fixtures.
Si HIOBuy ha proporcionado a su aplicación un WH-DEV Warehouse Developer Code, no use la clave Sandbox API para probar la configuración de almacén asignada.
Use:
Production API Key (hio_live_*) + WH-DEV
WH-DEV sigue siendo una configuración de almacén de prueba. Usar una Production API key con WH-DEV no significa que su aplicación realice fulfillment en vivo.
| Configuración | Propósito |
|---|---|
hio_test_* | Pruebas API mock / fixtures |
hio_live_* + WH-DEV | Pruebas de integración del almacén asignado con datos de prueba |
hio_live_* + autorización de almacén de producción | Fulfillment de almacén en vivo |
Los endpoints Sandbox Fulfillment devuelven datos predefinidos o simulados. Por ejemplo, ubicaciones, saldos, paquetes, rutas y estados sandbox pueden diferir de la configuración WH-DEV asignada a su aplicación.
Si valida una integración WH-DEV, use siempre su Production API key.
Cobertura Public API (resumen)
| Área | Sandbox |
|---|---|
| Global | response_format: upstream rechazado (solo standard). Campo currency en el body rechazado como en prod. sandbox_trigger permitido para claves test (fixtures de plataforma). OAuth de canal tratado como autorizado para hio_test_*. Cuotas y rate limits omitidos para claves test. |
/v1/products/* | Search, detail, parse, upload-image, search-by-image, freight estimate, batch-check, analytics 1688 mockeados como se documenta abajo. Extensiones solo OpenAPI fuera del conjunto handoff de este sitio no mockeadas. |
/v1/orders/* | Preview, create, detail, pay, cancel, logistics trace, list, purchase query mockeados con magic / dynamic ids. |
/v1/fulfillment/* | Balance, quotes, shipments, inbounds, packages, unclaimed, returns, locations, VAS, service-requests, finance mockeados con magic / dynamic ids (ver abajo). |
/v1/support/tickets | List/detail/reply mockeados con fixtures tkt_*. |
| Webhooks | Los recursos sandbox no emiten webhooks automáticamente. Usa el portal Send test (livemode: false) para verificar el receptor y la firma. |
Objetivos de diseño
| Objetivo | Significado |
|---|---|
| Repetible | Misma petición → misma respuesta (sin aleatoriedad en resultados). |
| Documentado | Cada escenario tiene un id o keyword estable para buscar en esta página. |
| Alineado al contrato | JSON coincide con campos del esquema standard de producción; valores distintos. |
| Happy path por defecto | Ids desconocidos caen en mocks genéricos de éxito. |
| Fallo explícito | Use ids sb_* o sandbox_trigger para forzar errores / estados límite. |
Nomenclatura: sb_{domain}_{scenario}
| Segmento | Regla | Ejemplos |
|---|---|---|
| Prefijo | Siempre sb_ | sb_prod_not_found |
domain | Sustantivo en minúsculas (prod, search, ord, shp, pkg, plat, …) | — |
scenario | snake_case | not_found, pay_declined |
Caracteres: [a-z0-9_], longitud ≤ ~48. No prefije ids upstream reales con sb_ salvo que quiera la fixture. Algunos recursos de fulfillment también usan ids estables no-sb_ (ret_*, ucp_*, svc_*, tkt_*, inv_*).
Dos capas de fallo
Distinga errores de transporte/API de estados de negocio con HTTP 200:
- Fallo API → HTTP 4xx/5xx +
error.code(p. ej.NOT_FOUND,PAYMENT_DECLINED). - HTTP 200 con estado → p. ej.
variants[].stock = 0,status: wait_payment.
Fixtures de productos (resumen)
POST /v1/products/detail
Vea Product detail. El formato upstream no está soportado en sandbox.
Se activa cuando id, product_id, url parseada, mi_id o tao_password se resuelve en un id sb_*.
| Fixture id | Resultado | HTTP |
|---|---|---|
(cualquier id no-sb_) | Producto mock estándar | 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
Aplican channel, keyword, page, page_size, language. Filtros 1688 filter / sort / precio aceptados pero ignorados para filas mock.
keyword (exacto) | Resultado |
|---|---|
| texto ordinario | Lista mock con resultados |
sb_search_empty | items: [], total: 0 |
sb_search_not_found | Alias de vacío |
Parse / upload-image / search-by-image / freight / analytics
| Endpoint | Nota sandbox |
|---|---|
| Parse URL | Query/path URL con sb_* replica el comportamiento detail. |
| Upload image | Siempre { "image_id": "img_sandbox_mock" } tras validaciones exitosas. |
| Image search | keyword: sb_search_empty opcional produce lista vacía; combínelo con upload-image para pruebas de flujo. |
| Advanced — freight estimate | Mock de flete doméstico por defecto 800 minor units alineado con preview. |
| Advanced — batch-check | Devuelve sobre de estilo upstream con mock mpProducts; use sb_prod_not_found en mi_id/item_id para listas de exclusión. |
| Advanced — top keywords/list / daily-sales-trend | Use sb_search_empty en category_id / rank_id donde se documente para listas vacías o casos 404 detail. |
Fixtures de pedidos y pago (magic ids)
POST /v1/orders/detail
order_id | status típico | Notas |
|---|---|---|
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 | Resultado | HTTP |
|---|---|---|
sb_ord_unpaid | Pago exitoso → estado lógico paid | 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 devuelve totales ilustrativos fijos (línea ejemplo ~4500 + flete ~800 en minor units). Create emite order_id dinámicos con prefijo sbo_* persistidos en sandbox storage — líneas con offer_id: sb_prod_offline / sb_prod_no_stock devuelven 422 como en producción.
Cancel / logistics / list / purchase query
Según cancel, trace, detail list: sb_ord_* impagados y sbo_* dinámicos impagados se cancelan; fixtures paid/shipped/etc. devuelven ORDER_NOT_CANCELLABLE. Logistics devuelve packages para mocks sb_ord_shipped / completed; unpaid/paid-await-shipment devuelven packages: []. La lista del comprador respeta product_name: sb_ord_list_empty para mocks vacíos. Purchase query devuelve sobres upstream; omita los pseudo ids not-found según corresponda.
Fixtures de fulfillment
Nota: las fixtures siguientes son solo para pruebas Sandbox API. No representan la configuración WH-DEV de su aplicación. Para pruebas WH-DEV, use una Production API key (
hio_live_*).
Todos los endpoints siguientes requieren una clave hio_test_*. Los ids dinámicos de create (pkg_*, sbs_*, sbi_*, …) se persisten en sandbox storage para la clave.
Balance · quotes · locations · catálogo VAS
| Endpoint | Nota sandbox |
|---|---|
GET /v1/fulfillment/balance | Saldo disponible mock 500000 CNY en minor units. |
POST /v1/fulfillment/shipping/quotes | Requiere destination.country_code + peso o dimensiones; el legacy …/shipments/freight/estimate sigue funcionando. |
GET /v1/fulfillment/locations | loc_wh_001 (Weihai), loc_sz_001 (Shenzhen, en pausa), loc_yw_001 (Yiwu). |
GET /v1/fulfillment/value-added-services | Lista de precios CODE estable; LEGACY_PHOTO_PRINT está INACTIVE → no disponible al solicitarlo. |
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 devuelve un package_id dinámico (pkg_*) — no hay un inbound_id separado.
| Valor disparador | Campo | 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 |
| Id cancel | HTTP | error.code |
|---|---|---|
Dinámico sbi_* (tras create) | 200 | Cancelado; package relacionado descartado |
El mismo sbi_* de nuevo | 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 |
|---|---|
Dinámico pkg_* | PENDING; tracking empieza en INBOUND_CREATED |
sb_pkg_pending | PENDING |
sb_pkg_received | RECEIVED + timeline PHOTO |
sb_pkg_exception | RECEIVED + condition.EXCEPTION |
sb_pkg_shipped | SHIPPED timeline outbound completa |
sb_pkg_not_found | 404 PACKAGE_NOT_FOUND |
Unclaimed packages
| Id / disparador | Comportamiento |
|---|---|
ucp_01K2ABCDEF1234567890 | Claimable; tracking real SF123456789012 (lista enmascarada) |
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 |
| Tracking incorrecto ×5 en la misma ucp | 429 CLAIM_ATTEMPTS_EXCEEDED |
Returns
| Id | Comportamiento |
|---|---|
ret_pending_001 | PENDING; fee=18; confirm correcta |
ret_pending_002 | PENDING; fee=20; confirm con 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 en sb_pkg_shipped | 409 PACKAGE_NOT_RETURNABLE |
Service requests
| Id | Comportamiento |
|---|---|
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 en espera de confirmación |
sb_svc_not_found | 404 |
sb_svc_fee_not_ready / sb_svc_insufficient | Casos límite de confirm |
Finance (transactions / invoices)
| Fixture | Nota |
|---|---|
txn_01K2ABC001…006 | TOP_UP / VAS / RETURN / SHIPPING / REFUND / STORAGE |
inv_01K2ABC001 | ISSUED (descargable) |
inv_01K2ABC002 | PENDING |
inv_01K2ABC003 | REJECTED |
Vea Fulfillment finance.
Fixtures de tickets de soporte
| Fixture id | Escenario |
|---|---|
tkt_01K2ABCDEF1234567890 | PACKAGE · NORMAL · WAITING_FOR_HIOBUY |
tkt_01K2ABCDEF9876543210 | RETURN · URGENT · WAITING_FOR_CUSTOMER |
tkt_01K2ABCDEFAPIRESOLVED | API · NORMAL · RESOLVED |
tkt_01K2ABCDEFSHIPCLOSED | SHIPMENT · NORMAL · CLOSED (sin replies) |
tkt_not_found | 404 TICKET_NOT_FOUND |
Vea Support tickets.
Triggers de plataforma: sandbox_trigger
Permitido solo en hio_test_*; las claves de producción ignoran el campo silenciosamente.
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 |
Combine con ids benignos para que cuerpos realistas pasen validación:
{
"channel": "1688",
"product_id": "123456",
"language": "en",
"sandbox_trigger": "sb_plat_quota_exceeded"
}La fixture auth especial sb_auth_channel_required combinada con triggers puede producir CHANNEL_AUTH_REQUIRED (403) para regresiones UI pese a la regla «authorized by default».
Instantánea del estado de implementación
| Fase | Cobertura | Notas |
|---|---|---|
| Shipped | Products, procurement orders, fulfillment (balance/quotes/shipments/inbounds/packages/unclaimed/returns/locations/VAS/service-requests/finance), support tickets | Refleja el subconjunto Public API publicado en este sitio. |
| Not yet | Webhooks sandbox autoemitidos; extensiones de catálogo OpenAPI-only no publicadas | Prefiera el portal Send test para CI de webhooks; no asuma que todos los eventos live están habilitados hasta que se anuncien. |
Hoja de referencia rápida
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_EXCEEDEDAl añadir fixtures internamente, refleje este esquema de numeración en pruebas de regresión — nunca mute las formas JSON standard dentro de los mocks.
Get Support
Need integration help? Contact Developer Support at support@hiobuy.com · Response within 1–2 business days