L'API est en pilote. Les clés API personnelles doivent appartenir à une boutique disposant d'un plan Enterprise actif, sans quoi chaque appel renvoie 403 ; les jetons d'application installée fonctionnent avec tous les plans. https://api.dzbuild.app est le seul hôte pris en charge.
v1.10 - 2026-10-09 (pilote)
✨ DZBuild POS. La caisse Windows gratuite se relie à une boutique par OAuth, avec la découverte sur
https://dzbuild.com/.well-known/oauth-authorization-server, et appelle ses propres endpoints avec un jeton de caisse :GET /v1/me,POST /v1/deviceset les heartbeats,GET /v1/locationsetPOST /v1/locations,POST /v1/products/batch,POST /v1/media/uploads,POST /v1/inventory/adjustments/batch,POST /v1/pos/sales,POST /v1/pos/sales/{sale_id}/refunds,POST /v1/pos/closures,POST /v1/orders/{id}/claimetGET /v1/events. Les quatre chemins de sauvegarde répondent501 not_implemented. Les clés API personnelles et les jetons d'application reçoivent403sur les chemins réservés à la caisse. Voir DZBuild POS.✨
GET /v1/storerenvoiecurrency(DZD),stock_deduction(on_createouon_confirm),planetplan_limits. Un plan payant expiré se litfree, etplan_limits.active_productsvautnullquand le plan n'a pas de plafond.⚠️ Aucun changement pour
POST /v1/productsau plafond du plan : il répond toujours400 bad_requestavec le même message. Le nouveau code402 product_limit_reachedconcerne seulement l'appel par lot de la caisse.
v1.9 - 2026-10-08 (pilote)
✨ Champs de la barre d'achat.
PATCH /v1/store/designacceptebuybar_show_mobile,buybar_show_qty,fc_show_qtyetproduct_button_size(normaloularge) sur tous les plans : ils affichent ou masquent la barre d'achat du téléphone et la quantité dans la barre et dans le formulaire Fast Checkout, et règlent la taille des boutons d'achat. Voir Boutique.✨
GET /v1/storerenvoiestore_theme,fast_checkout_themeetvariant_card_style, les trois clés utilisées, en lecture seule.✨
GET /v1/themesliste les thèmes Fast Checkout et les styles de variantes dansfast_checkoutetvariant_styles, chacun avec son plan, si la boutique peut l'utiliser et celui qui est utilisé. Voir Thèmes.✨ Les écritures de design et de thème renvoient
change_id.PATCH /v1/store/design,POST /v1/store/theme,POST /v1/store/fast-checkout-themeetPOST /v1/store/variant-styleportent l'id à envoyer àPOST /v1/changes/{id}/undo.
v1.8.1 - 2026-10-02 (pilote)
⚠️ Supprimer un produit utilisé par une page de destination est refusé avec
409 product_in_use_by_landing_page. L'erreur liste les pages danslanding_pages[]avecid,titleetslug. Supprimez d'abord la page de destination, ou rattachez-lui un autre produit avecPATCH /v1/landing-pages/{id}, puis supprimez le produit. Voir Produits.
v1.8 - 2026-09-28 (pilote)
✨ Sections de la page d'accueil.
GET /v1/store/home-layoutlit les sections de la page d'accueil d'une boutique et les types de section que son thème accepte.POST /v1/store/home-layout/sectionsen ajoute une,PATCHetDELETE /v1/store/home-layout/sections/{id}en modifient ou en suppriment une,POST /v1/store/home-layout/reorderfixe l'ordre etPUT /v1/store/home-layoutremplace toute la liste. Dix types de section peuvent être ajoutés sur chaque thème, dontcategory-products,banner,faqetvideo. Les réglages d'image prennent une image envoyée depuis le dashboard : l'API ne peut pas encore en envoyer. Ces endpoints utilisentstore:readetstore:write, les clés existantes fonctionnent donc. Voir Sections de la page d'accueil.✨ Chaque écriture de la mise en page de l'accueil peut être annulée, ajout de section compris. La réponse porte un
change_idpourPOST /v1/changes/{id}/undo, qui répond409 layout_changedsi la page a encore changé depuis.⚠️ Les écritures de la mise en page de l'accueil ont leur propre budget : 30 par minute et 5 en même temps par boutique. Voir Limites de taux.
v1.7 - 2026-09-26 (pilote)
✨ Applications tierces. Une application s'installe sur une boutique via OAuth et appelle l'API avec un jeton d'installation, quel que soit le plan. Ses appels peuvent recevoir quatre nouveaux codes
403,app_uninstalled,app_suspended,app_not_approvedetapp_plan_required, et chaque installation a sa propre limite de 120 requêtes par minute, vérifiée avant celle de la boutique. Voir Erreurs.⚠️ L'
expires_atd'une clé est désormais appliqué : une fois la date passée, la clé répond401.⚠️ Les clés Copilot et de connecteur ne gèrent pas les clés : elles reçoivent
403sur/v1/keys.✨ Les nouvelles clés portent
analytics:read; les clés plus anciennes gardent les portées reçues à leur création.⚠️ Les webhooks API v1 sont signés avec le secret propre à chaque webhook (
X-DZ-Signature: t=<ts>,v1=<hmac>), l'enregistrement n'accepte quehttps://,408et429sont réessayés, et tout autre 4xx ou 3xx passe aussitôt en file morte. Les webhooks enregistrés avant doivent l'être de nouveau. Voir Vérifier les signatures.✨
PUTaccepte uneIdempotency-Keyfacultative et suit alors les mêmes règles de rejeu.⚠️ Le rejeu idempotent s'applique sur les deux hôtes, et réutiliser une clé avec un autre corps renvoie
422 idempotency_key_reuse. Voir Idempotence.⚠️ Pas de preflight CORS : une requête
OPTIONSreçoit le401habituel, et l'API sert uniquement aux appels de serveur à serveur.⚠️ Les refus traversent la passerelle tels quels : un
403d'application, ou un429, venant deapi.dzbuild.apparrive avec son vrai statut et son vrai corps au lieu d'un401.
v1.6 - 2026-09-26 (pilote)
✨ Messages WhatsApp via l'API.
GET /v1/whatsapp/templatesliste les modèles de messages de commande validés pour la plateforme avec leur statut de validation,GET /v1/whatsapp/balancelit le solde WhatsApp de la boutique,GET /v1/whatsapp/messagesliste les messages envoyés aux acheteurs, etPOST /v1/orders/{id}/whatsappenvoie un modèle à l'acheteur d'une commande, débité du solde. L'addon WhatsApp Sender doit être activé. Les deux nouvelles portées sontwhatsapp:readetwhatsapp:send. Voir Messages WhatsApp.⚠️ Les portées sont figées à la création de la clé : une clé créée avant cette version n'a pas les deux nouvelles portées. Créez une nouvelle clé pour les utiliser.
⚠️ Un réessai après
402 no_creditou un422exige une nouvelleIdempotency-Key. La première réponse est conservée 24 heures et rejouée pour la même clé et le même corps : recharger le solde ou corriger la commande ne change rien pour l'ancienne clé.✨ Chaque message de
GET /v1/whatsapp/messagesportebilling:chargedune fois facturé par WhatsApp,freeune fois son crédit revenu sur le solde,nulltant que le résultat n'est pas encore connu.
v1.5 - 2026-09-23 (pilote)
⚠️ Les retries des webhooks s'espacent désormais (1 min, 5 min, 30 min, 2 h) et s'arrêtent après 5 tentatives échouées ; les timeouts et les échecs DNS/TLS sont réessayés au lieu d'être abandonnés.
v1.4 — 2026-09-05 (pilote)
✨ Les commandes peuvent être écrites.
POST /v1/orderscrée une commande,PATCH /v1/orders/{id}change son statut,POST /v1/orders/{id}/cancell'annule etPOST /v1/orders/{id}/send-to-deliveryconfie un colis au transporteur de la boutique. Les deux nouvelles portées sontorders:writeetdelivery:send.⚠️ Les portées sont figées à la création de la clé : une clé existante n'obtient pas les nouvelles portées. Créez une nouvelle clé, ou reconnectez le connecteur, pour les utiliser. Une clé créée depuis le dashboard reçoit
orders:write. Les clés créées depuis le dashboard ou viaPOST /v1/keysne reçoivent jamaisdelivery:send: elles ne peuvent donc pas appelersend-to-delivery.⚠️ Un envoi au transporteur exige toujours une confirmation émise par le serveur. Le premier appel renvoie
409 confirmation_requiredavec un jeton à usage unique et un récapitulatif nommant le client, le téléphone, la destination, le total et le transporteur ; seul ce jeton envoie le colis. Unconfirm: truedans le corps n'est accepté sur ce point d'entrée pour aucun appelant. Une commande déjà envoyée est refusée par409 already_sent.⚠️ Le calcul monétaire d'une commande vient désormais du serveur. Les valeurs
shipping_costetpayment_feeenvoyées par l'appelant sont ignorées : le coût de livraison vient de la table de tarifs de la boutique pour cette wilaya et ce type de livraison, etdiscountest plafonné au sous-total plus la livraison. Les prix des articles fonctionnaient déjà ainsi.✨
GET /v1/shipping/coverageindique si le transporteur lié dessert une commune et s'il possède un bureau dans une wilaya, avec la fraîcheur des données du transporteur.✨
GET /v1/shipping/providerssignale aussi un transporteur configuré directement sur la boutique plutôt qu'ajouté depuis la liste des fournisseurs, ainsi queis_send_default,economic_available,synced_tier,stock_account,auto_validateetcustom_name. Les identifiants et les adresses ne sont jamais renvoyés.✨
GET /v1/landing-pages/{id}/checksignale ce qu'un acheteur rencontrerait sur la page : un formulaire de commande sans produit, aucun formulaire, plusieurs, ou une section pointant vers un produit d'une autre boutique.⚠️ Publier une page de destination cassée est refusé.
PATCH /v1/landing-pages/{id}avecstatus: activeéchoue aveclanding_page_has_no_productquand la page prendrait des commandes à zéro. Modifier une page déjà en ligne reste possible, pour pouvoir la réparer. L'écriture d'une section nommant unproduct_idd'une autre boutique est refusée comme erreur de validation.⚠️
PATCH /v1/landing-page-sections/{id}avecreplace: trueréinstalle désormais les réglages par défaut du type de section sous l'objet que vous envoyez : une clé omise revient à sa valeur par défaut au lieu de disparaître de la page.✨
GET /v1/connectionliste les boutiques couvertes par une même autorisation et celle qui est active ;POST /v1/connection/active-storedéplace le pointeur. Ce pointeur n'est pas une permission : une boutique que le marchand n'a jamais approuvée n'a pas de clé et ne peut pas être sélectionnée.
v1.3 — 2026-08-13 (pilote)
✨ Gestion des clés en libre-service — les propriétaires de boutiques Enterprise peuvent désormais générer et révoquer leurs clés API depuis le dashboard marchand, dans Paramètres → API (
/dashboard/api). Les secrets ne sont affichés qu'une fois, à la création.⚠️ La limite de taux par minute est désormais appliquée par boutique, partagée entre toutes les clés de la boutique (auparavant par clé). Le plafond Enterprise reste inchangé à 600 requêtes/minute.
⚠️ Une boutique peut désormais détenir au plus 3 clés actives (contre 20), quel que soit le canal de création — dashboard,
POST /v1/keysou support. Révoquer une clé libère sa place.
v1.2 — 2026-08-13 (pilote)
⚠️ L'API est désormais réservée au plan Enterprise. Les clés ne s'authentifient que tant que leur boutique est sur un plan Enterprise actif ; tout autre plan — ainsi qu'un abonnement Enterprise expiré — reçoit
403 forbidden(« API access requires an active Enterprise plan »). Les nouvelles clés ne peuvent être créées que pour des boutiques Enterprise. Les clés existantes des boutiques non-Enterprise cessent de fonctionner immédiatement mais ne sont pas supprimées : elles reprennent dès que la boutique passe sur (ou renouvelle) Enterprise, sans rien à réémettre.⚠️ Les tiers de limite de taux hérités Free / Pro / Unlimited sont retirés. Le plafond Enterprise reste 600 requêtes/minute par clé sans plafond mensuel ; les surcharges par boutique du support s'appliquent toujours.
v1.1 — 2026-08-12 (pilote)
✨ Images produits via l'API —
POST /v1/products/{id}/imagesajoute une image depuis une URLhttpspublique (DZBuild la télécharge, l'optimise et l'héberge),PATCH .../images/{image_id}définit le texte alternatif, l'ordre d'affichage et l'image principale,DELETE .../images/{image_id}en supprime une. Les URL en double sont dédupliquées, la première image devient automatiquement l'image principale, maximum 20 images par produit.✨
PUT /v1/products/{id}/variants— créez et gérez les groupes de variantes, leurs options et le stock par combinaison en un seul appel (remplacement complet). Les champsprice_adjustment,stock,sku,image_idetshow_as_cardpar option sont désormais modifiables, et les indicateurs de mode de stock sont réglés pour vous.✨
GET /v1/products/{id}renvoie maintenant le bloccombinationsainsi que les champs d'option complets (price_adjustment,sku,show_as_card,sort_order,is_active) et lealt_textdes images.⚠️ Changement notable :
primary_imageetimages[].urlrenvoient désormais des URL CDN complètes au lieu de noms de fichiers nus. Si votre code ajoute le préfixe manuellement, retirez cette logique.
v1.0.1 — 2026-05-02 (pilote)
✨
POST /v1/orders— création de commandes via l'API. Conçu pour les thèmes personnalisés, les vitrines headless, les apps mobiles et l'automatisation des revendeurs. Tarification des lignes autoritative côté serveur ; support complet des variantes ; idempotent.📚 Nouveau guide : Thèmes & vitrines personnalisés — build de bout en bout : catalogue, UI variantes, panier, checkout, intégration webhooks.
📚 Nouveau guide : Pour revendeurs — gérer plusieurs boutiques clients, opérations en bulk, white-label, modèles de facturation.
📚 Nouveau guide : Environnement & .env — stockage sécurisé des credentials pour Node, Python, PHP, Go, Vercel, Cloudflare, AWS, Docker/K8s, GitHub Actions.
📚 Référence
Ordersenrichie — documentation complète des variantes : stock par variante, par combinaison, variantes en cascade, variantes image-texte, offres multi-pièces.
v1.0 — 2026-04-30 (pilote)
🎉 Lancement initial en pilote.
Authentification, limitation de taux et cache de lecture, par clé.
Endpoints de lecture : boutique / produits / commandes / clients / landing pages.
Endpoints d'écriture avec idempotence : produits / commandes / landing pages.
Ingestion asynchrone de
/v1/signupset/v1/events(202 Accepted).Webhooks sortants avec réessais automatiques.