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ónPropósito
hio_test_*Pruebas API mock / fixtures
hio_live_* + WH-DEVPruebas de integración del almacén asignado con datos de prueba
hio_live_* + autorización de almacén de producciónFulfillment 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)

ÁreaSandbox
Globalresponse_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/ticketsList/detail/reply mockeados con fixtures tkt_*.
WebhooksLos 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

ObjetivoSignificado
RepetibleMisma petición → misma respuesta (sin aleatoriedad en resultados).
DocumentadoCada escenario tiene un id o keyword estable para buscar en esta página.
Alineado al contratoJSON coincide con campos del esquema standard de producción; valores distintos.
Happy path por defectoIds desconocidos caen en mocks genéricos de éxito.
Fallo explícitoUse ids sb_* o sandbox_trigger para forzar errores / estados límite.

Nomenclatura: sb_{domain}_{scenario}

SegmentoReglaEjemplos
PrefijoSiempre sb_sb_prod_not_found
domainSustantivo en minúsculas (prod, search, ord, shp, pkg, plat, …)
scenariosnake_casenot_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 idResultadoHTTP
(cualquier id no-sb_)Producto mock estándar200
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

Aplican channel, keyword, page, page_size, language. Filtros 1688 filter / sort / precio aceptados pero ignorados para filas mock.

keyword (exacto)Resultado
texto ordinarioLista mock con resultados
sb_search_emptyitems: [], total: 0
sb_search_not_foundAlias de vacío

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

EndpointNota sandbox
Parse URLQuery/path URL con sb_* replica el comportamiento detail.
Upload imageSiempre { "image_id": "img_sandbox_mock" } tras validaciones exitosas.
Image searchkeyword: sb_search_empty opcional produce lista vacía; combínelo con upload-image para pruebas de flujo.
Advanced — freight estimateMock de flete doméstico por defecto 800 minor units alineado con preview.
Advanced — batch-checkDevuelve 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-trendUse 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_idstatus típicoNotas
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_idResultadoHTTP
sb_ord_unpaidPago exitoso → estado lógico paid200
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 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

EndpointNota sandbox
GET /v1/fulfillment/balanceSaldo disponible mock 500000 CNY en minor units.
POST /v1/fulfillment/shipping/quotesRequiere destination.country_code + peso o dimensiones; el legacy …/shipments/freight/estimate sigue funcionando.
GET /v1/fulfillment/locationsloc_wh_001 (Weihai), loc_sz_001 (Shenzhen, en pausa), loc_yw_001 (Yiwu).
GET /v1/fulfillment/value-added-servicesLista 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 / 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 devuelve un package_id dinámico (pkg_*) — no hay un inbound_id separado.

Valor disparadorCampoHTTPerror.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
Id cancelHTTPerror.code
Dinámico sbi_* (tras create)200Cancelado; package relacionado descartado
El mismo sbi_* de nuevo409INBOUND_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
Dinámico pkg_*PENDING; tracking empieza en INBOUND_CREATED
sb_pkg_pendingPENDING
sb_pkg_receivedRECEIVED + timeline PHOTO
sb_pkg_exceptionRECEIVED + condition.EXCEPTION
sb_pkg_shippedSHIPPED timeline outbound completa
sb_pkg_not_found404 PACKAGE_NOT_FOUND

Unclaimed packages

Id / disparadorComportamiento
ucp_01K2ABCDEF1234567890Claimable; tracking real SF123456789012 (lista enmascarada)
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
Tracking incorrecto ×5 en la misma ucp429 CLAIM_ATTEMPTS_EXCEEDED

Returns

IdComportamiento
ret_pending_001PENDING; fee=18; confirm correcta
ret_pending_002PENDING; fee=20; confirm con 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 en sb_pkg_shipped409 PACKAGE_NOT_RETURNABLE

Service requests

IdComportamiento
svc_photo_completedPHOTO COMPLETED + images
svc_inspection_failedBASIC_INSPECTION FAILED
svc_video_processingVIDEO PROCESSING
svc_reinforce_pendingPACKAGE_REINFORCEMENT PENDING
svc_wooden_awaitingWOODEN_FRAME en espera de confirmación
sb_svc_not_found404
sb_svc_fee_not_ready / sb_svc_insufficientCasos límite de confirm

Finance (transactions / invoices)

FixtureNota
txn_01K2ABC001006TOP_UP / VAS / RETURN / SHIPPING / REFUND / STORAGE
inv_01K2ABC001ISSUED (descargable)
inv_01K2ABC002PENDING
inv_01K2ABC003REJECTED

Vea Fulfillment finance.

Fixtures de tickets de soporte

Fixture idEscenario
tkt_01K2ABCDEF1234567890PACKAGE · NORMAL · WAITING_FOR_HIOBUY
tkt_01K2ABCDEF9876543210RETURN · URGENT · WAITING_FOR_CUSTOMER
tkt_01K2ABCDEFAPIRESOLVEDAPI · NORMAL · RESOLVED
tkt_01K2ABCDEFSHIPCLOSEDSHIPMENT · NORMAL · CLOSED (sin replies)
tkt_not_found404 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_triggerHTTPerror.code
sb_plat_quota_exceeded429QUOTA_EXCEEDED
sb_plat_rate_limited429RATE_LIMIT_EXCEEDED
sb_plat_upstream_error502CHANNEL_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

FaseCoberturaNotas
ShippedProducts, procurement orders, fulfillment (balance/quotes/shipments/inbounds/packages/unclaimed/returns/locations/VAS/service-requests/finance), support ticketsRefleja el subconjunto Public API publicado en este sitio.
Not yetWebhooks sandbox autoemitidos; extensiones de catálogo OpenAPI-only no publicadasPrefiera 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_EXCEEDED

Al 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

Email support