Integraciones de API y webhooks
Tiempo de lectura: 12 minutos
Plan requerido: Pro
Las integraciones de API y webhooks de CertLister le permiten conectar sistemas externos — su LMS, su plataforma de RR. HH., Zapier, Make o cualquier aplicación propia — para automatizar los flujos de credenciales. Puede enviar datos hacia adentro (crear credenciales mediante la API REST o webhooks entrantes) y recibir notificaciones cuando algo sucede dentro de CertLister (mediante suscripciones a eventos).
Todo vive en la página de Integraciones en la barra lateral izquierda (icono de enchufe).
Qué incluye
| Función | Qué hace |
|---|---|
| Claves de API | Autentican las solicitudes externas a la API REST de CertLister |
| API REST | Cree, liste, actualice y revoque credenciales de forma programática |
| Webhooks entrantes | Reciba datos de sistemas externos y cree credenciales automáticamente |
| Suscripciones a eventos | Reciba notificaciones (por HTTP POST) cuando las credenciales se emiten, revocan o vencen |
| Conectar | Guías paso a paso para Zapier, Make y ejemplos de código |
Claves de API
Las claves de API permiten a las aplicaciones externas autenticarse con la API REST de CertLister. Cada clave tiene permisos específicos (alcances) que controlan lo que puede hacer.
Crear una clave de API
- Vaya a Integraciones → pestaña Claves de API
- Haga clic en Crear clave de API
- Ingrese un nombre (p. ej., "Producción", "Zapier", "Integración LMS")
- Seleccione los alcances — los permisos que la clave debe tener:
credentials:read— listar y ver credencialescredentials:write— crear, actualizar y revocar credencialescategories:read— listar y ver categoríasdesigns:read— listar y ver diseños guardados
- Opcionalmente configure una expiración (Nunca, 30 días, 90 días o 1 año)
- Haga clic en Crear
Importante: la clave completa se muestra una sola vez tras la creación. Cópiela de inmediato y guárdela de forma segura — no podrá verla de nuevo. CertLister almacena solo un hash de la clave.
Formato de la clave
Las claves de API siguen el formato cl_live_ seguido de 48 caracteres aleatorios. El prefijo cl_live_ facilita identificarlas si aparecen en registros o código.
Gestionar las claves
La tabla de claves de API muestra:
| Columna | Descripción |
|---|---|
| Nombre | La etiqueta que le dio a la clave |
| Clave | Prefijo enmascarado (primeros 16 caracteres) |
| Alcances | Etiquetas de permisos mostrando lo que la clave puede hacer |
| Último uso | Cuándo se usó por última vez |
| Creada | Cuándo se creó |
| Estado | Activa o Revocada |
Para revocar una clave: haga clic en el botón de revocar en la fila y confirme. Las claves revocadas dejan de funcionar de inmediato. Cualquier sistema externo que la use recibirá respuestas 401 Unauthorized.
Para eliminar una clave: después de revocarla, puede eliminarla permanentemente de la lista.
API REST
La API REST le permite gestionar credenciales de forma programática. Todas las solicitudes se autentican con una clave de API.
Autenticación
Incluya su clave de API en el encabezado Authorization:
Authorization: Bearer cl_live_su_clave_de_api
URL base
Todos los puntos de acceso de la API están bajo:
https://app.certlister.com/api/v1/external/
Puntos de acceso disponibles
| Método | Punto de acceso | Alcance requerido | Descripción |
|---|---|---|---|
POST | /external/credentials | credentials:write | Crear una credencial |
GET | /external/credentials | credentials:read | Listar credenciales (paginado) |
GET | /external/credentials/:id | credentials:read | Obtener una credencial por ID o número |
PATCH | /external/credentials/:id | credentials:write | Actualizar campos de una credencial |
POST | /external/credentials/:id/revoke | credentials:write | Revocar una credencial |
GET | /external/categories | categories:read | Listar categorías |
GET | /external/categories/:id | categories:read | Obtener detalles de una categoría |
GET | /external/designs | designs:read | Listar diseños guardados |
GET | /external/designs/:id | designs:read | Obtener detalles de un diseño |
Crear una credencial mediante la API
Envíe una solicitud POST a /external/credentials:
{
"recipient_name": "Jane Smith",
"recipient_email": "jane@example.com",
"title": "AWS Solutions Architect",
"category_id": "uuid-de-su-categoria",
"design_id": "uuid-de-su-diseno",
"issue_date": "2026-06-18",
"expiry_date": "2027-06-18",
"status": "active",
"custom_attributes": {
"course_hours": "40",
"instructor": "John Doe"
},
"send_email": true
}
Solo recipient_name es obligatorio. Los demás campos son opcionales. Si category_id se omite, la credencial va a la categoría predeterminada "Sin categoría".
Establezca send_email: true para enviar automáticamente el correo de emisión al destinatario.
Formato de respuesta
Éxito:
{
"data": { ... },
"meta": { "page": 1, "per_page": 25, "total": 142 }
}
Error:
{
"error": {
"code": "INVALID_SCOPE",
"message": "This API key does not have the credentials:write scope"
}
}
Códigos de error
| Estado | Cuándo |
|---|---|
400 | Error de validación (campos requeridos faltantes, valores inválidos) |
401 | Clave de API inválida, expirada o revocada |
402 | Límite de credenciales del plan alcanzado |
403 | La clave de API carece del alcance requerido |
404 | Recurso no encontrado |
429 | Límite de solicitudes excedido (demasiadas solicitudes) |
Límites de solicitudes
La API externa permite 100 solicitudes por minuto por clave de API. Si excede este límite, recibirá una respuesta 429. Espere y reintente cuando el límite se restablezca.
Ejemplo de código — curl
curl -X POST https://app.certlister.com/api/v1/external/credentials \
-H "Authorization: Bearer cl_live_su_clave_de_api" \
-H "Content-Type: application/json" \
-d '{
"recipient_name": "Jane Smith",
"recipient_email": "jane@example.com",
"title": "Safety Training Certificate",
"category_id": "uuid-de-su-categoria",
"send_email": true
}'
Ejemplo de código — Node.js
const response = await fetch(
"https://app.certlister.com/api/v1/external/credentials",
{
method: "POST",
headers: {
"Authorization": "Bearer cl_live_su_clave_de_api",
"Content-Type": "application/json",
},
body: JSON.stringify({
recipient_name: "Jane Smith",
recipient_email: "jane@example.com",
title: "Safety Training Certificate",
category_id: "uuid-de-su-categoria",
send_email: true,
}),
}
);
const result = await response.json();
console.log(result.data);
Ejemplo de código — Python
import requests
response = requests.post(
"https://app.certlister.com/api/v1/external/credentials",
headers={
"Authorization": "Bearer cl_live_su_clave_de_api",
"Content-Type": "application/json",
},
json={
"recipient_name": "Jane Smith",
"recipient_email": "jane@example.com",
"title": "Safety Training Certificate",
"category_id": "uuid-de-su-categoria",
"send_email": True,
},
)
result = response.json()
print(result["data"])
Webhooks entrantes
Los webhooks entrantes permiten a los sistemas externos enviar datos a CertLister. Cuando CertLister recibe una carga de webhook, puede crear automáticamente una credencial o disparar una automatización de flujo de trabajo.
Crear un punto de acceso de webhook
- Vaya a Integraciones → pestaña Webhooks
- Haga clic en Crear webhook
- Complete los detalles:
- Nombre — una etiqueta descriptiva (p. ej., "Finalización de curso del LMS")
- Modo — elija cómo se comporta el webhook:
- Crear — crea automáticamente una credencial a partir de los datos entrantes
- Disparar — activa una automatización de flujo de trabajo vinculada
- Si es modo Crear:
- Seleccione una categoría para las credenciales nuevas
- Opcionalmente seleccione una plantilla de diseño
- Active Enviar correo para notificar automáticamente a los destinatarios
- Si es modo Disparar:
- Seleccione la automatización a disparar
- Configure los mapeos de campos (modo Crear) — asocie los campos del JSON entrante con los campos de la credencial
- Haga clic en Crear
URL del webhook
Cada punto de acceso recibe una URL única:
https://app.certlister.com/api/v1/hooks/su-token-de-endpoint
Envíe una solicitud POST a esta URL con una carga JSON. CertLister la procesará según sus mapeos de campos y su modo.
Mapeos de campos
Los mapeos de campos indican a CertLister cómo extraer datos de la carga JSON entrante. Asocie las rutas JSON de la izquierda con los campos de credencial de la derecha:
| Campo de la credencial | Requerido | Ruta JSON de ejemplo |
|---|---|---|
recipient_name | Sí | data.student_name |
recipient_email | No | data.email |
title | No | data.course_name |
issue_date | No | data.completion_date |
expiry_date | No | data.expiry |
| Atributos personalizados | No | data.score, data.instructor |
Firma y verificación
Cada punto de acceso de webhook tiene un secreto de firma. Al enviar una carga, puede incluir una firma HMAC-SHA256 en el encabezado X-CertLister-Signature para que CertLister verifique que la solicitud es auténtica:
X-CertLister-Signature: <HMAC-SHA256 del cuerpo crudo de la solicitud usando el secreto de firma>
La firma es opcional — las solicitudes sin firma también se procesan, pero los registros mostrarán una advertencia de "Sin firmar". Para producción, firme siempre sus solicitudes.
Puede revelar, copiar o regenerar el secreto de firma desde la tarjeta del punto de acceso.
Probar un webhook
Haga clic en el botón de Probar en cualquier tarjeta de punto de acceso. CertLister se envía una carga de muestra a sí mismo y le muestra el resultado — si los mapeos de campos funcionan correctamente y si se crearía una credencial.
Registros del webhook
Haga clic en Ver registros en cualquier tarjeta para ver las invocaciones recientes:
| Campo | Descripción |
|---|---|
| Estado | Código de respuesta HTTP (200 = éxito) |
| Marca de tiempo | Cuándo se recibió el webhook |
| Tiempo de procesamiento | Cuánto tomó procesarlo |
| Credencial | Enlace a la credencial creada (si aplica) |
| Error | Mensaje de error (si falló) |
Los registros se retienen para las 1,000 invocaciones más recientes por punto de acceso. Los cuerpos de solicitud se truncan a 10 KB.
Límites de solicitudes
Los webhooks entrantes están limitados a 30 solicitudes por minuto por punto de acceso. Esto previene inundaciones accidentales desde sistemas externos mal configurados.
Suscripciones a eventos
Las suscripciones a eventos le permiten recibir notificaciones cuando algo sucede dentro de CertLister. Usted se suscribe a un tipo de evento y proporciona una URL — CertLister enviará un POST con una carga firmada a su URL cada vez que ese evento se dispare.
Eventos admitidos
| Evento | Cuándo se dispara |
|---|---|
credential.issued | Se crea una credencial nueva (por interfaz, API, webhook o importación CSV) |
credential.revoked | El estado de una credencial cambia a Revocada |
credential.expired | El estado de una credencial pasa a Vencida (mediante el trabajo diario de vencimiento) |
Crear una suscripción
- Vaya a Integraciones → pestaña Suscripciones a eventos
- Haga clic en Crear suscripción
- Seleccione el tipo de evento que quiere escuchar
- Ingrese la URL de destino — el punto de acceso HTTPS que recibirá la carga del evento
- Haga clic en Crear
Un secreto de firma se genera automáticamente y se muestra en la pantalla de éxito. Guárdelo de forma segura — lo necesitará para verificar las cargas entrantes.
Carga del evento
Cuando un evento se dispara, CertLister envía una solicitud POST a su URL de destino con esta carga:
{
"event": "credential.issued",
"occurred_at": "2026-06-19T13:00:00.000Z",
"organization_id": "uuid-de-su-org",
"credential": {
"id": "uuid-de-la-credencial",
"certificate_number": "CERT-20260619-ABC123",
"recipient_name": "Jane Smith",
"recipient_email": "jane@example.com",
"title": "AWS Solutions Architect",
"issue_date": "2026-06-19",
"expiry_date": "2027-06-19",
"status": "active",
"category_id": "uuid-de-la-categoria",
"revocation_reason": null
}
}
Encabezados
Cada entrega incluye estos encabezados:
| Encabezado | Descripción |
|---|---|
Content-Type | application/json |
X-CertLister-Signature | Firma HMAC-SHA256 del cuerpo de la solicitud |
X-CertLister-Event | El tipo de evento (p. ej., credential.issued) |
X-CertLister-Delivery | ID único de este intento de entrega |
Verificar las firmas
Para verificar que una entrega es auténtica, calcule el HMAC-SHA256 del cuerpo crudo de la solicitud con el secreto de firma de su suscripción y compárelo con el encabezado X-CertLister-Signature:
const crypto = require("crypto");
function verifySignature(body, signature, secret) {
const expected = crypto
.createHmac("sha256", secret)
.update(body)
.digest("hex");
return crypto.timingSafeEqual(
Buffer.from(signature),
Buffer.from(expected)
);
}
Entrega y reintentos
CertLister reintenta las entregas fallidas hasta 3 veces con retrasos crecientes (2 segundos, 4 segundos, 8 segundos). Si todos los reintentos fallan, la entrega se registra como fallida.
Probar una suscripción
Haga clic en el botón de Probar en cualquier tarjeta de suscripción. CertLister envía un evento de prueba con datos de credencial ficticios a su URL de destino. El resultado de la entrega se registra para que verifique que su punto de acceso funciona.
Registros de entrega
Haga clic en Ver registros en cualquier tarjeta de suscripción para ver el historial:
| Campo | Descripción |
|---|---|
| Estado | Éxito o Fallida |
| Marca de tiempo | Cuándo se intentó la entrega |
| Evento | El tipo de evento |
| Respuesta | Código de estado HTTP de su punto de acceso |
Los registros siguen la misma política de retención que los de webhooks — las 1,000 entregas más recientes por suscripción.
Límites
Cada organización puede tener hasta 10 suscripciones a eventos. Las URL de destino deben usar HTTPS.
Conectar Zapier
Puede conectar CertLister con Zapier usando el módulo genérico "Webhooks by Zapier". No se necesita una aplicación nativa de Zapier.
Enviar datos de Zapier a CertLister
- En Zapier, cree un nuevo Zap
- Configure su activador (p. ej., "New Row in Google Sheets", "New Form Submission in Typeform")
- Agregue una acción: elija Webhooks by Zapier → POST
- Establezca la URL en su punto de acceso de webhook entrante de CertLister
- Establezca el Payload Type en JSON
- Mapee los campos del activador del Zap a los campos de credencial que su webhook espera
- Pruebe y habilite
Recibir eventos de CertLister en Zapier
- En Zapier, cree un nuevo Zap con el activador: Webhooks by Zapier → Catch Hook
- Copie la URL del webhook de Zapier
- En CertLister, cree una suscripción a eventos con la URL de Zapier como destino
- Haga clic en Probar en la suscripción para enviar un evento de muestra a Zapier
- En Zapier, pruebe el activador — debería captar el evento de muestra
- Agregue las acciones de Zapier que desee (mensaje de Slack, actualizar hoja de cálculo, etc.)
Conectar Make (Integromat)
Enviar datos de Make a CertLister
- En Make, cree un nuevo escenario
- Agregue su módulo activador (p. ej., Google Sheets — Watch New Rows)
- Agregue un módulo HTTP — Make a Request
- Establezca la URL en su punto de acceso de webhook entrante de CertLister
- Establezca el Method en POST
- Establezca el Body Type en JSON
- Mapee sus datos del activador a la estructura JSON esperada
- Ejecute y active el escenario
Recibir eventos de CertLister en Make
- En Make, cree un nuevo escenario con un módulo activador de Custom Webhook
- Copie la URL del webhook de Make
- En CertLister, cree una suscripción a eventos con la URL de Make como destino
- Haga clic en Probar en la suscripción para enviar un evento de muestra
- En Make, haga clic en Run once para capturar el evento de prueba
- Agregue los módulos de acción que desee
Buenas prácticas de seguridad
- Rote las claves de API si sospecha que se comprometieron. Cree una clave nueva, actualice sus integraciones y luego revoque la anterior.
- Use los alcances mínimos necesarios. No le dé a una clave
credentials:writesi solo necesita leer datos. - Configure la expiración de claves para integraciones temporales o herramientas de terceros.
- Verifique siempre las firmas de webhooks en producción para garantizar que las cargas provienen genuinamente de CertLister (o de su fuente de confianza).
- Use HTTPS en todas las URL de destino de las suscripciones a eventos.
- Guarde los secretos de forma segura — nunca suba claves de API ni secretos de firma al control de versiones.
Preguntas frecuentes
P: ¿Necesito el plan Pro para usar la API?
R: Sí. Las claves de API, los webhooks entrantes y las suscripciones a eventos son funciones exclusivas de Pro. Los usuarios de Gratuito y Basic pueden ver la página de Integraciones pero verán una invitación a actualizar a Pro.
P: ¿Puedo tener varias claves de API?
R: Sí. Puede crear tantas claves como necesite — por ejemplo, claves separadas para producción y staging, o claves distintas por integración.
P: ¿Qué pasa si mi clave de API expira?
R: Las solicitudes con una clave expirada recibirán una respuesta 401 Unauthorized. Cree una clave nueva y actualice su integración con las nuevas credenciales de acceso.
P: ¿Puedo usar el mismo punto de acceso de webhook para varios sistemas externos?
R: Técnicamente sí, pero es mejor crear puntos de acceso separados por sistema. Esto le da registros aislados, secretos de firma separados y la posibilidad de deshabilitar uno sin afectar a los demás.
P: ¿Qué pasa si el punto de acceso de mi suscripción a eventos está caído?
R: CertLister reintenta la entrega 3 veces con retrasos crecientes (2 s, 4 s, 8 s). Si todos los reintentos fallan, la entrega se registra como fallida. Puede revisar los registros de entrega para ver qué se perdió y reprocesarlo si es necesario.
P: ¿Hay un límite de credenciales que puedo crear vía API?
R: La API hace cumplir el límite de credenciales de su plan. Si alcanzó el máximo de su plan, la API devuelve una respuesta 402. Actualice su plan o elimine credenciales sin uso para continuar.
P: ¿Puedo usar los webhooks entrantes sin firma HMAC?
R: Sí — la firma es opcional. Las solicitudes sin firmar también se procesan. Sin embargo, para producción recomendamos encarecidamente firmar las solicitudes para verificar su autenticidad. Las solicitudes sin firma muestran una advertencia en los registros.
P: ¿Las suscripciones a eventos pueden disparar automatizaciones de flujo de trabajo?
R: Las suscripciones a eventos y las automatizaciones son sistemas separados. Las suscripciones notifican a sistemas externos, mientras que las automatizaciones ejecutan acciones internas (generar PDF, enviar correo, etc.). Ambas pueden responder a los mismos eventos de forma independiente.