Referencia de la API
Cada ruta que sirve la API, quién puede llamarla, y cómo funcionan el inicio de sesión, los permisos, los errores, las listas y los límites.
Para el paquete Full Stack
URL base y formato de respuesta
Todas las rutas se sirven bajo el prefijo /api. En local, la URL base es http://localhost:8000/api. En un servidor es la dirección de tu API seguida de /api, el mismo valor que leen los dos frontends de NEXT_PUBLIC_API_BASE_URL (Variables de entorno).
La API sirve a dos públicos que nunca comparten un token: los clientes, que usan las rutas del sitio web, y el personal, que usa las del panel. Los cuerpos de las peticiones son JSON, salvo las subidas de archivos. Cada respuesta llega en el mismo envoltorio:
{
"success": true,
"data": { },
"message": ""
}data contiene el resultado. message es una frase breve que rellenan algunas escrituras, en el idioma de la petición, y si no está vacío. El dinero va en dólares decimales en JSON, por ejemplo 14.99, y cada total lo calcula la API: no se confía en nada que un cliente envíe sobre dinero.
La comprobación de estado no necesita token:
curl http://localhost:8000/api/health{"success":true,"data":{"status":"ok","database":"up"},"message":""}Cuando no se puede leer la base de datos, sigue respondiendo 200, con "status":"degraded" y "database":"down". La comprobación de estado de la imagen de Docker lee ese campo.
Errores
Un fallo mantiene el envoltorio, con success: false y el estado HTTP:
{
"success": false,
"data": null,
"message": "errors.kitchen_closed",
"errors": { "email": ["…"] },
"code": "…"
}- Los errores que ve un cliente son claves como
errors.kitchen_closed,errors.outside_areaoerrors.rate_limited, que el sitio web traduce por sí mismo. Los demás mensajes son frases en el idioma de la petición. errorsaparece en un fallo de validación, con los problemas por campo.codelleva un motivo legible por máquina cuando existe, por ejemplochangescon una listachangescuando un precio cambió antes de hacer un pedido.- Una ruta protegida sin token responde
401; un token sin el permiso responde403.
Listas y paginación
Las rutas de lista aceptan page y limit (también se acepta page_count en lugar de limit). limit tiene un máximo de 100. Salvo que quien llama ordene, las filas llegan de la actualizada más recientemente a la más antigua, con el id como desempate, así que la paginación es estable.
{ "items": [ ], "total": 64, "page": 1, "limit": 12, "totalPages": 6 }Las listas de platos y de pedidos ponen las filas bajo items. Las listas de categorías, reseñas, clientes, equipo, roles y ajustes las ponen bajo data, con los mismos campos de paginación. Las listas que se leen en una secuencia, como las secciones de la página de inicio y la cola de las cocinas, mantienen esa secuencia.
Idioma
Envía Accept-Language: ar para recibir mensajes en árabe; cualquier otro valor responde en inglés. Los registros del menú llevan los dos idiomas como { "en": "…", "ar": "…" } diga lo que diga la cabecera, y el cliente elige uno.
Inicio de sesión
Inicia sesión como personal
Terminalcurl -X POST http://localhost:8000/api/auth/login \ -H "Content-Type: application/json" \ -d '{"email":"owner@foodstudio.example","password":"FoodDemo2026!"}'data.access_tokenes el token del personal, contoken_typeBearer,expires_in(7dpor defecto,JWT_EXPIRATION) y el miembro con sus roles.GET /api/auth/medevuelve el miembro con sesión iniciada con sus permisos.Llama a una ruta protegida
Terminalcurl http://localhost:8000/api/orders -H "Authorization: Bearer YOUR_TOKEN"Inicia sesión como cliente
POST /api/auth/customer/logincon el mismo cuerpo responde{ token, user };POST /api/auth/customer/registeraceptafirst_name,last_name,email,password(8 caracteres o más) y, opcionalmente,phone, y responde lo mismo. El cliente de demostración essam@foodstudio.exampleconFoodDemo2026!.
- Un token de cliente se rechaza en todas las rutas del personal, y un token del personal en todas las rutas de clientes.
- Un correo desconocido y una contraseña incorrecta responden ambos
401con el mismo mensaje. - Diez inicios de sesión fallidos desde una misma dirección en 15 minutos, por formulario, responden
429hasta que el fallo más antiguo tiene 15 minutos (RATE_LIMIT_LOGIN). Los inicios de sesión correctos no cuentan. - No hay ruta para cerrar sesión: un cliente cierra sesión olvidando su token.
| Método | Ruta | Quién puede llamarla | Qué hace |
|---|---|---|---|
POST | /api/auth/login | Cualquiera | Inicio de sesión del personal |
GET | /api/auth/me | Cualquier miembro del personal con sesión iniciada | El miembro con sesión iniciada, sus roles y sus permisos |
POST | /api/auth/customer/register | Cualquiera | Crea una cuenta de cliente e inicia sesión. Un client_token repetido devuelve la cuenta del primer intento |
POST | /api/auth/customer/login | Cualquiera | Inicio de sesión de clientes |
GET | /api/auth/customer/me | Cliente | El perfil, con reward_points |
PATCH | /api/auth/customer/me | Cliente | Edita first_name, last_name, email, phone |
PATCH | /api/auth/customer/me/password | Cliente | Cambia la contraseña: current_password, new_password |
POST | /api/auth/customer/forgot-password | Cualquiera | Envía por correo un enlace de restablecimiento. Siempre responde { sent: true }, para cualquier dirección |
POST | /api/auth/customer/reset-password | Cualquiera | Completa un restablecimiento: token, password. Un token funciona una vez, durante una hora |
Permisos
Las rutas del personal comprueban un permiso, con el nombre <module>.<action>. Un miembro tiene todos los permisos de todos sus roles.
| Módulo | Permisos |
|---|---|
| Equipo | admins.view, admins.create, admins.edit, admins.delete, admins.assign_roles |
| Roles | roles.view, roles.create, roles.edit, roles.delete, roles.assign_permissions |
| Ajustes, cocinas y códigos promocionales | settings.view, settings.edit |
| Clientes | users.view, users.create, users.update, users.delete, users.restore, users.verify |
| Categorías | categories.view, categories.create, categories.edit, categories.delete, categories.restore |
| Menú, ofertas y página de inicio | products.view, products.create, products.edit, products.delete, products.restore |
| Pedidos y el resumen | orders.view, orders.edit |
| IA | ai_studio.use, ai_chat.use, ai_chat.view_models |
| Rol de los datos iniciales | Concede |
|---|---|
| Propietario | Todos los permisos |
| Manager | Todos los permisos excepto admins.* y roles.* |
| Cocina | orders.view y orders.edit, limitados a los pedidos de su propia cocina, sin precios ni correo del cliente, y solo los pasos de confirmado a en preparación y de en preparación a listo |
El menú
| Método | Ruta | Quién puede llamarla | Qué hace |
|---|---|---|---|
GET | /api/products | Cualquiera; el personal también ve las filas ocultas | El menú publicado. q, category (slug), dietary (separados por comas), available, sort (popularity, price_asc, price_desc, name), page, limit (12 por defecto). scope=admin con products.view lista todos los platos, borradores incluidos |
GET | /api/products/featured | Cualquiera | Los platos destacados |
GET | /api/products/slug/:slug | Cualquiera; el personal también ve las filas ocultas | Un plato por su slug, con los platos related |
GET | /api/products/:id | Cualquiera; el personal también ve las filas ocultas | Un plato por su id |
GET | /api/products/:id/related | Cualquiera | Platos de la misma categoría, y luego los más vendidos |
GET | /api/categories | Cualquiera; el personal también ve las filas ocultas | Las categorías, en su orden en el menú |
GET | /api/categories/roots | Cualquiera | Las categorías de primer nivel |
GET | /api/categories/slug/:slug | Cualquiera; el personal también ve las filas ocultas | Una categoría por su slug |
GET | /api/categories/:id | Cualquiera; el personal también ve las filas ocultas | Una categoría por id |
GET | /api/offers | Cualquiera; el personal también ve las filas ocultas | Los combos, con sus opciones, suplementos y ahorros |
GET | /api/offers/:code | Cualquiera; el personal también ve las filas ocultas | Un combo, por ejemplo classic-combo |
GET | /api/homepage-sections | Cualquiera; el personal también ve las filas ocultas | Las secciones de la página de inicio, en el orden de la página |
GET | /api/homepage-sections/:key/products | Cualquiera | Los platos que muestra una sección, en orden |
GET | /api/reviews/product/:productId | Cualquiera | Las reseñas de un plato |
GET | /api/reviews/product/:productId/summary | Cualquiera | La media, el total y el recuento por estrellas |
Un plato lleva name, description e ingredients en los dos idiomas, price, su category, images, option_groups con sus choices y el price_delta de cada elección, allergens, dietary_tags, preparation_minutes, y los interruptores is_active (publicado), is_available (se puede pedir ahora), is_featured e is_best_seller.
Cocinas y la comprobación del código postal
| Método | Ruta | Quién puede llamarla | Qué hace |
|---|---|---|---|
GET | /api/kitchens | Cualquiera; el personal también ve las filas ocultas | Las cocinas, cada una con su horario, su zona horaria, su tiempo de preparación, sus códigos postales de entrega y si está abierta ahora |
GET | /api/kitchens/:code | Cualquiera; el personal también ve las filas ocultas | Una cocina, por ejemplo central |
POST | /api/kitchens/check | Cualquiera | Qué cocina puede dar servicio a un código postal |
{ "postcode": "10001", "mode": "delivery", "kitchen_code": "central" }Responde { result, kitchen, alternatives }, donde result es match, outside_area o closed. La recogida no está limitada por el código postal. Si una cocina está abierta depende del ajuste del reloj de servicio.
Precios, códigos promocionales y el carrito
| Método | Ruta | Quién puede llamarla | Qué hace |
|---|---|---|---|
POST | /api/checkout/quote | Cualquiera; si se envía un token de cliente, se lee | Calcula el precio de un carrito para una cocina sin escribir nada |
POST | /api/promo/validate | Cualquiera | Lo que descontaría un código de un subtotal: { code, subtotal } |
GET | /api/cart | Cliente | El carrito en el servidor del cliente con sesión iniciada, con su presupuesto |
POST | /api/cart/items | Cliente | Añade una selección |
PATCH | /api/cart/items/:id | Cliente | Cambia la cantidad, las opciones o la nota de una línea |
DELETE | /api/cart/items/:id | Cliente | Quita una línea |
DELETE | /api/cart | Cliente | Vacía el carrito |
PUT | /api/cart/meta | Cliente | Cambia la cocina y la entrega o recogida |
POST | /api/cart/merge | Cliente | Incorpora un carrito de invitado al iniciar sesión, sin sustituir nunca una línea |
{
"lines": [
{ "product_id": 9, "quantity": 1, "options": [{ "group": "size", "choice": "double" }], "instructions": "no onions" },
{ "offer_id": 1, "quantity": 1, "offer_choices": { "main": 9, "side": 5, "drink": 3 } }
],
"kitchen_code": "central",
"fulfillment": "delivery",
"address": { "street": "12 Main St", "city": "Demo City", "postcode": "10001" },
"promo_code": "TASTE10"
}- Una línea indica un
product_ido unoffer_id, con unaquantityde 1 a 10 einstructionsde 200 caracteres como máximo. - El presupuesto indica el subtotal, los descuentos, la tarifa, el total, los puntos que ganaría el pedido, si la entrega puede hacerse (
address_incomplete,outside_area,closed,below_minimum) y una listachangespara cualquier línea cuyo precio cambió o que no se puede pedir. - Un código promocional descuenta su porcentaje del subtotal del menú, nunca de la tarifa de entrega.
redeem_points: trueaplica un canje para un cliente con sesión iniciada que tenga puntos suficientes.
Hacer un pedido y seguirlo
| Método | Ruta | Quién puede llamarla | Qué hace |
|---|---|---|---|
POST | /api/orders | Cualquiera; si se envía un token de cliente, se lee | Hace un pedido. Necesita una cabecera Idempotency-Key |
GET | /api/orders/my | Cliente | Los pedidos del cliente, del más reciente al más antiguo |
GET | /api/orders/number/:orderNumber | Cliente | Uno de los pedidos del propio cliente, por ejemplo FS-1042 |
GET | /api/orders/track | Cualquiera | Seguimiento para invitados: ?number=FS-1042&email=… |
GET | /api/orders/track/status | Cualquiera | En qué punto está un pedido, para quien tiene un token de seguimiento: ?token=… |
POST /api/ordersacepta laslinesdel presupuesto,kitchen_code,fulfillmentyaddress, másphone,payment_method(stripe,paypalodemo, según lo que listeGET /api/payments/methods),terms_accepted: truey, para un invitado,nameyemail. Opcionales:promo_code,redeem_points,delivery_instructions,locale,accept_changes, yreturn_url_okyreturn_url_cancel, que deben estar en una dirección deCORS_ORIGIN.- Responde
201con{ order, payment, tracking }.payment.kindesredirect, con la página del proveedor enpayment.url, ononepara el pago de demostración, que luego pagaPOST /api/payments/checkout-session.trackinges un token firmado, válido durante tres horas, paraGET /api/orders/track/status. - La misma
Idempotency-Keyde la misma persona devuelve el pedido guardado en lugar de crear un segundo. - Un precio que cambió, o un plato que dejó de estar disponible, responde
422concode: "changes"hasta que el cliente envía la clave del cambio enaccept_changes. - El seguimiento para invitados responde el mismo
404para un número desconocido, un correo incorrecto y parámetros que faltan.
El estado de un pedido pasa por pending, confirmed, preparing, ready, y luego out_for_delivery y delivered para la entrega, o directamente a delivered para la recogida. Puede pasar a cancelled con un motivo antes de salir de la cocina, y solo pasa a refunded cuando el proveedor de pago informa de un reembolso.
Pagos
| Método | Ruta | Quién puede llamarla | Qué hace |
|---|---|---|---|
GET | /api/payments/methods | Cualquiera | Lo que puede ofrecer el pago: { methods, hosted, modes }, cada método test o live |
POST | /api/payments/checkout-session | Cualquiera; si se envía un token de cliente, se lee | Paga, o reabre el pago de, un pedido pendiente sin pagar: { order_number, email? } |
GET | /api/payments/return/stripe | El navegador, al volver de Stripe (dirección firmada) | Confirma el pago con Stripe y luego redirige al sitio web con ?order=…&payment=paid|pending|cancelled|failed |
GET | /api/payments/return/paypal | El navegador, al volver de PayPal (dirección firmada) | Captura el pago aprobado y luego redirige de la misma forma |
POST | /api/payments/webhooks/:provider | Stripe, PayPal o quien llama al pago de demostración | stripe, paypal o demo. Una llamada sin firmar o alterada responde 401 |
Direcciones, platos guardados, recompensas, reseñas y contacto
| Método | Ruta | Quién puede llamarla | Qué hace |
|---|---|---|---|
GET | /api/addresses | Cliente | Las direcciones de entrega guardadas |
GET | /api/addresses/:id | Cliente | Una dirección |
POST | /api/addresses | Cliente | Guarda una dirección |
PATCH | /api/addresses/:id | Cliente | Edita una dirección |
PATCH | /api/addresses/:id/default | Cliente | La convierte en predeterminada |
DELETE | /api/addresses/:id | Cliente | Elimina una dirección |
GET | /api/wishlist | Cliente | Los platos guardados |
PUT | /api/wishlist/:productId | Cliente | Guarda un plato |
DELETE | /api/wishlist/:productId | Cliente | Quita un plato |
DELETE | /api/wishlist | Cliente | Quita todos los platos guardados |
POST | /api/wishlist/merge | Cliente | Añade los platos guardados de un invitado al iniciar sesión |
GET | /api/rewards/me | Cliente | El saldo de puntos, el coste y el valor de un canje, y el historial |
POST | /api/reviews | Cliente | Escribe una reseña de un plato |
PATCH | /api/reviews/:id | Cliente | Edita la reseña propia |
DELETE | /api/reviews/:id | Cliente | Elimina la reseña propia |
POST | /api/contact | Cualquiera | El formulario de contacto: name, email, message, client_token. Llega al personal como notificación |
Personal: menú, categorías, combos y página de inicio
| Método | Ruta | Quién puede llamarla | Qué hace |
|---|---|---|---|
POST | /api/products | Personal con products.create | Crea un plato |
PATCH | /api/products/:id | Personal con products.edit | Edita un plato. images y option_groups sustituyen todo el conjunto cuando se envían |
PATCH | /api/products/:id/availability | Personal con products.edit | { is_available }: el interruptor que una cocina activa o desactiva durante el servicio |
DELETE | /api/products/:id | Personal con products.delete | Archiva un plato |
GET | /api/products/deleted | Personal con products.delete | Los platos archivados |
POST | /api/products/deleted/:id/restore | Personal con products.restore | Restaura un plato |
GET | /api/products/statistic | Personal con products.view | Recuentos del menú |
GET | /api/products/drafts | Cualquier miembro del personal con sesión iniciada | El borrador guardado automáticamente del formulario del plato |
PUT | /api/products/drafts | Cualquier miembro del personal con sesión iniciada | Guarda el borrador |
DELETE | /api/products/drafts | Cualquier miembro del personal con sesión iniciada | Descarta el borrador |
POST | /api/categories | Personal con categories.create | Crea una categoría |
PATCH | /api/categories/:id | Personal con categories.edit | Edita una categoría |
DELETE | /api/categories/:id | Personal con categories.delete | Archiva una categoría |
GET | /api/categories/deleted | Personal con categories.delete | Las categorías archivadas |
POST | /api/categories/deleted/:id/restore | Personal con categories.restore | Restaura una categoría |
GET | /api/categories/statistic | Personal con categories.view | Recuentos de categorías |
POST | /api/offers | Personal con products.create | Crea un combo |
PATCH | /api/offers/:code | Personal con products.edit | Edita un combo |
DELETE | /api/offers/:code | Personal con products.delete | Elimina un combo |
GET | /api/homepage-sections/:key | Personal con products.view | Una sección de la página de inicio |
PUT | /api/homepage-sections/:key | Personal con products.edit | Edita una sección: title, content, position, is_visible, product_ids. Lo que no se envía se queda como estaba |
Personal: pedidos y el resumen
| Método | Ruta | Quién puede llamarla | Qué hace |
|---|---|---|---|
GET | /api/orders | Personal con orders.view | Todos los pedidos que puede ver el miembro: status (separados por comas), fulfillment, date (today, yesterday o un día), q, sort_by, sort_order, paginación |
GET | /api/orders/:id | Personal con orders.view | Un pedido con su cronología |
GET | /api/orders/statistic | Personal con orders.view | Recuentos por estado, y los ingresos pagados para las cuentas que ven dinero |
PATCH | /api/orders/:id/status | Personal con orders.edit | Mueve un pedido: { status, reason? }. Una cancelación necesita un motivo |
GET | /api/overview | Personal con orders.view | La página principal del panel: ?range=today o yesterday. Se rechaza a las cuentas de cocina |
- Un paso que la secuencia de estados no permite responde
409 errors.transition_not_allowed; uno que esta cuenta no puede dar,403 errors.transition_forbidden; confirmar un pedido sin pagar,409 errors.payment_required. - Una cuenta de cocina solo ve los pedidos de su propia cocina, sin precios, y cualquier otro pedido responde
404.
Personal: clientes, equipo y roles
| Método | Ruta | Quién puede llamarla | Qué hace |
|---|---|---|---|
GET | /api/users | Personal con users.view | Clientes, con búsqueda y filtros |
GET | /api/users/statistic | Personal con users.view | Recuentos de clientes |
GET | /api/users/:username | Personal con users.view | Un cliente |
POST | /api/users | Personal con users.create | Crea un cliente |
PATCH | /api/users/:username | Personal con users.update | Edita un cliente |
PATCH | /api/users/:username/change-password | Personal con users.update | Establece la contraseña de un cliente |
POST | /api/users/:username/make-verified | Personal con users.verify | Marca el correo como verificado |
POST | /api/users/:username/make-unverified | Personal con users.verify | Marca el correo como no verificado |
DELETE | /api/users/:username | Personal con users.delete | Elimina un cliente |
GET | /api/users/deleted | Personal con users.view | Clientes eliminados |
GET | /api/users/deleted/:username | Personal con users.view | Un cliente eliminado |
POST | /api/users/deleted/:username/restore | Personal con users.restore | Restaura un cliente |
GET | /api/admins | Personal con admins.view | El equipo |
GET | /api/admins/statistics | Personal con admins.view | Recuentos del equipo |
GET | /api/admins/:id | Personal con admins.view | Un miembro, por id o nombre de usuario |
POST | /api/admins | Personal con admins.create | Añade un miembro |
PATCH | /api/admins/:id | Personal con admins.edit | Edita un miembro, incluida su cocina |
PATCH | /api/admins/:id/roles | Personal con admins.assign_roles | Asigna los roles de un miembro |
DELETE | /api/admins/:id | Personal con admins.delete | Elimina un miembro |
PATCH | /api/admins/profile | Personal con admins.edit | Edita el perfil propio |
PATCH | /api/admins/profile/password | Cualquier miembro del personal con sesión iniciada | Cambia la contraseña propia |
GET | /api/roles | Personal con roles.view | Los roles |
GET | /api/roles/statistics | Personal con roles.view | Recuentos de roles |
GET | /api/roles/select | Personal con roles.view | Los roles, con el formato de un selector |
GET | /api/roles/permissions | Personal con roles.view | Todos los permisos |
GET | /api/roles/:id | Personal con roles.view | Un rol con sus permisos |
POST | /api/roles | Personal con roles.create | Crea un rol |
PUT | /api/roles/:id | Personal con roles.edit | Renombra un rol |
POST | /api/roles/:id/permissions | Personal con roles.assign_permissions | Asigna los permisos de un rol |
DELETE | /api/roles/:id | Personal con roles.delete | Elimina un rol |
Personal: ajustes, cocinas, códigos promocionales, subidas y notificaciones
| Método | Ruta | Quién puede llamarla | Qué hace |
|---|---|---|---|
GET | /api/settings | Personal con settings.view | Cada ajuste guardado: search, category, paginación |
GET | /api/settings/:key | Personal con settings.view | Un ajuste, por ejemplo delivery_fee |
PATCH | /api/settings/:key | Personal con settings.edit | Cambia un ajuste |
DELETE | /api/settings/:key | Personal con settings.edit | Elimina un ajuste |
POST | /api/kitchens | Personal con settings.edit | Añade una cocina |
PATCH | /api/kitchens/:code | Personal con settings.edit | Edita una cocina |
DELETE | /api/kitchens/:code | Personal con settings.edit | Elimina una cocina |
GET | /api/promo | Personal con settings.view | Los códigos promocionales |
POST | /api/promo | Personal con settings.edit | Crea un código: code, percent, excludes_delivery, stackable_with_rewards, is_active |
PATCH | /api/promo/:id | Personal con settings.edit | Edita un código |
DELETE | /api/promo/:id | Personal con settings.edit | Elimina un código. Los pedidos lo conservan como texto |
POST | /api/helpers/upload | Cualquier miembro del personal con sesión iniciada | Sube una imagen o un vídeo, multipart/form-data con file, hasta 150 MB |
GET | /api/notifications | Cualquier miembro del personal con sesión iniciada | Las 30 notificaciones más recientes del miembro y el recuento de no leídas |
PATCH | /api/notifications/read-all | Cualquier miembro del personal con sesión iniciada | Marca todas las notificaciones como leídas |
PATCH | /api/notifications/:id/read | Cualquier miembro del personal con sesión iniciada | Marca una como leída |
DELETE | /api/notifications/:id | Cualquier miembro del personal con sesión iniciada | Elimina una |
- Los ajustes con los que funciona el restaurante son
delivery_fee,pickup_fee,delivery_minimum,rewards_points_per_dollar,rewards_redeem_points,rewards_redeem_valueyservice_clock(realodemo-fixed), junto asite_name,site_tagline,support_emailysupport_phone. - Una imagen subida se guarda como JPEG en varios tamaños, y la respuesta relaciona cada versión con su dirección. Los archivos van al bucket cuando las variables
R2_*están configuradas y, si no, a/media/uploads/…en la API. - Cada ruta de notificaciones responde con todo el listado, así que un cliente sustituye lo que tiene por la respuesta.
Límites por dirección
| Ruta | Límite | Variable |
|---|---|---|
POST /api/auth/login, POST /api/auth/customer/login | 10 inicios de sesión fallidos cada 15 minutos, por formulario | RATE_LIMIT_LOGIN |
POST /api/orders | 10 cada 10 minutos | RATE_LIMIT_ORDERS |
POST /api/payments/checkout-session | 30 cada 10 minutos | RATE_LIMIT_PAYMENT_SESSION |
GET /api/orders/track | 30 cada 10 minutos | RATE_LIMIT_TRACKING |
POST /api/auth/customer/register | 10 por hora | RATE_LIMIT_REGISTER |
POST /api/contact | 5 por hora | RATE_LIMIT_CONTACT |
POST /api/auth/customer/forgot-password | 10 por hora, y 5 mensajes por destinatario al día | RATE_LIMIT_PASSWORD_RESET, MAIL_MAX_PER_ADDRESS_PER_DAY |
Una petición que supera un límite responde 429 con errors.rate_limited. Los recuentos viven en la memoria de la API, así que un reinicio los borra. Detrás de un proxy inverso, configura TRUST_PROXY para que cada visitante se cuente por su propia dirección.
El asistente de IA y sus conversaciones
Incluido con tu compra. Inicia sesión para leerlo o ábrelo en tu descarga.
Las rutas en streaming del asistente, su lista de modelos y las conversaciones guardadas.
Estudio de IA
Incluido con tu compra. Inicia sesión para leerlo o ábrelo en tu descarga.
Las rutas del estudio: fichas, generaciones, guardado de resultados y eliminación del fondo.
Servidor MCP
Incluido con tu compra. Inicia sesión para leerlo o ábrelo en tu descarga.
El endpoint MCP para agentes de programación y cómo se autoriza.
Actualizaciones en directo por WebSocket
Incluido con tu compra. Inicia sesión para leerlo o ábrelo en tu descarga.
Los namespaces de Socket.IO que escucha el panel, sus eventos y cómo se autoriza una conexión.
Rutas del modo demostración
Incluido con tu compra. Inicia sesión para leerlo o ábrelo en tu descarga.
Las rutas que solo existen en una versión de demo pública.