bruxel.ai

Bruxel Public API · v1

Intégrez Bruxel à votre système

Une API REST pour générer des descriptions de produits optimisées pour le SEO et le GEO directement depuis votre backend, PIM ou e-commerce. Importez votre catalogue, générez des descriptions et exportez — sans toucher à l'interface.

Base URLhttps://bruxel.ai/api/public/v1Authentification Bearer bxk_…Format JSON
Démarrer

Premiers pas

Créez une clé API, découvrez la base URL et faites votre premier appel authentifié.

Aller au Démarrage rapide →
Sécurité

Authentification

Clés bxk_ par organisation, permissions par scope et remise unique.

Voir l'authentification →
OpenAPI

Référence de l'API

Explorez les endpoints avec leurs schémas, paramètres et réponses d'exemple.

Voir la référence →
Code

Exemples

Des flux complets en curl, Python et JavaScript, prêts à copier.

Voir les exemples →

Démarrage rapide

De zéro à une description générée. Remplacez bxk_votre_cle par celle créée dans la console.

# 1) Verifica que tu llave funciona
curl -s https://bruxel.ai/api/public/v1/me \
  -H "Authorization: Bearer bxk_tu_llave"

# 2) Empuja productos a tu catálogo (upsert por SKU)
curl -s -X POST https://bruxel.ai/api/public/v1/products \
  -H "Authorization: Bearer bxk_tu_llave" \
  -H "Content-Type: application/json" \
  -d '{"products":[{"sku":"MRN-CREW-01","name":"Suéter de lana merino"}]}'

# 3) Genera la descripción (síncrono — cobra créditos)
curl -s -X POST https://bruxel.ai/api/public/v1/generations \
  -H "Authorization: Bearer bxk_tu_llave" \
  -H "Content-Type: application/json" \
  -d '{"product_id":"prod_8f2","languages":["es"]}'

# 4) Exporta tu catálogo timbrado a CSV
curl -s "https://bruxel.ai/api/public/v1/export/catalog.csv?language=es" \
  -H "Authorization: Bearer bxk_tu_llave"

Derniers changements

Les nouveautés de l'API publique.

2026-10-09
videocambio

Vidéo : ai_model_id et extra_ref_ids sont retirés

POST /v1/products/{id}/ai-video et son scénario n'acceptent plus ai_model_id ni extra_ref_ids (« le mannequin dans les plans ») : le fournisseur refuse le visage du mannequin. Les envoyer renvoie 422 (X-Bruxel-Reason: params) sans réserver de crédits. La vidéo plan par plan, celle qui accepte le mannequin, n'existe pour l'instant que dans l'application.

2026-10-08
reportesbi

Les rapports, aussi par l’API

Avec le nouveau scope reports:read, votre BI lit les mêmes rapports que la section : GET /v1/reports donne le catalogue avec le nombre de lignes de chacun sur la période, GET /v1/reports/:id/rows une page en JSON (jusqu’aux 10 000 premières lignes) et GET /v1/reports/:id.csv le fichier complet. La période passe par from, to et tz ; brand et status filtrent là où le rapport les utilise.

2026-10-08
flujoswebhooks

Les flux vous préviennent : à vous, arrêté, terminé

Trois nouveaux événements de webhook : flow.step.ready (des produits arrivés à une étape), flow.run.blocked (des parcours arrêtés par une erreur) et flow.run.completed (des parcours terminés). Ils arrivent regroupés, un par étape ou par flux, avec un nombre et un échantillon de 20 au plus ; la liste complète vient de GET /v1/flows/:slug/steps/:key/products et de GET /v1/flows/:slug/runs, avec un curseur. Activer un flux vous réveille une fois par étape qui a des produits.

2026-10-07
flujossistemas

Les étapes de vos systèmes : notifications et appels

Une étape d'un flux peut aussi être validée quand Bruxel livre une notification à un système (un webhook qui répond par un 2xx) ou quand la clé de ce système lit ou écrit la fiche (consulter son parcours ou son historique ne compte pas). Dans GET /v1/products/:id/journey, `cause` peut valoir `delivery` ou `api_call`, et `event_system` et `event_type` indiquent le système et ce qui s'est passé : la notification ou l'opération (`read` ou `write`). Un événement sans `system` prend le système connecté auquel la clé est liée.

2026-10-06
flujoseventos

Signalez ce qui se passe à l’extérieur et lisez le parcours d’un produit

POST /v1/events (scope `events:write`) reçoit jusqu’à 100 événements par appel : quel système, ce qui s’est passé, si cela a réussi et quand. Une étape d’un flux peut être validée par cet événement. GET /v1/products/:id/journey (scope `catalog:read`) indique où en est le produit dans chaque flux et ce que les systèmes ont signalé.

2026-09-27
catálogoatributos

Attributs déduits : `derived` et le 422 `derived`

`GET /v1/attributes` renvoie `derived` : `true` quand le système fixe la valeur à partir d’un autre champ (un autre attribut, la catégorie ou la marque) selon une règle du client. Sur un produit où la déduction s’applique, `PUT /v1/products/{id}/attributes/{code}` répond 422 avec `X-Bruxel-Reason: derived` et n’écrit rien : on change l’origine et la valeur déduite se recalcule dans la même écriture.

2026-09-25
atributos

Listes partagées : `value_list` sur chaque attribut

`GET /v1/attributes` renvoie `value_list` : le code de la liste partagée d’où viennent les options de l’attribut, ou `null`. Les options d’un attribut lié se lisent et s’attribuent comme toujours ; ce qui change, c’est qu’elles se modifient dans la liste, depuis l’app.

2026-09-25
catálogokits

Kits : la composition d'un produit, par SKU

`GET` et `PUT /v1/products/{product_id}/components` (scopes `catalog:read`/`catalog:write`) lisent et écrivent la composition d'un kit : les produits qui le forment, avec leur quantité et dans l'ordre, plus `part_of` (dans combien de kits se trouve le produit). Un SKU inconnu donne un 422 qui le nomme ; un kit n'a qu'un niveau. L'upsert et l'import construisent aussi des kits à partir de `associated_skus` ou `kit_components` (`sku=quantité`), et les canaux les émettent avec la colonne `kit.components`.

2026-09-25
catálogoatributoscanales

Une valeur propre par canal : `is_channel_scoped` et `channel`

`GET /v1/attributes` indique quels attributs ont une valeur propre par canal (`is_channel_scoped`). Pour ceux-là, `PUT /v1/products/{id}/attributes/{code}` accepte `channel` (le `slug` du canal) pour écrire la valeur de CE canal sans toucher la valeur maître, et `GET …/attributes?channel=` la lit avec repli sur la valeur maître : la même valeur que sort le CSV du canal. Un attribut qui n'est pas par canal ou un canal inexistant donnent un 422.

2026-09-25
canalesatributos

La valeur de chaque option dans chaque canal : `map` et `strict`

`GET /v1/channels` renvoie, par colonne, `map` (la valeur que CE fichier écrit pour chaque option d'une liste : « Rojo » → « Red » pour Amazon, « 001 » pour l'ERP) et `strict` (une option sans valeur pour le canal sort vide et le produit compte comme incomplet dans `readiness`). La clé est le texte que la cellule aurait sans le mappage, dans la langue du canal. Avec `null`/`false`, la cellule sort comme toujours.

2026-09-24
catálogocanales

Ce produit est-il complet pour le canal ? — par produit

`GET /v1/products/{id}/channels/readiness` (scope `channels:read`) indique, pour chaque canal configuré, si le produit sortirait complet dans son CSV : `published` (une fiche est publiée dans la langue du canal), `ready`, et `missing` avec chaque colonne manquante et sa source (`output.{champ}`, `attribute.{code}`, `media.*`). C'est ce qu'un middleware vérifie avant de créer le produit dans la boutique. Même résolveur que le fichier ; sans frais.

2026-09-24
mediawebhooks

Envoyer et lier des images via l'API (media:write)

Nouveau scope `media:write` et quatre routes : `POST /v1/media/presign` réserve le quota et renvoie le POST signé S3 ; `POST /v1/media/{asset_id}/complete` confirme par signature binaire et poids réel ; `POST /v1/products/{id}/media` lie l'asset avec son rôle et `DELETE /v1/products/{id}/media/{asset_id}` le délie. C'est la même porte du DAM que celle de l'application : le serveur ne voit jamais les octets, le quota est réservé avant de signer et un fichier qui ment sur son type est rejeté.

2026-09-24
catálogoatributosidiomas

Écrire la valeur d'un attribut dans une langue

`PUT /v1/products/{id}/attributes/{code}` accepte `language` : il écrit la valeur DANS CETTE LANGUE pour un attribut localisable ; sans lui, la valeur va dans l'emplacement global comme toujours. `GET /v1/attributes` dit à l'avance quels attributs l'acceptent (`is_localizable`). Une langue non prise en charge, ou un attribut non localisable, est un 422 qui nomme le code — et `GET …/attributes?language=xx` est désormais un 422 aussi, au lieu d'un 200 avec les valeurs globales.

2026-09-24
catálogoatributos

Groupes d'attributs dans GET /v1/attributes

Chaque attribut porte `group` : le code du groupe (la section de la fiche) auquel il appartient, ou `null`. C'est le code et non un id parce que cette API parle en codes : un intégrateur qui construit la ligne d'une équipe filtre dessus sans second appel. Les groupes se définissent dans l'application ou avec la colonne `group` du CSV de définitions.

2026-09-24
catálogoatributos

Filtrer le catalogue par la valeur d'un attribut

`GET /v1/products` accepte `attr=code:valeur` (répétable, jusqu'à cinq, en ET) : le texte de l'option pour une liste, Oui/Non pour un booléen, texte exact, nombre ou date ; un `code:` vide garde les produits SANS valeur. C'est la question que pose la file d'une équipe dans l'application — par exemple `attr=ready_to_master_data:Sí&attr=ready_to_sap:` — et ce qui ne peut pas s'appliquer est un 422 avec la cause, jamais une liste vide.

2026-09-24
catálogowebhookshistorial

Le flux des changements de fiche, et un `product.updated` qui dit ce qui a changé

`GET /v1/products/deltas` parcourt l'historique de toutes vos fiches avec un curseur reprenable : pour chaque version, il indique le produit, le motif et CE QUI a changé (champs, codes d'attribut, catégories, famille), jamais les valeurs ; `attribute=` et `reason=` permettent de n'écouter qu'un indicateur ou un motif. Et le webhook `product.updated` part désormais de tout changement réel de la fiche — y compris l'écriture d'une valeur d'attribut, qui n'avertissait pas avant — avec `version`, `reason` et `changed`. C'est un réveil : relisez la fiche ou le flux, ne vous fiez pas seulement à `changed`.

2026-09-23
catálogohistorial

L’historique de la fiche enregistre les changements du catalogue

L’historique de chaque fiche enregistre désormais ce qui lui arrive quand le catalogue change : supprimer un attribut, une option, une catégorie ou une famille, ou renommer une option ou un code, laisse une version avec `reason` `structure`. Et `changes` peut contenir deux nouvelles clés : `replaced` (le code appartient désormais à un autre attribut) et `recoded` (le même attribut sous un autre code).

2026-09-20
catálogocanales

Unités de mesure sur les attributs et les canaux

Un attribut de mesure indique désormais de quelle mesure il s’agit et quelles unités il accepte : `GET /v1/attributes` renvoie `dimension` et `accepted_units`, et le `PUT` d’une valeur accepte « 1.7 fl oz » sur un attribut en ml (la conversion est automatique). Et chaque colonne de canal peut demander une autre unité, d’autres décimales ou le nombre sans unité : `GET /v1/channels` l’expose dans `columns[]` pour que vous sachiez lire la cellule.

2026-09-17
catálogocanales

Produits associés par API

Vous pouvez désormais lire et écrire avec quels autres produits chacun est proposé — associés, vente croisée et montée en gamme — par SKU, et les télécharger dans le CSV de votre canal avec les noms de colonnes attendus par votre boutique.

2026-09-12
contenidopublicación

Publier, approuver et dépublier par API

Trois nouveaux endpoints avec leur propre scope `content:manage` : publier une version précise, approuver le candidat du workflow éditorial et cesser de servir une fiche. Le scope est distinct de `catalog:write` à dessein — écrire la fiche et décider de ce que sert votre boutique sont deux choses différentes.

2026-09-12
catálogohistorial

Historique de la fiche : ce qui a changé dans un produit, et quand

GET /v1/products/{product_id}/revisions renvoie les versions d'une fiche, de la plus récente à la plus ancienne, avec ce qui a changé dans chacune : champs, attributs (par code et par langue), catégories et famille. Des données importées, il indique les noms des colonnes qui ont changé, jamais leur contenu. Pour l'intégrateur qui synchronise et veut savoir quoi regarder sans retélécharger toute la fiche.

2026-09-11
canalesexport

Canaux : quelles colonnes sont requises et combien de produits sont prêts

GET /v1/channels renvoie désormais `columns[].required` et `skip_incomplete` (si le canal omet les lignes incomplètes de son CSV et de son flux). Et GET /v1/channels/{slug}/readiness indique combien de produits sortiraient complets dans le canal, combien n’ont pas de fiche publiée et quelles colonnes requises manquent le plus — avec le même critère que le fichier.

2026-09-10
imágenes3D

L'objet 3D du produit, dans le même endpoint de médias

GET /v1/products/{id}/media peut renvoyer un quatrième rôle : model_3d. Son url est le GLB et le nouveau champ usdz_url est le même modèle en USDZ, la seule chose qu'ouvre Quick Look sur iPhone ; sur une image ou une vidéo il vaut null. Additif : si vous intégrez déjà, votre contrat ne change pas — mais choisissez l'image de base par role, pas par l'index 0.

2026-09-10
atributosexport

Le code de l'attribut dans votre boutique

GET /v1/attributes renvoie external_code : l'attribute_code sous lequel Adobe Commerce connaît chaque attribut, tel que saisi dans Bruxel. Quand il existe, /v1/export/catalog.csv nomme ainsi la colonne au lieu de code. null = pas de code externe ; rien ne change.

2026-09-07
video

Vidéo par API : des clips jusqu'à 30 secondes, avec scénario

POST /v1/products/{id}/ai-video lance un clip à partir d'une image déjà enregistrée du produit : cinq secondes à prix fixe, ou jusqu'à 30 avec du son, facturées à la seconde × la qualité. Avec ai_model_id, le même mannequin apparaît dans tous les plans. POST /v1/products/{id}/ai-video/script écrit le scénario plan par plan avec l'IA (3 crédits, au succès).

2026-09-07
imágenes

Le look de chaque photo : coiffure, maquillage et tenue

POST /v1/products/{id}/ai-media accepte hairstyle, makeup et outfit pour diriger le look du mannequin sur CETTE photo, sans toucher à son identité. Les trois valent as_model par défaut et, avec cette valeur, rien ne change ; le job les renvoie dans look.

2026-09-04
imágenes

Vêtement et expression dans la génération d'images

POST /v1/products/{id}/ai-media accepte subject (product | garment) pour que le mannequin porte le vêtement au lieu de le tenir, et expression (natural, smile, laugh, neutral, serious, playful) pour choisir son visage. Les deux sont optionnels et leurs valeurs par défaut reproduisent le comportement précédent ; le job les renvoie dans subject et expression.

2026-09-03
imágeneswebhooks

Images : flux de changements, webhook et génération par API

GET /v1/media/deltas indique quels produits ont modifié leur galerie (suppressions incluses) ; l'événement media.updated prévient en temps réel ; GET /v1/products/{id}/media porte le rôle réel (swatch apparaît), la position et la provenance (origin, synthetic_performer) ; et avec le nouveau scope media:generate vous ouvrez des séances photo IA depuis votre système (POST /v1/products/{id}/ai-media, GET /v1/ai-media/jobs/{id}, GET /v1/ai-models).

2026-07-21
llavesauth

Clés API par organisation

Nouvelles clés bxk_ avec permissions par scope (catalog:read, generate, export…), remise unique et révocation immédiate depuis la console.

2026-07-21
generación

Lots asynchrones avec idempotence

L'endpoint POST /v1/batches pour la génération en volume : réservation de crédits, Idempotency-Key obligatoire et facturation par résultat à la lecture.

2026-07-13
export

Export du catalogue par langue

GET /v1/export/catalog.csv?language=es renvoie votre catalogue généré dans la langue demandée, au format Adobe Commerce.

Voir le journal complet →

Bruxel pour les développeurs — API publique