Ir al contenido

Ciclo de vida de órdenes

Las órdenes representan pedidos de picking en Pickwise. Viajan por una secuencia de estados desde que entran hasta que son despachadas, y tu integración las trackea vía webhook o polling.

POST /orders es upsert: si el externalId ya existe y la orden está en PENDING, se actualiza. Si ya está en proceso (IN_PICKING o posterior), recibís 409 CONFLICT.

Validación cross productExternalId + productSku

Sección titulada «Validación cross productExternalId + productSku»

Cada item de una orden debe referenciar un producto del catálogo por dos campos simultáneos: productExternalId y productSku. Pickwise valida que ambos coincidan con un producto existente (cross-reference) para prevenir desincronización entre tu sistema y el catálogo.

Si algún item no resuelve contra el catálogo (producto inexistente, SKU mal pareado con externalId, stock insuficiente), la orden se crea igual pero en estado PENDING_VALIDATION con hasIssues: true. El equipo de almacén o una integración posterior resuelve el problema. Recibís el webhook order.issue_resolved cuando se completa.

POST /orderspermisos: orders:write

CampoTipoRequeridoDescripción
externalIdstring (max 100)ID único en tu sistema
orderNumberstring (max 100)Número visible (debe ser único)
itemsarray (min 1)Items de la orden
items[].productExternalIdstringexternalId del producto
items[].productSkustringSKU del producto (validado cross)
items[].quantitynumber (≥ 1)Cantidad
priorityenumNolow | medium | high | urgent
channelstring (max 100)NoCanal de venta
orderDateISO 8601NoFecha original en tu sistema
dueDateISO 8601NoFecha límite de despacho
shippingMethodstring (max 100)NoMétodo de envío
shippingAddressstring (max 500)NoDirección de entrega
notesstring (max 1000)NoNotas internas
customerobjectNoDatos del cliente
customer.externalIdstringSí**Requerido si customer presente
customer.namestringNo
customer.emailstringNo
customer.phonestringNo
metadataobjectNoCampos custom
Ventana de terminal
curl -X POST https://api-{CLIENTE}.pickwise.com.ar/api/v1/public/orders \
-H "Authorization: Bearer pk_live_xxxx" \
-H "Content-Type: application/json" \
-d '{
"externalId": "ERP-ORD-98765",
"orderNumber": "OC-2026-00543",
"priority": "high",
"channel": "MercadoLibre",
"orderDate": "2026-03-07T10:00:00Z",
"dueDate": "2026-03-08T18:00:00Z",
"customer": {
"externalId": "CLI-001",
"name": "Juan Perez",
"email": "juan@email.com"
},
"items": [
{
"productExternalId": "ERP-PROD-00123",
"productSku": "AURICULAR-BT500",
"quantity": 2
}
]
}'
{
"success": true,
"action": "created",
"data": {
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"externalId": "ERP-ORD-98765",
"orderNumber": "OC-2026-00543",
"status": "PENDING",
"hasIssues": false,
"itemsCount": 1,
"unresolvedProducts": []
},
"requestId": "..."
}

Respuesta con productos no resueltos (201 con issues)

Sección titulada «Respuesta con productos no resueltos (201 con issues)»

La orden se acepta igual, pero queda en PENDING_VALIDATION:

{
"success": true,
"action": "created",
"data": {
"externalId": "ERP-ORD-98765",
"status": "PENDING_VALIDATION",
"hasIssues": true,
"unresolvedProducts": [
{ "productExternalId": "ERP-PROD-UNKNOWN", "productSku": "SKU-NO-EXISTE" }
]
},
"warnings": [
"1 producto(s) no encontrados. La orden queda en estado PENDING_VALIDATION hasta resolver."
],
"requestId": "..."
}
{
"success": true,
"action": "created",
"data": { "status": "PENDING", "hasIssues": true },
"warnings": [
"Item 'AURICULAR-BT500': cantidad solicitada (100) supera stock disponible (5)"
]
}
┌──→ IN_PICKING ──→ PICKED ──→ PACKED ──→ DISPATCHED
PENDING ────┤
└──→ CANCELLED
PENDING_VALIDATION ──(issues resueltos)──→ PENDING
└──→ CANCELLED
Estado actualTransiciones válidasQuién la dispara
PENDINGIN_PICKING, CANCELLEDSistema (asignación) o integrador (cancel)
PENDING_VALIDATIONPENDING, CANCELLEDSistema (resolución) o integrador (cancel)
IN_PICKINGPICKEDSistema (picker completa)
PICKEDPACKEDSistema (packing)
PACKEDDISPATCHEDSistema (logística)
DISPATCHEDEstado terminal
CANCELLEDEstado terminal

GET /orders/{externalId}permisos: orders:read

{
"success": true,
"data": {
"id": "...",
"externalId": "ERP-ORD-98765",
"orderNumber": "OC-2026-00543",
"status": "PICKED",
"hasIssues": false,
"itemsCount": 2,
"createdAt": "2026-03-07T10:15:00Z",
"updatedAt": "2026-03-07T14:30:00Z"
}
}

GET /orders — paginación por cursor.

ParámetroTipoDefaultDescripción
limitinteger50Max 100
cursorstring-Token de nextCursor
statusenum-Filtrar por estado (ver abajo)
has_issuesboolean-Solo órdenes con / sin issues
created_sinceISO 8601-Creadas desde esa fecha
updated_sinceISO 8601-Actualizadas desde esa fecha

Valores de status: PENDING | PENDING_VALIDATION | IN_PICKING | PICKED | PACKED | DISPATCHED | CANCELLED.

Para enterarte de cambios de estado:

  • Webhooks (recomendado): configurá un endpoint y recibí order.status_changed en tiempo real. Ver guía de webhooks.
  • Polling con updated_since: llamá periódicamente a GET /orders?updated_since=<ISO>&limit=100. Más simple pero consume rate limit.

Hacé otro POST /orders con el mismo externalId. La orden se actualiza únicamente si está en PENDING. Si está en PENDING_VALIDATION, podés actualizar items para resolver los issues; si está en estados posteriores, recibís 409 CONFLICT.

Campos que se pueden cambiar: items, customer, notes, priority, shippingAddress, shippingMethod, dueDate, metadata.

Campos inmutables después de creada: externalId, orderNumber.

POST /orders/{externalId}/cancelpermisos: orders:write

Sólo en PENDING o PENDING_VALIDATION.

Ventana de terminal
curl -X POST https://api-{CLIENTE}.pickwise.com.ar/api/v1/public/orders/ERP-ORD-98765/cancel \
-H "Authorization: Bearer pk_live_xxxx"
{
"success": true,
"data": {
"externalId": "ERP-ORD-98765",
"status": "CANCELLED",
"cancelledAt": "2026-03-07T16:00:00Z"
}
}
{
"success": false,
"error": {
"code": "ORDER_IN_PROGRESS",
"message": "La orden ya está en proceso de picking y no puede cancelarse"
}
}

Una orden entra en estado PENDING_VALIDATION (con hasIssues: true) cuando algún item no resuelve contra el catálogo. Casos típicos:

  • UNRESOLVED_PRODUCT: productExternalId no existe, o no coincide con el productSku enviado.
  • INSUFFICIENT_STOCK: stock insuficiente (warning; la orden sigue en PENDING pero con hasIssues).
  1. Tu sistema envía la orden.
  2. Pickwise detecta el issue, crea la orden en PENDING_VALIDATION y dispara el webhook order.issue_detected.
  3. El equipo de almacén (o una integración) resuelve el issue — típicamente cargando el producto faltante o corrigiendo el SKU.
  4. Pickwise transiciona la orden a PENDING y dispara order.issue_resolved.

Ver guía de webhooks para los payloads.

POST /orders/batch — hasta 50 órdenes por request, máximo 10 MB.

{
"orders": [
{
"externalId": "ERP-ORD-001",
"orderNumber": "OC-001",
"items": [{ "productExternalId": "P1", "productSku": "SKU1", "quantity": 1 }]
},
{
"externalId": "ERP-ORD-002",
"orderNumber": "OC-002",
"items": [{ "productExternalId": "P2", "productSku": "SKU2", "quantity": 3 }]
}
]
}

Respuesta con contadores y detalle de errores por índice — mismo patrón que products/batch.

CódigoCaso típicoAcción
400 VALIDATION_ERRORItem con quantity ≤ 0, sin productSkuRevisar details
409 CONFLICT al cancelarOrden ya en IN_PICKING o posteriorNo se puede cancelar vía API
409 CONFLICT al upsertOrden existente no está en PENDINGCancelar o esperar finalización
413 PAYLOAD_TOO_LARGEBatch > 10 MB o > 50 itemsPartir el batch