Ir al contenido
docs

Kardex de un producto

El libro de un producto con saldo corrido; con inventory:costs también el costo y el valor.

GET /public/v1/inventory/kardex

Permiso inventory:read · Inventario

Solo cuando la cuenta lleva el stock en la nube (todas sus cajas con la versión nueva de Posdata); antes responde 409 STOCK_MODE_LEGACY.

Parámetros

Parámetros de consulta

NombreTipoRequeridoDescripción
product_idstring (uuid)NoEl producto (obligatorio).
warehouse_idstring (uuid)NoSolo las filas de esa bodega (el saldo total sigue siendo el del producto).
variant_idstring (uuid)NoSolo las filas de esa variante.
fromstring (date-time)NoDesde (instante ISO 8601 con zona). Los saldos ya incluyen lo anterior.
tostring (date-time)NoHasta (instante ISO 8601 con zona).
typestringNoSolo ese tipo de fila. Valores: in, out, count, cost.
orderstringNoOrden cronológico. Valores: asc, desc. Por defecto: asc.
pageintegerNoPágina (empieza en 1). Por defecto: 1. Mínimo: 1.
page_sizeintegerNoFilas por página (máximo 200). Por defecto: 50. Mínimo: 1. Máximo: 200.

Ejemplo de petición

Terminal
curl "https://api.posdata.so/public/v1/inventory/kardex" \
  -H "Authorization: Bearer $POSDATA_API_KEY"
JavaScript
const res = await fetch('https://api.posdata.so/public/v1/inventory/kardex', {
  headers: {
    Authorization: `Bearer ${process.env.POSDATA_API_KEY}`,
  },
});
const data = await res.json();
if (!res.ok) throw new Error(`${data.error.code}: ${data.error.message} (${data.error.request_id})`);
Python
import os

import requests

res = requests.get(
    "https://api.posdata.so/public/v1/inventory/kardex",
    headers={
        "Authorization": f"Bearer {os.environ['POSDATA_API_KEY']}",
    },
    timeout=30,
)
data = res.json()
if not res.ok:
    raise RuntimeError(f"{data['error']['code']}: {data['error']['message']} ({data['error']['request_id']})")
PHP
<?php
$ch = curl_init('https://api.posdata.so/public/v1/inventory/kardex');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => [
        'Authorization: Bearer ' . getenv('POSDATA_API_KEY'),
    ],
]);
$data = json_decode(curl_exec($ch), true);
if (curl_getinfo($ch, CURLINFO_RESPONSE_CODE) >= 400) {
    throw new RuntimeException("{$data['error']['code']}: {$data['error']['message']} ({$data['error']['request_id']})");
}

Respuesta

200 OK: un objeto InventoryKardex.

CampoTipoRequeridoDescripción
object"kardex"No—
productobjectNo—
product.idstring (uuid)No—
product.local_idstringNo—
product.namestringNo—
rowsarreglo de objectNo—
metaobjectNo—
meta.pageintegerNo—
meta.page_sizeintegerNo—
meta.totalintegerNo—
meta.total_pagesintegerNo—
levelsarreglo de objectNo—
levels[].warehouse_idstring (uuid)No—
levels[].variant_idstring (uuid) | nullNo—
levels[].quantitynumberNo—
total_qtynumberNoExistencia total del producto al final de lo consultado.
avg_costnumber | nullNoCosto promedio ponderado al final; null si se desconoce o no tienes inventory:costs.
warehousesarreglo de objectNo—
warehouses[].idstring (uuid)No—
warehouses[].namestringNo—
costs_hiddenbooleanNotrue si tu llave no tiene inventory:costs.
Ejemplo de respuesta (valores ilustrativos)
{
  "object": "kardex",
  "product": {
    "id": "3f1c2e8d-7a10-4d0b-9a57-0b6f2f0e5c1d",
    "local_id": "3f1c2e8d-7a10-4d0b-9a57-0b6f2f0e5c1d",
    "name": "Café molido 500 g"
  },
  "rows": [
    {}
  ],
  "meta": {
    "page": 1,
    "page_size": 1,
    "total": 25900,
    "total_pages": 25900
  },
  "levels": [
    {
      "warehouse_id": "3f1c2e8d-7a10-4d0b-9a57-0b6f2f0e5c1d",
      "variant_id": "3f1c2e8d-7a10-4d0b-9a57-0b6f2f0e5c1d",
      "quantity": 5
    }
  ],
  "total_qty": 25900,
  "avg_cost": 1,
  "warehouses": [
    {
      "id": "3f1c2e8d-7a10-4d0b-9a57-0b6f2f0e5c1d",
      "name": "Café molido 500 g"
    }
  ],
  "costs_hidden": true
}

Errores

Todo error responde con un objeto Error y un request_id. Ramifica por error.code, nunca por el mensaje.

Cuerpo: un objeto Error. Qué significa cada código y qué hacer: Errores.

VALIDATION_ERRORINVALID_JSONINVALID_CURSOR

Cuerpo: un objeto Error. Qué significa cada código y qué hacer: Errores.

UNAUTHENTICATEDINVALID_API_KEYAPI_KEY_REVOKEDAPI_KEY_EXPIREDAPI_KEY_WRONG_ENVIRONMENTACCOUNT_INACTIVE

Cuerpo: un objeto Error. Qué significa cada código y qué hacer: Errores.

PLAN_REQUIREDINSUFFICIENT_SCOPEBROWSER_REQUESTS_NOT_ALLOWED

Cuerpo: un objeto Error. Qué significa cada código y qué hacer: Errores.

STOCK_MODE_LEGACY

Cuerpo: un objeto Error. Qué significa cada código y qué hacer: Errores.

RATE_LIMITED

Cuerpo: un objeto Error. Qué significa cada código y qué hacer: Errores.

INTERNAL_ERROR