Référence de l'API
Chaque route servie par l'API, qui peut l'appeler, et comment fonctionnent la connexion, les permissions, les erreurs, les listes et les limites.
Pour le pack Full Stack
URL de base et format des réponses
Chaque route est servie sous le préfixe /api. En local, l'URL de base est http://localhost:8000/api. Sur un serveur, c'est l'adresse de votre API suivie de /api, la même valeur que les deux frontends lisent dans NEXT_PUBLIC_API_BASE_URL (Variables d'environnement).
L'API sert deux publics qui ne partagent jamais de jeton : les clients, qui utilisent les routes du site, et le personnel, qui utilise celles du tableau de bord. Les corps de requête sont en JSON, sauf pour les envois de fichiers. Chaque réponse arrive dans la même enveloppe :
{
"success": true,
"data": { },
"message": ""
}data contient le résultat. message est une courte phrase que certaines écritures remplissent, dans la langue de la requête, et qui est vide sinon. Les montants sont en dollars décimaux dans le JSON, par exemple 14.99, et chaque total est calculé par l'API : rien de ce qu'un client envoie au sujet d'un montant n'est pris pour argent comptant.
La vérification de santé ne demande aucun jeton :
curl http://localhost:8000/api/health{"success":true,"data":{"status":"ok","database":"up"},"message":""}Quand la base de données ne peut pas être lue, elle répond quand même 200, avec "status":"degraded" et "database":"down". La vérification de santé de l'image Docker lit ce champ.
Erreurs
Un échec garde l'enveloppe, avec success: false et le statut HTTP :
{
"success": false,
"data": null,
"message": "errors.kitchen_closed",
"errors": { "email": ["…"] },
"code": "…"
}- Les erreurs qu'un client voit sont des clés comme
errors.kitchen_closed,errors.outside_areaouerrors.rate_limited, que le site traduit lui-même. Les autres messages sont des phrases dans la langue de la requête. errorsapparaît en cas d'échec de validation, avec les problèmes par champ.codeporte une raison lisible par une machine quand il en existe une, commechangesavec une listechangesquand un prix a changé avant qu'une commande soit passée.- Une route protégée sans jeton répond
401; un jeton sans la permission répond403.
Listes et pagination
Les routes de liste acceptent page et limit (page_count est accepté à la place de limit). limit est plafonné à 100. Sauf si l'appelant trie, les lignes arrivent de la plus récemment modifiée à la plus ancienne, avec l'id pour départager, donc la pagination est stable.
{ "items": [ ], "total": 64, "page": 1, "limit": 12, "totalPages": 6 }Les listes de plats et de commandes placent les lignes sous items. Les listes de catégories, d'avis, de clients, d'équipe, de rôles et de paramètres les placent sous data, avec les mêmes champs de pagination. Les listes lues dans un ordre défini, comme les sections de la page d'accueil et la file d'attente des cuisines, gardent cet ordre.
Langue
Envoyez Accept-Language: ar pour des messages en arabe ; toute autre valeur répond en anglais. Les éléments du menu portent les deux langues sous la forme { "en": "…", "ar": "…" } quel que soit l'en-tête, et le client en choisit une.
Connexion
Se connecter en tant que membre du personnel
Terminalcurl -X POST http://localhost:8000/api/auth/login \ -H "Content-Type: application/json" \ -d '{"email":"owner@foodstudio.example","password":"FoodDemo2026!"}'data.access_tokenest le jeton du personnel, avectoken_typeBearer,expires_in(7dpar défaut,JWT_EXPIRATION) et le membre avec ses rôles.GET /api/auth/merenvoie le membre connecté avec ses permissions.Appeler une route protégée
Terminalcurl http://localhost:8000/api/orders -H "Authorization: Bearer YOUR_TOKEN"Se connecter en tant que client
POST /api/auth/customer/loginavec le même corps répond{ token, user };POST /api/auth/customer/registeracceptefirst_name,last_name,email,password(8 caractères ou plus) et éventuellementphone, et répond de la même façon. Le client de démonstration estsam@foodstudio.exampleavecFoodDemo2026!.
- Un jeton client est refusé sur toutes les routes du personnel, et un jeton du personnel sur toutes les routes client.
- Un e-mail inconnu et un mauvais mot de passe répondent tous deux
401avec le même message. - Dix échecs de connexion depuis une même adresse en 15 minutes, par formulaire, répondent
429jusqu'à ce que le plus ancien échec date de 15 minutes (RATE_LIMIT_LOGIN). Les connexions réussies ne sont pas comptées. - Il n'y a pas de route de déconnexion : un client se déconnecte en oubliant son jeton.
| Méthode | Chemin | Qui peut l'appeler | Rôle |
|---|---|---|---|
POST | /api/auth/login | N'importe qui | Connexion du personnel |
GET | /api/auth/me | Tout membre du personnel connecté | Le membre connecté, ses rôles et ses permissions |
POST | /api/auth/customer/register | N'importe qui | Créer un compte client et se connecter. Un client_token répété renvoie le compte de la première tentative |
POST | /api/auth/customer/login | N'importe qui | Connexion client |
GET | /api/auth/customer/me | Client | Le profil, avec reward_points |
PATCH | /api/auth/customer/me | Client | Modifier first_name, last_name, email, phone |
PATCH | /api/auth/customer/me/password | Client | Changer le mot de passe : current_password, new_password |
POST | /api/auth/customer/forgot-password | N'importe qui | Envoyer un lien de réinitialisation par e-mail. Répond toujours { sent: true }, pour n'importe quelle adresse |
POST | /api/auth/customer/reset-password | N'importe qui | Terminer une réinitialisation : token, password. Un jeton fonctionne une seule fois, dans l'heure |
Permissions
Les routes du personnel vérifient une permission, nommée <module>.<action>. Un membre détient toutes les permissions de tous ses rôles.
| Module | Permissions |
|---|---|
| Équipe | admins.view, admins.create, admins.edit, admins.delete, admins.assign_roles |
| Rôles | roles.view, roles.create, roles.edit, roles.delete, roles.assign_permissions |
| Paramètres, cuisines et codes promo | settings.view, settings.edit |
| Clients | users.view, users.create, users.update, users.delete, users.restore, users.verify |
| Catégories | categories.view, categories.create, categories.edit, categories.delete, categories.restore |
| Menu, offres et page d'accueil | products.view, products.create, products.edit, products.delete, products.restore |
| Commandes et vue d'ensemble | orders.view, orders.edit |
| IA | ai_studio.use, ai_chat.use, ai_chat.view_models |
| Rôle de démonstration | Accorde |
|---|---|
| Propriétaire | Toutes les permissions |
| Manager | Toutes les permissions sauf admins.* et roles.* |
| Cuisine | orders.view et orders.edit, limitées aux commandes de sa propre cuisine, sans les prix ni l'e-mail du client, et uniquement les passages de confirmée à en préparation et d'en préparation à prête |
Le menu
| Méthode | Chemin | Qui peut l'appeler | Rôle |
|---|---|---|---|
GET | /api/products | Tout le monde ; le personnel voit aussi les lignes masquées | Le menu publié. q, category (slug), dietary (séparés par des virgules), available, sort (popularity, price_asc, price_desc, name), page, limit (12 par défaut). scope=admin avec products.view liste tous les plats, brouillons compris |
GET | /api/products/featured | N'importe qui | Les plats mis en avant |
GET | /api/products/slug/:slug | Tout le monde ; le personnel voit aussi les lignes masquées | Un plat par son slug, avec les plats related |
GET | /api/products/:id | Tout le monde ; le personnel voit aussi les lignes masquées | Un plat par son id |
GET | /api/products/:id/related | N'importe qui | Des plats de la même catégorie, puis les meilleures ventes |
GET | /api/categories | Tout le monde ; le personnel voit aussi les lignes masquées | Les catégories, dans l'ordre du menu |
GET | /api/categories/roots | N'importe qui | Les catégories de premier niveau |
GET | /api/categories/slug/:slug | Tout le monde ; le personnel voit aussi les lignes masquées | Une catégorie par son slug |
GET | /api/categories/:id | Tout le monde ; le personnel voit aussi les lignes masquées | Une catégorie par identifiant |
GET | /api/offers | Tout le monde ; le personnel voit aussi les lignes masquées | Les menus combinés, avec leurs choix, suppléments et économies |
GET | /api/offers/:code | Tout le monde ; le personnel voit aussi les lignes masquées | Un menu combiné, par exemple classic-combo |
GET | /api/homepage-sections | Tout le monde ; le personnel voit aussi les lignes masquées | Les sections de la page d'accueil, dans l'ordre de la page |
GET | /api/homepage-sections/:key/products | N'importe qui | Les plats qu'affiche une section, dans l'ordre |
GET | /api/reviews/product/:productId | N'importe qui | Les avis d'un plat |
GET | /api/reviews/product/:productId/summary | N'importe qui | La moyenne, le total et le nombre par étoile |
Un plat porte name, description et ingredients dans les deux langues, price, sa category, images, option_groups avec leurs choices et le price_delta de chaque choix, allergens, dietary_tags, preparation_minutes, et les interrupteurs is_active (publié), is_available (commandable maintenant), is_featured et is_best_seller.
Les cuisines et la vérification du code postal
| Méthode | Chemin | Qui peut l'appeler | Rôle |
|---|---|---|---|
GET | /api/kitchens | Tout le monde ; le personnel voit aussi les lignes masquées | Les cuisines, chacune avec ses horaires, son fuseau horaire, son temps de préparation, ses codes postaux de livraison et si elle est ouverte en ce moment |
GET | /api/kitchens/:code | Tout le monde ; le personnel voit aussi les lignes masquées | Une cuisine, par exemple central |
POST | /api/kitchens/check | N'importe qui | Quelle cuisine peut desservir un code postal |
{ "postcode": "10001", "mode": "delivery", "kitchen_code": "central" }Elle répond { result, kitchen, alternatives }, où result vaut match, outside_area ou closed. Le retrait sur place n'est pas limité par le code postal. L'ouverture d'une cuisine suit le réglage de l'horloge de service.
Prix, codes promo et panier
| Méthode | Chemin | Qui peut l'appeler | Rôle |
|---|---|---|---|
POST | /api/checkout/quote | Tout le monde ; un jeton client est lu s'il est envoyé | Calculer le prix d'un panier pour une cuisine sans rien écrire |
POST | /api/promo/validate | N'importe qui | Ce qu'un code retirerait d'un sous-total : { code, subtotal } |
GET | /api/cart | Client | Le panier serveur du client connecté, avec son devis |
POST | /api/cart/items | Client | Ajouter une sélection |
PATCH | /api/cart/items/:id | Client | Modifier la quantité, les options ou la note d'une ligne |
DELETE | /api/cart/items/:id | Client | Supprimer une ligne |
DELETE | /api/cart | Client | Vider le panier |
PUT | /api/cart/meta | Client | Changer de cuisine et de mode, livraison ou retrait |
POST | /api/cart/merge | Client | Fusionner un panier invité à la connexion, sans jamais remplacer une ligne |
{
"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"
}- Une ligne indique un
product_idou unoffer_id, avec unequantityde 1 à 10 et desinstructionsde 200 caractères au plus. - Le devis indique le sous-total, les remises, les frais, le total, les points que rapporterait la commande, si la livraison peut avoir lieu (
address_incomplete,outside_area,closed,below_minimum) et une listechangespour chaque ligne dont le prix a changé ou qui ne peut pas être commandée. - Un code promo retire son pourcentage du sous-total du menu, jamais des frais de livraison.
redeem_points: trueapplique une utilisation de points pour un client connecté qui en a assez.
Passer et suivre une commande
| Méthode | Chemin | Qui peut l'appeler | Rôle |
|---|---|---|---|
POST | /api/orders | Tout le monde ; un jeton client est lu s'il est envoyé | Passer une commande. Nécessite un en-tête Idempotency-Key |
GET | /api/orders/my | Client | Les commandes du client, de la plus récente à la plus ancienne |
GET | /api/orders/number/:orderNumber | Client | Une des commandes du client, par exemple FS-1042 |
GET | /api/orders/track | N'importe qui | Suivi invité : ?number=FS-1042&email=… |
GET | /api/orders/track/status | N'importe qui | L'état d'une commande, pour le détenteur d'un jeton de suivi : ?token=… |
POST /api/ordersaccepte leslinesdu devis,kitchen_code,fulfillmentetaddress, plusphone,payment_method(stripe,paypaloudemo, comme les listeGET /api/payments/methods),terms_accepted: trueet, pour un invité,nameetemail. Optionnels :promo_code,redeem_points,delivery_instructions,locale,accept_changes, ainsi quereturn_url_oketreturn_url_cancel, qui doivent se trouver sur une adresse deCORS_ORIGIN.- Elle répond
201avec{ order, payment, tracking }.payment.kindvautredirect, avec la page du prestataire danspayment.url, ounonepour le paiement de démonstration, quePOST /api/payments/checkout-sessionrègle ensuite.trackingest un jeton signé, valable trois heures, pourGET /api/orders/track/status. - Le même
Idempotency-Keyenvoyé par la même personne renvoie la commande enregistrée au lieu d'en créer une deuxième. - Un prix qui a changé, ou un plat devenu indisponible, répond
422aveccode: "changes"jusqu'à ce que le client envoie la clé du changement dansaccept_changes. - Le suivi invité répond le même
404pour un numéro inconnu, un mauvais e-mail et des paramètres manquants.
Le statut d'une commande passe par pending, confirmed, preparing, ready, puis out_for_delivery et delivered pour une livraison, ou directement delivered pour un retrait. Elle peut être cancelled avec un motif avant de quitter la cuisine, et ne devient refunded que lorsque le prestataire de paiement signale un remboursement.
Paiements
| Méthode | Chemin | Qui peut l'appeler | Rôle |
|---|---|---|---|
GET | /api/payments/methods | N'importe qui | Ce que le paiement peut proposer : { methods, hosted, modes }, chaque moyen en test ou live |
POST | /api/payments/checkout-session | Tout le monde ; un jeton client est lu s'il est envoyé | Payer, ou rouvrir le paiement, d'une commande en attente impayée : { order_number, email? } |
GET | /api/payments/return/stripe | Le navigateur, au retour de Stripe (adresse signée) | Confirme le paiement auprès de Stripe, puis redirige vers le site avec ?order=…&payment=paid|pending|cancelled|failed |
GET | /api/payments/return/paypal | Le navigateur, au retour de PayPal (adresse signée) | Capture le paiement approuvé, puis redirige de la même façon |
POST | /api/payments/webhooks/:provider | Stripe, PayPal, ou l'appelant du paiement de démonstration | stripe, paypal ou demo. Un appel non signé ou modifié répond 401 |
Adresses, plats enregistrés, fidélité, avis et contact
| Méthode | Chemin | Qui peut l'appeler | Rôle |
|---|---|---|---|
GET | /api/addresses | Client | Les adresses de livraison enregistrées |
GET | /api/addresses/:id | Client | Une adresse |
POST | /api/addresses | Client | Enregistrer une adresse |
PATCH | /api/addresses/:id | Client | Modifier une adresse |
PATCH | /api/addresses/:id/default | Client | En faire l'adresse par défaut |
DELETE | /api/addresses/:id | Client | Supprimer une adresse |
GET | /api/wishlist | Client | Les plats enregistrés |
PUT | /api/wishlist/:productId | Client | Enregistrer un plat |
DELETE | /api/wishlist/:productId | Client | Retirer un plat |
DELETE | /api/wishlist | Client | Retirer tous les plats enregistrés |
POST | /api/wishlist/merge | Client | Ajouter les plats enregistrés d'un invité à la connexion |
GET | /api/rewards/me | Client | Le solde de points, le coût et la valeur d'une utilisation, et l'historique |
POST | /api/reviews | Client | Donner un avis sur un plat |
PATCH | /api/reviews/:id | Client | Modifier son propre avis |
DELETE | /api/reviews/:id | Client | Supprimer son propre avis |
POST | /api/contact | N'importe qui | Le formulaire de contact : name, email, message, client_token. Il arrive au personnel sous forme de notification |
Personnel : menu, catégories, menus combinés et page d'accueil
| Méthode | Chemin | Qui peut l'appeler | Rôle |
|---|---|---|---|
POST | /api/products | Personnel avec products.create | Créer un plat |
PATCH | /api/products/:id | Personnel avec products.edit | Modifier un plat. images et option_groups remplacent tout l'ensemble quand ils sont envoyés |
PATCH | /api/products/:id/availability | Personnel avec products.edit | { is_available } : l'interrupteur qu'une cuisine actionne pendant le service |
DELETE | /api/products/:id | Personnel avec products.delete | Archiver un plat |
GET | /api/products/deleted | Personnel avec products.delete | Les plats archivés |
POST | /api/products/deleted/:id/restore | Personnel avec products.restore | Restaurer un plat |
GET | /api/products/statistic | Personnel avec products.view | Totaux du menu |
GET | /api/products/drafts | Tout membre du personnel connecté | Le brouillon enregistré automatiquement du formulaire de plat |
PUT | /api/products/drafts | Tout membre du personnel connecté | Enregistrer le brouillon |
DELETE | /api/products/drafts | Tout membre du personnel connecté | Abandonner le brouillon |
POST | /api/categories | Personnel avec categories.create | Créer une catégorie |
PATCH | /api/categories/:id | Personnel avec categories.edit | Modifier une catégorie |
DELETE | /api/categories/:id | Personnel avec categories.delete | Archiver une catégorie |
GET | /api/categories/deleted | Personnel avec categories.delete | Les catégories archivées |
POST | /api/categories/deleted/:id/restore | Personnel avec categories.restore | Restaurer une catégorie |
GET | /api/categories/statistic | Personnel avec categories.view | Nombre de catégories |
POST | /api/offers | Personnel avec products.create | Créer un menu combiné |
PATCH | /api/offers/:code | Personnel avec products.edit | Modifier un menu combiné |
DELETE | /api/offers/:code | Personnel avec products.delete | Supprimer un menu combiné |
GET | /api/homepage-sections/:key | Personnel avec products.view | Une section de la page d'accueil |
PUT | /api/homepage-sections/:key | Personnel avec products.edit | Modifier une section : title, content, position, is_visible, product_ids. Ce qui est omis reste inchangé |
Personnel : commandes et vue d'ensemble
| Méthode | Chemin | Qui peut l'appeler | Rôle |
|---|---|---|---|
GET | /api/orders | Personnel avec orders.view | Toutes les commandes que le membre peut voir : status (séparés par des virgules), fulfillment, date (today, yesterday ou un jour), q, sort_by, sort_order, pagination |
GET | /api/orders/:id | Personnel avec orders.view | Une commande avec sa chronologie |
GET | /api/orders/statistic | Personnel avec orders.view | Totaux par statut, et le chiffre d'affaires encaissé pour les comptes qui voient les montants |
PATCH | /api/orders/:id/status | Personnel avec orders.edit | Faire avancer une commande : { status, reason? }. Une annulation nécessite un motif |
GET | /api/overview | Personnel avec orders.view | La page principale du tableau de bord : ?range=today ou yesterday. Refusée aux comptes cuisine |
- Un passage que l'enchaînement des statuts n'autorise pas répond
409 errors.transition_not_allowed; un passage que ce compte ne peut pas faire,403 errors.transition_forbidden; la confirmation d'une commande impayée,409 errors.payment_required. - Un compte cuisine ne voit que les commandes de sa propre cuisine, sans les prix, et toute autre commande répond
404.
Personnel : clients, équipe et rôles
| Méthode | Chemin | Qui peut l'appeler | Rôle |
|---|---|---|---|
GET | /api/users | Personnel avec users.view | Clients, avec recherche et filtres |
GET | /api/users/statistic | Personnel avec users.view | Totaux des clients |
GET | /api/users/:username | Personnel avec users.view | Un client |
POST | /api/users | Personnel avec users.create | Créer un client |
PATCH | /api/users/:username | Personnel avec users.update | Modifier un client |
PATCH | /api/users/:username/change-password | Personnel avec users.update | Définir le mot de passe d'un client |
POST | /api/users/:username/make-verified | Personnel avec users.verify | Marquer l'e-mail comme vérifié |
POST | /api/users/:username/make-unverified | Personnel avec users.verify | Marquer l'e-mail comme non vérifié |
DELETE | /api/users/:username | Personnel avec users.delete | Supprimer un client |
GET | /api/users/deleted | Personnel avec users.view | Clients supprimés |
GET | /api/users/deleted/:username | Personnel avec users.view | Un client supprimé |
POST | /api/users/deleted/:username/restore | Personnel avec users.restore | Restaurer un client |
GET | /api/admins | Personnel avec admins.view | L'équipe |
GET | /api/admins/statistics | Personnel avec admins.view | Totaux de l'équipe |
GET | /api/admins/:id | Personnel avec admins.view | Un membre, par id ou par nom d'utilisateur |
POST | /api/admins | Personnel avec admins.create | Ajouter un membre |
PATCH | /api/admins/:id | Personnel avec admins.edit | Modifier un membre, y compris sa cuisine |
PATCH | /api/admins/:id/roles | Personnel avec admins.assign_roles | Définir les rôles d'un membre |
DELETE | /api/admins/:id | Personnel avec admins.delete | Retirer un membre |
PATCH | /api/admins/profile | Personnel avec admins.edit | Modifier son propre profil |
PATCH | /api/admins/profile/password | Tout membre du personnel connecté | Changer son propre mot de passe |
GET | /api/roles | Personnel avec roles.view | Les rôles |
GET | /api/roles/statistics | Personnel avec roles.view | Nombre de rôles |
GET | /api/roles/select | Personnel avec roles.view | Les rôles, sous une forme adaptée à un sélecteur |
GET | /api/roles/permissions | Personnel avec roles.view | Toutes les permissions |
GET | /api/roles/:id | Personnel avec roles.view | Un rôle avec ses permissions |
POST | /api/roles | Personnel avec roles.create | Créer un rôle |
PUT | /api/roles/:id | Personnel avec roles.edit | Renommer un rôle |
POST | /api/roles/:id/permissions | Personnel avec roles.assign_permissions | Définir les permissions d'un rôle |
DELETE | /api/roles/:id | Personnel avec roles.delete | Supprimer un rôle |
Personnel : paramètres, cuisines, codes promo, envois de fichiers et notifications
| Méthode | Chemin | Qui peut l'appeler | Rôle |
|---|---|---|---|
GET | /api/settings | Personnel avec settings.view | Chaque paramètre enregistré : search, category, pagination |
GET | /api/settings/:key | Personnel avec settings.view | Un paramètre, par exemple delivery_fee |
PATCH | /api/settings/:key | Personnel avec settings.edit | Modifier un paramètre |
DELETE | /api/settings/:key | Personnel avec settings.edit | Supprimer un paramètre |
POST | /api/kitchens | Personnel avec settings.edit | Ajouter une cuisine |
PATCH | /api/kitchens/:code | Personnel avec settings.edit | Modifier une cuisine |
DELETE | /api/kitchens/:code | Personnel avec settings.edit | Supprimer une cuisine |
GET | /api/promo | Personnel avec settings.view | Les codes promo |
POST | /api/promo | Personnel avec settings.edit | Créer un code : code, percent, excludes_delivery, stackable_with_rewards, is_active |
PATCH | /api/promo/:id | Personnel avec settings.edit | Modifier un code |
DELETE | /api/promo/:id | Personnel avec settings.edit | Supprimer un code. Les commandes le conservent sous forme de texte |
POST | /api/helpers/upload | Tout membre du personnel connecté | Envoyer une image ou une vidéo, en multipart/form-data avec file, jusqu'à 150 Mo |
GET | /api/notifications | Tout membre du personnel connecté | Les 30 notifications les plus récentes du membre et le nombre de non lues |
PATCH | /api/notifications/read-all | Tout membre du personnel connecté | Marquer toutes les notifications comme lues |
PATCH | /api/notifications/:id/read | Tout membre du personnel connecté | En marquer une comme lue |
DELETE | /api/notifications/:id | Tout membre du personnel connecté | En supprimer une |
- Les paramètres sur lesquels tourne le restaurant sont
delivery_fee,pickup_fee,delivery_minimum,rewards_points_per_dollar,rewards_redeem_points,rewards_redeem_valueetservice_clock(realoudemo-fixed), à côté desite_name,site_tagline,support_emailetsupport_phone. - Une image envoyée est stockée en JPEG en plusieurs tailles, et la réponse associe chaque version à son adresse. Les fichiers vont dans le bucket quand les variables
R2_*sont définies, et sinon dans/media/uploads/…sur l'API. - Chaque route de notifications répond avec le flux complet : un client remplace donc ce qu'il a par la réponse.
Limites par adresse
| Route | Limite | Variable |
|---|---|---|
POST /api/auth/login, POST /api/auth/customer/login | 10 connexions échouées par 15 minutes, par formulaire | RATE_LIMIT_LOGIN |
POST /api/orders | 10 par 10 minutes | RATE_LIMIT_ORDERS |
POST /api/payments/checkout-session | 30 par 10 minutes | RATE_LIMIT_PAYMENT_SESSION |
GET /api/orders/track | 30 par 10 minutes | RATE_LIMIT_TRACKING |
POST /api/auth/customer/register | 10 par heure | RATE_LIMIT_REGISTER |
POST /api/contact | 5 par heure | RATE_LIMIT_CONTACT |
POST /api/auth/customer/forgot-password | 10 par heure, et 5 messages par destinataire et par jour | RATE_LIMIT_PASSWORD_RESET, MAIL_MAX_PER_ADDRESS_PER_DAY |
Une requête au-delà d'une limite répond 429 avec errors.rate_limited. Les compteurs sont gardés dans la mémoire de l'API, donc un redémarrage les remet à zéro. Derrière un reverse proxy, définissez TRUST_PROXY pour que chaque visiteur soit compté sur sa propre adresse.
L'assistant IA et ses conversations
Inclus avec votre achat. Connectez-vous pour le lire, ou ouvrez-le dans votre téléchargement.
Les routes de streaming de l'assistant, sa liste de modèles et les conversations enregistrées.
Studio IA
Inclus avec votre achat. Connectez-vous pour le lire, ou ouvrez-le dans votre téléchargement.
Les routes du studio : fiches, générations, enregistrement des résultats et suppression d'arrière-plan.
Serveur MCP
Inclus avec votre achat. Connectez-vous pour le lire, ou ouvrez-le dans votre téléchargement.
L'endpoint MCP pour les agents de code et la façon dont il est autorisé.
Mises à jour en direct via WebSocket
Inclus avec votre achat. Connectez-vous pour le lire, ou ouvrez-le dans votre téléchargement.
Les namespaces Socket.IO qu'écoute le tableau de bord, leurs événements et la façon dont une connexion est autorisée.
Routes du mode démo
Inclus avec votre achat. Connectez-vous pour le lire, ou ouvrez-le dans votre téléchargement.
Les routes qui n'existent que sur un build de démo publique.