Todo error responde con un código HTTP distinto de 2xx y este cuerpo:
{
"error": {
"code": "INSUFFICIENT_SCOPE",
"message": "Esta API key no tiene el permiso \"sales:read\". Crea una key con ese permiso en cuenta.posdata.so → Desarrolladores.",
"required_scope": "sales:read",
"request_id": "req_6vJx0Qm2cPp1bK9a"
}
}
Campo
Qué es
code
El código estable para tu lógica. Ramifica por code, nunca por message. Los códigos no cambian de nombre ni se reutilizan.
message
Explicación en español para una persona, con el siguiente paso. Puede cambiar de redacción.
param
El campo que causó el error, cuando aplica (por ejemplo sku, warehouse_id o Idempotency-Key). En errores de validación puede ser una ruta con puntos.
request_id
El identificador de la petición. También llega en el header Request-Id de todas las respuestas.
Algunos errores traen campos adicionales: required_scope (en INSUFFICIENT_SCOPE), feature (en
PLAN_REQUIRED), retry_after (en RATE_LIMITED) y devices (en DEVICES_OUTDATED). Tu código debe
tolerar campos nuevos.
Guarda el request_id en tus logs. Si escribes a soporte, inclúyelo: con él encontramos la
petición exacta. Los errores nunca exponen detalles internos (trazas, SQL ni mensajes de otros servicios).
Un campo o parámetro no es válido, falta uno obligatorio, o enviaste uno que no existe (los filtros y campos desconocidos se rechazan, no se ignoran). También con 415 si el cuerpo no es JSON en UTF-8.
Lee message y param, corrige y reintenta.
INVALID_JSON
400
El cuerpo no es JSON válido.
Revisa la serialización y envía Content-Type: application/json.
PAYLOAD_TOO_LARGE
413
El cuerpo supera 256 KB.
Envía menos datos por petición.
INVALID_CURSOR
400
starting_after no es un cursor válido.
Usa el next_cursor de la respuesta anterior tal cual, sin modificarlo.
NOT_FOUND
404
El recurso no existe en esta cuenta (o el id no tiene formato de uuid).
Verifica el id. Un id de otra cuenta responde igual que uno inventado.
Busca el registro existente en vez de crearlo otra vez.
SKU_ALREADY_EXISTS
409
Al editar una variante (PATCH /products/{id}/variants/{variantId}), otra variante de la cuenta ya usa ese sku. Trae param: "sku".
Usa un SKU distinto o busca la variante que ya lo tiene.
NO_WAREHOUSE
409
Un movimiento de stock (o un producto con initial_stock) sin warehouse_id, y la cuenta no tiene una bodega predeterminada: o todavía no hay bodegas sincronizadas desde las cajas, o hay varias y ninguna es la predeterminada.
Indica warehouse_id (consúltalas con GET /warehouses) o abre Posdata en una caja con conexión para que sincronice sus bodegas.
DEVICES_OUTDATED
409
Al editar un producto o una variante (PATCH /products/{id} o PATCH /products/{id}/variants/{variantId}), algún dispositivo del negocio todavía no tiene la versión de Posdata que acepta ediciones sin stock. No se modificó nada. Trae devices: la lista de esos dispositivos, cada uno con name, kind, platform, app_version y last_seen_at.
Abre esos dispositivos con internet para que se actualicen solos (tardan un minuto en reportarse) y reintenta, o revoca los que ya no uses en cuenta.posdata.so → Dispositivos. Crear productos y mover stock sí funciona mientras tanto. Mira por qué.
VARIANT_STOCK_UNSUPPORTED
422
Intentaste mover stock de un producto con variantes.
Sí: 429 (después de Retry-After), 409 IDEMPOTENCY_IN_PROGRESS, 500 y errores de red o
tiempos de espera. Si es un POST, reintenta con el mismoIdempotency-Key.
No, sin cambiar algo antes: el resto de 4xx. Repetir la misma petición dará el mismo error.