API et MCP

API des projets

Un projet est un intervieweur IA avec ses propres questions. La plupart des autres endpoints ont besoin d’un ID de projet : c’est donc en général le premier appel que vous faites. Pour l’authentification, la pagination et les erreurs, consultez la Vue d’ensemble de l’API.

Lister les projets#

HTTP
GET /api/v1/projects

Renvoie tous les projets de l’organisation de la clé, des plus récents aux plus anciens, publiés ou non. Il ne prend aucun paramètre et renvoie tous les projets sur une seule page.

Exemple#

curl "https://diaform.io/api/v1/projects" \
  -H "Authorization: Bearer $DIAFORM_API_KEY"

Réponse#

JSON
{
  "data": [
    {
      "id": "b8acb3ab-1f3d-4a7e-a846-b7f493f86b6d",
      "name": "Onboarding interviews",
      "product_name": "Acme",
      "published": true,
      "language": "english",
      "respondent_access": "public",
      "url": "https://acme.diaform.io/c/b8acb3ab-1f3d-4a7e-a846-b7f493f86b6d",
      "created_at": "2026-04-02T09:14:31.402057+00:00",
      "published_at": "2026-04-02T09:41:05.471073+00:00"
    }
  ],
  "has_more": false,
  "next_cursor": null
}

Champs d’un projet#

ChampTypeDescription
idstringID du projet
namestring ou nullLe nom du projet tel qu’il apparaît dans le tableau de bord
product_namestring ou nullNom du produit ou du service, dans les paramètres du projet
publishedbooleanIndique si le projet est en ligne
languagestring ou nullLangue de l’entretien, par exemple english
respondent_accessstringpublic (toute personne qui a le lien) ou invite_only
urlstring ou nullLe lien public de conversation. Il utilise votre domaine personnalisé vérifié, si vous en avez un.
created_atstringDate de création du projet
published_atstring ou nullDate de sa dernière publication

Obtenir un projet#

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

Renvoie un projet avec ses questions actuelles et le nombre de ses conversations.

Exemple#

curl "https://diaform.io/api/v1/projects/b8acb3ab-1f3d-4a7e-a846-b7f493f86b6d" \
  -H "Authorization: Bearer $DIAFORM_API_KEY"

Réponse#

JSON
{
  "id": "b8acb3ab-1f3d-4a7e-a846-b7f493f86b6d",
  "name": "Onboarding interviews",
  "product_name": "Acme",
  "published": true,
  "language": "english",
  "respondent_access": "public",
  "url": "https://acme.diaform.io/c/b8acb3ab-1f3d-4a7e-a846-b7f493f86b6d",
  "created_at": "2026-04-02T09:14:31.402057+00:00",
  "published_at": "2026-04-02T09:41:05.471073+00:00",
  "questions": [
    {
      "id": "V1StGXR8_Z5jdHi6B-myT",
      "text": "How did your first week with the product go?",
      "type": "open_text",
      "required": false,
      "options": []
    },
    {
      "id": "tTJUuhijB3m3nvA5horJ6",
      "text": "Which plan are you on?",
      "type": "single_choice",
      "required": true,
      "options": [
        { "id": "fvbfMZcZXZLzZWCa-jXXJ", "label": "Starter" },
        { "id": "nb-XqVVvSICqEQjZ12Mox", "label": "Pro" }
      ]
    }
  ],
  "conversation_counts": {
    "total": 212,
    "completed": 148
  }
}

Il contient tous les champs de la liste, plus :

ChampTypeDescription
questionsarrayLes questions publiées, dans l’ordre
questions[].idstringID de la question. Les résumés de conversation le désignent par question_id.
questions[].textstringLa question telle qu’elle est rédigée
questions[].typestringopen_text, single_choice, multiple_choice, nps, star_rating ou file_upload
questions[].requiredbooleanIndique si la question est obligatoire
questions[].optionsarrayLes choix d’une question à choix, chacun avec id et label. Vide pour les autres types.
conversation_counts.totalnumberConversations qui ont au moins été ouvertes
conversation_counts.completednumberConversations allées jusqu’au bout

Les questions peuvent changer avec le temps. Le résumé d’une conversation conserve la formulation réellement posée au répondant.