La mise en page de l'accueil est la liste ordonnée des sections qu'une boutique affiche sur sa page d'accueil. Chaque section a un type et des réglages. Dix types peuvent être ajoutés sur chaque thème : category-products, featured, categories, banner, image-with-text, rich-text, trust-badges, testimonials, faq et video. Un thème à sections comme atlas propose aussi hero et product-grid. types dans la réponse du GET donne les réglages de chacun. Chaque écriture de cette page est en ligne sur la boutique dès qu'elle répond.
Ce n'est pas GET /v1/store/home-sections, qui lit les interrupteurs des pages d'accueil Digital, Ariana et Prestige. Ces interrupteurs sont décrits à la fin de cette page.
Avant de commencer
GETdemandestore:readet les écritures demandentstore:write. Les clés marchand ont les deux.POST,PATCHetDELETEdemandent uneIdempotency-Key. SurPUT, elle est facultative. Voir Idempotence.L'id d'une catégorie vient de
GET /v1/categories, qui demandeproducts:read.
L'objet section
Champ | Type | Notes |
| int | Stable tant que la section existe. Une section qui revient par une annulation reçoit un nouvel id. |
| string | L'une des valeurs |
| object | Tous les réglages du type, valeurs par défaut comprises. |
| bool |
|
| bool |
|
Réglages de category-products
Réglage | Type | Défaut | Règles |
| id de catégorie |
| Une catégorie de cette boutique. |
| text |
| Jusqu'à 80 caractères, HTML retiré. Vide, il affiche le nom de la catégorie. |
| range |
| De 4 à 12. Un nombre hors de cet intervalle est ramené à la borne la plus proche. |
| select |
|
|
| checkbox |
| Un lien vers la page de la catégorie. |
Une catégorie sans produits n'affiche rien aux acheteurs non plus. Lisez les règles de chaque type dans son settings_schema au lieu de les coder en dur : la liste des types dépend du thème de la boutique.
Formats des réglages
Type de réglage | Valeur acceptée |
| Un id de |
|
|
| Un lien de vidéo YouTube ou son identifiant de 11 caractères. L'identifiant est enregistré. |
| Le chemin d'une image envoyée depuis le dashboard pour cette boutique, |
Quand les acheteurs voient une section
Une section dont le contenu n'est pas encore rempli est enregistrée et l'écriture répond 2xx, mais les acheteurs ne la voient pas tant qu'il ne l'est pas :
Type | Les acheteurs la voient dès que |
|
|
| la |
| la boutique a une catégorie avec des produits, ou n'importe quelle catégorie quand |
|
|
|
|
|
|
| toujours. Les badges 1 et 2 vides affichent les lignes par défaut de livraison et de paiement à la livraison. |
| au moins un |
| au moins un |
|
|
rendered ne change pas pour autant : il dit si le thème affiche les sections enregistrées, pas si une section précise est visible. Sur un thème à sections (atlas), les sections enregistrées remplacent l'accueil du thème seulement tant qu'elles contiennent une section product-grid visible, et rendered vaut false jusque-là ; avant, les acheteurs voient l'accueil du thème, et le GET ne liste que les sections enregistrées, pas celles du thème.
GET /v1/store/home-layout
Les sections dans l'ordre d'affichage, les types de section qu'on peut ajouter sur le thème de la boutique, et le plafond du plan.
Auth : clé plateforme avec store:read.
Requête
curl 'https://api.dzbuild.app/v1/store/home-layout' \ -H "Authorization: Bearer $DZ_KEY"
Réponse 200
{
"data": {
"theme": "starter",
"rendered": true,
"max_sections": 25,
"cap": 25,
"version": "9c1e04b7a2d35f68",
"sections": [
{
"id": 412,
"type": "category-products",
"settings": {
"category": 57,
"title": "",
"count": 8,
"layout": "grid",
"show_view_all": true
},
"is_active": true,
"available": true
},
{
"id": 415,
"type": "category-products",
"settings": {
"category": 61,
"title": "Nos parfums",
"count": 10,
"layout": "slider",
"show_view_all": false
},
"is_active": false,
"available": true
}
],
"types": [
{
"type": "category-products",
"name": {"ar": "منتجات فئة", "fr": "Produits d'une catégorie"},
"description": {"ar": "اعرض منتجات فئة واحدة في شبكة أو شريط تمرير.", "fr": "Affichez les produits d'une catégorie en grille ou en carrousel."},
"icon": "bi-grid-3x3-gap",
"limit": 12,
"settings_schema": [
{"id": "category", "type": "category", "default": 0, "label": {"ar": "الفئة", "fr": "Catégorie"}},
{"id": "title", "type": "text", "max": 80, "default": "", "label": {"ar": "العنوان (إذا تركته فارغاً يظهر اسم الفئة)", "fr": "Titre (si vide, le nom de la catégorie s'affiche)"}},
{"id": "count", "type": "range", "min": 4, "max": 12, "default": 8, "label": {"ar": "عدد المنتجات", "fr": "Nombre de produits"}},
{"id": "layout", "type": "select", "options": ["grid", "slider"], "default": "grid", "label": {"ar": "طريقة العرض", "fr": "Affichage"}, "option_labels": {"ar": ["شبكة", "شريط تمرير"], "fr": ["Grille", "Carrousel"]}},
{"id": "show_view_all", "type": "checkbox", "default": true, "label": {"ar": "زر عرض الكل", "fr": "Lien « Voir tout »"}}
]
}
]
},
"meta": {"request_id": "8f2c1a9d4b7e6035", "api_version": "v1"}
}
Champ | Signification |
| La clé du thème de la boutique. |
|
|
| 25, le nombre maximum de sections sur une page d'accueil. |
| Les sections que le plan de la boutique autorise : 3 sur Free ou un plan expiré, 25 à partir de Pro. |
| Une empreinte de la mise en page enregistrée. Renvoyez-la dans |
| Les sections dans l'ordre d'affichage, sections masquées comprises. |
| Les types qu'on peut ajouter sur ce thème, avec |
Lire après une écriture
Par api.dzbuild.app, chaque GET est servi à neuf : un GET envoyé juste après une écriture renvoie la nouvelle mise en page. Vous en aurez rarement besoin, car chaque écriture renvoie la liste complète dans l'ordre d'affichage, avec la nouvelle version.
POST /v1/store/home-layout/sections
Ajoute une section.
Auth : clé plateforme avec store:write. Nécessite Idempotency-Key.
Corps
Champ | Type | Requis | Notes |
| string | oui | Un |
| object | non | Les réglages non envoyés prennent les valeurs par défaut du type. |
| int | non | 0 met la section en haut, 24 est la dernière place. Sans lui, la section va à la fin. |
Requête
curl -X POST 'https://api.dzbuild.app/v1/store/home-layout/sections' \
-H "Authorization: Bearer $DZ_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: hs-add-sacs-1" \
-d '{"type": "category-products", "settings": {"category": 64, "layout": "slider"}, "position": 0}'
Réponse 201
{
"data": {
"section": {
"id": 418,
"type": "category-products",
"settings": {"category": 64, "title": "", "count": 8, "layout": "slider", "show_view_all": true},
"is_active": true,
"available": true
},
"sections": [
{"id": 418, "type": "category-products", "settings": {"category": 64, "title": "", "count": 8, "layout": "slider", "show_view_all": true}, "is_active": true, "available": true},
{"id": 412, "type": "category-products", "settings": {"category": 57, "title": "", "count": 8, "layout": "grid", "show_view_all": true}, "is_active": true, "available": true},
{"id": 415, "type": "category-products", "settings": {"category": 61, "title": "Nos parfums", "count": 10, "layout": "slider", "show_view_all": false}, "is_active": false, "available": true}
],
"version": "e27a90c4b1f36d05",
"change_id": 90231,
"rendered": true
},
"meta": {"request_id": "3b7d0e5a9c14f862", "api_version": "v1"}
}
PATCH /v1/store/home-layout/sections/{id}
Modifie une section. Les réglages envoyés sont fusionnés avec ceux enregistrés. Envoyez settings, is_active ou les deux.
Auth : clé plateforme avec store:write. Nécessite Idempotency-Key.
Corps
Champ | Type | Requis | Notes |
| object | non | Fusionnés avec les réglages enregistrés. |
| bool | non |
|
| bool | non | Avec |
Requête
curl -X PATCH 'https://api.dzbuild.app/v1/store/home-layout/sections/415' \
-H "Authorization: Bearer $DZ_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: hs-415-show-1" \
-d '{"settings": {"count": 6}, "is_active": true}'
Réponse 200
La réponse a les mêmes champs que celle de POST : section (la section après le changement), sections, version, change_id et rendered.
{
"data": {
"section": {
"id": 415,
"type": "category-products",
"settings": {"category": 61, "title": "Nos parfums", "count": 6, "layout": "slider", "show_view_all": false},
"is_active": true,
"available": true
},
"sections": [
{"id": 418, "type": "category-products", "settings": {"category": 64, "title": "", "count": 8, "layout": "slider", "show_view_all": true}, "is_active": true, "available": true},
{"id": 412, "type": "category-products", "settings": {"category": 57, "title": "", "count": 8, "layout": "grid", "show_view_all": true}, "is_active": true, "available": true},
{"id": 415, "type": "category-products", "settings": {"category": 61, "title": "Nos parfums", "count": 6, "layout": "slider", "show_view_all": false}, "is_active": true, "available": true}
],
"version": "51d8c3e06fa2b974",
"change_id": 90232,
"rendered": true
},
"meta": {"request_id": "c90a6e1f2d7b4538", "api_version": "v1"}
}
DELETE /v1/store/home-layout/sections/{id}
Supprime une section.
Auth : clé plateforme avec store:write. Nécessite Idempotency-Key.
Requête
curl -X DELETE 'https://api.dzbuild.app/v1/store/home-layout/sections/412' \ -H "Authorization: Bearer $DZ_KEY" \ -H "Idempotency-Key: hs-del-412-1"
Réponse 200
{
"data": {
"deleted": true,
"id": 412,
"sections": [
{"id": 418, "type": "category-products", "settings": {"category": 64, "title": "", "count": 8, "layout": "slider", "show_view_all": true}, "is_active": true, "available": true},
{"id": 415, "type": "category-products", "settings": {"category": 61, "title": "Nos parfums", "count": 6, "layout": "slider", "show_view_all": false}, "is_active": true, "available": true}
],
"version": "0f6b2d9e84a1c357",
"change_id": 90233,
"rendered": true
},
"meta": {"request_id": "71e4b08c3a5d9f26", "api_version": "v1"}
}
POST /v1/store/home-layout/reorder
Fixe l'ordre d'affichage. ids liste chaque section de la page une seule fois, sections masquées comprises.
Auth : clé plateforme avec store:write. Nécessite Idempotency-Key.
Requête
curl -X POST 'https://api.dzbuild.app/v1/store/home-layout/reorder' \
-H "Authorization: Bearer $DZ_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: hs-order-2" \
-d '{"ids": [415, 418]}'
Réponse 200
La réponse porte sections dans le nouvel ordre, version, change_id et rendered. Un id absent de la page répond 404 section_not_found. Un id manquant ou répété répond 422 invalid_order.
PUT /v1/store/home-layout
Remplace toute la mise en page par la liste envoyée, dans cet ordre.
Auth : clé plateforme avec store:write. Idempotency-Key est facultative.
Corps
Champ | Type | Requis | Notes |
| array | oui | 25 éléments au plus, chacun |
| string | non | La |
Comment chaque élément est lu :
Un élément avec un
idgarde cette section. Sontypedoit être le type actuel de la section.Un élément sans
idcrée une section.Une section de la page absente de la liste est supprimée.
settingsest l'objet complet : un réglage omis revient à sa valeur par défaut. Envoyez les réglages complets de chaque section que vous gardez.is_activevauttruepar défaut.
Requête
curl -X PUT 'https://api.dzbuild.app/v1/store/home-layout' \
-H "Authorization: Bearer $DZ_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: hs-replace-7" \
-d '{
"version": "0f6b2d9e84a1c357",
"sections": [
{"id": 415, "type": "category-products", "settings": {"category": 61, "title": "Nos parfums", "count": 6, "layout": "slider", "show_view_all": false}},
{"type": "category-products", "settings": {"category": 57}}
]
}'
Réponse 200
La réponse porte sections, version, change_id et rendered. La section 418 n'a pas été envoyée, elle est donc supprimée. Renvoyer telle quelle la mise en page lue répond change_id: null.
Avec une Idempotency-Key, un réessai avec la même clé et le même corps renvoie la réponse conservée pendant 24 heures avec Idempotency-Replay: 1, et la même clé avec un autre corps répond 422 idempotency_key_reuse. Sans clé, l'appel s'exécute à chaque fois, ce qui est sans risque : envoyer deux fois la même liste laisse la même mise en page.
Annulation
Chaque écriture répond avec un change_id, ou null quand elle n'a rien changé. POST /v1/changes/{change_id}/undo remet toute la page d'accueil telle qu'elle était avant ce changement.
Un ajout de section s'annule aussi : l'annulation retire la section. Pour les autres ressources, l'annulation refuse un changement qui a créé quelque chose.
Si la page d'accueil a changé après ce changement, par l'API ou dans le dashboard, l'annulation répond
409 layout_changedet n'écrit rien. Lisez la mise en page et écrivez directement ce que vous voulez.Une section qui revient après une suppression reçoit un nouvel id.
L'annulation est enregistrée comme un changement à part,
undo_change_id, que vous pouvez annuler à son tour. Annuler l'annulation d'une suppression répond409 layout_changed, parce que la section est revenue avec un nouvel id.Les changements que le marchand enregistre dans le dashboard ne sont pas enregistrés, on ne peut donc pas les annuler par l'API.
GET /v1/changes?entity=store.home_layoutliste les changements de la mise en page de l'accueil, du plus récent au plus ancien, avecstore:read.Le jeton d'une application installée ne peut ni lire ni annuler les changements :
GET /v1/changeset l'annulation répondent403 forbidden(Apps cannot use this endpoint). Les réponses d'écriture portent toujours lechange_id.La réponse de l'annulation ne contient pas la mise en page. Relisez-la avec
GET /v1/store/home-layout; la lecture est servie à neuf.
L'annulation demande store:write et une Idempotency-Key.
curl -X POST 'https://api.dzbuild.app/v1/changes/90231/undo' \ -H "Authorization: Bearer $DZ_KEY" \ -H "Idempotency-Key: undo-90231"
{
"data": {
"undone": true,
"change_id": 90231,
"entity": "store.home_layout",
"undo_change_id": 90240
},
"meta": {"request_id": "5ad2f7c01e9b8634", "api_version": "v1"}
}
Un changement annulé une seconde fois répond 409 already_undone.
Erreurs
HTTP | Code | Cause |
400 |
| Le corps n'est pas un objet JSON, un champ a le mauvais type ( |
401 |
| Clé absente ou invalide. |
402 |
| Le quota mensuel de requêtes de la boutique est épuisé. Voir Limites de taux. |
403 |
| « Missing scope: store:read » ou « Missing scope: store:write », ou « API access requires an active Enterprise plan » pour une clé du marchand dont la boutique n'a pas de plan Enterprise actif. |
403 |
| L'écriture laisserait plus de sections que le plan n'en autorise. L'erreur porte |
404 |
| Aucune section avec cet id sur la page. |
409 |
| Une autre écriture est arrivée avant, ou la |
409 |
| Annulation seulement : la page d'accueil a changé après ce changement. |
409 |
| Annulation seulement : le changement a déjà été annulé. |
413 |
| Le corps dépasse 1 Mo. |
422 |
| Une valeur a été refusée. |
422 |
| Le type n'existe pas ou ne peut pas être ajouté sur ce thème. |
422 |
| Plus de 25 sections, ou plus de sections d'un type que sa |
422 |
| Les |
422 |
| Un |
422 |
| La même |
429 |
| Trop de requêtes, y compris plus de 30 écritures de mise en page de l'accueil par minute pour la boutique. Attendez la durée de |
429 |
| Plus de 5 écritures de mise en page de l'accueil en cours en même temps pour la boutique. Réessayez dans quelques secondes. |
500 |
| La requête a échoué. Réessayez avec la même |
Une réponse invalid_settings ressemble à ceci.
{
"error": {
"code": "invalid_settings",
"message": "Invalid value at settings.category: category not found in this store; accepted values are in settings_schema of GET /v1/store/home-layout",
"fields": [{"path": "settings.category", "code": "invalid"}]
},
"meta": {"request_id": "e4c19a0b7d2f5836", "api_version": "v1"}
}
Limites
25 sections par page d'accueil (
max_sections).Plafond du plan (
cap) : 3 sections sur Free ou un plan expiré, 25 à partir de Pro. Les sections masquées comptent. Une boutique au-dessus de son plafond après un changement de plan garde ses sections et peut toujours les modifier, les masquer, les réordonner et les supprimer. Une écriture qui laisse plus de sections que le plafond et plus qu'avant répond403 plan_required.Par type : chaque type a une
limitdanstypes, 12 pourcategory-products.Réglages : 8 Ko par section une fois encodés. Un texte plus long est coupé au
maxdu réglage.Corps : 1 Mo.
Écritures : 30 par minute et 5 en même temps par boutique, en plus de la limite par minute de la boutique. Voir Limites de taux.
Interrupteurs de la page d'accueil de Digital, Ariana et Prestige
Les thèmes Digital, Ariana et Prestige construisent leur page d'accueil à partir de blocs fixes. Un ensemble plus ancien d'interrupteurs affiche ou masque ces blocs et règle leurs titres, catégories et bannières. GET et PATCH /v1/store/home-sections lisent et modifient ces interrupteurs. Ils sont enregistrés à part de la mise en page de l'accueil décrite plus haut : une écriture sur l'un ne change jamais l'autre.
Thème | Champs lus |
Digital, Ariana |
|
Prestige |
|
Aucun autre thème ne lit ces interrupteurs : sur un autre thème, une écriture est enregistrée et répond 200, et les acheteurs ne voient aucun changement. Un interrupteur jamais enregistré est absent de la réponse : Digital et Ariana affichent alors son bloc, et Prestige masque ses témoignages. section_order fixe l'ordre des blocs de Digital et d'Ariana avec les valeurs hero_slider, category_cards, top_sellers, popular_by_category, promo_banners et multi_column_lists. Un bloc absent de cette liste n'est pas affiché.
GET /v1/store/home-sections
Auth : clé plateforme avec store:read. Comme pour GET /v1/store/home-layout, la réponse est servie à neuf à chaque appel.
curl 'https://api.dzbuild.app/v1/store/home-sections' \ -H "Authorization: Bearer $DZ_KEY"
{
"data": {
"theme": "digital",
"settings": {"show_top_sellers": 1, "top_sellers_title": "Meilleures ventes", "column_1_category_id": 57}
},
"meta": {"request_id": "...", "api_version": "v1"}
}
settings ne contient que les champs enregistrés. Une boutique qui n'en a jamais enregistré répond "settings": [].
PATCH /v1/store/home-sections
Auth : clé plateforme avec store:write. Nécessite Idempotency-Key.
Envoyez seulement les champs à changer : les autres gardent leur valeur, et les champs inconnus sont ignorés. Les champs show_* sont enregistrés comme 1 ou 0. Un *_category_id prend une catégorie de cette boutique, et 0 le vide. Le texte est débarrassé des espaces en début et en fin, puis coupé à 500 caractères, testimonials_title à 200. banner_1_button_link et banner_2_button_link acceptent un lien https://, http://, mailto: ou tel:, un /path ou une #anchor. testimonials garde au plus 24 entrées, chacune avec name, comment et stars de 1 à 5.
curl -X PATCH 'https://api.dzbuild.app/v1/store/home-sections' \
-H "Authorization: Bearer $DZ_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: hs-top-sellers-off-1" \
-d '{"show_top_sellers": false, "column_1_category_id": 61}'
{
"data": {
"updated": ["show_top_sellers", "column_1_category_id"],
"settings": {"show_top_sellers": 0, "top_sellers_title": "Meilleures ventes", "column_1_category_id": 61}
},
"meta": {"request_id": "...", "api_version": "v1"}
}
updated liste les champs écrits, et settings contient tous les champs enregistrés après l'écriture. La réponse ne porte pas de change_id : GET /v1/changes?entity=store.home_sections liste ces changements, et POST /v1/changes/{change_id}/undo en annule un. Annuler la première écriture d'un champ ne remet pas sa valeur par défaut : un interrupteur show_* revient à 0 et section_order à [], ce qui masque ce bloc sur Digital et Ariana, ou tous les blocs. Pour revenir aux valeurs par défaut, envoyez 1 ou la liste section_order complète avec PATCH.
HTTP | Code | Cause |
400 |
| Le corps n'est pas du JSON, ou |
403 |
| « Missing scope: store:read » ou « Missing scope: store:write », ou « API access requires an active Enterprise plan » pour une clé du marchand dont la boutique n'a pas de plan Enterprise actif. |
422 |
| Le corps ne contient aucun des champs que cet endpoint accepte. |
422 |
| Un |
422 |
| Un lien de bouton utilise un autre schéma, par exemple |
422 |
| La même |
401, 402, 413 et 500 ont le même sens que pour les écritures de la mise en page de l'accueil. 429 rate_limited vient seulement des limites générales par minute décrites dans Limites de taux : les limites d'écriture de la mise en page de l'accueil ne s'appliquent pas ici.