API i MCP

API rozmów

Rozmowa to jeden wywiad między AI a jednym respondentem. API zwraca informację, kim jest respondent, podsumowanie AI z jedną odpowiedzią na każde pytanie i pełną transkrypcję. O uwierzytelnianiu, paginacji i błędach przeczytasz na stronie Przegląd API.

Lista rozmów#

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

Zwraca rozmowy w projekcie, od najnowszych, każdą z podsumowaniem AI. Lista nie zawiera transkrypcji. Pobierzesz je w sposób opisany w sekcji Pobieranie rozmowy.

Parametry zapytania#

ParametrOpis
statusJedna lub więcej wartości invited, opened, started, completed, cancelled, rozdzielonych przecinkami. Bez tego parametru zwracane są wszystkie statusy oprócz invited.
sentimentJedna lub więcej wartości positive, negative, neutral, mixed, rozdzielonych przecinkami
created_afterTylko rozmowy utworzone w podanym czasie ISO 8601 lub później, np. 2026-05-01T00:00:00Z
created_beforeTylko rozmowy utworzone w podanym czasie lub wcześniej
searchTekst do wyszukania w podsumowaniach, cytatach i danych respondenta. Do 200 znaków.
limitOd 1 do 100. Domyślnie 25.
cursorWartość next_cursor z poprzedniej strony

Pełne podsumowanie mają tylko zakończone rozmowy, więc większość integracji wysyła status=completed.

Przykład#

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"

Odpowiedź#

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"
}

Pola rozmowy#

PoleTypOpis
idstringID rozmowy, to samo, które webhooki wysyłają jako conversation_id
project_idstringProjekt, do którego należy rozmowa
statusstringinvited, opened, started, completed lub cancelled. Panel pokazuje started jako W toku.
created_atstringKiedy utworzono rozmowę. W przypadku zaproszeń to moment utworzenia zaproszenia.
started_atstring lub nullKiedy zaczął się wywiad
ended_atstring lub nullKiedy rozmowa została zakończona lub anulowana
duration_secondsnumber lub nullCzas od początku do końca
countrystring lub nullKod kraju respondenta, jeśli jest znany
overall_sentimentstring lub nullpositive, negative, neutral lub mixed. To samo co summary.overall_sentiment.
respondent.labelstring lub nullNajlepsze oznaczenie respondenta: e-mail, potem imię i nazwisko, potem inna tożsamość
respondent.emailstring lub nullPrzestarzałe pole, null w nowych rozmowach. Adresy e-mail odczytuj z respondent.identities.
respondent.identitiesarrayWszystko, co wiadomo o respondencie. source to owner (podane przez Ciebie), ai (wyodrębnione z wiadomości respondenta) lub system (dodane przez Diaform).
metadataobjectPuste dla zaproszeń i bezpośrednich linków. W osadzonych rozmowach zawiera szczegóły osadzenia, np. "embed": true i embed_parent_origin.
inviteobject lub nullSzczegóły zaproszenia, gdy rozmowa pochodzi z zaproszenia respondenta, w przeciwnym razie null
summaryobject lub nullPodsumowanie AI. null, dopóki rozmowa się nie zakończy i podsumowanie nie będzie gotowe.

Pola podsumowania#

PoleTypOpis
overall_sentimentstringpositive, negative, neutral lub mixed
answersarrayJeden wpis na każde pytanie zadane respondentowi
answers[].question_idstringID pytania w projekcie
answers[].questionstringPytanie w brzmieniu, w jakim zostało zadane
answers[].summarystringKrótkie podsumowanie odpowiedzi
answers[].sentimentstringpositive, negative, neutral lub mixed
answers[].confidencestringhigh, medium lub low: na ile pełna była odpowiedź na pytanie
answers[].quotesarrayCiekawe cytaty, dosłowne słowa respondenta. Często puste.
urgent_issuesarrayKrytyczne problemy zgłoszone przez respondenta, jako krótkie ciągi znaków
additional_insightsstring lub nullPrzydatne opinie, które nie pasowały do żadnego pytania

Pobieranie rozmowy#

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

Zwraca jedną rozmowę ze wszystkimi polami z listy oraz transkrypcją w messages.

Przykład#

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

Odpowiedź#

Pola wspólne z listą są tu skrócone.

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?"
    }
  ]
}
PoleTypOpis
messagesarrayTranskrypcja po kolei. Pusta, gdy respondent ani razu nie odpowiedział.
messages[].rolestringinterviewer (AI) lub respondent
messages[].textstringTreść wypowiedzi. Odpowiedzi głosowe pojawiają się jako transkrypcja, a wybór lub ocena jako tekst, np. Selected answers: Pro.