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 · ruta | Qué devuelve o hace |
|---|---|
GET /recipes | Todas las recetas con costo, precio, % de costo de alimentos y qué tan completas están. |
GET /recipes/{id}/rollup | Una receta completa: ingredientes en gramos, subrecetas, pasos, alérgenos, costo de lote y de porción. |
GET /ingredients | La biblioteca de ingredientes con precios por gramo, rendimientos y categorías. |
GET /suppliers | Artí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/full | Existencias disponibles con valores y niveles par. |
GET /count/sheet?date=YYYY-MM-DD · POST /count | La 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=category | Estrellas, caballos de batalla, incógnitas y perros, con margen y popularidad. |
GET /sales · GET /sales/pending | Historial de ventas, y nombres del POS aún no vinculados a una receta. |
GET /order · GET /orders · POST /orders/place | La hoja de pedido sugerido, los pedidos realizados, y la creación de uno nuevo. |
GET /invoices | Facturas archivadas con sus líneas. |
GET /price-watch | Cambios de precio de proveedores de los últimos 30 días y los platos que afectan. |
GET /prep · GET /plan | La lista de preparación de hoy y el plan de producción. |
POST /message | Enví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"}
}
| Evento | Cuándo | data |
|---|---|---|
count.finalized | Se bloquea un conteo para una fecha. | date, items, value, by |
stock.low | Los 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.called | Chefrys One llamó a un proveedor y leyó un pedido en voz alta. | id, supplier, to, lines, by, sid |
order.confirmed | El 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.problem | Un 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_ended | Cómo resultó esa llamada (completada, ocupado, sin respuesta…) y qué tecla presionó el proveedor. | id, supplier, status, seconds, answered_by, result (confirmed | declined) |
order.placed | Las líneas de la hoja de pedido se convierten en órdenes de compra. | orders: [{id, supplier, lines, total}] |
order.sent | Se envía una orden de compra por correo electrónico al proveedor. | id, supplier, to, lines |
price.alert | El 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.received | Se 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.synced | Llegaron ventas desde un POS conectado. | source, days, rows, matched, unmatched |
webhook.test | Usted 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.