Saltar al contenido principal

Integración con ATS

Envía los candidatos que encajan a tu ATS actual

InTransparency no reemplaza tu ATS: lo alimenta. Cuando se activa un match de alta confianza, enviamos un webhook firmado; un relay de 30 líneas lo convierte en un prospecto de Greenhouse, una oportunidad de Lever o un candidato de requisición de Workday.

El patrón

InTransparency lanza un webhook → tu pequeño relay verifica la firma → tu relay llama al endpoint candidates de tu ATS. Sin middleware personalizado, sin polling, sin sincronización programada. El relay se ejecuta en cualquier lugar (Vercel, Cloudflare Workers, AWS Lambda o un contenedor FastAPI).

  1. Crea una clave de agente y registra un webhook

    InTransparency API

    # Step 1: Create an InTransparency agent key with webhook scope
    curl -X POST https://www.in-transparency.com/api/agents/keys \
      -H "Cookie: <your session>" \
      -H "Content-Type: application/json" \
      -d '{"name":"ATS-relay","scopes":["agent:webhook"]}'
    # Response: { "key": "ita_...", ... } — save it once; never shown again
    
    # Step 2: Register your webhook endpoint with InTransparency
    curl -X POST https://www.in-transparency.com/api/agents/webhooks \
      -H "Authorization: Bearer ita_..." \
      -H "Content-Type: application/json" \
      -d '{
        "url": "https://your-relay.example.com/webhooks/intransparency",
        "events": ["match.created", "credential.issued"]
      }'
    # Response includes { "secret": "..." } — store as INTRANSPARENCY_WEBHOOK_SECRET
  2. Relay de Greenhouse (Node / TypeScript)

    Greenhouse Harvest API

    // Deno / Node webhook relay: InTransparency → Greenhouse Harvest API
    // Env: GREENHOUSE_API_KEY, GREENHOUSE_USER_ID, GREENHOUSE_JOB_ID,
    //      INTRANSPARENCY_WEBHOOK_SECRET
    import crypto from 'node:crypto'
    
    export default async function relay(req: Request): Promise<Response> {
      // 1. Verify the signature (constant-time compare)
      const body = await req.text()
      const sig = req.headers.get('X-InTransparency-Signature') || ''
      const expected = 'sha256=' + crypto
        .createHmac('sha256', process.env.INTRANSPARENCY_WEBHOOK_SECRET!)
        .update(body).digest('hex')
      const ok = sig.length === expected.length &&
        crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(expected))
      if (!ok) return new Response('bad signature', { status: 401 })
    
      const { event, data } = JSON.parse(body)
      if (event !== 'match.created' || data.matchScore < 70) {
        return new Response('ignored', { status: 200 })
      }
    
      // 2. Create a prospect in Greenhouse. Before the student accepts contact,
      // the webhook carries no email or surname — only a first name with an
      // initial ("Giulia M."), a stable pseudonym and the evidence link. The
      // recruiter opens the link, writes to the student on InTransparency, and
      // the full contact arrives once the student says yes.
      const [firstName, ...rest] = String(data.candidateName).split(' ')
      await fetch('https://harvest.greenhouse.io/v1/candidates', {
        method: 'POST',
        headers: {
          'Authorization': 'Basic ' + Buffer.from(process.env.GREENHOUSE_API_KEY + ':').toString('base64'),
          'Content-Type': 'application/json',
          'On-Behalf-Of': process.env.GREENHOUSE_USER_ID!,
        },
        body: JSON.stringify({
          first_name: firstName,
          last_name: rest.join(' ') || data.candidatePseudonym,
          applications: [{ job_id: Number(process.env.GREENHOUSE_JOB_ID) }],
          website_addresses: [{ value: data.url, type: 'other' }],
          tags: ['InTransparency', data.decisionLabel],
          custom_fields: [
            { name_key: 'intransparency_match_id', value: data.matchId },
            { name_key: 'intransparency_match_score', value: data.matchScore },
          ],
        }),
      })
    
      return new Response('ok', { status: 200 })
    }

Otras plataformas ATS

  • Workday Recruiting

    Usa el Recruiting Staffing Web Service (SOAP): añade un Candidate con la operación Add_Candidate. Mismo patrón de relay, distinto payload.

  • SmartRecruiters

    Haz un POST a /candidates con jobId y status=LEAD. Los campos personalizados se mapean sin problemas.

  • Recruitee

    Haz un POST a /candidates con placements=[{offer_id}]. Adjunta la URL de evidencia como nota.

  • Teamtailor

    El envío nativo está disponible en beta: añade una API key de TeamTailor en los ajustes de recruiter. Si prefieres construirlo: POST a /v1/candidates con job-applications incluidas; los candidatos captados aparecen en el pipeline como leads.

  • Personio

    Usa la Recruiting API: POST /v1/recruiting/applications. Los equipos de RR. HH. italianos que ya conocen Personio pueden configurarlo en menos de una hora.

  • Ashby

    El envío nativo está disponible en beta: añade una API key de Ashby en los ajustes de recruiter y te ahorras el relay. Si prefieres construirlo: POST a /candidate.create y luego /candidate.addApplication.