Skip to content

Conversations

Exportez vos conversations, les échanges que les visiteurs ont eus avec l'assistant IA (et avec vos opérateurs après un handoff), pour l'analytics, votre data warehouse, l'enrichissement CRM ou l'archivage de conformité.

Ces endpoints sont en lecture seule. Vous pouvez lister les conversations (filtrées par date, paginées par curseur) et récupérer une conversation complète avec sa transcription de messages, les tags qui lui sont associés, et les événements d'interaction qu'elle a produits (ajout au panier, clics produit, clic bouton support).

Léger par défaut

L'endpoint de liste renvoie uniquement les métadonnées de la conversation et les tags. Ajoutez include=messages pour inliner la transcription, et include=contact pour inliner les coordonnées client. Un balayage sur une plage de dates reste ainsi rapide, et vous n'optez pour les données plus lourdes que lorsque vous en avez besoin.

L'objet Conversation

ChampTypeDescription
humind_idstringId hex 24 caractères de la conversation. À utiliser comme {id} sur l'endpoint de récupération.
created_atISO 8601Début de la conversation (UTC).
updated_atISO 8601Dernière activité (UTC). Sert à la synchro incrémentale updated_after.
last_message_atISO 8601Horodatage du message le plus récent.
originstringCanal d'où la conversation a démarré (ex. shopify).
origin_urlstringURL de la page où le chat a commencé, si connue.
languagestring[]Langue(s) détectée(s), ISO 639-1.
titlestringTitre de conversation assigné par l'IA/l'opérateur, si défini.
handoff_statusstringai_active, queued ou human_active.
tagsstring[]Tags assignés par l'IA et les opérateurs. Toujours présent (peut être vide).
has_triggered_cartbooleantrue si le visiteur a ajouté un produit au panier durant la conversation.
contact_idstringId du client identifié, quand il y en a un. Renvoyé sauf si include=contact est passé (l'objet contact complet le remplace alors).
contactobject | nullCoordonnées du client. Présent uniquement quand include=contact est passé. Voir Contact.
messagesobject[]La transcription. Toujours présente sur l'endpoint de récupération ; sur la liste uniquement quand include=messages est passé. Voir Message.
message_countintegerNombre de messages exportés. Présent seulement quand les messages sont inclus.
event_countintegerTotal des événements d'interaction sur l'ensemble des messages. Présent seulement quand les messages sont inclus.

Message

ChampTypeDescription
humind_idstringId du message.
fromstringÉmetteur : user, assistant ou operator.
rolestringconversation (tour visiteur) ou answer (tour assistant).
sourcestringComment un message visiteur a été envoyé, si connu (ex. typed, follow_up, product_page_question).
contentstring[]Le texte du message, en un ou plusieurs blocs.
created_atISO 8601Envoi du message (UTC).
product_idsstring[]Ids Humind des produits montrés dans ce tour. Omis si vide.
referenced_product_idsstring[]Ids Humind des produits cités inline (non affichés en cartes). Omis si vide.
attachmentsobject[]Fichiers uploadés dans ce tour. Omis si vide. Chacun : { id, type, original_name, mime_type, size, width?, height? }.
eventsobject[]Événements d'interaction sur ce message. Omis si vide. Voir Événement d'interaction.

Événement d'interaction

Les interactions visiteur capturées sur un message : ce que les visiteurs ont fait, pas seulement ce qu'ils ont dit.

ChampTypeDescription
humind_idstringId de l'événement.
typestringadd_product, remove_product, open_product_page, open_product_url ou click_support_button.
created_atISO 8601Enregistrement de l'événement (UTC).
product_idstringId produit Humind. Présent pour les quatre types d'événement produit.
product_titlestringTitre du produit, inclus quand résolvable.
product_variant_idstringLe variant ajouté/retiré. Présent pour add_product / remove_product.
price_at_eventnumberPrix unitaire capturé au moment de l'événement. Présent pour add_product / remove_product.
button_identifierstringQuel bouton support a été cliqué : email, contact_us, support_page ou phone. Présent pour click_support_button.

Contact

Renvoyé uniquement quand vous passez include=contact. Contient des données personnelles. Voir l'avertissement ci-dessous.

ChampTypeDescription
idstringId du contact.
namestringNom du client, si connu.
emailstringEmail du client, si connu.
phonestringTéléphone du client, si connu.

Quand include=contact est passé mais que la conversation n'a aucun contact identifié, contact vaut null.

Les données de contact sont des données personnelles

name, email et phone sont des PII. Elles sont exclues par défaut et renvoyées seulement quand vous ajoutez explicitement include=contact. Traitez ces données conformément à votre politique de confidentialité et à la réglementation applicable (RGPD, etc.), et ne les demandez que lorsque votre cas d'usage l'exige.

Ce qui est exclu

L'export est la vue marchand d'une conversation. Les éléments suivants ne sont pas renvoyés, par conception :

  • Conversations playground/sandbox : les threads de test du playground du dashboard n'apparaissent jamais.
  • Notes internes opérateur : les annotations réservées aux opérateurs ne font pas partie de la transcription.
  • Messages supprimés : les messages soft-deleted sont omis plutôt que renvoyés comme tombstones.
  • Champs IA internes : embeddings, notes de qualité de réponse, appels d'outils et traces de raisonnement ne sont jamais exposés.

Lister les conversations

GET /conversations renvoie les conversations de la company à laquelle la clé API est rattachée, les plus récentes d'abord.

Scope requis : conversations:read

Paramètre de requêteTypeDescription
created_afterISO 8601Uniquement les conversations démarrées à/après cet instant. Accepte une date (2026-05-01) ou un date-time (2026-05-01T00:00:00Z).
created_beforeISO 8601Uniquement les conversations démarrées à/avant cet instant.
updated_afterISO 8601Synchro incrémentale : uniquement les conversations mises à jour à/après cet instant (un nouveau message met à jour updated_at).
includestringEnsemble opt-in séparé par des virgules : messages (inline la transcription avec les événements imbriqués), contact (inline les PII de contact).
handoff_statusstringFiltrer par statut : ai_active, queued, human_active.
limitintegerÉléments par page (1 à 100). Défaut 50.
cursorstringCurseur opaque renvoyé comme next_cursor dans la page précédente. À omettre au premier appel.

Pagination par curseur

La réponse renvoie jusqu'à limit éléments plus un next_cursor. Repassez-le comme cursor pour la page suivante. Quand next_cursor vaut null, vous avez atteint la fin. Le curseur est opaque : ne le parsez pas ; son format peut changer dans une future version.

Requête

bash
curl "https://api.thehumind.com/public/v1/conversations?created_after=2026-05-01&limit=50" \
  -H "Authorization: Bearer hmd_live_..."

Réponse 200 OK

json
{
  "data": [
    {
      "humind_id": "65f1ab9c8e7d4a2b1c3d4e5f",
      "created_at": "2026-05-15T10:00:00Z",
      "updated_at": "2026-05-15T10:05:00Z",
      "last_message_at": "2026-05-15T10:05:00Z",
      "origin": "shopify",
      "origin_url": "https://example.com/products/creme-hydratante",
      "language": ["fr"],
      "title": "Question sur la crème hydratante",
      "handoff_status": "ai_active",
      "tags": ["high-intent", "skincare"],
      "has_triggered_cart": true,
      "contact_id": "65f1c0de8e7d4a2b1c3d4e70"
    }
  ],
  "next_cursor": "eyJpZCI6IjY1ZjFhYjljOGU3ZDRhMmIxYzNkNGU1ZiJ9"
}

Pour inliner la transcription et les événements d'interaction en un seul balayage :

bash
curl "https://api.thehumind.com/public/v1/conversations?created_after=2026-05-01&include=messages&limit=25" \
  -H "Authorization: Bearer hmd_live_..."

Récupérer une conversation

GET /conversations/{id} renvoie une conversation complète avec sa transcription de messages (chaque message avec ses événements d'interaction imbriqués). {id} est le humind_id de la conversation.

Scope requis : conversations:read

Paramètre de requêteTypeDescription
includestringPassez contact pour inliner les PII de contact client. La transcription (messages) est toujours incluse sur cet endpoint.

Requête

bash
curl https://api.thehumind.com/public/v1/conversations/65f1ab9c8e7d4a2b1c3d4e5f \
  -H "Authorization: Bearer hmd_live_..."

Réponse 200 OK

json
{
  "humind_id": "65f1ab9c8e7d4a2b1c3d4e5f",
  "created_at": "2026-05-15T10:00:00Z",
  "updated_at": "2026-05-15T10:05:00Z",
  "last_message_at": "2026-05-15T10:05:00Z",
  "origin": "shopify",
  "language": ["fr"],
  "handoff_status": "ai_active",
  "tags": ["high-intent", "skincare"],
  "has_triggered_cart": true,
  "contact_id": "65f1c0de8e7d4a2b1c3d4e70",
  "message_count": 3,
  "event_count": 1,
  "messages": [
    {
      "humind_id": "65f1ab9c8e7d4a2b1c3d4e60",
      "from": "user",
      "role": "conversation",
      "source": "typed",
      "content": ["Vous l'avez en 50 ml ?"],
      "created_at": "2026-05-15T10:01:00Z"
    },
    {
      "humind_id": "65f1ab9c8e7d4a2b1c3d4e61",
      "from": "assistant",
      "role": "answer",
      "content": ["Oui, la crème hydratante existe en 50 ml."],
      "created_at": "2026-05-15T10:01:30Z",
      "product_ids": ["65f1aa008e7d4a2b1c3d4e10"]
    },
    {
      "humind_id": "65f1ab9c8e7d4a2b1c3d4e62",
      "from": "user",
      "role": "conversation",
      "content": ["Parfait, je la prends."],
      "created_at": "2026-05-15T10:02:00Z",
      "events": [
        {
          "humind_id": "65f1ab9c8e7d4a2b1c3d4e80",
          "type": "add_product",
          "created_at": "2026-05-15T10:02:05Z",
          "product_id": "65f1aa008e7d4a2b1c3d4e10",
          "product_title": "Crème hydratante",
          "product_variant_id": "65f1aa008e7d4a2b1c3d4e11",
          "price_at_event": 29.90
        }
      ]
    }
  ]
}

Pour inclure les coordonnées du contact :

bash
curl "https://api.thehumind.com/public/v1/conversations/65f1ab9c8e7d4a2b1c3d4e5f?include=contact" \
  -H "Authorization: Bearer hmd_live_..."

Le champ contact_id est alors remplacé par un objet contact :

json
{
  "contact": {
    "id": "65f1c0de8e7d4a2b1c3d4e70",
    "name": "Jane Doe",
    "email": "jane@example.com",
    "phone": "+33123456789"
  }
}

Recettes

Exporter une plage de dates

Paginez tout ce qui a démarré sur une fenêtre :

bash
# Première page
curl "https://api.thehumind.com/public/v1/conversations?created_after=2026-05-01&created_before=2026-06-01&include=messages&limit=50" \
  -H "Authorization: Bearer hmd_live_..."

# Page suivante : passez le next_cursor de la réponse précédente
curl "https://api.thehumind.com/public/v1/conversations?created_after=2026-05-01&created_before=2026-06-01&include=messages&limit=50&cursor=COLLER_NEXT_CURSOR" \
  -H "Authorization: Bearer hmd_live_..."

Continuez à suivre next_cursor jusqu'à ce qu'il revienne null.

Synchro incrémentale

Ne récupérez que ce qui a changé depuis votre dernier run. Stockez l'horodatage de votre synchro précédente et passez-le en updated_after :

bash
curl "https://api.thehumind.com/public/v1/conversations?updated_after=2026-06-07T00:00:00Z&include=messages" \
  -H "Authorization: Bearer hmd_live_..."

Cela renvoie chaque conversation touchée (nouveau message, handoff, changement de tag) depuis cet instant, idéal pour un ETL nocturne vers votre warehouse.


Erreurs courantes

StatutCodeQuandCorrection
400validation_failedFormat de date invalide, cursor invalide ou {id} malformé. details pointe le problème.Corrigez le paramètre et renvoyez.
401missing_credentials, invalid_key, revokedHeader d'auth manquant, malformé, ou clé inactive.Voir Authentication.
403insufficient_scopeLa clé n'a pas conversations:read.Créez une clé avec le scope conversations:read.
404not_found{id} ne correspond à aucune conversation de votre company (les ids cross-tenant et playground renvoient aussi 404).Vérifiez le humind_id.
429rate_limitedTrop de requêtes pour cette clé.Temporisez via le header Retry-After. Voir Rate limits.

Suite

Released under the proprietary Humind license.