Skip to content

Conventions

Conventions qui s'appliquent à chaque endpoint de l'API publique. Lisez cette page une fois ; les pages par ressource partent du principe que vous avez intégré tout ce qui est ici.

Format des requêtes

  • Protocole : HTTPS uniquement. Le HTTP simple est refusé.
  • Body : JSON, UTF-8. Le header Content-Type: application/json est requis sur POST, PUT et PATCH. Sans ce header, l'API renvoie 415 unsupported_media_type.
  • Limite de taille du body : 5 MB. Les payloads plus gros reçoivent 413 Payload Too Large. Pour les imports bulk de gros catalogues, utilisez les endpoints batch (max 500 items par appel) ou l'API Imports en streaming.
  • Toutes les réponses sont en JSON, UTF-8.
bash
curl -X POST https://api.thehumind.com/public/v1/products \
  -H "Authorization: Bearer hmd_live_..." \
  -H "Content-Type: application/json" \
  -d '{ "external_id": "SKU-123", "title": "..." }'

Identifiants

Chaque ressource exposée par l'API publique a deux identifiants : un que vous contrôlez (external_id) et un que Humind contrôle (humind_id). Choisissez celui qui est le plus pratique pour l'appel que vous faites.

IdentifiantQui le poseFormatNotes
external_idVousString free-form, unique par companyVotre SKU, votre slug, n'importe quoi que vous pouvez déduire de vos propres données. Utilisé pour les upserts : reposter un produit avec le même external_id qu'un existant met à jour celui-là.
humind_idHumind24 caractères hex minusculesRenvoyé dans chaque réponse. Stable pendant toute la vie de la ressource.

Pour les path parameters qui prennent un {id} (GET /products/{id}, PATCH /products/{id}, …), passez l'une ou l'autre forme :

FormeExempleQuand l'utiliser
api:<external_id>api:SKU-123Quand vous voulez agir sur une ressource par votre propre identifiant. Le préfixe api: désambiguïse de humind_id.
<humind_id>65f1ab9c8e7d4a2b1c3d4e5fQuand vous avez stocké le humind_id d'une réponse précédente et voulez l'utiliser directement.

Choisissez external_id pour vos scripts

Si vous écrivez un script de sync, external_id est presque toujours le bon choix, votre script connaît déjà votre SKU et vous n'avez pas à round-tripper Humind pour récupérer le humind_id d'abord.

Dates

Tous les timestamps en réponse sont en ISO 8601 UTC avec le Z final :

2026-04-25T14:30:00Z

En requête, n'importe quel timestamp ISO 8601 est accepté ; les valeurs non-UTC (par exemple 2026-04-25T16:30:00+02:00) sont normalisées en UTC à l'écriture et stockées avec le suffixe Z. On recommande quand même d'envoyer en UTC côté client pour que ce que vous lisez corresponde exactement à ce que vous avez envoyé.

Pagination

Les endpoints de liste (GET /products, GET /collections, GET /knowledge) utilisent une pagination par cursor opaque. Chaque réponse inclut une chaîne next_cursor ; passez-la en retour comme ?cursor=… pour récupérer la page suivante. Les pages sont plafonnées à 100 items (par défaut 50). Quand next_cursor est null, vous êtes à la fin. Le cursor est opaque — ne le parsez pas, le format peut changer dans une version future.

Idempotency

Pour chaque appel modifiant l'état (POST, PUT, PATCH, DELETE), incluez un header Idempotency-Key à un UUID v4 (ou n'importe quelle valeur unique, max 255 caractères) :

bash
curl -X POST https://api.thehumind.com/public/v1/products \
  -H "Authorization: Bearer hmd_live_..." \
  -H "Idempotency-Key: 3f1a8d92-7c4b-4e6f-b2a1-d5e9c8f7a3b4" \
  -H "Content-Type: application/json" \
  -d '{ ... }'

Ce que ça fait :

  • Si votre client retente la même requête (même méthode + path + body) dans les 24h, l'API rejoue la réponse originale au lieu d'exécuter la mutation une seconde fois. Safe à retry sur les interruptions réseau, timeouts, gateway errors.
  • Si vous réutilisez la même clé avec un body différent, l'API rejette la requête en 409 Conflict avec le code idempotency_conflict. Générez un UUID frais pour chaque nouvelle opération.

Requis sur chaque write

Idempotency-Key est requis sur chaque appel modifiant l'état (POST, PUT, PATCH, DELETE). Deux exceptions state-machine-idempotent sont documentées inline : POST /imports/{sync_id}/start et POST /imports/{sync_id}/cancel acceptent le header mais ne le requièrent pas. Tout le reste renvoie 400 idempotency_key_required si le header est manquant.

Pour les endpoints batch, la clé d'idempotency s'applique au batch entier, un retry rejoue toute la réponse 207 Multi-Status.

Versioning

L'API est versionnée par URL. La version actuelle est /public/v1.

  • Changements additifs (nouveaux endpoints, nouveaux champs optionnels, nouveaux headers optionnels) sortent sous la version existante. Votre code continue de marcher.
  • Breaking changes (champs renommés, endpoints supprimés, règles de validation changées) sortent sous une nouvelle version (/public/v2). La précédente reste vivante en parallèle.
  • Fenêtre de dépréciation : 6 mois minimum entre l'annonce d'une dépréciation et la suppression. On envoie un mail à l'adresse enregistrée pour la company et on affiche une bannière dans le dashboard.

Une version future pourra introduire une pagination cursor-based sur les endpoints list (?cursor=...&limit=... avec { "data": [...], "next_cursor": "..." }). Quand ça sortira, les clients qui ne passent pas de cursor continueront de fonctionner : l'API retombera sur la plus grande taille de page raisonnable.

La fenêtre de migration exacte vers v2 sera annoncée dans le changelog quand v2 sera sur la roadmap.

Localisation

La façon standard de pousser du contenu multilingue est de l'embarquer directement dans le payload de la ressource. Chaque ressource a un champ default_language plus une map optionnelle translations clée par codes ISO 639-1 :

json
{
  "default_language": "fr",
  "title": "Crème hydratante",
  "description": "...",
  "handle": "creme-hydratante",
  "translations": {
    "en": {
      "title": "Hydrating cream",
      "description": "...",
      "handle": "hydrating-cream"
    }
  }
}

default_language est la langue des champs top-level. translations[<lang>] est l'override par locale.

Les codes de langue suivent ISO 639-1 (minuscule, deux lettres) : en, fr, de, es, it, nl, pt, ru, ar, he, zh.

Translations comme sub-resource

Pour les workflows de traduction où chaque langue sort à sa propre cadence, une sub-resource translations dédiée vous laisse patcher une locale à la fois sans renvoyer le payload complet : voir Products / Translations, Collections / Translations et Knowledge / Translations.

Rate limits

Les limites par clé API sont enforced aujourd'hui (buckets séparés pour les reads, writes et triggers d'imports), plus un throttle de 5/minute/IP sur les tentatives d'auth échouées. Voir Rate limits pour les valeurs actives, la forme de la réponse 429 et les snippets de backoff.

Isolation cross-tenant

Les clés API sont strictement liées à une seule company. Tenter de lire ou écrire une ressource qui appartient à une autre company renvoie toujours 404 Not Found (jamais 403) : Humind ne révèle pas l'existence des ressources d'autres tenants. Ça s'applique même quand vous connaissez par hasard un humind_id valide d'une autre company.

Pour aller plus loin

  • Errors : format d'erreur, codes HTTP, codes d'erreur Humind.
  • Products : pousser votre catalogue.

Released under the proprietary Humind license.