Cliente · Menú y QR¶
Esta área expone la cara pública (cliente) del catálogo: lo que ve quien escanea el QR de la mesa. A partir del slug del restaurante (o, por retrocompatibilidad, su id numérico) devuelve el menú completo —categorías con sus productos disponibles, extras de pago y grupos de opciones— y el detalle ampliado de un producto concreto (alérgenos, perfil de sabor, maridajes, descripción de IA). Es de solo lectura: aquí no se crean pedidos; eso vive en el dominio de carrito y comanda.
Estos endpoints son públicos y sin autenticación: no requieren JWT ni cabeceras de acceso. La multitenancy se resuelve por la ruta (el slug/id del restaurante en el path), no por la sesión del cliente; nunca se confía en un restaurant_id del body. Los campos traducibles (name, description…) se resuelven a un idioma mediante el parámetro de query ?lang= (por defecto es, con fallback a es y luego al primer idioma disponible). Los precios viajan en céntimos enteros (price) más su versión formateada con divisa (price_formatted).
Caché y consistencia
La respuesta del menú completo se cachea por (restaurant_id, lang). Las mutaciones desde la API de administración invalidan esa caché, así que los cambios de carta se reflejan en cuanto se propaga la invalidación. No hay paginación en esta superficie: el menú se entrega entero en una sola respuesta.
Para entender el modelo de datos detrás de estos endpoints —la jerarquía Menu → Category → Product, la diferencia entre extras y grupos de opciones, el i18n por diccionarios y los precios en céntimos— consulta Menú y catálogo. El QR y la mesa que originan la sesión del cliente se describen en Restaurante y mesas. Para la visión general de la API y sus convenciones, ver Referencia API.
Generado automáticamente
Las tablas y fichas de endpoints de esta página se generan desde el contrato OpenAPI. No las edites a mano; edita la intro en documentation/reference/api/_intros/cliente-menu.md y regenera con python scripts/gen_openapi_reference.py.
Resumen de endpoints¶
| Método | Ruta | Resumen | Auth |
|---|---|---|---|
GET |
/api/v1/products/{product_id} |
Get Public Product | Pública |
GET |
/api/v1/restaurants/{slug}/menu |
Get Public Menu | Pública |
GET |
/api/v1/tables/{qr_code} |
Get Table By Qr | Pública |
Detalle¶
GET /api/v1/products/{product_id}¶
Get Public Product
Get product details by ID (customer-facing).
- Auth: Pública
- Parámetros:
product_id(path, requerido) - Respuestas:
200ProductDetailResponse,422HTTPValidationError
GET /api/v1/restaurants/{slug}/menu¶
Get Public Menu
Get full menu for a restaurant (customer-facing), keyed by slug.
- Auth: Pública
- Parámetros:
slug(path, requerido),lang(query, opcional) - Respuestas:
200MenuResponse,422HTTPValidationError
GET /api/v1/tables/{qr_code}¶
Get Table By Qr
Get table info by QR code.
- Auth: Pública
- Parámetros:
qr_code(path, requerido) - Respuestas:
200TableResponse,422HTTPValidationError