Aller à l'article
Aniq-UI

E-CommerceRéférence de l'API

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 :

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 :

Terminal
curl http://localhost:8000/api/health
Réponse
{"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 :

Réponse (400)
{
  "success": false,
  "data": null,
  "message": "<the first field's problem>",
  "errors": {
    "email": ["<the problem with email>"]
  }
}
StatutQuand
400Un 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.
401Le 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.
402La cabine d'essayage dans une démo publique, quand le client n'a pas envoyé sa propre clé.
403Les rôles de l'administrateur n'accordent pas la permission de la route : « You do not have permission to perform this action ».
404Aucun enregistrement de ce type.
409L'écriture entre en conflit avec un enregistrement existant, comme un e-mail, un slug ou un SKU déjà utilisé.
429Trop 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.
503Une 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.
500Un é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 :

Réponse
{
  "success": true,
  "data": { "data": [ ], "page": 1, "limit": 15, "total": 35, "totalPages": 3 },
  "message": ""
}
ListeTaille de page par défaut
Produits, catégories, clients, commandes admin15
Personnel, rôles, paramètres, avis, commandes d'un client10
/api/products/featured (limit)8
/api/products/:id/related (limit)4
  • order=asc ou order=desc dé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, rating ou best_selling. Une valeur inconnue revient au tri par défaut, par date de mise à jour décroissante, les égalités départagées par id. order_by_featured=true place 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, tag et on_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 message d'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.

PublicConnexionJeton dans la réponseAccepté sur
ClientPOST /api/auth/customer/logindata.token, avec data.userRoutes clients
PersonnelPOST /api/auth/logindata.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 forme Authorization: Bearer <token>.
  • Un jeton dure JWT_EXPIRATION, 7d par défaut (Variables d'environnement). La connexion du personnel indique la même valeur dans expires_in.
  • Il n'y a pas d'endpoint de rafraîchissement. Quand un jeton expire, la requête suivante répond 401 et 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 401 avec 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 429 avec un en-tête Retry-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, voyez TRUST_PROXY (Dépannage).
  1. Se connecter avec le Super Admin des données de démonstration

    Terminal
    curl -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": "..."
    }
  2. Appeler une route protégée avec le jeton

    Terminal
    curl "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.

  3. Se connecter avec un client de démonstration

    La boutique de démonstration contient aussi des clients, comme john.doe@example.com avec le mot de passe password123 :

    Terminal
    curl -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.token de 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.

ModulePermissions
Personneladmins.view, admins.create, admins.edit, admins.delete, admins.assign_roles
Rôlesroles.view, roles.create, roles.edit, roles.delete, roles.assign_permissions
Paramètressettings.view, settings.edit
Clientsusers.view, users.create, users.update, users.delete, users.restore, users.verify
Catégoriescategories.view, categories.create, categories.edit, categories.delete, categories.restore
Produitsproducts.view, products.create, products.edit, products.delete, products.restore
Commandesorders.view, orders.edit
Assistant IAai_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émonstrationAccorde
Super AdminToutes les permissions
ViewerToutes les permissions se terminant par .view
Admin, Manager, EditorAucune 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éthodeCheminQui peut l'appelerRôle
GET/api/productsN'importe quiLa 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/featuredN'importe quiLes produits actifs mis en avant (limit, 8 par défaut).
GET/api/products/slug/:slugN'importe quiUn 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/:idN'importe quiUn produit par identifiant, avec la même règle de 404.
GET/api/products/:id/relatedN'importe quiLes produits actifs qui lui sont associés (limit, 4 par défaut) ; 404 pour un produit inactif sans jeton admin.
GET/api/categoriesN'importe quiLa liste des catégories (search, is_active, parent_id, order).
GET/api/categories/rootsN'importe quiLes catégories sans parent.
GET/api/categories/slug/:slugN'importe quiUne catégorie par son slug.
GET/api/categories/:idN'importe quiUne catégorie par identifiant.
GET/api/homepage-sections/:key/productsN'importe quiLes produits choisis pour une section de la page d'accueil, comme best-sellers.
GET/api/reviews/product/:productIdN'importe quiLes avis d'un produit, 10 par page.
GET/api/reviews/product/:productId/summaryN'importe quiSa note moyenne et le nombre d'avis par étoile.
GET/api/helpers/countriesN'importe quiLes pays pour une liste déroulante, dans la langue de la requête.

Inscription et comptes clients

MéthodeCheminQui peut l'appelerRôle
POST/api/auth/customer/registerN'importe quiCrée un client (first_name, last_name, email, password, phone facultatif) et le connecte. Limité en fréquence.
POST/api/auth/customer/loginN'importe quiConnecte un client. Limité en fréquence.
GET/api/auth/customer/meClientLe client connecté.
PATCH/api/auth/customer/meClientMet à jour ses informations.
PATCH/api/auth/customer/me/passwordClientChange son mot de passe.
POST/api/auth/customer/forgot-passwordN'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-passwordN'importe quiDéfinit un nouveau mot de passe avec ce jeton. Limité en fréquence.
GET/api/addressesClientSes adresses enregistrées.
GET/api/addresses/:idClientL'une d'elles.
POST/api/addressesClientEnregistre une adresse.
PATCH/api/addresses/:idClientLa modifie.
PATCH/api/addresses/:id/defaultClientLa définit par défaut.
DELETE/api/addresses/:idClientLa supprime.
POST/api/reviewsClientDonne un avis sur un produit, un avis par client et par produit : en publier un nouveau met à jour le premier.
PATCH/api/reviews/:idClientModifie son avis.
DELETE/api/reviews/:idClientSupprime 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éthodeCheminQui peut l'appelerRôle
GET/api/cartClientLe panier du client.
POST/api/cart/itemsClientAjoute product_id, variant_id facultatif, et quantity.
PATCH/api/cart/items/:idClientChange la quantité d'une ligne.
DELETE/api/cart/items/:idClientSupprime une ligne.
DELETE/api/cartClientVide le panier.

Commandes, paiement et suivi

MéthodeCheminQui peut l'appelerRôle
POST/api/ordersTout 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/trackN'importe quiL'avancement d'une commande par order_number et email ensemble. Limité en fréquence.
GET/api/orders/myClientLes commandes du client, 10 par page.
GET/api/orders/number/:orderNumberClientUne de ses commandes par son numéro.
POST/api/payments/webhookStripe, signé avec STRIPE_WEBHOOK_SECRETMarque 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éthodeCheminQui peut l'appelerRôle
POST/api/auth/loginN'importe quiConnecte un membre du personnel. Limité en fréquence.
GET/api/auth/meTout administrateur connectéL'administrateur connecté, avec ses rôles et ses permissions.
GET/api/adminsadmins.viewLa liste du personnel.
GET/api/admins/statisticsadmins.viewLes effectifs du personnel.
GET/api/admins/:idadmins.viewUn administrateur.
POST/api/adminsadmins.createCrée un administrateur.
PATCH/api/admins/:idadmins.editModifie un administrateur.
PATCH/api/admins/:id/rolesadmins.assign_rolesDéfinit les rôles d'un administrateur.
DELETE/api/admins/:idadmins.deleteSupprime un administrateur.
PATCH/api/admins/profileadmins.editModifie le propre profil de l'administrateur connecté.
PATCH/api/admins/profile/passwordTout administrateur connectéChange le propre mot de passe de l'administrateur connecté.

Rôles

MéthodeCheminQui peut l'appelerRôle
GET/api/rolesroles.viewLes rôles. Sans paramètres de page, tous les rôles.
GET/api/roles/statisticsroles.viewLe nombre de rôles.
GET/api/roles/selectroles.viewLes rôles pour une liste déroulante.
GET/api/roles/permissionsroles.viewToutes les permissions, regroupées par module.
GET/api/roles/:idroles.viewUn rôle avec ses permissions.
POST/api/rolesroles.createCrée un rôle.
PUT/api/roles/:idroles.editRenomme ou modifie un rôle.
POST/api/roles/:id/permissionsroles.assign_permissionsDéfinit les permissions d'un rôle. Les administrateurs connectés qui le détiennent reçoivent le changement en direct.
DELETE/api/roles/:idroles.deleteSupprime 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éthodeCheminQui peut l'appelerRôle
GET/api/usersusers.viewLa liste des clients.
GET/api/users/statisticusers.viewLe nombre de clients.
GET/api/users/deletedusers.viewLes clients supprimés.
GET/api/users/deleted/:usernameusers.viewUn client supprimé.
GET/api/users/:usernameusers.viewUn client.
POST/api/usersusers.createCrée un client.
PATCH/api/users/:usernameusers.updateModifie un client.
PATCH/api/users/:username/change-passwordusers.updateDéfinit le mot de passe d'un client.
POST/api/users/:username/resend-verification-emailusers.updateRé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-verifiedusers.verifyMarque l'e-mail comme vérifié.
POST/api/users/:username/make-unverifiedusers.verifyLe marque comme non vérifié.
DELETE/api/users/:usernameusers.deleteDéplace un client dans la liste des supprimés.
POST/api/users/deleted/:username/restoreusers.restoreRestaure un client supprimé.

Produits et catégories

MéthodeCheminQui peut l'appelerRôle
POST/api/productsproducts.createCrée un produit avec ses images et ses variantes.
PATCH/api/products/:idproducts.editModifie un produit.
DELETE/api/products/:idproducts.deleteLe déplace dans la liste des supprimés.
GET/api/products/deletedproducts.deleteLes produits supprimés.
POST/api/products/deleted/:id/restoreproducts.restoreEn restaure un.
GET/api/products/statisticproducts.viewLe nombre de produits.
GET/api/products/draftsTout administrateur connectéLe brouillon non enregistré du formulaire produit de l'administrateur (product_id pour un produit existant).
PUT/api/products/draftsTout administrateur connectéEnregistre ce brouillon.
DELETE/api/products/draftsTout administrateur connectéL'abandonne.
POST/api/categoriescategories.createCrée une catégorie.
PATCH/api/categories/:idcategories.editModifie une catégorie, ordre de tri compris.
DELETE/api/categories/:idcategories.deleteLe déplace dans la liste des supprimés.
GET/api/categories/deletedcategories.deleteLes catégories supprimées.
POST/api/categories/deleted/:id/restorecategories.restoreEn restaure un.
GET/api/categories/statisticcategories.viewLe nombre de catégories.
GET/api/homepage-sections/:keyproducts.viewLes paramètres et les produits d'une section de la page d'accueil.
PUT/api/homepage-sections/:keyproducts.editLes définit.

Les clés des sections sont style-pillars, editorial-split, new-drops, best-sellers, spotlight, lux-difference et editorial-slider.

Commandes

MéthodeCheminQui peut l'appelerRôle
GET/api/ordersorders.viewLa liste des commandes : search, status (un ou plusieurs, séparés par une virgule), payment_status, from_date, to_date, order.
GET/api/orders/statisticorders.viewLe nombre de commandes par statut et le chiffre d'affaires.
GET/api/orders/:idorders.viewUne commande avec ses articles.
PATCH/api/orders/:id/statusorders.editDé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éthodeCheminQui peut l'appelerRôle
GET/api/settingssettings.viewLes paramètres de l'application, 10 par page.
GET/api/settings/:keysettings.viewUn paramètre.
PATCH/api/settings/:keysettings.editChange sa valeur.
DELETE/api/settings/:keysettings.editLa 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éthodeCheminQui peut l'appelerRôle
POST/api/helpers/uploadTout administrateur connectéEnvoie un fichier dans le bucket.
  • Formulaire multipart : le fichier dans file, le dossier dans path (uploads par défaut), et éventuellement un préréglage de taille dans for.
  • 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épond 503 : « File uploads are not set up yet. »

Notifications

MéthodeCheminQui peut l'appelerRôle
GET/api/notificationsTout administrateur connectéLes 30 dernières notifications de l'administrateur, conservées 30 jours.
PATCH/api/notifications/read-allTout administrateur connectéLes marque toutes comme lues.
PATCH/api/notifications/:id/readTout administrateur connectéEn marque une comme lue.
DELETE/api/notifications/:idTout 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 dans auth.token du handshake ; les jetons clients sont déconnectés.
  • Chaque nouvelle notification arrive en tant que notification:created. Les types sont order_created, pour chaque administrateur autorisé à voir les commandes, ainsi que studio_generation_completed et studio_generation_failed, pour l'administrateur qui a lancé la génération.
  • Un second namespace, /auth, envoie permissions-updated quand 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.

Bloqué sur une étape ?

Trouvez une solution avant de tout recommencer.

Dépannage

Préférences des Cookies

Nous utilisons des cookies pour améliorer votre expérience de navigation, analyser le trafic du site et personnaliser le contenu. En cliquant sur "Accepter Tout", vous consentez à notre utilisation des cookies pour l'analyse et la publicité personnalisée.