API de invitaciones a participantes
Las invitaciones a participantes permiten que tus propios sistemas inviten a una entrevista a personas que ya conoces. Crea un enlace personal para un cliente con su correo o su ID de cuenta asociado, envíalo como quieras, y sus respuestas quedan vinculadas a ese cliente desde el principio.
Necesitas un plan Pro, Business o Enterprise y una clave de API. Para las claves y la autenticación, consulta la descripción general de la API.
Para leer los resultados, usa la API de conversaciones: cada conversación incluye su invite y las identidades que asociaste.
Estos endpoints son más antiguos que el resto de la API y conservan sus nombres originales: llaman agente (agentId) al proyecto y usan parámetros en camelCase.
Crear un enlace de invitación#
POST /api/v1/respondent-invitesCada solicitud crea un enlace para un participante en un proyecto. Diaform también crea la conversación al momento y le asocia las identidades que envías, así que los resultados quedan vinculados a esa persona desde el principio.
Cuerpo de la solicitud#
| Campo | Tipo | Obligatorio | Reglas |
|---|---|---|---|
agentId | string | Sí | ID del proyecto (UUID) en la organización de la clave |
identities | array | Sí | De 1 a 10 elementos, uno por tipo. |
identities[].type | string | Sí | Hasta 64 caracteres: letras minúsculas, números, _ y -, empezando por una letra o un número. Las mayúsculas se convierten a minúsculas. |
identities[].value | string | Sí | De 1 a 512 caracteres tras quitar los espacios de los extremos. Un valor email debe ser un correo válido y se guarda en minúsculas. |
organizationId | string | No | Si lo envías, debe coincidir con la organización de la clave |
send_email | boolean | No | true envía el enlace por correo a la identidad email de la invitación y manda un recordatorio a los 3 días si el participante no ha terminado. Valor predeterminado: false. |
Cuando envías send_email, la respuesta incluye un objeto email: { "status": "sent" }, { "status": "failed" } o { "status": "skipped", "reason": "..." }. La invitación se crea en todos los casos. Los motivos son no_email, unsubscribed, not_published, no_usage, monthly_limit (se agotaron los correos de invitación mensuales de tu plan), answered, already_sent, in_progress, plan y not_found. Consulta Identificar a los participantes para ver qué contiene el correo.
Los tipos habituales son email, name, identifier, user_id y account_id. Sirve cualquier tipo que cumpla las reglas.
Ejemplo#
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" }
]
}'Respuesta#
{
"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 | Descripción |
|---|---|
invite.id | ID de la invitación. Los webhooks lo envían como respondent.invite_id. |
invite.status | pending, opened o completed |
invite.conversation_id | La conversación creada para este participante |
invite.identities | Las identidades que enviaste, cada una con source: "owner" |
invite.url | El enlace que debes enviar. Usa tu dominio personalizado verificado si tienes uno. null cuando la invitación está completada. |
Cómo funciona el enlace#
- Creado. La invitación está en
pendingy su conversación eninvited. - Abierto. Cuando el participante abre el enlace, ambas pasan a
opened. La conversación pasa astarteden cuanto responde. - Retomado. Si el participante sale y vuelve con el mismo enlace, continúa la misma conversación.
- Terminado. Cuando termina la conversación, ya sea completada o cancelada, la invitación pasa a
completedy el enlace deja de funcionar.
El proyecto debe estar publicado para que el enlace se abra. Los enlaces funcionan tanto en proyectos con Enlace público como con Solo enlaces de invitación. En los proyectos públicos, el enlace normal también sigue funcionando. Consulta Identificar a los participantes.
Endpoint de conversaciones anterior#
GET /api/v1/respondent-conversationsEste endpoint lista las conversaciones de un proyecto y sigue funcionando, así que las integraciones existentes no tienen que cambiar. Para los desarrollos nuevos, usa Listar conversaciones, que añade filtros, transcripciones y una paginación más sencilla.
| Parámetro | Obligatorio | Descripción |
|---|---|---|
agentId | Sí | ID del proyecto |
limit | No | De 1 a 100. Valor predeterminado: 50. |
status | No | invited, opened, started, completed o cancelled |
cursor | No | nextCursor.created_at de la página anterior |
cursorId | No | nextCursor.id de la página anterior |
Devuelve conversations (cada una con conversation_id, created_at, status, respondent_email, metadata, identities, summary e invite) y nextCursor, un objeto con created_at e id, o null en la última página. Envía esos dos valores de vuelta como cursor y cursorId.
Codifica cursor para URL. Su marca de tiempo contiene un +, que debe enviarse como %2B. Un + sin codificar se lee como un espacio y la solicitud falla con 400. curl --data-urlencode y URLSearchParams lo codifican por ti.
Errores#
Los errores devuelven JSON con un mensaje en error y un code, como en el resto de la API. Un 400 también incluye details.fieldErrors, que indica el campo que falló.
{
"error": "Invalid request",
"code": "invalid_request",
"details": {
"formErrors": [],
"fieldErrors": {
"identities": ["Add at least one respondent identity."]
}
}
}| Estado | code | Causa |
|---|---|---|
400 | invalid_request | Falta un campo o un parámetro de consulta, o no es válido |
401 | unauthorized | Falta la cabecera Authorization, no es Bearer dia_org_live_... o la clave se revocó |
403 | forbidden | Tu organización no tiene un plan Pro, Business o Enterprise, o organizationId no coincide con la clave |
404 | not_found | agentId no es un proyecto de la organización de la clave |
500 | internal_error | Se produjo un error en Diaform. Vuelve a intentarlo. |
Límites#
Estos dos endpoints no tienen límite de solicitudes. Cada invitación admite hasta 10 identidades (una por tipo), y cada organización puede tener hasta 10 claves de API.