API · versión 1

Tus costes, desde tu propio programa

Lee tus recetas con su coste por ración, tu catálogo con los precios de compra reales, cómo ha ido cambiando cada precio y lo que te queda en el almacén. Solo lectura: esta API no puede cambiar ni borrar nada de tu cuenta.

Incluida en el plan Business. La clave se crea desde Ajustes, en Plan y facturación.

Autenticación

La clave va en una cabecera. Nunca en la URL: ahí quedaría escrita en los registros de cualquier intermediario y en el historial del navegador.

curl https://www.usegramo.app/api/v1/recetas \
  -H "Authorization: Bearer gr_TU_CLAVE"

# o bien
curl https://www.usegramo.app/api/v1/recetas -H "X-API-Key: gr_TU_CLAVE"
Si algo falla: un 401 es que la clave no vale, un 403 es que el negocio ya no tiene plan Business activo, y un 429 es que has pasado de 1.000 llamadas en una hora.

GET /recetas

Las recetas activas con su coste. El coste sale de los precios de compra reales de tus facturas, no de lo que pone la tarifa del proveedor.

{
  "recetas": [
    {
      "id": "…",
      "local": "…",
      "nombre": "Croquetas de jamón",
      "categoria": "Entrantes",
      "raciones": 4,
      "coste_total": 4.21,
      "coste_por_racion": 1.05,
      "precio_venta": 6.5,
      "margen": 0.838,
      "es_subreceta": false,
      "actualizada": "2026-09-15T10:22:31Z"
    }
  ]
}

Parámetros: ?limite= (100 por defecto, 500 máximo) y ?local= si tu negocio tiene varios locales. Sin ese parámetro vienen los de todos.

GET /ingredientes

El catálogo con el precio por unidad y los alérgenos.

{
  "ingredientes": [
    {
      "id": "…",
      "local": "…",
      "nombre": "Harina de trigo T-55",
      "categoria": "Secos",
      "unidad": "kg",
      "precio_por_unidad": 0.79,
      "alergenos": ["gluten"],
      "stock_minimo": 10,
      "actualizado": "2026-09-14T18:02:11Z"
    }
  ]
}
Ojo con el precio. No es el de la tarifa del proveedor: es lo que de verdad te costó, calculado desde el importe de la factura. Si lo comparas con la tarifa no van a coincidir, y el bueno es este.

GET /precios

Cómo ha ido cambiando el precio de cada ingrediente, con su fecha. Es el dato que sale de leer tus facturas una a una, así que no lo tiene nadie más.

{
  "cambios": [
    {
      "ingrediente_id": "…",
      "ingrediente": "Harina de trigo T-55",
      "unidad": "kg",
      "local": "…",
      "precio_anterior": 0.76,
      "precio_nuevo": 0.79,
      "variacion_pct": 3.95,
      "cuando": "2026-09-14T18:02:11Z"
    }
  ]
}

Filtros: ?ingrediente=… para uno solo, ?desde=2026-01-01 para acotar en el tiempo, ?local=… si tienes varios.

GET /stock

Qué hay en el almacén ahora mismo, qué está por debajo del mínimo y qué caduca pronto.

{
  "stock": [
    {
      "ingrediente_id": "…",
      "nombre": "Harina de trigo T-55",
      "unidad": "kg",
      "existencias": 37.5,
      "stock_minimo": 10,
      "bajo_minimo": false,
      "lotes_activos": 2,
      "caduca_el": "2026-11-21",
      "precio_unidad": 0.79
    }
  ]
}

Filtros: ?bajo_minimo=true y ?caduca_en=7 (días).

Un mínimo vacío no es cero. Si stock_minimo viene a null es que nadie ha dicho todavía cuánto es poco de ese ingrediente, no que sobre con cero. No avises de una falta que nadie ha definido.

Lo que NO hace

¿Te falta algo para tu integración? Escríbenos a hola@dfmsaas.solutions y nos lo cuentas. Es como se decidió lo que hay hoy.