Saltar al contenido principal

Webhooks y automatización

Eventos de InTransparency en cualquier herramienta

Cinco eventos firmados con HMAC-SHA256, entregados a tu endpoint HTTPS. Funcionan hoy con Zapier, Make, n8n o cualquier receptor personalizado.

Eventos disponibles

match.created

Una búsqueda de talento que lanzaste devolvió este candidato: un evento por cada candidato de los resultados. El candidato se identifica solo con un seudónimo y el nombre seguido de la inicial del apellido, nunca con el apellido completo ni con el email.

Llega a las suscripciones webhook del reclutador que lanzó la búsqueda

data: { matchId, candidateId, candidatePseudonym, candidateName, matchScore, decisionLabel, jobId, url }

credential.issued

Se emitió una credencial firmada (W3C Verifiable Credential) para un proyecto, unas prácticas completadas o la evaluación de un profesor.

Llega a las suscripciones webhook del propio estudiante

data: { credentialId, credentialType, issuerName, issuedAt }

credential.revoked

Una credencial emitida anteriormente fue revocada; el evento indica el motivo.

Llega a las suscripciones webhook del propio estudiante

data: { credentialId, credentialType, revokedAt, reason }

stage.completed

El tutor de la empresa envió la evaluación final de unas prácticas.

Llega a las suscripciones webhook del propio estudiante

data: { stageExperienceId, placementId, companyName, completedAt }

exchange.completed

La universidad de acogida marcó un intercambio como completado.

Llega a las suscripciones webhook del propio estudiante

data: { exchangeEnrollmentId, completedAt }

  1. 1. Crea la subscription

    Necesitas una clave API (gratuita, desde tu workspace). La subscription acepta cualquier URL HTTPS — incluido un Catch Hook de Zapier o un Custom Webhook de Make.

    Shell

    # The key needs the agent:webhook scope (agent:write covers it too).
    # Tick "Webhooks" when you create it at /developers/keys.
    curl -X POST https://www.in-transparency.com/api/agents/webhooks \
      -H "Authorization: Bearer YOUR_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
        "url": "https://hooks.zapier.com/hooks/catch/123456/abcdef/",
        "events": ["match.created"]
      }'
    
    # Response. The secret is shown exactly once, so store it now:
    # {
    #   "id": "cmh4p2x7k0002s8v3",
    #   "url": "https://hooks.zapier.com/hooks/catch/123456/abcdef/",
    #   "events": ["match.created"],
    #   "active": true,
    #   "createdAt": "2026-05-03T14:20:51.000Z",
    #   "secret": "3f8a…64 hex characters…c1",
    #   "message": "Store the secret — we use HMAC-SHA256 to sign every delivery…"
    # }
  2. 2. Recibe las entregas

    Cada evento llega como un POST JSON y esperamos la respuesta 5 segundos como máximo. Por ahora cada entrega se intenta una sola vez (tras un estado de error o un timeout no reintentamos), así que responde enseguida con un 2xx y procesa el evento después. Para descartar duplicados, usa event más eventId como clave; X-InTransparency-Delivery identifica la entrega concreta.

    HTTP

    POST <your-url>
    Content-Type: application/json
    User-Agent: InTransparency-Webhook/1.0
    X-InTransparency-Signature: sha256=<hex HMAC-SHA256 of the raw body>
    X-InTransparency-Delivery: <delivery id>
    
    {
      "event": "match.created",
      "eventId": "cmh3x9q2a0001k7w4",
      "occurredAt": "2026-05-03T14:22:08.000Z",
      "data": {
        "matchId": "cmh3x9q2a0001k7w4",
        "candidateId": "cmh1k7w4n0007p2r9",
        "candidatePseudonym": "stu_4f2a91c0b6e54d12",
        "candidateName": "Giulia M.",
        "matchScore": 89,
        "decisionLabel": "STRONG_MATCH",
        "jobId": "cmh2b8r1v0003x5q1",
        "url": "https://www.in-transparency.com/en/matches/cmh3x9q2a0001k7w4/why"
      }
    }
  3. 3. Verifica la firma

    Cada entrega se firma con el secret de la subscription. Verifícala antes de confiar en el payload (en Zapier/Make puedes omitir la verificación siempre que la URL del hook se mantenga secreta).

    Node.js

    // Node.js — check the signature before trusting the payload.
    // rawBody is the body exactly as it arrived (a Buffer or a string):
    // parsing and re-serialising it changes the bytes, and the HMAC with them.
    import crypto from 'crypto'
    
    function isValid(rawBody, signatureHeader, secret) {
      const expected = 'sha256=' +
        crypto.createHmac('sha256', secret).update(rawBody).digest('hex')
      const received = Buffer.from(signatureHeader || '')
      // timingSafeEqual throws when the lengths differ, so compare them first.
      return received.length === expected.length &&
        crypto.timingSafeEqual(received, Buffer.from(expected))
    }

Recetas para herramientas no-code

  • Zapier

    Webhooks by Zapier

    1. Nuevo Zap → disparador "Webhooks by Zapier" → Catch Hook
    2. Copia la URL del hook
    3. Regístrala como subscription (paso 1 arriba)
    4. Conecta las acciones: Slack, Sheets, CRM…
  • Make

    Custom webhook

    1. Nuevo escenario → módulo "Webhooks" → Custom webhook
    2. Copia la URL generada
    3. Regístrala como subscription
    4. Make detecta la estructura del payload en el primer evento
  • n8n

    Webhook node

    1. Añade un nodo "Webhook" (POST)
    2. Usa la URL de producción del nodo
    3. Regístrala como subscription
    4. Verifica el HMAC en un nodo Function

¿Necesitas una clave API?

Las claves API y la gestión de subscriptions están incluidas en todos los planes. Escríbenos y te activaremos el acceso.