Referencia de eventos de webhook
Estructuras de payload, encabezados y definiciones de campos para cada evento de webhook.
Por qué es importante
Cada entrega de webhook encapsula los datos específicos del evento en la misma envoltura. Esta referencia documenta la estructura exacta del payload para cada evento para que puedas analizarlos y actuar sobre ellos con confianza.
Envoltura del payload
{
"event": "application.submitted",
"created_at": "2025-01-15T14:30:00Z",
"data": { }
}
| Campo | Tipo | Descripción |
|---|---|---|
event |
string | El tipo de evento que activó esta entrega |
created_at |
string | Marca de tiempo ISO 8601 de cuándo ocurrió el evento |
data |
object | Payload específico del evento (varía según el tipo de evento) |
Encabezados de solicitud
Cada solicitud de webhook incluye estos encabezados:
| Encabezado | Ejemplo | Descripción |
|---|---|---|
Content-Type |
application/json |
Siempre JSON |
X-Webhook-Event |
application.submitted |
El tipo de evento |
X-Webhook-Signature |
a1b2c3d4... |
Digest hexadecimal HMAC-SHA256 |
X-Webhook-Timestamp |
2025-01-15T14:30:00Z |
Marca de tiempo ISO 8601 usada en la firma |
User-Agent |
Kit-Webhooks/1.0 |
Identifica a Kit como el emisor |
Consulta Seguridad y entrega de webhooks para ver los detalles de verificación de firmas.
Eventos de candidatura
Eventos: application.submitted, application.rejected, application.advanced, application.withdrawn, application.offer_extended
{
"event": "application.submitted",
"created_at": "2025-01-15T14:30:00Z",
"data": {
"id": 42,
"candidate": {
"id": 7,
"name": "Jane Smith",
"email": "[email protected]"
},
"job_posting": {
"id": 3,
"title": "Senior Engineer"
},
"current_stage": "Applied",
"submitted_at": "2025-01-15T14:30:00Z",
"rejected": false,
"withdrawn": false,
"offered": false
}
}
| Campo | Tipo | Descripción |
|---|---|---|
id |
integer | ID de la candidatura |
candidate.id |
integer | ID del candidato |
candidate.name |
string | Nombre completo del candidato |
candidate.email |
string | Dirección de email del candidato |
job_posting.id |
integer | ID de la oferta de empleo |
job_posting.title |
string | Título de la oferta de empleo |
current_stage |
string | Nombre de la etapa actual del pipeline |
submitted_at |
string | null | Marca de tiempo ISO 8601 del envío |
rejected |
boolean | Si la candidatura ha sido rechazada |
withdrawn |
boolean | Si el candidato se ha retirado |
offered |
boolean | Si se ha extendido una oferta |
Eventos de oferta
Eventos: offer.accepted, offer.declined, offer.candidate_accepted, offer.candidate_declined, offer.revised
offer.accepted/offer.declined– se dispara cuando un administrador acepta o rechaza una ofertaoffer.candidate_accepted/offer.candidate_declined– se dispara cuando un candidato responde a una ofertaoffer.revised– se dispara cuando un administrador revisa la oferta con nuevas condiciones
{
"event": "offer.candidate_accepted",
"created_at": "2025-01-20T10:00:00Z",
"data": {
"id": 15,
"status": "candidate_accepted",
"details": "Senior Engineer — $150k base",
"extended_at": "2025-01-18T09:00:00Z",
"expires_at": "2025-01-25T23:59:59Z",
"accepted_at": null,
"declined_at": null,
"candidate": {
"id": 7,
"name": "Jane Smith",
"email": "[email protected]"
},
"job_posting": {
"id": 3,
"title": "Senior Engineer"
}
}
}
| Campo | Tipo | Descripción |
|---|---|---|
id |
integer | ID de la oferta |
status |
string | Uno de: pending, accepted, declined, candidate_accepted, candidate_declined, expired |
details |
string | null | Texto de los detalles de la oferta |
extended_at |
string | null | Cuándo se extendió la oferta |
expires_at |
string | null | Cuándo expira la oferta |
accepted_at |
string | null | Cuándo un administrador aceptó la oferta |
declined_at |
string | null | Cuándo un administrador rechazó la oferta |
candidate |
object | Detalles del candidato (misma estructura que en los eventos de candidatura) |
job_posting |
object | Detalles de la oferta de empleo (misma estructura que en los eventos de candidatura) |
Eventos de entrevista
Eventos: interview.scheduled, interview.confirmed, interview.completed, interview.cancelled, interview.no_show
{
"event": "interview.scheduled",
"created_at": "2025-01-16T09:00:00Z",
"data": {
"id": 28,
"status": "scheduled",
"scheduled_at": "2025-01-20T14:00:00Z",
"duration_minutes": 60,
"candidate": {
"id": 7,
"name": "Jane Smith",
"email": "[email protected]"
},
"job_posting": {
"id": 3,
"title": "Senior Engineer"
}
}
}
| Campo | Tipo | Descripción |
|---|---|---|
id |
integer | ID de la entrevista |
status |
string | Estado de la entrevista (scheduled, confirmed, completed, cancelled, no_show) |
scheduled_at |
string | null | Marca de tiempo ISO 8601 de la hora programada |
duration_minutes |
integer | Duración de la entrevista en minutos |
candidate |
object | Detalles del candidato |
job_posting |
object | Detalles de la oferta de empleo |
Eventos de ejercicio de código
Eventos: code_assignment.submitted, code_assignment.auto_submitted
{
"event": "code_assignment.submitted",
"created_at": "2025-01-22T16:45:00Z",
"data": {
"id": 11,
"repo_url": "https://github.com/org/assignment-jane-smith",
"submitted_at": "2025-01-22T16:45:00Z",
"deadline_at": "2025-01-25T23:59:59Z",
"candidate": {
"id": 7,
"name": "Jane Smith",
"email": "[email protected]"
},
"job_posting": {
"id": 3,
"title": "Senior Engineer"
}
}
}
| Campo | Tipo | Descripción |
|---|---|---|
id |
integer | ID del envío de código |
repo_url |
string | URL del repositorio de GitHub |
submitted_at |
string | null | Cuándo se envió el ejercicio |
deadline_at |
string | null | Fecha límite del ejercicio |
candidate |
object | Detalles del candidato |
job_posting |
object | Detalles de la oferta de empleo |
Eventos de evaluación
Eventos: review.submitted
{
"event": "review.submitted",
"created_at": "2025-01-23T11:00:00Z",
"data": {
"id": 9,
"recommendation": "strong_yes",
"reviewer": "Alex Johnson",
"candidate": {
"id": 7,
"name": "Jane Smith",
"email": "[email protected]"
},
"job_posting": {
"id": 3,
"title": "Senior Engineer"
},
"stage": "Technical Interview"
}
}
| Campo | Tipo | Descripción |
|---|---|---|
id |
integer | ID de la evaluación |
recommendation |
string | Recomendación del evaluador |
reviewer |
string | Nombre del evaluador |
candidate |
object | Detalles del candidato |
job_posting |
object | Detalles de la oferta de empleo |
stage |
string | Nombre de la etapa del pipeline donde se envió la evaluación |
Eventos de oferta de empleo
Eventos: job_posting.published, job_posting.paused, job_posting.closed, job_posting.reopened
{
"event": "job_posting.published",
"created_at": "2025-01-10T08:00:00Z",
"data": {
"id": 3,
"title": "Senior Engineer",
"status": "published",
"location": "Remote",
"department": "Engineering",
"employment_type": "Full-time",
"published_at": "2025-01-10T08:00:00Z",
"closed_at": null,
"public_url": "https://careers.example.com/senior-engineer"
}
}
| Campo | Tipo | Descripción |
|---|---|---|
id |
integer | ID de la oferta de empleo |
title |
string | Título del puesto |
status |
string | Estado actual (published, paused, closed) |
location |
string | Ubicación del puesto |
department |
string | Nombre del departamento |
employment_type |
string | Tipo de empleo (Full-time, Part-time, Contract, etc.) |
published_at |
string | null | Cuándo se publicó la oferta |
closed_at |
string | null | Cuándo se cerró la oferta |
public_url |
string | URL pública del portal de empleo para esta oferta |
Eventos de Outreach
Eventos: outreach.prospect.drafted, outreach.message.approved, outreach.message.sent, outreach.message.bounced, outreach.message.failed
Estos eventos requieren el complemento Outreach.
outreach.prospect.drafted
Se dispara cuando la IA termina de investigar a un prospecto y redactar un email.
{
"event": "outreach.prospect.drafted",
"created_at": "2026-03-12T10:00:00Z",
"data": {
"id": "op_abc123",
"campaign_id": "oc_def456",
"company_name": "Acme Corp",
"display_name": "Jane Smith",
"status": "drafted"
}
}
| Campo | Tipo | Descripción |
|---|---|---|
id |
string | ID con prefijo del prospecto |
campaign_id |
string | ID con prefijo de la campaña |
company_name |
string | Nombre de la empresa del prospecto |
display_name |
string | Nombre visible del prospecto |
status |
string | Estado del prospecto en el momento del evento |
Nota: El email del prospecto se excluye de los payloads de webhook (cifrado en reposo).
outreach.message.approved / sent / bounced / failed
Se dispara cuando un mensaje pasa al estado approved, sent, bounced o failed.
{
"event": "outreach.message.sent",
"created_at": "2026-03-12T10:15:00Z",
"data": {
"id": "om_ghi789",
"campaign_id": "oc_def456",
"prospect_id": "op_abc123",
"step_number": 1,
"subject": "Quick question about Acme's hiring workflow",
"status": "sent",
"sent_at": "2026-03-12T10:15:00Z",
"approved_at": "2026-03-12T09:30:00Z",
"retry_count": 0,
"last_error_code": null
}
}
| Campo | Tipo | Descripción |
|---|---|---|
id |
string | ID con prefijo del mensaje |
campaign_id |
string | ID con prefijo de la campaña |
prospect_id |
string | ID con prefijo del prospecto |
step_number |
integer | Número del paso en la secuencia (1 = inicial, 2+ = seguimientos) |
subject |
string | Asunto del email |
status |
string | Uno de: approved, sent, bounced, failed |
sent_at |
string | null | Cuándo se envió el email |
approved_at |
string | null | Cuándo se aprobó el borrador |
retry_count |
integer | Número de reintentos de envío realizados |
last_error_code |
string | null | Código de error SMTP (presente en bounced/failed) |
Nota: El cuerpo del email del mensaje se excluye de los payloads de webhook (cifrado en reposo).
Eventos de prueba
Eventos: test.ping
El evento test.ping se envía cuando haces clic en Send Test Ping en la configuración del webhook. Úsalo para verificar la conectividad del endpoint y la validación de firmas.
{
"event": "test.ping",
"created_at": "2025-01-15T14:30:00Z",
"data": {}
}