API zaproszeń respondentów
Zaproszenia respondentów pozwalają Twoim systemom zapraszać na wywiad konkretne osoby. Utwórz osobisty link dla klienta z dołączonym e-mailem lub ID konta, wyślij go w dowolny sposób, a odpowiedzi będą powiązane z tym klientem od samego początku.
Potrzebujesz planu Pro, Business lub Enterprise i klucza API. O kluczach i uwierzytelnianiu przeczytasz na stronie Przegląd API.
Wyniki odczytasz przez API rozmów: każda rozmowa zawiera swoje invite i dołączone przez Ciebie tożsamości.
Te endpointy są starsze niż reszta API i zachowują pierwotne nazwy: projekt nazywają agentem (agentId) i używają parametrów w camelCase.
Tworzenie linku z zaproszeniem#
POST /api/v1/respondent-invitesKażde żądanie tworzy jeden link dla jednego respondenta w jednym projekcie. Diaform od razu tworzy też rozmowę i dołącza przesłane tożsamości, więc wyniki są powiązane z tą osobą od samego początku.
Treść żądania#
| Pole | Typ | Wymagane | Zasady |
|---|---|---|---|
agentId | string | Tak | ID projektu (UUID) w organizacji klucza |
identities | array | Tak | Od 1 do 10 elementów, po jednym na typ. |
identities[].type | string | Tak | Do 64 znaków: małe litery, cyfry, _ i -, na początku litera lub cyfra. Wielkie litery są zamieniane na małe. |
identities[].value | string | Tak | Od 1 do 512 znaków po usunięciu spacji z początku i końca. Wartość email musi być poprawnym adresem e-mail i jest zapisywana małymi literami. |
organizationId | string | Nie | Jeśli go wyślesz, musi pasować do organizacji klucza |
send_email | boolean | Nie | true wysyła link e-mailem na tożsamość email zaproszenia, a po 3 dniach jedno przypomnienie, jeśli respondent nie skończył rozmowy. Domyślnie false. |
Gdy wyślesz send_email, odpowiedź zawiera obiekt email: { "status": "sent" }, { "status": "failed" } lub { "status": "skipped", "reason": "..." }. Zaproszenie jest tworzone w każdym przypadku. Możliwe powody to no_email, unsubscribed, not_published, no_usage, monthly_limit (miesięczny limit e-maili z zaproszeniami w Twoim planie został wykorzystany), answered, already_sent, in_progress, plan i not_found. O tym, co zawiera e-mail, przeczytasz w artykule Identyfikacja respondentów.
Popularne typy to email, name, identifier, user_id i account_id. Działa każdy typ zgodny z zasadami.
Przykład#
curl -X POST "https://diaform.io/api/v1/respondent-invites" \
-H "Authorization: Bearer $DIAFORM_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"agentId": "b8acb3ab-1f3d-4a7e-a846-b7f493f86b6d",
"identities": [
{ "type": "email", "value": "alex@acme.com" },
{ "type": "account_id", "value": "acct_4821" }
]
}'Odpowiedź#
{
"organization_id": "4d6ecdb4-8543-4adf-ae65-1f24106d5474",
"agent_id": "b8acb3ab-1f3d-4a7e-a846-b7f493f86b6d",
"agent_name": "Onboarding interviews",
"invite": {
"id": "3a4f49c7-b8f4-4c44-8f74-fd8e4277c3e4",
"created_at": "2026-05-07T12:00:00.123456+00:00",
"status": "pending",
"opened_at": null,
"completed_at": null,
"conversation_id": "0f8d43a2-6df9-49c8-bf5d-fd2b6ec2d9ee",
"identities": [
{
"id": "71138f36-d16a-41f8-8a1f-65b9b8d483e3",
"created_at": "2026-05-07T12:00:00.123456+00:00",
"conversation_id": "0f8d43a2-6df9-49c8-bf5d-fd2b6ec2d9ee",
"source": "owner",
"identity_type": "email",
"value": "alex@acme.com",
"metadata": {}
},
{
"id": "120feee2-a10e-4b9a-af8e-a54d4dd672a1",
"created_at": "2026-05-07T12:00:00.123456+00:00",
"conversation_id": "0f8d43a2-6df9-49c8-bf5d-fd2b6ec2d9ee",
"source": "owner",
"identity_type": "account_id",
"value": "acct_4821",
"metadata": {}
}
],
"url": "https://acme.diaform.io/c/b8acb3ab-1f3d-4a7e-a846-b7f493f86b6d?invite=dia_resp_pCaJHykjUYBKZdkbVUtbyZRMC3yFzm246SK2K8lw"
}
}| Pole | Opis |
|---|---|
invite.id | ID zaproszenia. Webhooki wysyłają je jako respondent.invite_id. |
invite.status | pending, opened lub completed |
invite.conversation_id | Rozmowa utworzona dla tego respondenta |
invite.identities | Przesłane przez Ciebie tożsamości, każda z source: "owner" |
invite.url | Link do wysłania. Korzysta z Twojej zweryfikowanej własnej domeny, jeśli ją masz. null po zakończeniu zaproszenia. |
Jak działa link#
- Utworzenie. Zaproszenie ma status
pending, a jego rozmowainvited. - Otwarcie. Gdy respondent otworzy link, oba zmieniają status na
opened. Rozmowa przechodzi nastarted, gdy respondent odpowie. - Wznowienie. Jeśli respondent wyjdzie i wróci przez ten sam link, kontynuuje tę samą rozmowę.
- Zakończenie. Gdy rozmowa się skończy, niezależnie od tego, czy jako zakończona, czy anulowana, zaproszenie przechodzi na
completed, a link przestaje działać.
Żeby link się otworzył, projekt musi być opublikowany. Linki działają w projektach w trybie Link publiczny i Tylko linki z zaproszeniem. W projektach publicznych zwykły link też nadal działa. Zobacz Identyfikacja respondentów.
Starszy endpoint rozmów#
GET /api/v1/respondent-conversationsTen endpoint zwraca listę rozmów w projekcie i nadal działa, więc istniejących integracji nie trzeba zmieniać. W nowych wdrożeniach korzystaj z endpointu Lista rozmów, który dodaje filtry, transkrypcje i prostszą paginację.
| Parametr | Wymagany | Opis |
|---|---|---|
agentId | Tak | ID projektu |
limit | Nie | Od 1 do 100. Domyślnie 50. |
status | Nie | invited, opened, started, completed lub cancelled |
cursor | Nie | nextCursor.created_at z poprzedniej strony |
cursorId | Nie | nextCursor.id z poprzedniej strony |
Zwraca conversations (każda z conversation_id, created_at, status, respondent_email, metadata, identities, summary i invite) oraz nextCursor, czyli obiekt z created_at i id albo null na ostatniej stronie. Odeślij te dwie wartości jako cursor i cursorId.
Zakoduj cursor do postaci URL. Jego znacznik czasu zawiera +, który trzeba wysłać jako %2B. Niezakodowany + jest odczytywany jako spacja i żądanie kończy się błędem 400. curl --data-urlencode i URLSearchParams zakodują go za Ciebie.
Błędy#
Błędy zwracają JSON z komunikatem error i wartością code, tak jak w pozostałej części API. Odpowiedź 400 zawiera też details.fieldErrors, które wskazuje błędne pole.
{
"error": "Invalid request",
"code": "invalid_request",
"details": {
"formErrors": [],
"fieldErrors": {
"identities": ["Add at least one respondent identity."]
}
}
}| Status | code | Przyczyna |
|---|---|---|
400 | invalid_request | Pole lub parametr zapytania nie zostały podane albo są niepoprawne |
401 | unauthorized | Brakuje nagłówka Authorization, nie ma on postaci Bearer dia_org_live_... albo klucz został unieważniony |
403 | forbidden | Twoja organizacja nie ma planu Pro, Business ani Enterprise albo organizationId nie pasuje do klucza |
404 | not_found | agentId nie jest projektem w organizacji klucza |
500 | internal_error | Wystąpił błąd po stronie Diaform. Spróbuj ponownie. |
Limity#
Te dwa endpointy nie mają limitu żądań. Każde zaproszenie przyjmuje do 10 tożsamości (po jednej na typ), a każda organizacja może mieć do 10 kluczy API.