API de convites de respondentes
Os convites de respondentes permitem que seus próprios sistemas convidem pessoas conhecidas para uma entrevista. Crie um link pessoal para um cliente com o e-mail ou o ID da conta dele associado, envie como quiser, e as respostas ficam ligadas a esse cliente desde o início.
Você precisa de um plano Pro, Business ou Enterprise e de uma chave de API. Para chaves e autenticação, veja a visão geral da API.
Para ler os resultados, use a API de conversas: cada conversa traz o invite dela e as identidades que você associou.
Estes endpoints são mais antigos que o restante da API e mantêm os nomes originais: eles chamam o projeto de agente (agentId) e usam parâmetros em camelCase.
Criar um link de convite#
POST /api/v1/respondent-invitesCada requisição cria um link para um respondente em um projeto. O Diaform também cria a conversa na hora e associa as identidades que você envia, então os resultados ficam ligados a essa pessoa desde o início.
Corpo da requisição#
| Campo | Tipo | Obrigatório | Regras |
|---|---|---|---|
agentId | string | Sim | ID do projeto (UUID) na organização da chave |
identities | array | Sim | De 1 a 10 itens, um por tipo. |
identities[].type | string | Sim | Até 64 caracteres: letras minúsculas, números, _ e -, começando com uma letra ou um número. Letras maiúsculas são convertidas para minúsculas. |
identities[].value | string | Sim | De 1 a 512 caracteres depois de remover os espaços das pontas. Um valor email precisa ser um endereço de e-mail válido e é salvo em minúsculas. |
organizationId | string | Não | Se você enviar, precisa corresponder à organização da chave |
send_email | boolean | Não | true envia o link por e-mail para a identidade email do convite e manda um lembrete depois de 3 dias, se o respondente não tiver terminado. Padrão false. |
Quando você envia send_email, a resposta traz um objeto email: { "status": "sent" }, { "status": "failed" } ou { "status": "skipped", "reason": "..." }. O convite é criado em todos os casos. Os motivos são no_email, unsubscribed, not_published, no_usage, monthly_limit (os e-mails de convite mensais do seu plano acabaram), answered, already_sent, in_progress, plan e not_found. Veja Identificar respondentes para saber o que o e-mail contém.
Os tipos comuns são email, name, identifier, user_id e account_id. Qualquer tipo que siga as regras funciona.
Exemplo#
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" }
]
}'Resposta#
{
"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"
}
}| Campo | Descrição |
|---|---|
invite.id | ID do convite. Os webhooks o enviam como respondent.invite_id. |
invite.status | pending, opened ou completed |
invite.conversation_id | A conversa criada para esse respondente |
invite.identities | As identidades que você enviou, cada uma com source: "owner" |
invite.url | O link a enviar. Usa seu domínio próprio verificado, se você tiver um. null depois que o convite é concluído. |
Como o link se comporta#
- Criado. O convite fica
pendinge a conversa dele ficainvited. - Aberto. Quando o respondente abre o link, os dois passam para
opened. A conversa passa parastartedassim que ele responde. - Retomado. Se o respondente sair e voltar pelo mesmo link, ele continua a mesma conversa.
- Encerrado. Quando a conversa termina, seja concluída ou cancelada, o convite passa para
completede o link para de funcionar.
O projeto precisa estar publicado para o link abrir. Os links funcionam em projetos com Link público e com Links só por convite. Em projetos públicos, o link normal também continua funcionando. Veja Identificar respondentes.
Endpoint de conversas mais antigo#
GET /api/v1/respondent-conversationsEste endpoint lista as conversas de um projeto e continua funcionando, então as integrações existentes não precisam mudar. Para trabalhos novos, use Listar conversas, que adiciona filtros, transcrições e uma paginação mais simples.
| Parâmetro | Obrigatório | Descrição |
|---|---|---|
agentId | Sim | ID do projeto |
limit | Não | De 1 a 100. Padrão 50. |
status | Não | invited, opened, started, completed ou cancelled |
cursor | Não | nextCursor.created_at da página anterior |
cursorId | Não | nextCursor.id da página anterior |
Ele retorna conversations (cada uma com conversation_id, created_at, status, respondent_email, metadata, identities, summary e invite) e nextCursor, um objeto com created_at e id, ou null na última página. Envie esses dois valores de volta como cursor e cursorId.
Codifique cursor para URL. O timestamp dele contém um +, que precisa ser enviado como %2B. Um + sem codificação é lido como espaço, e a requisição falha com 400. curl --data-urlencode e URLSearchParams fazem essa codificação para você.
Erros#
Os erros retornam JSON com uma mensagem em error e um code, como no restante da API. Um 400 também inclui details.fieldErrors, que indica o campo que falhou.
{
"error": "Invalid request",
"code": "invalid_request",
"details": {
"formErrors": [],
"fieldErrors": {
"identities": ["Add at least one respondent identity."]
}
}
}| Status | code | Causa |
|---|---|---|
400 | invalid_request | Um campo ou parâmetro de consulta está ausente ou é inválido |
401 | unauthorized | O cabeçalho Authorization está ausente, não é Bearer dia_org_live_... ou a chave foi revogada |
403 | forbidden | Sua organização não está no plano Pro, Business ou Enterprise, ou organizationId não corresponde à chave |
404 | not_found | agentId não é um projeto da organização da chave |
500 | internal_error | Ocorreu um erro no Diaform. Tente de novo. |
Limites#
Estes dois endpoints não têm limite de requisições. Cada convite aceita até 10 identidades (uma por tipo), e cada organização pode ter até 10 chaves de API.