nomiDocumentación
SoporteVolver al sitio
  • Primeros pasos

    • Introducción
    • Qué es Nomi
    • Inicio rápido
    • Conceptos
    • Autenticación
  • Credenciales

    • Crear una credencial
    • Emitir una credencial
    • Ciclo de vida
    • Revocar una credencial
    • Verificar una credencial
    • Verificación por QR
  • Distribución

    • Apple Wallet
    • Google Wallet
    • Correo
    • Entrega de credenciales
    • Emisión masiva
  • API

    • Panorama del API
    • Autenticación
    • API de credenciales
    • Destinatarios
    • Verificación
    • Revocación
    • Webhooks
    • Errores
  • Integraciones

    • Moodle
    • WordPress
    • API REST
    • Webhooks
  • Seguridad

    • Autenticación
    • Llaves de API
    • Seguridad de webhooks
    • Protección de datos
    • Buenas prácticas
  • Recursos

    • Preguntas frecuentes
    • Glosario
    • Cambios
  1. Documentación
  2. /
  3. API
  4. /
  5. Webhooks

Webhooks

Registrar un endpoint, comprobar la firma, y todos los tipos de evento que emite la plataforma.

Los webhooks son la bitácora de eventos, entregada a una dirección tuya, firmada para que tu servicio pueda probar que vino de Nomi, y reintentada cuando tu servicio tiene una mala tarde.

POST/v1/webhook_endpoints

Registra una dirección. El secreto de firma se devuelve una sola vez, aquí.

Registrar

curl -X POST https://api.nomi-tech.com/v1/webhook_endpoints \
  -H "Authorization: Bearer nomi_sk_live_EXAMPLE" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://your-app.example/hooks/nomi",
    "description": "Production listener",
    "eventTypes": ["credential.*"]
  }'

Un eventTypes vacío significa todos los eventos. credential.* calza con una familia entera, así que un tipo nuevo no obliga a volver a listarlos.

Comprobar la firma

Cada entrega lleva un encabezado nomi-signature con la forma t=<segundos unix>,v1=<hex>. v1 es un HMAC-SHA256 sobre ${t}.${rawBody} con el secreto del endpoint. La marca de tiempo va dentro del HMAC, así que una firma válida no se puede repetir para siempre.

Un verificador

import { createHmac, timingSafeEqual } from "node:crypto";

export function verify(rawBody: string, header: string, secret: string) {
  const parts = new Map(
    header.split(",").map((p) => {
      const [k, ...rest] = p.trim().split("=");
      return [k, rest.join("=")] as const;
    }),
  );

  const t = parts.get("t");
  const v1 = parts.get("v1");
  if (!t || !v1) return false;

  const expected = createHmac("sha256", secret).update(`${t}.${rawBody}`).digest("hex");

  const given = Buffer.from(v1, "hex");
  const mine = Buffer.from(expected, "hex");
  if (given.length !== mine.length || !timingSafeEqual(given, mine)) return false;

  // Frescura. La firma prueba el origen; la marca de tiempo prueba que no es una repetición.
  return Math.abs(Date.now() / 1000 - Number(t)) <= 300;
}
Comprueba el cuerpo crudo, antes de interpretarlo. Volver a serializar JSON reordena llaves y cambia espacios, y un receptor que primero interpreta va a fallar con una firma perfectamente correcta.

Tipos de evento

GET /v1/webhook_event_types devuelve la lista a la que tu cuenta se puede suscribir, que es contra la que hay que programar. Las familias de abajo son las que normalmente quiere una integración:

FamiliaTipos
credential.*created, issued, updated, suspended, resumed, revoked, expired, verified, verify_refused, shared, viewed
credential.channel.*provisioned, installed, removed, failed
subject.*created, updated, deactivated, deleted
template.version.*published, archived, unarchived
achievement.*created, updated, version.published, version.archived
policy.*applied, halted, failed
group.*created, updated, deleted, members_added, members_removed
webhook.endpoint.*created, updated, deleted, disabled

Entrega y fallo

Una entrega que tu servicio no acepta se reintenta, así que una tarde caído no se convierte en un día de eventos perdidos. Lo que a ti te toca está en esta página y en Seguridad de webhooks: comprobar la firma, contestar rápido y hacer idempotente el manejador, porque un reintento significa que vas a ver el mismo evento dos veces.

La mitad operativa —mirar qué se intentó, volver a mandar uno después de arreglar algo, mandar una entrega de prueba y rotar el secreto de firma— se hace desde la consola, y la hace quien administra la organización. Nada de eso necesita un despliegue de tu lado.

Un endpoint que falla una y otra vez termina desactivado, y eso emite webhook.endpoint.disabled — así el silencio es algo de lo que te avisan y no algo que descubres.

Seguridad de webhooks

El lado de quien escucha.

Errores

Cuando una llamada sale mal.

AnteriorRevocaciónSiguienteErrores

¿Sigues atascado?

Si esta página no te lo resolvió, el centro de ayuda tiene el lado operativo de la misma pregunta — y lo que escribas ahí lo lee una persona.

Ir al centro de ayuda →

En esta página

  • Comprobar la firma
  • Tipos de evento
  • Entrega y fallo
nomi

Infraestructura de credenciales digitales. Crea, emite y administra credenciales desde los sistemas que ya usas.

Operado por

País y moneda

Plataforma

  • Cómo funciona
  • Plantillas
  • Ciclo de vida
  • Desarrolladores
  • Precios
  • Preguntas frecuentes
  • Nomi Academic

Credenciales

  • Membresías
  • Carnés de empleado
  • Carnés estudiantiles
  • Eventos y lealtad

Desarrolladores

  • Documentación
  • Inicio rápido
  • Referencia del API
  • Webhooks
  • Integraciones

Soporte

  • Centro de ayuda
  • Apple y Google Wallet
  • Verificación
  • Contactar a soporte

Empresa

  • Solicitar una demo
  • Hablar con Nomi
  • Legal
  • Codingraph
PrivacidadTérminosCookiesSeguridadContacto

© 2026 Codingraph S.A. Todos los derechos reservados.

Nomi is a registered trademark used by Codingraph S.A. under licence.

Se factura en CRC

Apple Wallet y Google Wallet son marcas de sus respectivos dueños.