Invitations & Signing Lifecycle
Los endpoints de Invitations te permiten enviar invitaciones de firma a los participantes de un documento. Cada invitación crea una sesión de firmante (guest session) con un link único y seguro, y puede entregarse por email, WhatsApp, o ambos.
Antes de enviar una invitación, el participante debe existir como firmante en el documento. Usa el endpoint de crear documento con participants o agrega firmantes por separado.
Choosing your signing flow
AllSign soporta tres flujos de firma dependiendo de tu caso de uso. Los endpoints de esta página (start-signing, invite, invite-bulk) son opcionales si utilizas el flujo de una sola llamada.
Flujo 1: Una sola llamada (recomendado para APIs)
Crea el documento con todo incluido en POST /v2/documents. El backend se encarga de todo: créditos, invitaciones, y avanzar el status.
POST /v2/documents — Todo en una llamada
{
"document": { "base64Content": "...", "name": "contrato.pdf" },
"participants": [
{ "email": "firmante@empresa.com", "name": "Juan" }
],
"signatureValidation": {
"autografa": true,
"videofirma": true,
"id_scan": true
},
"config": {
"startAtStep": 3,
"sendInvitations": true
}
}
¿Cuándo usar este flujo? Si ya tienes toda la información (quién firma, qué verificaciones usar, el PDF) al momento de crear el documento. Ideal para integraciones backend-to-backend, automatizaciones, y flujos donde el usuario no necesita interactuar paso a paso.
Flujo 2: Paso a paso (dashboard)
Crea el documento sin participantes ni invitaciones, y luego configura cada parte con llamadas separadas:
| Paso | Descripción | Endpoint |
|---|---|---|
| 1 | Subir el PDF | POST /v2/documents con startAtStep: 1 |
| 2 | Agregar firmantes y seleccionar tipo de firma | PATCH /v2/documents/{id} con signatureValidation |
| 3 | Avanzar a configuración de sellos | PATCH /v2/documents/{id} con status: "SELLOS_PDF" |
| 4 | Configurar verificaciones (videofirma, ID, etc.) | PATCH /v2/documents/{id} con signatureValidation |
| 5 | Enviar invitaciones | POST /v2/documents/{id}/invite-bulk |
¿Cuándo usar este flujo? Cuando el usuario necesita configurar el documento interactivamente (como en el dashboard de AllSign). Cada paso se puede ajustar antes de enviar las invitaciones.
Flujo 3: Auto-firma (owner es el único firmante)
Si el creador del documento es el único firmante, no se envían invitaciones — solo se avanza el status:
| Paso | Descripción | Endpoint |
|---|---|---|
| 1-4 | Igual que el flujo paso a paso | — |
| 5 | Iniciar firma (cobra créditos, avanza status) | POST /v2/documents/{id}/start-signing |
start-signing vs invite-bulk: Ambos avanzan el documento a ESPERANDO_FIRMAS y cobran créditos. La diferencia es que invite-bulk además crea guest sessions y envía notificaciones. Si el owner es el único firmante, usa start-signing.
Comparación rápida
| Una sola llamada | Paso a paso | Auto-firma | |
|---|---|---|---|
| Llamadas a la API | 1 | 3-5 | 3-5 |
start-signing necesario | ❌ | ❌ | ✅ |
invite / invite-bulk necesario | ❌ | ✅ | ❌ |
| Configuración interactiva | ❌ | ✅ | ✅ |
| Caso de uso típico | Backend-to-backend, automatización | Dashboard, UI interactiva | Firma personal del owner |
Validación de email
Los endpoints v2 implementan dos capas de validación para correos electrónicos. Ambas se ejecutan automáticamente — no necesitas hacer nada desde tu lado más que manejar las respuestas de error.
Capa 1: Validación de formato (schema)
La primera capa verifica que el email tenga un formato válido antes de procesar la petición. Esto se aplica a todos los campos de email en el request (participant.email, config.invitedByEmail, etc.).
Qué valida:
- Que el campo no esté vacío ni contenga solo espacios
- Que el formato cumpla
usuario@dominio.extensión - Trim y lowercase automático (ej.
" Juan@Gmail.COM "→"juan@gmail.com")
Si el formato es inválido, la API retorna 422 inmediatamente sin procesar nada más:
Error de formato (422)
{
"error": {
"code": "E1200",
"type": "validation_error",
"message": "Invalid email format: 'correo-sin-arroba'. Expected format: user@example.com",
"field": "participant.email"
}
}
Emails vacíos también son rechazados:
Error de email vacío (422)
{
"error": {
"code": "E1200",
"type": "validation_error",
"message": "Email address cannot be empty.",
"field": "participant.email"
}
}
Capa 2: Validación de entregabilidad (SendGrid)
Si el formato es correcto, la segunda capa verifica que el buzón realmente exista usando la API de SendGrid Email Validation. Esta validación ocurre justo antes de enviar el correo.
| Veredicto | Acción | Descripción |
|---|---|---|
| Valid | ✅ Email enviado | La dirección es válida y puede recibir correos. |
| Risky | ⚠️ Email enviado (con advertencia) | Dirección sospechosa (desechable, bounces previos, role-based). Se envía de todas formas. |
| Invalid | ❌ Email bloqueado | La dirección no existe, dominio sin registros MX o es desechable. Se retorna un error. |
| Skipped | ✅ Email enviado | La validación no se ejecutó (API key no configurada o error en el servicio). Se envía normalmente (fail-open). |
Cuando la validación detecta un email inválido, la invitación falla con un mensaje descriptivo:
Error de entregabilidad — single invite (422)
{
"error": {
"code": "E1200",
"type": "validation_error",
"message": "Email 'usuario@dominio-invalido.xyz' is invalid: domain cannot receive email (no MX records)",
"field": "participant.email"
}
}
Error de entregabilidad — bulk invite (422)
{
"error": {
"code": "E1200",
"type": "validation_error",
"message": "Invalid email addresses: ghost@dead.xyz: domain cannot receive email (no MX records)",
"field": "participants[].email"
}
}
Códigos de error
Todos los errores v2 usan el formato estándar con código numérico E1XXX. Usa error.code para manejo programático:
| Código | HTTP Status | Descripción |
|---|---|---|
E1200 | 422 | Validation error — formato de email incorrecto o email no entregable |
E1300 | 404 | Not found — recurso no encontrado |
E1400 | 402 | Payment required — créditos insuficientes |
E1700 | 400 | Bad request — firmante no encontrado en el documento, u otro error lógico |
El campo error.field indica qué campo del request causó el error (ej. "participant.email", "participants[].email").
Flujo completo
Request con email " " → 422 E1200 (Capa 1: formato vacío)
Request con email "invalido" → 422 E1200 (Capa 1: formato malo)
Request con email "user@fake-domain.xyz" → 422 E1200 (Capa 2: dominio sin MX)
Request con email "user@gmail.com" → ✅ (Ambas capas pasan)
La validación aplica a todos los endpoints que envían email: invitaciones de firma, Onboarding (POST /v2/onboarding/sessions), e invitaciones de equipo. La Capa 2 (SendGrid) opera en modo fail-open: si el servicio no está disponible, el correo se envía de todas formas.
Start signing
Avanza el documento de la fase de configuración (RECOLECTANDO_FIRMANTES o SELLOS_PDF) a ESPERANDO_FIRMAS, desbloqueando la firma para los participantes.
Este endpoint es idempotente — si el documento ya está en ESPERANDO_FIRMAS o en un estado posterior, retorna 200 sin hacer cambios.
¿Necesitas este endpoint? Si creas documentos con POST /v2/documents usando sendInvitations: true y startAtStep: 3, no necesitas llamar a start-signing — el flujo completo se ejecuta en una sola llamada. Ver choosing your signing flow.
Si usas el flujo paso a paso, invite e invite-bulk también llaman a start-signing internamente, así que tampoco necesitas llamarlo por separado.
Usa start-signing directamente solo cuando:
- El firmante es el propio creador del documento (auto-firma)
- Manejas tus propias notificaciones por otro canal y solo necesitas desbloquear la firma
Path parameters
- Name
document_id- Type
- string
- Description
ID único del documento (UUID).
Request
curl -X POST "https://api.allsign.io/v2/documents/DOC_UUID/start-signing" \
-H "Authorization: Bearer ALLSIGN_LIVE_SK"
Response (200) — status advanced
{
"success": true,
"message": "Status advanced from RECOLECTANDO_FIRMANTES to ESPERANDO_FIRMAS",
"previousStatus": "RECOLECTANDO_FIRMANTES",
"currentStatus": "ESPERANDO_FIRMAS"
}
Response (200) — already started (idempotent)
{
"success": true,
"message": "Already in ESPERANDO_FIRMAS, no change needed",
"previousStatus": "ESPERANDO_FIRMAS",
"currentStatus": "ESPERANDO_FIRMAS"
}
Invite participant
Envía una invitación de firma a un solo participante. Crea una sesión de firmante (GuestSession) con un token seguro y envía el link de firma por email y/o WhatsApp.
Path parameters
- Name
document_id- Type
- string
- Description
ID único del documento (UUID).
Request body
- Name
participant- Type
- object
- Description
Datos del participante a invitar.
- Name
participant.email- Type
- string
- Description
Email del firmante. Se valida automáticamente antes de enviar.
- Name
participant.name- Type
- string
- Description
Nombre del firmante.
- Name
participant.whatsapp- Type
- string
- Description
Número de WhatsApp con código de país (ej.
+525512345678).
- Name
config- Type
- object
- Description
Configuración de entrega.
- Name
config.sendInvitationByEmail- Type
- boolean
- Description
Enviar invitación por email (default:
false).
- Name
config.sendInvitationByWhatsapp- Type
- boolean
- Description
Enviar invitación por WhatsApp (default:
false).
- Name
config.invitedByEmail- Type
- string
- Description
Email de quien invita (se usa como remitente visible).
- Name
config.invitedByName- Type
- string
- Description
Nombre de quien invita.
Request
curl -X POST "https://api.allsign.io/v2/documents/DOC_UUID/invite" \
-H "Authorization: Bearer ALLSIGN_LIVE_SK" \
-H "Content-Type: application/json" \
-d '{
"participant": {
"email": "firmante@empresa.com",
"name": "Juan Pérez"
},
"config": {
"sendInvitationByEmail": true,
"invitedByEmail": "admin@empresa.com",
"invitedByName": "María López"
}
}'
Response (200)
{
"success": true,
"message": "Invitation sent successfully",
"sentCount": 1,
"failedCount": 0,
"details": [
{
"participant": "firmante@empresa.com",
"success": true,
"guestLink": "https://app.allsign.io/firmar/abc123..."
}
]
}
Invite bulk
Envía invitaciones de firma a múltiples participantes en una sola llamada. Cada participante recibe su propia GuestSession y link único.
Path parameters
- Name
document_id- Type
- string
- Description
ID único del documento (UUID).
Request body
- Name
participants- Type
- array
- Description
Lista de participantes a invitar (mínimo 1).
- Name
config- Type
- object
- Description
Configuración de entrega compartida para todos los participantes.
Request
curl -X POST "https://api.allsign.io/v2/documents/DOC_UUID/invite-bulk" \
-H "Authorization: Bearer ALLSIGN_LIVE_SK" \
-H "Content-Type: application/json" \
-d '{
"participants": [
{ "email": "firmante1@empresa.com", "name": "Ana García" },
{ "email": "firmante2@empresa.com", "name": "Carlos Ruiz" }
],
"config": {
"sendInvitationByEmail": true,
"sendInvitationByWhatsapp": false,
"invitedByEmail": "admin@empresa.com"
}
}'
Response (200)
{
"success": true,
"message": "Processed 2 invitations. Sent: 2, Failed: 0",
"sentCount": 2,
"failedCount": 0,
"details": [
{
"participant": "firmante1@empresa.com",
"success": true,
"guestLink": "https://app.allsign.io/firmar/token1..."
},
{
"participant": "firmante2@empresa.com",
"success": true,
"guestLink": "https://app.allsign.io/firmar/token2..."
}
]
}

