Desarrolladores

Su cocina, por HTTPS.

Todo lo que Chefrys One sabe sobre una cocina — recetas, costos, existencias, conteos, pedidos, ventas, variación — se puede leer con una clave de API, y los momentos que importan llegan como webhooks firmados. No hay que instalar ningún SDK; cualquier lenguaje que pueda hacer una solicitud HTTPS sirve.

Autenticación

Un gerente o dueño crea una clave en Integraciones → API & webhooks en la barra lateral. La clave se muestra una sola vez. Envíela como token bearer:

curl https://www.chefrys.com/recipes \
  -H "Authorization: Bearer cos_0123456789abcdef…"

Una clave actúa para una sola cocina con acceso de chef: toda lectura y escritura operativa, pero nunca personas, facturación, exportaciones o el registro de auditoría. Revóquela en cualquier momento desde la misma pantalla; cada solicitud que hizo queda en el registro de actividad de la cocina bajo el nombre de la clave.

Endpoints que más usan las integraciones

Método · rutaQué devuelve o hace
GET /recipesTodas las recetas con costo, precio, % de costo de alimentos y qué tan completas están.
GET /recipes/{id}/rollupUna receta completa: ingredientes en gramos, subrecetas, pasos, alérgenos, costo de lote y de porción.
GET /ingredientsLa biblioteca de ingredientes con precios por gramo, rendimientos y categorías.
GET /suppliersArtículos del proveedor: paquete, peso del paquete (pack_g, gramos), precio del paquete, código. pack_g 0 es un artículo que se vende por unidad (guantes, charolas de aluminio, una renta): tiene un precio por paquete pero no precio por gramo, así que no se incluye en ningún cálculo por gramo.
GET /inventory/fullExistencias disponibles con valores y niveles par.
GET /count/sheet?date=YYYY-MM-DD · POST /countLa hoja de conteo en unidades de anaquel, y el guardado de conteos ({date, lines:[{id, entries:[{key, qty}]}]}).
GET /variance?from=&to=Variación del período entre dos conteos: apertura + compras − cierre vs. ideal, en gramos y dólares.
GET /menu-engineering?range=30&by=categoryEstrellas, caballos de batalla, incógnitas y perros, con margen y popularidad.
GET /sales · GET /sales/pendingHistorial de ventas, y nombres del POS aún no vinculados a una receta.
GET /order · GET /orders · POST /orders/placeLa hoja de pedido sugerido, los pedidos realizados, y la creación de uno nuevo.
GET /invoicesFacturas archivadas con sus líneas.
GET /price-watchCambios de precio de proveedores de los últimos 30 días y los platos que afectan.
GET /prep · GET /planLa lista de preparación de hoy y el plan de producción.
POST /messageEnvíe un documento (multipart files[]) o texto para lectura — el mismo camino que el compositor; gasta los tokens de la cocina. Con archivos, la respuesta llega de una vez con un batch_id; consulte GET /message/batch/{id} para los resultados a medida que llegan (cada uno se entrega una sola vez) hasta finished.

Las respuestas son JSON. Las fechas están en YYYY-MM-DD; los pesos están en gramos; el dinero está en dólares estadounidenses. Los errores traen {"detail": "…"} con los códigos de estado habituales; una clave que no puede hacer algo recibe 403. Mientras no haya nada que mostrar todavía (sin plan o sin conteos), estos tres devuelven estado 404: GET /prep, /order y /variance. Agregar empty=1 a la consulta para obtener 200 {"empty": true, "detail": "…"} en su lugar.

Webhooks

Registre una URL HTTPS en la misma pantalla y elija los eventos. Cada entrega es un POST en JSON:

{
  "event": "count.finalized",
  "kitchen": "the_bistro",
  "ts": 1789300000.123,
  "data": {"date": "2026-09-13", "items": 212, "value": 18342.10, "by": "marco"}
}
EventoCuándodata
count.finalizedSe bloquea un conteo para una fecha.date, items, value, by
stock.lowLos productos cayeron por debajo del nivel par (después de un conteo, una entrega o las ventas del día); los pedidos sugeridos que se generaron.trigger, items[{id, ingredient, on_hand_g, par_g, short_g, supplier, new}], suggested_orders[{id, supplier, lines, total}]
order.calledChefrys One llamó a un proveedor y leyó un pedido en voz alta.id, supplier, to, lines, by, sid
order.confirmedEl proveedor confirmó un pedido: hizo clic en Confirmar en el correo, respondió por correo electrónico o presionó 1 en la llamada.id, supplier, via (link | reply | call), note
order.problemUn pedido necesita la atención de una persona: el correo rebotó, el proveedor dijo que no puede surtirlo, o su respuesta parece indicar un problema.id, supplier, problem (bounced | declined | reply), detail
order.call_endedCómo resultó esa llamada (completada, ocupado, sin respuesta…) y qué tecla presionó el proveedor.id, supplier, status, seconds, answered_by, result (confirmed | declined)
order.placedLas líneas de la hoja de pedido se convierten en órdenes de compra.orders: [{id, supplier, lines, total}]
order.sentSe envía una orden de compra por correo electrónico al proveedor.id, supplier, to, lines
price.alertEl precio de un proveedor cambió lo suficiente como para modificar el costo de los platos.ingredient, pct, old_pack_price, new_pack_price, dishes
invoice.receivedSe leyó una factura y se registraron sus compras.proveedor, número, fecha, total, líneas (líneas de alimentos), insumos, costo_insumos (líneas de no alimentos, excluidas del costo de alimentos)
sales.syncedLlegaron ventas desde un POS conectado.source, days, rows, matched, unmatched
webhook.testUsted presionó Probar.hello

Verifique cada entrega. El encabezado X-ChefOS-Signature es sha256= seguido del HMAC-SHA256 en hexadecimal del cuerpo de la solicitud sin procesar, usando como clave el secreto del webhook (que se muestra una sola vez al crearlo). Rechace todo lo que no coincida. Responda con un código 2xx dentro de ocho segundos; Chefrys One reintenta una vez y pausa un webhook después de veinte fallos consecutivos.

# Python
import hmac, hashlib
expected = "sha256=" + hmac.new(SECRET.encode(), request_body_bytes, hashlib.sha256).hexdigest()
ok = hmac.compare_digest(expected, request.headers["X-ChefOS-Signature"])

Límites y uso justo

Las claves gastan los tokens de la cocina y comparten su límite diario cuando envían documentos o preguntas. Las lecturas simples son gratuitas. Sea prudente: unas pocas solicitudes por segundo está bien; un scraper no. Preguntas: chefrys.com/talk.