La API de StockAI

Casi todo lo que haces dentro de StockAI también se puede hacer por API: subir ventas, entrenar, leer el semáforo, registrar órdenes, administrar proveedores y bodegas. Así puedes conectarlo a tu ERP, tu POS o cualquier sistema propio.

URL base
https://app.stockai.es/api/v1
Autenticación
Authorization: Bearer sk_live_…
Endpoints
256 documentados156 de lectura100 de escritura
GET/api/v1/planning
Petición
curl "$STOCKAI/planning" \
  -H "Authorization: Bearer $STOCKAI_KEY"
Respuesta
200 OK application/json
{
  "success": true,
  "data": {},
  "meta": {
    "timestamp": "2026-10-02T08:00:00Z"
  }
}

Autenticación

Cada llamada lleva una API key en la cabecera Authorization. Las claves se crean en la app, en Automatización → API Keys, y se muestran una sola vez: StockAI guarda solo un hash.

shell
export STOCKAI=https://app.stockai.es/api/v1
export STOCKAI_KEY=sk_live_…

curl "$STOCKAI/planning" \
  -H "Authorization: Bearer $STOCKAI_KEY"

Una clave actúa como sí misma, no como la persona que la creó: sigue funcionando si esa persona deja la empresa.

Claves de lectura y de escritura

Al crear una clave eliges qué puede hacer. Cada endpoint de la referencia dice qué tipo de clave necesita.

LecturaLee todo lo que un usuario visor ve: semáforo, pronósticos, proveedores, órdenes, reportes.
Lectura y escrituraAdemás crea y modifica, como un analista: sube archivos, entrena, registra órdenes, edita inventario y proveedores.

Una clave de lectura que intenta escribir recibe 403 con error_code api_key_scope_insufficient, y no cambia nada.

Lo que una clave nunca puede hacer

Algunas acciones son de personas, no de sistemas. Con una API key responden 403 api_key_route_not_exposed:

  • Iniciar sesión, refrescar tokens o recuperar contraseñas.
  • Crear, invitar o modificar usuarios y sus permisos.
  • Crear, listar o revocar API keys: una clave no puede crear otra.
  • Configurar la instalación o los canales de la cuenta.
  • Exportar o borrar la cuenta.
  • Lo que es de una persona: su bandeja de mensajes, sus conversaciones con el asistente, sus preferencias.
  • Lo que solo un administrador puede hacer (por ejemplo, cambiar la moneda o el período activo).

Enviar una orden o una alerta por correo o WhatsApp con una clave de escritura exige que la cuenta tenga al menos un administrador con el correo verificado (si no: 403 api_key_tenant_unverified).

Límites

Autenticación
/ min120 llamadas por minuto por clave, en los planes que incluyen la API.
APIPlan gratis y cuentas de prueba: la API no está incluida; empieza en el plan completo.
/ 24 hPlan completo: 2000 llamadas por día por clave (ventana de 24 horas).
/ 24 hPlan corporativo: sin tope diario.

Al pasarte recibes 429 con la cabecera Retry-After (segundos). El mismo 429 sirve para el límite por minuto y para el tope diario, y su cuerpo no trae error_code.

No hay cabeceras X-RateLimit-*: la única señal es el 429 con Retry-After. Cuenta tus llamadas o espera el 429.

Medición y precio

La API viene desde el plan completo, con un tope diario de llamadas por clave; el volumen mayor se acuerda con nosotros. Contamos cada llamada con una API key que llegó a un endpoint, por día (UTC) y por clave; las rechazadas (clave inválida, sin permiso o por encima del límite) no cuentan. Un administrador ve el consumo del mes en la app, en la pantalla API.

Errores

Casi todo error trae un error_code estable y, si aplica, error_params con los valores: ramifica por el código, no por el texto de detail, que es una ayuda en inglés y puede cambiar. Las respuestas del propio framework (cabecera ausente, ruta inexistente, método incorrecto) y el 429 solo traen detail.

api_key_invalid401 la clave no existe, fue revocada o venció.
api_key_route_not_exposed403 ese endpoint no se puede usar con una API key.
api_key_scope_insufficient403 la clave es de lectura y el endpoint escribe.
api_key_tenant_unverified403 enviar algo fuera de StockAI exige un administrador verificado.
validation_error422 el cuerpo o los parámetros no son válidos; detail es una lista con un objeto por campo.
PLAN_LIMIT_REACHED403 llegaste a un tope del plan; detail es un objeto y error_params dice cuál.
server_busy503 el servidor está saturado; reintenta según Retry-After.
(sin error_code)401 falta la cabecera Authorization o no es “Bearer sk_live_…”: detail es “Not authenticated”.
(sin error_code)429 límite por minuto o tope diario: espera Retry-After segundos.
(sin error_code)404 / 405 ruta inexistente o método no permitido.

La forma de detail

textoLa mayoría de los errores: una frase en inglés.
lista422 validation_error: [{ type, loc, msg, input }], uno por campo inválido; loc dice dónde (por ejemplo ["body", "name"]).
objetoPLAN_LIMIT_REACHED: { code, limit, current, max, tier }, el mismo contenido que error_params.
403 Ejemplo: clave de lectura que escribe
{
  "detail": "This endpoint writes and the API key is read-only. Use a write key.",
  "error_code": "api_key_scope_insufficient",
  "error_params": { "required_scope": "write", "key_scope": "read" }
}

El formato de respuesta

Toda respuesta JSON viene envuelta: { "success": true, "data": …, "meta": { "timestamp": … } }. Lo tuyo está en data, que según el endpoint es un objeto o una lista; los listados paginados traen la lista en data.items.

200 application/json
{
  "success": true,
  "data": {},
  "meta": {
    "timestamp": "2026-10-02T08:00:00Z"
  }
}

Los endpoints que devuelven un archivo (Excel, PDF, CSV) responden el archivo directamente, sin envoltorio.

El endpoint MCP (POST /mcp) habla JSON-RPC 2.0 y no usa este envoltorio.

Tipos y formatos

FechasLas fechas son YYYY-MM-DD; los instantes, ISO 8601 en UTC, por ejemplo 2026-10-01T08:00:00+00:00.
NúmerosCantidades y montos son números JSON, no textos. Los montos van en la moneda de la cuenta (GET /tenant/currency).
Sin valorUn campo sin valor suele llegar como null en lugar de omitirse.
IdentificadoresCadenas opacas con prefijo (sess_…, ds_…, sup_…): guárdalas tal cual.
SeñalesEl semáforo usa PEDIR_YA, PEDIR_PRONTO, OK y SOBRESTOCK: valores fijos que no se traducen.

Paginación

Hay tres formas, y cada endpoint la declara en sus parámetros:

skip y limitSesiones, resumen de sesiones, fuentes de datos y datasets. La respuesta trae items, total, skip y limit.
limit y offsetLa actividad de alertas (/alerts/activity). La respuesta trae items, total, limit y offset.
solo limitLos más recientes primero, hasta limit: alertas, historial de órdenes, brechas de configuración, mermas e historial de reentrenamientos.
sin paginaciónEl resto devuelve el conjunto completo y se acota con sus filtros, por ejemplo signal o supplier en /inventory/status.

Idempotencia

POST /inventory/log-po y POST /inventory/po aceptan la cabecera Idempotency-Key: un valor único (un UUID) por orden que quieres colocar. Si repites la petición con la misma clave recibes la orden que ya se creó (200 con replayed: true) en vez de una segunda; la misma clave con otras líneas responde 409 po_idempotency_key_reused. Los demás endpoints de escritura no son idempotentes: antes de reintentar una escritura cuyo resultado no viste, consulta si ya se aplicó.

HTTP
Idempotency-Key: 3f1c9a5e-7d62-4b0e-9d6a-2c8f4a1b5e70

Para clientes de IA (MCP)

La misma clave abre un servidor MCP en POST /mcp con cinco herramientas de solo lectura, para que un asistente de IA consulte tu semáforo. Por diseño no escribe nada. GET /mcp responde 405: el servidor no abre un flujo hacia el cliente.

Referencia de endpoints

Generada a partir del propio servicio: si un endpoint está aquí, se puede llamar con una API key. Las respuestas de ejemplo son llamadas reales a una cuenta de prueba. Las descripciones están en inglés, como el código.

POST Explain a SKU's recommendation
Narrativas con IA

Explain a SKU's recommendation

POST/api/v1/ai/narrative/forecast-explanation
Clave de lecturaResponde 200 · application/json

Explains a specific SKU's inventory signal and recommendation in plain language.

Petición

Cabeceras
  • AuthorizationBearer sk_live_…obligatorio

    Tu API key. Siempre obligatoria.

  • Content-Typeapplication/jsonobligatorio
Cuerpo

application/jsonEl cuerpo es obligatorio.

object Un objeto.
  • skustringobligatorio
  • session_idstringobligatorio
  • profilestringopcionalpor defecto "distributor"
  • languagestringopcionalpor defecto "es"

Respuestas

200 Si sale bien

Para este endpoint no se capturó una respuesta de ejemplo. Toda respuesta JSON trae este envoltorio; lo que va en data depende del endpoint.

Errores posibles

Además de los errores de cada endpoint, toda llamada con clave puede responder:

  • 401Authorization header missing, or API key invalid, revoked or expired.
  • 403Key may not call this endpoint, is read-only on a write, or a permission check refused it.
  • 429Per-minute limit or daily ceiling reached; honour Retry-After.
  • 422Validation Error
Errores
Petición
curl -X POST "$STOCKAI/ai/narrative/forecast-explanation" \
  -H "Authorization: Bearer $STOCKAI_KEY" \
  -H "Content-Type: application/json" \
  -d '{"sku":"SKU-001","session_id":"<session_id>","profile":"distributor","language":"es"}'
Respuesta
200 OK application/json
{
  "success": true,
  "data": {},
  "meta": {
    "timestamp": "2026-10-02T08:00:00Z"
  }
}

Pon tu propia IA a trabajar en tus compras. Hoy.

Tres formas de empezar, según cuánto quieras comprometer ahora. Las tres llegan al mismo producto.

Crea tu cuenta gratis

Para siempre, con el motor completo. Sube tu archivo de ventas y ve tu primera lista de qué pedir.

Crear mi cuenta gratis

Mira antes de dar tu correo

Una cuenta de prueba al instante, con datos de ejemplo. Dura 24 horas y después se borra.

Probar sin registrarme

Habla con nosotros

Si tu operación ya no cabe en el plan gratis, o quieres verlo con tus datos y acompañado. Respondemos en menos de 24 horas.

Ventas y contacto: contacto@stockai.es. Teléfono: +506 7186 2820.

Hecho en Costa Rica para distribuidores de Latinoamérica.