Endpoints de la API. Especificación exacta de cada operación de la API v1 (parámetros, cuerpo, respuestas y ejemplos), generada del documento OpenAPI con el que se valida cada respuesta real. Los procedimientos completos están en Guías.
/stock-levels
Niveles de existencia por producto
Para cada producto, lo que hay a la mano (on_hand: todo lo que está en almacén) y lo disponible
(available: en estado disponible, sin retenciones y descontando lo que reservan los pedidos abiertos). Son
las mismas cifras del evento stock.updated. Con warehouse, solo las de ese almacén.
updated_since aquí significa «productos cuyas existencias se movieron desde esa fecha».
- Alcance (cliente de integración)
stocks:read- Permiso (token de usuario)
- Token válido
- Idempotency-Key
- No aplica
Parámetros de consulta
-
pageinteger valor por omisión:1Número de página, desde 1.
-
per_pageinteger valor por omisión:25Elementos por página, de 1 a 100. Un valor mayor se toma como 100.
-
sortstring valor por omisión:item_codeCampo de orden; antepón
-para descendente.Valores:item_code,-item_code,name,-name -
updated_sincestring (date-time)Solo lo que cambió desde esta fecha (ISO 8601), para sincronización incremental.
-
item_codestringUno o varios códigos separados por comas (hasta 100).
-
product_idintegerId del producto.
-
warehousestringCódigo del almacén; sin él, el total de la empresa.
Respuestas
200 Página de niveles por producto.
-
dataarray de objetos obligatorio6 campos de
data-
product_idinteger obligatorio -
item_codestring obligatorio -
namestring | null -
warehousestring | nullEl almacén pedido;
nullpara el total de la empresa. -
on_handnumber obligatorioTodo lo que está en almacén.
-
availablenumber obligatorioLo que se puede prometer o surtir.
-
-
linksobjeto obligatorio4 campos de
links-
firststring (uri) | null obligatorio -
laststring (uri) | null obligatorio -
prevstring (uri) | null obligatorioPágina anterior;
nullen la primera. -
nextstring (uri) | null obligatorioPágina siguiente;
nullen la última.
-
-
metaobjeto obligatorio8 campos de
meta-
current_pageinteger obligatorio -
frominteger | nullPosición del primer elemento de la página.
-
last_pageinteger obligatorio -
linksarray de objetosEnlaces de página para interfaces; no hace falta leerlos.
-
pathstring (uri) -
per_pageinteger obligatorio -
tointeger | null -
totalinteger obligatorioTotal de elementos con los filtros aplicados.
-
401 Falta el token o no es válido.
Cuerpo: el sobre de error.
402 La función no está en el plan de la empresa, o la cuenta está suspendida o cancelada.
Cuerpo: el sobre de error.
403
Al cliente le falta el alcance (missing_scope), al usuario el permiso (forbidden), o el token de usuario no
tiene acceso a la ruta (client_not_allowed: aplicación móvil o usuario con verificación en dos pasos).
Cuerpo: el sobre de error.
422
Datos no válidos (validation_failed), una llave de idempotencia reutilizada con otra solicitud
(idempotency_key_reused) o una regla de negocio que bloquea la operación (rule_blocked).
Cuerpo: el sobre de error.
429
Se superó el límite por minuto. Reintente después de los segundos de Retry-After.
Cuerpo: el sobre de error.
Probar
Probar con una instancia
curl "https://empresa.chainlink.mx/api/v1/stock-levels?item_code=P-1001%2CP-1002&warehouse=CEDIS-GDL" \
-H "Authorization: Bearer $CHAINLINK_TOKEN" \
-H "Accept: application/json"
<?php
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://empresa.chainlink.mx/api/v1/stock-levels?item_code=P-1001%2CP-1002&warehouse=CEDIS-GDL', [
'headers' => [
'Authorization' => 'Bearer ' . getenv('CHAINLINK_TOKEN'),
'Accept' => 'application/json',
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://empresa.chainlink.mx/api/v1/stock-levels?item_code=P-1001%2CP-1002&warehouse=CEDIS-GDL', {
headers: {
Authorization: `Bearer ${process.env.CHAINLINK_TOKEN}`,
Accept: 'application/json',
},
});
const data = await response.json();
import os
import requests
response = requests.get(
"https://empresa.chainlink.mx/api/v1/stock-levels?item_code=P-1001%2CP-1002&warehouse=CEDIS-GDL",
headers={
"Authorization": f"Bearer {os.environ['CHAINLINK_TOKEN']}",
"Accept": "application/json",
},
)
data = response.json()
{
"data": [
{
"product_id": 101,
"item_code": "P-1001",
"name": "Aceite comestible 1 L",
"warehouse": "CEDIS-GDL",
"on_hand": 48,
"available": 46
},
{
"product_id": 102,
"item_code": "P-1002",
"name": "Arroz grano largo 1 kg",
"warehouse": "CEDIS-GDL",
"on_hand": 120,
"available": 120
}
],
"links": {
"first": "https://demo.chainlink.mx/api/v1/stock-levels?warehouse=CEDIS-GDL&page=1",
"last": "https://demo.chainlink.mx/api/v1/stock-levels?warehouse=CEDIS-GDL&page=1",
"prev": null,
"next": null
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 1,
"links": [],
"path": "https://demo.chainlink.mx/api/v1/stock-levels",
"per_page": 25,
"to": 2,
"total": 2
}
}
{
"error": {
"code": "unauthenticated",
"message": "Falta el token de acceso o ya no es válido.",
"doc_url": "https://chainlink.mx/developers/errores#unauthenticated",
"request_id": "req_01j9x2m4k7q8r5t6v3w0y1z2a3"
},
"errors": [],
"message": "Falta el token de acceso o ya no es válido."
}
{
"error": {
"code": "feature_not_in_plan",
"message": "Función no disponible en tu plan actual.",
"feature": "webhooks.enabled",
"upgrade_url": "/billing/plans",
"doc_url": "https://chainlink.mx/developers/errores#feature_not_in_plan",
"request_id": "req_01j9x2m4k7q8r5t6v3w0y1z2a3"
},
"errors": [],
"message": "Función no disponible en tu plan actual."
}
{
"error": {
"code": "missing_scope",
"message": "El cliente no tiene el alcance products:write.",
"scope": "products:write",
"doc_url": "https://chainlink.mx/developers/errores#missing_scope",
"request_id": "req_01j9x2m4k7q8r5t6v3w0y1z2a3"
},
"errors": [],
"message": "El cliente no tiene el alcance products:write."
}
{
"error": {
"code": "validation_failed",
"message": "El campo name es obligatorio.",
"field": "name",
"doc_url": "https://chainlink.mx/developers/errores#validation_failed",
"request_id": "req_01j9x2m4k7q8r5t6v3w0y1z2a3"
},
"errors": [
{
"field": "name",
"message": "El campo name es obligatorio."
}
],
"message": "El campo name es obligatorio."
}
{
"error": {
"code": "rate_limited",
"message": "Superaste el límite de solicitudes por minuto. Espera los segundos que indica Retry-After.",
"doc_url": "https://chainlink.mx/developers/errores#rate_limited",
"request_id": "req_01j9x2m4k7q8r5t6v3w0y1z2a3"
},
"errors": [],
"message": "Superaste el límite de solicitudes por minuto. Espera los segundos que indica Retry-After."
}