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 webhookemscreening.created. - Opakované volání se stejným
externalRefnezaloží duplicitu – vrátí existujícího uchazeče (a jeho živý screening).inviteUrlse 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
GET /positions– aktivní pozice se schválenou rubrikou.POST /candidates– uchazeč s textem CV; profil je hotový obvykle do 30 s (profileReady).POST /screenings– screening a odkaz pro uchazeče (inviteUrl, jen v této odpovědi). S"sendInvite": truepošleme pozvánku e-mailem my.- Po dokončení přijde webhook
screening.completeds 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)
| Pole | Typ | Popis |
|---|---|---|
| fullName* | string | |
| email* | string (email) | |
| cvText* | string | Text CV (PDF zatím jen přes portál) |
| externalRef | string |
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.
| Pole | Typ | Popis |
|---|---|---|
| positionId* | string (uuid) | |
| candidate* | object | |
| cvText | string | Text CV. Buď `cvText`, nebo `cvPdfBase64`. |
| cvPdfBase64 | string | CV jako PDF v base64 (max. 5 MB po dekódování; uložíme do šifrovaného úložiště). |
| variant | short | medium | long | |
| language | cs | en | |
| sendInvite | boolean | Pozvá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`.
| Pole | Typ | Popis |
|---|---|---|
| positionId* | string (uuid) | |
| candidateId* | string (uuid) | |
| variant | short | medium | long | |
| language | cs | en | |
| reportLanguage | cs | en | |
| answerMode | voice | text | voice = rozhovor s AI avatarem (výchozí), text = písemné odpovědi (přiměřená úprava) |
| extendedTime | boolean | Přiměřená úprava: dvojnásobný čas na odpovědi (max. 180 s na odpověď) |
| sendInvite | boolean | Poš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.
