Dokumentace API

Napojte HireUP na svůj ATS: zakládejte uchazeče a screeningy, stahujte výsledky a dostávejte je webhookem.

Aktualizováno 29. 9. 2026

Základy

  • Základní adresa: https://hireup.inflexion.cz/api/v1, JSON přes HTTPS. Strojově čitelná specifikace: OpenAPI 3.1.
  • Autentizace hlavičkou x-api-key. Klíč vydává vlastník firmy v HR portálu (Integrace) a patří firmě, ne osobě. Každý klíč vidí jen data své firmy.
  • Limit: 10 000 požadavků za 24 hodin na klíč (pak 429). Na výsledky nečekejte dotazováním – použijte webhook.
  • Chyby vrací JSON { "error": "kód" } se stavem 400/401/404/409.
curl https://hireup.inflexion.cz/api/v1/positions \
  -H "x-api-key: hu_…"

Nejrychlejší napojení: jedno volání

Webhook vašeho ATS zavolá POST /intake hned, jak uchazeč přijde z inzerátu. Pošlete pozici, uchazeče a CV (cvText nebo PDF v cvPdfBase64, do 5 MB). Vše ostatní uděláme my: profil z CV, screening a pozvánku e-mailem ("sendInvite": false ji vypne).

POST https://hireup.inflexion.cz/api/v1/intake
{ "positionId": "…",
  "candidate": { "fullName": "Eva Nováková", "email": "eva@example.com", "externalRef": "ID v ATS" },
  "cvPdfBase64": "JVBERi0x…" }

202 { "candidateId": "…", "status": "waiting_for_profile", "existingCandidate": false }
    // nebo "screening_created" + screeningId (+ inviteUrl při novém založení)
  • Profil z CV trvá obvykle do 30 s. Do té doby je stav waiting_for_profile; screening založíme, jakmile bude hotový, a dáme vám vědět webhookem screening.created.
  • Opakované volání se stejným externalRef nezaloží duplicitu – vrátí existujícího uchazeče (a jeho živý screening). inviteUrl se vrací jen při novém založení.
  • Limit těla požadavku hostingu je řádově jednotky MB; větší PDF pošlete jako cvText.

Podrobný postup po krocích

  1. GET /positions – aktivní pozice se schválenou rubrikou.
  2. POST /candidates – uchazeč s textem CV; profil je hotový obvykle do 30 s (profileReady).
  3. POST /screenings – screening a odkaz pro uchazeče (inviteUrl, jen v této odpovědi). S "sendInvite": true pošleme pozvánku e-mailem my.
  4. Po dokončení přijde webhook screening.completed s doporučením a odkazem na report. Rozhoduje personalista v HireUP.

Endpointy

get/api/v1/me

200 Firma, ke které API klíč patří

get/api/v1/positions

Aktivní pozice firmy (se schválenou rubrikou)

200 Seznam pozic

post/api/v1/candidates

Založit uchazeče (z textu CV se připraví profil, obvykle do 30 s)

PoleTypPopis
fullName*string
email*string (email)
cvText*stringText CV (PDF zatím jen přes portál)
externalRefstring

201 Uchazeč založen409 Uchazeč se stejným externalRef už existuje

post/api/v1/intake

Jednokrokový vstup z ATS: uchazeč + CV → screening a pozvánka

Jedno volání pro webhook ATS. Založí uchazeče (nebo najde podle `externalRef`), z CV připraví profil a založí screening s pozvánkou e-mailem. Když je profil hotový, screening vznikne hned (odpověď obsahuje `inviteUrl`); jinak `waiting_for_profile` a screening vznikne do několika minut – ATS se to dozví webhookem `screening.created`. Pozice musí být aktivní se schválenou rubrikou.

PoleTypPopis
positionId*string (uuid)
candidate*object
cvTextstringText CV. Buď `cvText`, nebo `cvPdfBase64`.
cvPdfBase64stringCV jako PDF v base64 (max. 5 MB po dekódování; uložíme do šifrovaného úložiště).
variantshort | medium | long
languagecs | en
sendInvitebooleanPozvánku pošleme uchazeči e-mailem (výchozí). Jinak ji z API odkaz získáte jen při synchronním založení.

202 Přijato400 Neplatný vstup nebo PDF (invalid_pdf, pdf_too_large)404 Pozice neexistuje409 Pozice není aktivní nebo nemá schválenou rubriku503 Nahrávání PDF není dostupné (pdf_unavailable), pošlete cvText

get/api/v1/candidates/{id}

Uchazeč a stav jeho profilu

Parametry cesty: id

200 Uchazeč404 Uchazeč neexistuje

delete/api/v1/candidates/{id}

Smazat uchazeče a všechna jeho data (CV, screeningy, záznamy, hodnocení)

Pro žádosti uchazečů o výmaz (GDPR čl. 17) a úklid ve vašem ATS. Nevratné. Data se jinak mažou automaticky po lhůtě uchování nastavené firmou.

Parametry cesty: id

204 Smazáno404 Uchazeč neexistuje

post/api/v1/screenings

Založit screening a získat odkaz pro uchazeče

Odkaz `inviteUrl` se vrací jen v této odpovědi (ukládáme jen jeho otisk). Pošlete ho uchazeči. Po dokončení přijde webhook `screening.completed`.

PoleTypPopis
positionId*string (uuid)
candidateId*string (uuid)
variantshort | medium | long
languagecs | en
reportLanguagecs | en
answerModevoice | textvoice = rozhovor s AI avatarem (výchozí), text = písemné odpovědi (přiměřená úprava)
extendedTimebooleanPřiměřená úprava: dvojnásobný čas na odpovědi (max. 180 s na odpověď)
sendInvitebooleanPošleme uchazeči pozvánku e-mailem (v jazyce rozhovoru). Jinak ji pošlete sami.

201 Screening založen404 Pozice nebo uchazeč neexistuje409 Pozice nemá schválenou rubriku nebo uchazeč nemá hotový profil

get/api/v1/screenings

Seznam screeningů firmy (nejnovější první, stránkování přes before)

Pro synchronizaci s ATS, když webhook nedorazil. Filtry: stav, uchazeč, dokončené od. Další stránku získáte parametrem before = nextBefore z předchozí odpovědi.

200 Screeningy

get/api/v1/screenings/{id}

Stav screeningu, doporučení a praktické informace uchazeče

Parametry cesty: id

200 Screening404 Screening neexistuje

post/api/v1/screenings/{id}/cancel

Zrušit pozvánku (jen než uchazeč začne)

Parametry cesty: id

204 Zrušeno404 Screening neexistuje409 Rozhovor už začal nebo skončil

post/api/v1/screenings/{id}/invite

Nový odkaz pro uchazeče (starý přestane platit, platnost 7 dní)

Pro vypršelé pozvánky nebo ztracený odkaz. Jde jen před začátkem rozhovoru. Volitelné tělo `{ "sendInvite": true }` pošle uchazeči nový odkaz e-mailem.

Parametry cesty: id

200 Nový odkaz404 Screening neexistuje409 Rozhovor už začal nebo skončil

Webhooky

Adresu webhooku (https) přidá správce v HR portálu → Integrace. Odebíráme dvě události: screening.created (screening založený přes /intake; v data jen screeningId, candidate a position s ID, status a inviteSent) a screening.completed. Webhook adresy přidané před zavedením screening.created odebírají jen dokončení – přidejte adresu znovu. Po dokončení hodnocení pošleme POST s tělem:

{
  "id": "…",                      // ID doručení (pro deduplikaci)
  "type": "screening.completed",
  "createdAt": "2026-09-26T10:00:00.000Z",
  "data": {
    "screeningId": "…",
    "candidate": { "id": "…", "externalRef": "ID ve vašem ATS" },
    "position": { "id": "…", "title": "…" },
    "recommendation": "advance" | "consider" | "reject",
    "summary": "…",
    "competencies": [{ "key": "…", "name": "…", "score": 1–5 | null, "confidence": "…" }],
    "reportUrl": "https://hireup.inflexion.cz/dashboard/screenings/…",
    "decisionRequired": true
  }
}

Každá zpráva má hlavičku HireUP-Signature: t=<unix>,v1=<hex>, kde v1 = HMAC-SHA256(tajemství, "t.tělo"). Ověřte podpis a odmítněte zprávy starší než 5 minut. Neúspěšné doručení (jiný stav než 2xx, timeout 10 s) opakujeme až 5×.

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

export function verifyHireup(secret, rawBody, header, toleranceSec = 300) {
  const parts = Object.fromEntries(header.split(",").map((p) => p.split("=")));
  const t = Number(parts.t);
  if (!Number.isFinite(t) || Math.abs(Date.now() / 1000 - t) > toleranceSec) return false;
  const expected = createHmac("sha256", secret).update(`${t}.${rawBody}`).digest();
  const given = Buffer.from(parts.v1 ?? "", "hex");
  return given.length === expected.length && timingSafeEqual(given, expected);
}

Osobní údaje přes API

  • Na žádost uchazeče o výmaz zavolejte DELETE /candidates/{id} – smaže CV, screeningy, záznamy i hodnocení.
  • Jinak se data smažou automaticky po lhůtě uchování nastavené firmou.
  • Webhook nenese přepis ani citace – ty zůstávají v reportu v HireUP.