API et MCP

API des conversations

Une conversation est un entretien entre l’IA et un répondant. L’API renvoie l’identité du répondant, le résumé IA avec une réponse par question, et la transcription complète. Pour l’authentification, la pagination et les erreurs, consultez la Vue d’ensemble de l’API.

Lister les conversations#

HTTP
GET /api/v1/projects/{project_id}/conversations

Renvoie les conversations d’un projet, des plus récentes aux plus anciennes, chacune avec son résumé IA. Les transcriptions ne figurent pas dans la liste. Récupérez-les avec Obtenir une conversation.

Paramètres de requête#

ParamètreDescription
statusUne ou plusieurs valeurs parmi invited, opened, started, completed, cancelled, séparées par des virgules. Sans ce paramètre, tous les statuts sauf invited sont renvoyés.
sentimentUne ou plusieurs valeurs parmi positive, negative, neutral, mixed, séparées par des virgules
created_afterUniquement les conversations créées à partir de cette date et heure ISO 8601, par exemple 2026-05-01T00:00:00Z
created_beforeUniquement les conversations créées jusqu’à cette date et heure
searchTexte à rechercher dans les résumés, les citations et les informations sur le répondant. Jusqu’à 200 caractères.
limitDe 1 à 100. 25 par défaut.
cursorLe next_cursor de la page précédente

Seules les conversations terminées ont un résumé complet : la plupart des intégrations envoient donc status=completed.

Exemple#

curl -G "https://diaform.io/api/v1/projects/b8acb3ab-1f3d-4a7e-a846-b7f493f86b6d/conversations" \
  -H "Authorization: Bearer $DIAFORM_API_KEY" \
  --data-urlencode "status=completed" \
  --data-urlencode "sentiment=negative,mixed" \
  --data-urlencode "created_after=2026-05-01T00:00:00Z" \
  --data-urlencode "limit=50"

Réponse#

JSON
{
  "data": [
    {
      "id": "0f8d43a2-6df9-49c8-bf5d-fd2b6ec2d9ee",
      "project_id": "b8acb3ab-1f3d-4a7e-a846-b7f493f86b6d",
      "status": "completed",
      "created_at": "2026-05-07T12:00:00.123456+00:00",
      "started_at": "2026-05-07T12:01:11.482913+00:00",
      "ended_at": "2026-05-07T12:15:41.204+00:00",
      "duration_seconds": 870,
      "country": "DE",
      "overall_sentiment": "mixed",
      "respondent": {
        "label": "alex@acme.com",
        "email": null,
        "identities": [
          { "type": "email", "value": "alex@acme.com", "source": "owner" },
          { "type": "name", "value": "Alex", "source": "ai" }
        ]
      },
      "metadata": {},
      "invite": {
        "id": "3a4f49c7-b8f4-4c44-8f74-fd8e4277c3e4",
        "status": "completed",
        "created_at": "2026-05-07T12:00:00.123456+00:00",
        "opened_at": "2026-05-07T12:01:11.482913+00:00",
        "completed_at": "2026-05-07T12:15:41.204+00:00"
      },
      "summary": {
        "overall_sentiment": "mixed",
        "answers": [
          {
            "question_id": "V1StGXR8_Z5jdHi6B-myT",
            "question": "How did your first week with the product go?",
            "summary": "Setup was quick, but inviting teammates was confusing.",
            "sentiment": "mixed",
            "confidence": "high",
            "quotes": ["I had no idea where the invite button was"]
          }
        ],
        "urgent_issues": [],
        "additional_insights": "Would pay more for a Slack integration."
      }
    }
  ],
  "has_more": true,
  "next_cursor": "WyIyMDI2LTA1LTA3VDEyOjAwOjAwLjEyMzQ1NiswMDowMCIsIjBmOGQ0M2EyIl0"
}

Champs d’une conversation#

ChampTypeDescription
idstringID de la conversation, le même que celui envoyé par les webhooks dans conversation_id
project_idstringLe projet auquel elle appartient
statusstringinvited, opened, started, completed ou cancelled. Le tableau de bord affiche started comme En cours.
created_atstringDate de création de la conversation. Pour les invitations, il s’agit de la date de création de l’invitation.
started_atstring ou nullDate de début de l’entretien
ended_atstring ou nullDate à laquelle la conversation s’est terminée ou a été annulée
duration_secondsnumber ou nullDurée entre le début et la fin
countrystring ou nullLe code pays du répondant, s’il est connu
overall_sentimentstring ou nullpositive, negative, neutral ou mixed. Identique à summary.overall_sentiment.
respondent.labelstring ou nullLe meilleur nom disponible pour le répondant : son e-mail, sinon son nom, sinon une autre identité
respondent.emailstring ou nullChamp hérité, null pour les nouvelles conversations. Lisez les e-mails dans respondent.identities.
respondent.identitiesarrayTout ce que l’on sait du répondant. source vaut owner (vous l’avez fourni), ai (extrait de ses messages) ou system (ajouté par Diaform).
metadataobjectVide pour les invitations et les liens directs. Pour les conversations intégrées, contient des détails sur l’intégration, comme "embed": true et embed_parent_origin.
inviteobject ou nullDétails de l’invitation quand la conversation provient d’une invitation de répondant, sinon null
summaryobject ou nullLe résumé IA. null tant que la conversation n’est pas terminée et que le résumé n’est pas prêt.

Champs du résumé#

ChampTypeDescription
overall_sentimentstringpositive, negative, neutral ou mixed
answersarrayUne entrée par question posée au répondant
answers[].question_idstringL’ID de la question dans le projet
answers[].questionstringLa question telle qu’elle a été posée
answers[].summarystringCourt résumé de la réponse
answers[].sentimentstringpositive, negative, neutral ou mixed
answers[].confidencestringhigh, medium ou low : dans quelle mesure la question a reçu une réponse complète
answers[].quotesarrayCitations marquantes, dans les mots du répondant. Souvent vide.
urgent_issuesarrayProblèmes critiques signalés par le répondant, sous forme de courtes chaînes
additional_insightsstring ou nullFeedback utile qui ne relevait d’aucune question

Obtenir une conversation#

HTTP
GET /api/v1/conversations/{conversation_id}

Renvoie une conversation avec tous les champs de la liste, plus la transcription dans messages.

Exemple#

curl "https://diaform.io/api/v1/conversations/0f8d43a2-6df9-49c8-bf5d-fd2b6ec2d9ee" \
  -H "Authorization: Bearer $DIAFORM_API_KEY"

Réponse#

Les champs communs avec la liste sont abrégés ici.

JSON
{
  "id": "0f8d43a2-6df9-49c8-bf5d-fd2b6ec2d9ee",
  "project_id": "b8acb3ab-1f3d-4a7e-a846-b7f493f86b6d",
  "status": "completed",
  "overall_sentiment": "mixed",
  "summary": {},
  "messages": [
    {
      "role": "interviewer",
      "text": "Hi! Thanks for taking the time. How did your first week with the product go?"
    },
    {
      "role": "respondent",
      "text": "Setup was fast. But I had no idea where the invite button was."
    },
    {
      "role": "interviewer",
      "text": "Where did you expect to find it?"
    }
  ]
}
ChampTypeDescription
messagesarrayLa transcription, dans l’ordre. Vide quand le répondant n’a jamais répondu.
messages[].rolestringinterviewer (l’IA) ou respondent
messages[].textstringCe qui a été dit. Les réponses orales apparaissent sous forme de transcription, et un choix ou une note sous forme de texte, comme Selected answers: Pro.