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 et la pagination.
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 de la boutique, et le personnel, qui utilise celles du tableau de bord admin. 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 renseignent, traduite dans la langue de la requête, et vide sinon.
Le health check est la seule route hors de l'enveloppe. Il n'exige pas de jeton :
curl http://localhost:8000/api/health{"status":"ok"}Il répond 503 avec {"status":"unavailable"} tant que la base de données est injoignable ou ne contient pas de tables : un répartiteur de charge peut donc s'en servir comme sonde de disponibilité.
Erreurs
Une requête échouée répond avec le statut HTTP correspondant et la même enveloppe, avec success: false, data: null et, pour la validation, les problèmes par champ :
{
"success": false,
"data": null,
"message": "<the first field's problem>",
"errors": {
"email": ["<the problem with email>"]
}
}| Statut | Quand |
|---|---|
400 | Un champ n'a pas passé la validation, ou le corps contient un champ que la route n'accepte pas. Les champs inconnus sont refusés, pas ignorés. |
401 | Le jeton est absent, expiré ou appartient à l'autre public. Aussi une connexion qui échoue, que l'e-mail n'ait pas de compte ou que le mot de passe soit faux. |
402 | La cabine d'essayage dans une démo publique, quand le client n'a pas envoyé sa propre clé. |
403 | Les rôles de l'administrateur n'accordent pas la permission de la route : « You do not have permission to perform this action ». |
404 | Aucun enregistrement de ce type. |
409 | L'écriture entre en conflit avec un enregistrement existant, comme un e-mail, un slug ou un SKU déjà utilisé. |
429 | Trop de tentatives depuis une même adresse sur une route de connexion, d'inscription, de mot de passe ou de suivi, ou trop d'essayages. L'en-tête Retry-After indique combien de secondes attendre sur les routes de connexion. |
503 | Une fonctionnalité non configurée : les envois de fichiers sans bucket, une fonctionnalité IA sans sa clé, ou le health check avant que les tables n'existent. |
500 | Un échec inattendu. Le message reste générique et les détails vont dans le journal de l'API. |
Les écritures réussies répondent 201 pour POST et 200 pour les autres méthodes.
Pagination et tri
Les listes acceptent page, à partir de 1, et page_count, la taille de page. Une page contient au plus 100 lignes : une taille plus grande est lue comme 100, une plus petite comme 1, et une taille absente ou illisible revient à la valeur par défaut de la liste. Une liste répond toujours sous la même forme :
{
"success": true,
"data": { "data": [ ], "page": 1, "limit": 15, "total": 35, "totalPages": 3 },
"message": ""
}| Liste | Taille de page par défaut |
|---|---|
| Produits, catégories, clients, commandes admin | 15 |
| Personnel, rôles, paramètres, avis, commandes d'un client | 10 |
/api/products/featured (limit) | 8 |
/api/products/:id/related (limit) | 4 |
order=ascouorder=descdéfinit le sens de tri des produits, catégories, clients et commandes. Les catégories sont par défaut en ordre croissant, les autres des plus récentes aux plus anciennes.- Les produits se trient aussi avec
sort:created_at,updated_at,price,ratingoubest_selling. Une valeur inconnue revient au tri par défaut, par date de mise à jour décroissante, les égalités départagées parid.order_by_featured=trueplace en premier les produits mis en avant et les meilleures ventes. - La liste des produits filtre par
search(nom dans l'une ou l'autre langue, ou SKU),category_id,is_active,is_featured,is_best_seller,min_price,max_price,tageton_sale.
Langue
Envoyez la langue du lecteur dans l'en-tête Accept-Language : en ou ar tels que livrés. ar-SA compte comme de l'arabe, et toute langue que l'API ne possède pas reçoit une réponse en anglais. Il n'y a pas de paramètre de requête pour la langue.
- Les messages d'erreur et le
messaged'une écriture réussie sont traduits. - Le texte enregistré dans les deux langues, comme les noms de produits et de catégories, revient sous la forme
{ "en": "...", "ar": "..." }et le client choisit l'une d'elles.
Authentification
Les clients et le personnel se connectent sur des endpoints différents, auprès de tables différentes, et reçoivent des jetons que seules leurs propres routes acceptent.
| Public | Connexion | Jeton dans la réponse | Accepté sur |
|---|---|---|---|
| Client | POST /api/auth/customer/login | data.token, avec data.user | Routes clients |
| Personnel | POST /api/auth/login | data.access_token, avec data.admin (rôles et permissions) | Routes admin |
- Les deux sont des JWT signés avec
JWT_SECRET. Envoyez-les sous la formeAuthorization: Bearer <token>. - Un jeton dure
JWT_EXPIRATION,7dpar défaut (Variables d'environnement). La connexion du personnel indique la même valeur dansexpires_in. - Il n'y a pas d'endpoint de rafraîchissement. Quand un jeton expire, la requête suivante répond
401et le client se reconnecte. - Un jeton client est refusé sur les routes admin et un jeton du personnel sur les routes clients, même si les deux utilisent le même secret.
- Une connexion échouée répond
401avec un seul message, que l'e-mail n'ait pas de compte ou que le mot de passe soit faux. - Les routes de connexion, d'inscription, de mot de passe et de suivi de commande acceptent 10 tentatives par minute depuis une même adresse, comptées par route. Au-delà, elles répondent
429avec un en-têteRetry-After. Le compteur est conservé dans la mémoire de l'API : il repart donc de zéro à chaque redémarrage et est compté séparément par chaque instance. Derrière un proxy, voyezTRUST_PROXY(Dépannage).
Se connecter avec le Super Admin des données de démonstration
Terminalcurl -X POST http://localhost:8000/api/auth/login \ -H "Content-Type: application/json" \ -d '{"email":"admin@example.com","password":"Admin@123"}'Réponse{ "success": true, "data": { "access_token": "eyJhbGciOiJIUzI1NiIs...", "token_type": "Bearer", "expires_in": "7d", "admin": { "id": 1, "email": "admin@example.com", "roles": [{ "id": 1, "name": "Super Admin", "guard_name": "web" }], "permissions": ["admins.view", "admins.create", "..."] } }, "message": "..." }Appeler une route protégée avec le jeton
Terminalcurl "http://localhost:8000/api/orders?page=1&page_count=5" \ -H "Authorization: Bearer <access_token>"Résultat attendu: Les cinq commandes les plus récentes, sous la forme d'une liste.
Se connecter avec un client de démonstration
La boutique de démonstration contient aussi des clients, comme
john.doe@example.comavec le mot de passepassword123:Terminalcurl -X POST http://localhost:8000/api/auth/customer/login \ -H "Content-Type: application/json" \ -d '{"email":"john.doe@example.com","password":"password123"}'Puis transmettez
data.tokende la même façon, par exemple àGET /api/orders/my.
Changez les mots de passe de démonstration
Les comptes de la boutique de démonstration utilisent des mots de passe publiés : Admin@123 pour le Super Admin, admin123 pour le reste du personnel et password123 pour les clients. Changez-les, ou partez de tables vides, avant la mise en ligne d'un site.
Permissions
Chaque route admin vérifie d'abord le jeton, puis la permission qu'elle indique. Un administrateur détient toutes les permissions de tous ses rôles ; quand une route en indique plusieurs, une seule suffit. Dans les tableaux admin ci-dessous, un nom de permission dans la colonne Qui peut l'appeler désigne un administrateur dont les rôles l'accordent.
| Module | Permissions |
|---|---|
| Personnel | 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 | 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 |
| Produits | products.view, products.create, products.edit, products.delete, products.restore |
| Commandes | orders.view, orders.edit |
| Assistant IA | ai_chat.use, ai_chat.view_models |
Les sections de la page d'accueil et le studio IA utilisent les permissions des produits. Les avis n'ont pas de permission propre : le tableau de bord les lit via les produits.
| Rôle de démonstration | Accorde |
|---|---|
| Super Admin | Toutes les permissions |
| Viewer | Toutes les permissions se terminant par .view |
| Admin, Manager, Editor | Aucune tant que vous ne les accordez pas |
Relancer le seed crée ce qui manque et laisse les permissions des rôles existants telles que vous les avez définies.
Catalogue public
Aucun jeton n'est nécessaire. Les clients ne voient jamais que les produits actifs : sans jeton admin, un produit inactif ou supprimé n'existe pas.
| Méthode | Chemin | Qui peut l'appeler | Rôle |
|---|---|---|---|
GET | /api/products | N'importe qui | La liste des produits, avec les filtres et le tri ci-dessus. Sans jeton admin, elle ne liste que les produits actifs, quoi que demande is_active ; avec un jeton, chaque filtre s'applique tel qu'envoyé, produits inactifs compris. |
GET | /api/products/featured | N'importe qui | Les produits actifs mis en avant (limit, 8 par défaut). |
GET | /api/products/slug/:slug | N'importe qui | Un produit par son slug, avec ses images, ses variantes et sa catégorie. Un produit inactif ou supprimé répond 404 sans jeton admin. |
GET | /api/products/:id | N'importe qui | Un produit par identifiant, avec la même règle de 404. |
GET | /api/products/:id/related | N'importe qui | Les produits actifs qui lui sont associés (limit, 4 par défaut) ; 404 pour un produit inactif sans jeton admin. |
GET | /api/categories | N'importe qui | La liste des catégories (search, is_active, parent_id, order). |
GET | /api/categories/roots | N'importe qui | Les catégories sans parent. |
GET | /api/categories/slug/:slug | N'importe qui | Une catégorie par son slug. |
GET | /api/categories/:id | N'importe qui | Une catégorie par identifiant. |
GET | /api/homepage-sections/:key/products | N'importe qui | Les produits choisis pour une section de la page d'accueil, comme best-sellers. |
GET | /api/reviews/product/:productId | N'importe qui | Les avis d'un produit, 10 par page. |
GET | /api/reviews/product/:productId/summary | N'importe qui | Sa note moyenne et le nombre d'avis par étoile. |
GET | /api/helpers/countries | N'importe qui | Les pays pour une liste déroulante, dans la langue de la requête. |
Inscription et comptes clients
| Méthode | Chemin | Qui peut l'appeler | Rôle |
|---|---|---|---|
POST | /api/auth/customer/register | N'importe qui | Crée un client (first_name, last_name, email, password, phone facultatif) et le connecte. Limité en fréquence. |
POST | /api/auth/customer/login | N'importe qui | Connecte un client. Limité en fréquence. |
GET | /api/auth/customer/me | Client | Le client connecté. |
PATCH | /api/auth/customer/me | Client | Met à jour ses informations. |
PATCH | /api/auth/customer/me/password | Client | Change son mot de passe. |
POST | /api/auth/customer/forgot-password | N'importe qui | Émet un jeton de réinitialisation à usage unique, valable une heure. Hors production, il est écrit dans le journal de l'API ; aucun e-mail n'est envoyé. Limité en fréquence. |
POST | /api/auth/customer/reset-password | N'importe qui | Définit un nouveau mot de passe avec ce jeton. Limité en fréquence. |
GET | /api/addresses | Client | Ses adresses enregistrées. |
GET | /api/addresses/:id | Client | L'une d'elles. |
POST | /api/addresses | Client | Enregistre une adresse. |
PATCH | /api/addresses/:id | Client | La modifie. |
PATCH | /api/addresses/:id/default | Client | La définit par défaut. |
DELETE | /api/addresses/:id | Client | La supprime. |
POST | /api/reviews | Client | Donne un avis sur un produit, un avis par client et par produit : en publier un nouveau met à jour le premier. |
PATCH | /api/reviews/:id | Client | Modifie son avis. |
DELETE | /api/reviews/:id | Client | Supprime son avis. |
Un panier côté serveur est aussi disponible pour les clients connectés. La boutique livrée garde son panier dans le navigateur et ne l'appelle pas.
| Méthode | Chemin | Qui peut l'appeler | Rôle |
|---|---|---|---|
GET | /api/cart | Client | Le panier du client. |
POST | /api/cart/items | Client | Ajoute product_id, variant_id facultatif, et quantity. |
PATCH | /api/cart/items/:id | Client | Change la quantité d'une ligne. |
DELETE | /api/cart/items/:id | Client | Supprime une ligne. |
DELETE | /api/cart | Client | Vide le panier. |
Commandes, paiement et suivi
| Méthode | Chemin | Qui peut l'appeler | Rôle |
|---|---|---|---|
POST | /api/orders | Tout le monde ; un jeton client est lu s'il est envoyé | Passe une commande. Un visiteur sans compte envoie items, email et l'adresse ; un client connecté peut ne pas envoyer d'items pour commander son panier côté serveur. payment_method vaut stripe ou cod (paypal est accepté mais rien ne le traite). Les prix viennent du catalogue, pas de la requête. |
GET | /api/orders/track | N'importe qui | L'avancement d'une commande par order_number et email ensemble. Limité en fréquence. |
GET | /api/orders/my | Client | Les commandes du client, 10 par page. |
GET | /api/orders/number/:orderNumber | Client | Une de ses commandes par son numéro. |
POST | /api/payments/webhook | Stripe, signé avec STRIPE_WEBHOOK_SECRET | Marque une commande par carte comme payée (payment_intent.succeeded) ou échouée (payment_intent.payment_failed). |
Avec payment_method: "stripe" et Stripe configuré, la réponse contient un client_secret que la boutique confirme auprès de Stripe. La livraison est gratuite à partir d'un sous-total de 75 et coûte 9,99 en dessous ; la taxe est de 0. Un promo_code est enregistré sur la commande mais pas appliqué.
Connexion et comptes du personnel
| Méthode | Chemin | Qui peut l'appeler | Rôle |
|---|---|---|---|
POST | /api/auth/login | N'importe qui | Connecte un membre du personnel. Limité en fréquence. |
GET | /api/auth/me | Tout administrateur connecté | L'administrateur connecté, avec ses rôles et ses permissions. |
GET | /api/admins | admins.view | La liste du personnel. |
GET | /api/admins/statistics | admins.view | Les effectifs du personnel. |
GET | /api/admins/:id | admins.view | Un administrateur. |
POST | /api/admins | admins.create | Crée un administrateur. |
PATCH | /api/admins/:id | admins.edit | Modifie un administrateur. |
PATCH | /api/admins/:id/roles | admins.assign_roles | Définit les rôles d'un administrateur. |
DELETE | /api/admins/:id | admins.delete | Supprime un administrateur. |
PATCH | /api/admins/profile | admins.edit | Modifie le propre profil de l'administrateur connecté. |
PATCH | /api/admins/profile/password | Tout administrateur connecté | Change le propre mot de passe de l'administrateur connecté. |
Rôles
| Méthode | Chemin | Qui peut l'appeler | Rôle |
|---|---|---|---|
GET | /api/roles | roles.view | Les rôles. Sans paramètres de page, tous les rôles. |
GET | /api/roles/statistics | roles.view | Le nombre de rôles. |
GET | /api/roles/select | roles.view | Les rôles pour une liste déroulante. |
GET | /api/roles/permissions | roles.view | Toutes les permissions, regroupées par module. |
GET | /api/roles/:id | roles.view | Un rôle avec ses permissions. |
POST | /api/roles | roles.create | Crée un rôle. |
PUT | /api/roles/:id | roles.edit | Renomme ou modifie un rôle. |
POST | /api/roles/:id/permissions | roles.assign_permissions | Définit les permissions d'un rôle. Les administrateurs connectés qui le détiennent reçoivent le changement en direct. |
DELETE | /api/roles/:id | roles.delete | Supprime un rôle. |
Clients
Les clients sont désignés par leur nom d'utilisateur. La liste filtre par search, email, phone, country_id, username, first_name, last_name, verified, from_date et to_date.
| Méthode | Chemin | Qui peut l'appeler | Rôle |
|---|---|---|---|
GET | /api/users | users.view | La liste des clients. |
GET | /api/users/statistic | users.view | Le nombre de clients. |
GET | /api/users/deleted | users.view | Les clients supprimés. |
GET | /api/users/deleted/:username | users.view | Un client supprimé. |
GET | /api/users/:username | users.view | Un client. |
POST | /api/users | users.create | Crée un client. |
PATCH | /api/users/:username | users.update | Modifie un client. |
PATCH | /api/users/:username/change-password | users.update | Définit le mot de passe d'un client. |
POST | /api/users/:username/resend-verification-email | users.update | Répond avec succès et n'envoie rien : le template ne fournit aucun transport d'e-mails. Branchez ici votre service d'envoi. |
POST | /api/users/:username/make-verified | users.verify | Marque l'e-mail comme vérifié. |
POST | /api/users/:username/make-unverified | users.verify | Le marque comme non vérifié. |
DELETE | /api/users/:username | users.delete | Déplace un client dans la liste des supprimés. |
POST | /api/users/deleted/:username/restore | users.restore | Restaure un client supprimé. |
Produits et catégories
| Méthode | Chemin | Qui peut l'appeler | Rôle |
|---|---|---|---|
POST | /api/products | products.create | Crée un produit avec ses images et ses variantes. |
PATCH | /api/products/:id | products.edit | Modifie un produit. |
DELETE | /api/products/:id | products.delete | Le déplace dans la liste des supprimés. |
GET | /api/products/deleted | products.delete | Les produits supprimés. |
POST | /api/products/deleted/:id/restore | products.restore | En restaure un. |
GET | /api/products/statistic | products.view | Le nombre de produits. |
GET | /api/products/drafts | Tout administrateur connecté | Le brouillon non enregistré du formulaire produit de l'administrateur (product_id pour un produit existant). |
PUT | /api/products/drafts | Tout administrateur connecté | Enregistre ce brouillon. |
DELETE | /api/products/drafts | Tout administrateur connecté | L'abandonne. |
POST | /api/categories | categories.create | Crée une catégorie. |
PATCH | /api/categories/:id | categories.edit | Modifie une catégorie, ordre de tri compris. |
DELETE | /api/categories/:id | categories.delete | Le déplace dans la liste des supprimés. |
GET | /api/categories/deleted | categories.delete | Les catégories supprimées. |
POST | /api/categories/deleted/:id/restore | categories.restore | En restaure un. |
GET | /api/categories/statistic | categories.view | Le nombre de catégories. |
GET | /api/homepage-sections/:key | products.view | Les paramètres et les produits d'une section de la page d'accueil. |
PUT | /api/homepage-sections/:key | products.edit | Les définit. |
Les clés des sections sont style-pillars, editorial-split, new-drops, best-sellers, spotlight, lux-difference et editorial-slider.
Commandes
| Méthode | Chemin | Qui peut l'appeler | Rôle |
|---|---|---|---|
GET | /api/orders | orders.view | La liste des commandes : search, status (un ou plusieurs, séparés par une virgule), payment_status, from_date, to_date, order. |
GET | /api/orders/statistic | orders.view | Le nombre de commandes par statut et le chiffre d'affaires. |
GET | /api/orders/:id | orders.view | Une commande avec ses articles. |
PATCH | /api/orders/:id/status | orders.edit | Définit le statut (pending, confirmed, processing, shipped, delivered, cancelled, refunded) et le numéro de suivi. |
L'API accepte n'importe quel changement de statut ; le tableau de bord ne propose que l'étape suivante ou une annulation.
Paramètres
| Méthode | Chemin | Qui peut l'appeler | Rôle |
|---|---|---|---|
GET | /api/settings | settings.view | Les paramètres de l'application, 10 par page. |
GET | /api/settings/:key | settings.view | Un paramètre. |
PATCH | /api/settings/:key | settings.edit | Change sa valeur. |
DELETE | /api/settings/:key | settings.edit | La supprime. |
Il n'y a pas de route pour créer un paramètre : c'est le seed qui les crée. Rien dans le code livré ne lit leurs valeurs.
Envoi de médias
| Méthode | Chemin | Qui peut l'appeler | Rôle |
|---|---|---|---|
POST | /api/helpers/upload | Tout administrateur connecté | Envoie un fichier dans le bucket. |
- Formulaire multipart : le fichier dans
file, le dossier danspath(uploadspar défaut), et éventuellement un préréglage de taille dansfor. - Jusqu'à 150 Mo. Les vidéos (MP4, WebM, MOV, M4V) sont enregistrées telles quelles et répondent
{ "original": url }. - Les images sont réencodées en JPEG, à 1920 pixels de large au plus, plus la taille du préréglage, et répondent avec chaque URL, comme
{ "original": url, "250x250": url }. - Sans les cinq variables
R2_*, elle répond503: « File uploads are not set up yet. »
Notifications
| Méthode | Chemin | Qui peut l'appeler | Rôle |
|---|---|---|---|
GET | /api/notifications | Tout administrateur connecté | Les 30 dernières notifications de l'administrateur, conservées 30 jours. |
PATCH | /api/notifications/read-all | Tout administrateur connecté | Les marque toutes comme lues. |
PATCH | /api/notifications/:id/read | Tout administrateur connecté | En marque une comme lue. |
DELETE | /api/notifications/:id | Tout administrateur connecté | En supprime une. |
- Les notifications en direct utilisent Socket.IO sur le namespace
/notifications, à l'adresse de l'API sans/api. Envoyez le jeton du personnel dansauth.tokendu handshake ; les jetons clients sont déconnectés. - Chaque nouvelle notification arrive en tant que
notification:created. Les types sontorder_created, pour chaque administrateur autorisé à voir les commandes, ainsi questudio_generation_completedetstudio_generation_failed, pour l'administrateur qui a lancé la génération. - Un second namespace,
/auth, envoiepermissions-updatedquand les rôles ou les permissions d'un administrateur changent. - Le socket n'accepte de connexions que depuis
FRONTEND_URL.
Assistant IA
Inclus avec votre achat. Connectez-vous pour le lire, ou ouvrez-le dans votre téléchargement.
Les routes de conversation, de modèles et d'historique de l'assistant.
Studio IA
Inclus avec votre achat. Connectez-vous pour le lire, ou ouvrez-le dans votre téléchargement.
Les routes de génération et de médias du studio produit IA.
Cabine d'essayage
Inclus avec votre achat. Connectez-vous pour le lire, ou ouvrez-le dans votre téléchargement.
Les routes publiques de la cabine d'essayage de la boutique et leurs limites.
Routes du mode démo
Inclus avec votre achat. Connectez-vous pour le lire, ou ouvrez-le dans votre téléchargement.
La route qu'utilise une démo publique pour donner un compte à chaque visiteur.