Ir al contenido

Sincronización de productos

Los endpoints de productos permiten mantener el catálogo de Pickwise sincronizado con tu ERP, marketplace o sistema de inventario. Todos los endpoints de escritura son upsert por externalId.

Es el ID del producto en tu sistema. Es el único identificador con el que Pickwise dedupica. Debe ser:

  • Estable: una vez asignado a un producto, no cambia nunca.
  • Inmutable: si cambiás el externalId, para Pickwise es un producto nuevo.
  • Único por producto en tu catálogo.

El sku también es único dentro del tenant: un mismo SKU no puede estar asociado a dos externalId distintos. Si lo intentás, recibís 409 DUPLICATE_SKU.

Los únicos campos obligatorios al crear o actualizar un producto son externalId, sku y name. El campo stock es opcional: si no lo enviás al crear, se inicializa en 0; si no lo enviás al actualizar, se mantiene el valor anterior.

POST /products — crea o actualiza un producto por externalId.

Permisos: products:write

CampoTipoRequeridoDescripción
externalIdstring (max 100)ID único en tu sistema
skustring (max 50)Único globalmente
namestring (max 255)Nombre del producto
stocknumber (≥ 0)NoDefault 0 al crear; inmutable en update si se omite
locationCodestring (max 50)NoUbicación en el almacén (ej: A-03-02-01)
pricenumber (≥ 0)NoPrecio unitario
weightnumber (> 0)NoPeso en kg
lengthnumber (> 0)NoLargo en cm
widthnumber (> 0)NoAncho en cm
heightnumber (> 0)NoAlto en cm
barcodestring (max 50)NoCódigo de barras
categorystring (max 255)NoCategoría
supplierstring (max 255)NoProveedor
brandstring (max 255)NoMarca
isActivebooleanNoDefault true
isCombobooleanNoDefault false
imageUrlstring (max 255)NoURL de imagen
metadataobjectNoCampos custom clave-valor
Ventana de terminal
curl -X POST https://api-{CLIENTE}.pickwise.com.ar/api/v1/public/products \
-H "Authorization: Bearer pk_live_xxxx" \
-H "Content-Type: application/json" \
-d '{
"externalId": "ERP-PROD-00123",
"sku": "AURICULAR-BT500",
"name": "Auricular Bluetooth BT500",
"stock": 150,
"locationCode": "A-03-02-01",
"price": 45.99,
"brand": "SoundMax",
"metadata": { "color": "Negro", "garantia_meses": 12 }
}'
{
"success": true,
"action": "created",
"data": {
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"externalId": "ERP-PROD-00123",
"sku": "AURICULAR-BT500"
},
"requestId": "550e8400-e29b-41d4-a716-446655440000"
}
  • action: "created" si el externalId no existía, "updated" si ya existía.
  • data.id: UUID interno de Pickwise (no lo uses como referencia desde tu sistema — usá el externalId).

POST /products/batch — hasta 200 productos por request, máximo 5 MB.

Permisos: products:write

El batch es parcial: los productos válidos se procesan aunque otros fallen. Revisá errors y warnings en la respuesta.

Ventana de terminal
curl -X POST https://api-{CLIENTE}.pickwise.com.ar/api/v1/public/products/batch \
-H "Authorization: Bearer pk_live_xxxx" \
-H "Content-Type: application/json" \
-d '{
"products": [
{ "externalId": "ERP-PROD-001", "sku": "SKU-001", "name": "Producto 1", "stock": 100 },
{ "externalId": "ERP-PROD-002", "sku": "SKU-002", "name": "Producto 2", "stock": 50 }
]
}'
{
"success": true,
"data": {
"successCount": 198,
"createdCount": 150,
"updatedCount": 48,
"errorCount": 2
},
"errors": [
{
"index": 45,
"externalId": "ERP-PROD-ERR1",
"error": "SKU 'SKU-DUPLICADO' ya existe con un externalId diferente"
}
],
"warnings": [
{
"index": 3,
"externalId": "ERP-PROD-003",
"warning": "locationCode 'Z-99-01' no existe en el warehouse"
}
],
"requestId": "..."
}

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

Ventana de terminal
curl https://api-{CLIENTE}.pickwise.com.ar/api/v1/public/products/ERP-PROD-00123 \
-H "Authorization: Bearer pk_live_xxxx"

GET /products — devuelve páginas de hasta 200 items, con nextCursor para la siguiente página.

ParámetroTipoDefaultDescripción
limitinteger50Max 200
cursorstring-Token de nextCursor de la respuesta anterior
updated_sinceISO 8601-Solo productos actualizados desde esa fecha
active_onlybooleantrueExcluir productos desactivados
{
"success": true,
"data": [
{
"id": "...",
"externalId": "ERP-PROD-001",
"sku": "SKU-001",
"name": "Producto 1",
"stock": 100,
"isActive": true,
"createdAt": "2026-02-10T10:00:00Z",
"updatedAt": "2026-03-07T14:30:00Z"
}
],
"pagination": {
"limit": 50,
"hasMore": true,
"nextCursor": "eyJpZCI6IjEyMzQ1Njc4LTkwYWItY2RlZiJ9",
"total": 1523
},
"requestId": "..."
}
async function* allProducts() {
let cursor = null;
while (true) {
const params = new URLSearchParams({ limit: '200' });
if (cursor) params.set('cursor', cursor);
const res = await fetch(
`https://api-{CLIENTE}.pickwise.com.ar/api/v1/public/products?${params}`,
{ headers: { 'Authorization': `Bearer ${process.env.PICKWISE_API_KEY}` } }
);
const body = await res.json();
for (const product of body.data) yield product;
if (!body.pagination.hasMore) return;
cursor = body.pagination.nextCursor;
}
}
for await (const product of allProducts()) {
process(product);
}

En lugar de bajar todo el catálogo periódicamente, traé solo lo que cambió desde la última sync:

GET /products?updated_since=2026-03-07T00:00:00Z&limit=200

No hay endpoint DELETE. Para “eliminar” un producto del catálogo activo, marcalo como inactivo:

Ventana de terminal
curl -X POST https://api-{CLIENTE}.pickwise.com.ar/api/v1/public/products \
-H "Authorization: Bearer pk_live_xxxx" \
-H "Content-Type: application/json" \
-d '{
"externalId": "ERP-PROD-00123",
"sku": "AURICULAR-BT500",
"name": "Auricular Bluetooth BT500",
"stock": 0,
"isActive": false
}'
  • externalId inmutable. Si cambiás el externalId de un producto, para Pickwise es un producto nuevo.
  • sku único: no podés tener dos productos con el mismo sku y distinto externalId. Recibís 409 DUPLICATE_SKU.
  • locationCode tolerante: si el código no existe en el warehouse, el producto se crea igual y recibís un warning.
  • Campos inmutables linkeados: si un producto está asociado a órdenes activas, no podés cambiar el sku sin primero resolver esas órdenes.
CódigoCaso típicoAcción
400 VALIDATION_ERRORstock negativo, externalId vacíoRevisar details
409 DUPLICATE_SKUDos externalId quieren el mismo SKUUnificar en tu sistema
413 PAYLOAD_TOO_LARGEBatch > 5 MB o > 200 itemsPartir en chunks más chicos

Ver guía de manejo de errores para la lista completa.