Skip to content

API Stafio ​

Jednotné rozhraní, přes které se ke Stafiu připojují externí aplikace — vlastní web, mobilní aplikace i aplikace třetích stran.

Rychlý start ​

Standardní API v8 slouží k napojení vlastního webu nebo systému. Následující čtyři kroky vedou od založení účtu k prvnímu volání; podrobnosti ke každému z nich jsou dál na této stránce.

1. Připravte účet a API klíč ​

Založte samostatného integračního uživatele s rolí STAFIO.API a přidělte mu potřebná pracoviště a střediska. V Profil → API klíče, případně na detailu uživatele jako administrátor, vytvořte klíč. Jeho plná hodnota je viditelná jen 15 minut. Uložte ji na server integrace do chráněné konfigurace, nikoli do JavaScriptu veřejného webu.

Od správce potřebujete také adresu API své instance. V příkladech nahraďte <INSTANCE> skutečným hostitelem. Nepoužívejte zde api.stafio.cz, protože jde o přihlašovací bránu.

2. Vyměňte klíč za token ​

POST https://<INSTANCE>/api/rpc/platform_jwt_token_generate8
Content-Type: application/json
Content-Profile: platform
Prefer: params=single-object

{"api_key":"<VAS_API_KLIC>"}

Zkontrolujte HTTP stav a pole success v JSON odpovědi. Při úspěchu použijte hodnotu token. Při neúspěchu zpracujte message_text. Klíč se ověřuje přímo na vaší instanci. Platnost tokenu určuje nastavení klíče, standardně 60 minut; po vypršení jej znovu vyměňte.

3. Proveďte první volání bez změny dat ​

POST https://<INSTANCE>/api/rpc/call
Content-Type: application/json
Content-Profile: api
Prefer: params=single-object
Authorization: Bearer <TOKEN_Z_ODPOVEDI>

{"version":8,"func":"ping","params":{}}

Úspěšná odpověď má ok: true. Poté můžete zkusit například seznam inzerátů se stejnými hlavičkami:

json
{"version":8,"func":"job.list","params":{"limit":20,"offset":0}}

4. Zpracujte odpovědi ​

Obálka standardního volání obsahuje ok, version, func, data, meta a error. Nestačí kontrolovat HTTP 200: aplikační chyba může být vrácena s ok: false. Zároveň ošetřete HTTP chyby autentizace, proxy a sítě, které tuto obálku mít nemusí.

  • Při chybě přihlášení zkontrolujte instanci, klíč a platnost tokenu.
  • Při chybě oprávnění zkontrolujte roli a přiřazení dat integračnímu účtu.
  • Po timeoutu zápis neopakujte naslepo: nejprve ověřte, zda již nevznikla registrace nebo reakce.

Funkční implementaci přihlášení a volání najdete v PHP ukázce. Živé demo používá skutečné API; odeslání formuláře může vytvářet data.

Jak to funguje ​

Celé API má jediný endpoint. Nevolá se tedy různá URL podle funkce, ale vždy stejná adresa a v těle požadavku se řekne, co se má provést.

POST https://<instance>/api/rpc/call
Content-Type: application/json
Content-Profile: api
Prefer: params=single-object
Authorization: Bearer <JWT>

Tělo požadavku je vždy objekt se třemi povinnými poli:

json
{
  "version": 8,
  "func": "job.list",
  "params": { "limit": 20, "offset": 0 }
}
PoleVýznam
versionVerze kontraktu. Povinné, celé kladné číslo. Aktuální verze je 8.
funcLogické jméno funkce (např. job.list). Není to jméno databázové procedury.
paramsParametry funkce. Povinné — když funkce nic nepotřebuje, pošle se {}.

Hlavička Prefer: params=single-object je povinná — bez ní by se tělo požadavku nepředalo jako jeden celek a volání skončí chybou.

Odpověď ​

Odpověď má vždy stejný tvar, ať dopadne jakkoliv:

json
{
  "ok": true,
  "version": 8,
  "func": "job.list",
  "data": [ { "job_id": 1042, "name": "Skladník" } ],
  "meta": { "row_count": 1 },
  "error": null
}

Při chybě:

json
{
  "ok": false,
  "version": 8,
  "func": "job.list",
  "data": null,
  "meta": null,
  "error": { "code": "API_FUNC_UNKNOWN", "message": "Neznámá funkce…", "detail": null }
}

Chyby (včetně neočekávaných) se vracejí s HTTP kódem 200 a rozlišují se polem ok. Klient tak má jednotné zpracování a nemusí řešit různé stavové kódy.

Čí data se vrátí, určuje token, se kterým voláte — stejný požadavek tak u každého zákazníka vrací jeho vlastní data.

Token — získání a prodlužování ​

Každé volání API se posílá s tokenem v hlavičce Authorization: Bearer <JWT>. Token se nevytváří ručně — vydává ho samo API.

Příprava: uživatel s rolí pro API ​

  1. Založte uživatele, pod kterým bude integrace běžet (samostatného pro každou integraci, ne sdíleného).
  2. Přiřaďte mu roli STAFIO.API — ta zpřístupňuje endpoint api.call.

Doporučeně: přihlášení API klíčem ​

API klíč je trvalé heslo pro strojový přístup. Má stejná práva jako uživatel, kterému patří, a odvolá se jeho zakázáním nebo smazáním — bez zásahu do hesla uživatele.

Kde se klíč vytvoří:

  1. Přihlaste se do Stafia a otevřete Profil → záložka API klíče.
  2. Klikněte na Nový API klíč a vyplňte popis, k čemu klíč slouží.
  3. Vygenerovaná hodnota se zobrazí ve sloupci Klíč a je viditelná jen 15 minut — zkopírujte si ji hned, později už ji nelze zjistit (v přehledu zůstane jen začátek).
  4. Ve sloupci Platnost tokenu (min) nastavíte, jak dlouho platí token vydaný na klíč (výchozí 60 minut).

Administrátor zakládá a ruší klíče všech uživatelů ownera na detailu uživatele → záložka API klíče — integrátor tak nepotřebuje heslo k účtu, pod kterým poběží.

Klíč se vymění za token přímo na instanci zákazníka:

bash
curl -X POST <base_api_url>/rpc/platform_jwt_token_generate8 \
  -H 'Content-Type: application/json' \
  -H 'Content-Profile: platform' \
  -H 'Prefer: params=single-object' \
  -d '{ "api_key": "stf_..." }'

Klíč patří jedné databázi a přihlašovací proxy app.stafio.cz ho po instancích nerozesílá — volání s klíčem musí mířit rovnou na adresu API dané instance. Token vydaný na klíč se neobnovuje přes platform_jwt_token_renew8; po vypršení si klient vyžádá nový stejným voláním.

Přihlášení jménem a heslem — přes app.stafio.cz ​

Tato cesta platí, když se integrace přihlašuje uživatelským jménem a heslem místo API klíče. Zákazníci jsou rozdělení do více databází a klient dopředu neví, ve které je ten jeho. První požadavek proto míří vždy na app.stafio.cz a volá se proxy_jwt_token_generate8:

bash
curl -X POST https://app.stafio.cz/api/rpc/proxy_jwt_token_generate8 \
  -H 'Content-Type: application/json' \
  -H 'Content-Profile: platform' \
  -H 'Prefer: params=single-object' \
  -d '{
        "login": "<uživatel>",
        "password": "<heslo>"
      }'
ParametrVýznam
login, passwordPřihlašovací údaje uživatele
app_domainVolitelné — doména instance, je-li známa
token_typeVolitelné. STAFIO_APP_PUBLIC vydá veřejný (anonymní) token bez hesla — pro veřejné výpisy inzerátů
otpVolitelné — jednorázový kód, je-li u účtu zapnuté dvoufaktorové ověření

Proxy uživatele najde: buď je v databázi, na kterou jste zavolali, nebo se postupně zeptá ostatních instancí a přihlášení jim přepošle. Vrácený token pak patří té správné databázi.

Nevolejte platform_jwt_token_generate8 přímo. Ta hledá uživatele jen v jedné konkrétní databázi, takže pro zákazníka v jiné instanci skončí chybou.

Kam posílat další požadavky ​

Odpověď obsahuje token a v něm je i adresa API dané instance:

json
{ "success": true, "token": "eyJhbGciOi…", "user_name": "Jan Novák" }

Token (JWT) nese mimo jiné tyto údaje:

Údaj v tokenuK čemu je
base_api_urlAdresa API instance zákazníka — sem míří všechna další volání
app_domainDoména instance; z ní se skládají adresy obrázků a dokumentů
owner_id, user_id, roleIdentita — určuje, čí data se vrací
expKonec platnosti

Postup je tedy vždy: přihlásit se na app.stafio.cz → z tokenu si přečíst base_api_url → všechno ostatní posílat tam. To platí i pro prodlužování tokenu a pro stahování obrázků.

Payload tokenu si klient přečte běžným dekódováním JWT (prostřední část oddělená tečkami, Base64URL) — podpis ověřovat nemusí, ten kontroluje server.

Platnost a prodloužení ​

Token platí 1 den. Integrace ho proto musí pravidelně prodlužovat.

Prodloužení se dělá stávajícím platným tokenem — žádné heslo se neposílá a nejsou potřeba žádné parametry:

bash
curl -X POST <base_api_url>/rpc/platform_jwt_token_renew8 \
  -H 'Content-Type: application/json' \
  -H 'Content-Profile: platform' \
  -H 'Authorization: Bearer <stávající token>'

Prodloužení se posílá na base_api_url z tokenu, ne na app.stafio.cz — přes proxy se chodí jen pro první přihlášení.

Vrátí se nový token se stejnou identitou a novou platností; starý zahoďte.

Doporučený postup pro integraci:

  1. Při startu si vyžádejte token přes platform_jwt_token_generate8.
  2. Token si držte a prodlužujte ho s rezervou (například jednou za pár hodin), ne až v okamžiku vypršení.
  3. Když prodloužení selže (token už vypršel), přihlaste se znovu jménem a heslem.

Prodloužit lze jen token uživatele nebo osoby. U jiných typů vrátí volání chybu CANNOT_RENEW a je nutné se přihlásit znovu.

Pozor: vydaný token nelze odvolat — platí až do vypršení. Když token unikne, je jediná cesta zablokovat nebo změnit heslo dotčeného uživatele. Proto má mít každá integrace vlastního uživatele.

Přehled funkcí ​

ping ​

Ověření dostupnosti. Bez parametrů ({}), vrací { "pong": true }.

job.list — seznam inzerátů ​

Všechny parametry volitelné.

ParametrVýznam
region_idFiltr regionu
work_type_idFiltr druhu práce
partner_idFiltr zaměstnavatele
label_idsFiltr štítků
limitPočet položek (výchozí 20, maximum 100)
offsetPosun pro stránkování

Vrací pole inzerátů: job_id, name, wage, description_short, region_id, region_description, work_type_id, work_type_desc, address, partner_id, partner_name, partner_logo_id, partner_logo_ois, photo_bin_object_id, created, created_as_text.

job.detail — detail inzerátu ​

ParametrVýznam
job_idPovinné — ID inzerátu

Vrací navíc oproti seznamu: description (HTML), regions, regions_description, work_types, work_types_description, gallery_bin_object_id, gallery_bin_object_ois (pole obrázků galerie), video_url a cost_center — pole kódů středisek, do kterých inzerát patří (stejné kódy, jaké vrací cost_center.list a přijímá person.update).

job.response — odpověď na inzerát ​

ParametrVýznam
job_idPovinné — ID inzerátu
first_name, last_namePovinné — jméno a příjmení
emailPovinné
mobilePovinné — celé telefonní číslo (samotná předvolba nestačí)
response_textVolitelné — průvodní dopis / komentář
passwordVolitelné — heslo pro založení účtu
mail_template_idVolitelné — šablona potvrzovacího e-mailu (viz níže)
cv_file_nameVolitelné — název souboru životopisu včetně přípony; povinný, když je vyplněno cv_base64
cv_base64Volitelné — obsah životopisu v Base64. Přiloží se k odpovědi a osobě se nastaví jako CV, pokud žádný nemá

Vrací { "result": true, "response_id": …, "person_id": …, "info_text": … }. person_id je uchazeč, ke kterému se odpověď zapsala — uložte si ho, údaje k odpovědi pak doplníte přes person.update.

Kam se odpověď zapíše:

TabulkaCo se zapíše
jp_job_response_tabSamotná odpověď na inzerát (vrácené response_id)
person_tabOsoba — podle e-mailu se dohledá existující, jinak se založí nová
mail_box_tabPotvrzovací e-mail — pouze pokud je předán mail_template_id

Před zápisem se kontroluje, že je inzerát aktivní, a že telefon má alespoň 9 číslic.

Co se stane s uchazečem:

  • E-mail ve Stafiu ještě není — založí se nový uchazeč ve stavu Čeká a dostane středisko inzerátu.
  • E-mail už ve Stafiu je — odpověď se zapíše k existujícímu uchazeči. Jeho jméno, telefon ani střediska se nemění. Středisko inzerátu mu případně doplníte voláním person.update s kódem z job.detail → cost_center.

Odpověď je vazbou uchazeče na inzerát a přes inzerát i na zaměstnavatele (partner_id). Jiná vazba na zaměstnavatele se nezakládá. Ve Stafiu ji najdete v Inzerce → Odpovědi a na kartě uchazeče v části Odpovědi.

person.register — registrace uchazeče ​

ParametrVýznam
first_name, last_namePovinné
emailPovinné
mobilePovinné — celé telefonní číslo
passwordVolitelné — heslo
cost_centerVolitelné — kód střediska („chci pracovat jako“) z cost_center.list
emergency_contactVolitelné — nouzový kontakt (u nezletilých odpovědná osoba); uloží se do kontaktů osoby jako „Nouzový kontakt“
domainVolitelné — doména webu v rodině pracovních portálů (např. o2callup.cz); určuje šablonu potvrzovacího e-mailu a adresu potvrzovacího odkazu. Bez parametru se bere z tokenu; token z přihlášení jménem a heslem ani token vydaný na API klíč ji nenesou. Nemáte-li web v rodině pracovních portálů, parametr neposílejte — registrace projde a potvrzovací e-mail se neodešle
mail_template_idVolitelné — šablona uvítacího e-mailu (viz níže)
noteVolitelné — poznámka k uchazeči (např. shrnutí telefonického předvýběru). Uloží se do poznámek osoby, tedy tam, kam ji píše náborář v aplikaci — s časem a autorem, bez přepsání profilu
cv_file_nameVolitelné — název souboru životopisu včetně přípony; povinný, když je vyplněno cv_base64
cv_base64Volitelné — obsah životopisu v Base64. Uloží se jako dokument osoby typu Web CV

Vrací { "result": true, "person_id": …, "info_text": … }.

Kam uchazeč vznikne: do kategorie Zaměstnanec a uchazeč, tedy mezi lidi, se kterými ve Stafiu běžně pracujete, ve stavu Čeká — ten odlišuje kandidáty, které ještě nikdo neposoudil. Stav změníte na kartě osoby akcí Aktivovat.

Nahrávání kandidátů z externího systému: note a cv_base64 jsou určené pro integrace, které kandidáty sbírají jinde (ATS, kariérní web, AI náborář) a do Stafia je předávají i s poznámkou a životopisem. Když kandidát patří ke konkrétnímu inzerátu, použijte místo registrace job.response — poznámka tam patří do response_text a životopis se přiloží přímo k odpovědi.

Uchazeč už ve Stafiu je: registrace kontroluje e-mail v rámci zákazníka, takže druhé volání se stejným e-mailem skončí chybou ALREADY_REGISTERED. Chcete-li k už založenému uchazeči něco doplnit, použijte person.update (viz níže).

Registrace bez hesla: password se posílat nemusí — registrační formulář tedy pole pro heslo mít nemusí. Stafio si v takovém případě vygeneruje interní heslo, které se nikam neodesílá; uchazeč si své heslo nastaví později v aplikaci volbou Zapomenuté heslo (na jeho e-mail přijde odkaz pro nastavení hesla). Do té doby je uchazeč zaregistrovaný, ale do aplikace se nepřihlásí.

person.update — doplnění uchazeče ​

Protějšek registrace pro integrace, které kandidáta předávají po částech: hned po přihlášení pošlete kontakt přes person.register, a jakmile máte životopis nebo shrnutí předvýběru, doplníte je tímto voláním. Nemusíte tedy čekat, až budete mít všechny podklady pohromadě — náborář vidí kandidáta od první chvíle.

Kterou osobu doplnit — stačí jeden z klíčů:

ParametrVýznam
person_idID osoby, které vrátilo person.register nebo job.response
emailE-mail osoby; použijte, když person_id nemáte — třeba když registrace skončila chybou ALREADY_REGISTERED, protože uchazeč ve Stafiu už byl

E-mail slouží jako klíč, měnit ho tímto voláním nelze.

Jeden e-mail může být ve Stafiu u více osob. Kontroluje ho jen registrace, kdežto v aplikaci duplicita běžně vznikne — třeba když dva rodinní příslušníci uvedou stejnou adresu. Když e-mail vede na víc osob, volání skončí chybou EMAIL_NOT_UNIQUE a vypíše jejich person_id; Stafio si samo nevybere. Pošlete pak volání znovu s tím person_id, které je správné. Proto je spolehlivější person_id z registrace uložit a používat ho.

Co doplnit — zapíše se jen to, co skutečně pošlete; co vynecháte, zůstane beze změny:

ParametrVýznam
first_name, last_nameVolitelné — jméno a příjmení
mobileVolitelné — celé telefonní číslo
cost_centerVolitelné — kód střediska („chci pracovat jako“) z cost_center.list nebo z job.detail; přidá se k dosavadním střediskům, už přiřazené středisko se podruhé nepřidá
emergency_contactVolitelné — nouzový kontakt
noteVolitelné — poznámka; přidá se k dosavadním, s časem a autorem
cv_file_nameVolitelné — název souboru životopisu včetně přípony; povinný, když je vyplněno cv_base64
cv_base64Volitelné — obsah životopisu v Base64; přidá se jako další dokument typu Web CV

Vrací { "result": true, "person_id": …, "info_text": … }.

Posílejte jen to, co se opravdu mění. Jméno a telefon se přepíšou hodnotou z volání, takže když integrace bude pokaždé posílat celý stejný balík, přemaže i opravu, kterou mezitím udělal náborář na kartě osoby. Středisko, poznámka a životopis tímto netrpí — ty se vždy jen přidávají.

Volání bez jediného údaje k doplnění skončí chybou NOTHING_TO_UPDATE — ať se ztracené volání pozná hned a netváří se jako úspěch.

Předání kandidáta nadvakrát — obojí je běžný POST na /api/rpc/call, liší se jen pole func v těle:

json
// 1. hned po přihlášení kandidáta — jen kontakt
{"version":8,"func":"person.register","params":{
  "first_name":"Jana","last_name":"Nováková",
  "email":"jana.novakova@example.com","mobile":"+420700123456"}}

// odpověď:  { "ok": true, "data": { "result": true, "person_id": 144812, … } }

// 2. jakmile máte podklady — person_id z odpovědi výše
{"version":8,"func":"person.update","params":{
  "person_id":144812,
  "note":"Předvybráno telefonicky, praxe 3 roky, nástup od 1. 10.",
  "cv_file_name":"zivotopis-novakova.pdf","cv_base64":"JVBERi0xLjQKJc..."}}

department.list — pracoviště integračního účtu ​

Bez parametrů ({}). Vrací pole { department_id, description, work_place } — platná pracoviště přiřazená uživateli, pod kterým integrace běží. Nabídku na formuláři tak řídíte ve Stafiu přiřazením pracovišť tomuto uživateli, bez zásahu do webu.

cost_center.list — střediska integračního účtu ​

ParametrVýznam
department_idVolitelné — omezí výsledek na střediska daného pracoviště (z department.list)

Vrací pole { cost_center, description } — platná střediska přiřazená uživateli integrace. Do person.register a person.update se posílá kód cost_center, ne popis. Středisko konkrétního inzerátu vrací job.detail v poli cost_center.

Šablony e-mailů ​

API samo od sebe žádný e-mail neposílá. E-mail vznikne jen tehdy, když volající předá parametr mail_template_id. Bez něj se odpověď i registrace uloží, ale žádná zpráva se nezaloží.

Šablona se dohledává podle vlastníka (zákazníka) a předaného ID. Z šablony se vezme předmět i tělo, doplní se do nich hodnoty a výsledek se založí do fronty mail_box_tab, odkud ho odešle standardní odesílání pošty. Odesílatel se nastaví na e-mail uživatele, pod kterým volání běží.

FunkceDoporučené ID šablony
job.responseAPI_JOB_RESPONSE
person.registerAPI_PERSON_REG

Uvedená ID jsou doporučená konvence pro šablony používané tímto API — proto začínají API_. Šablonu s tímto ID si musíte ve svém účtu nejdřív založit; pokud neexistuje, e-mail se nezaloží. Použít lze i libovolnou jinou existující šablonu, právě proto je ID parametrem.

Pole, která lze v šabloně nahradit ​

V předmětu i těle šablony se nahradí tyto zástupné hodnoty:

FunkceDostupná pole
job.responseFIRST_NAME, LAST_NAME, EMAIL, MOBILE, RESPONSE_TEXT, JOB_ID, JOB_NAME
person.registerFIRST_NAME, LAST_NAME, EMAIL, MOBILE, COST_CENTER

Zápis zástupných polí v šabloně se řídí obecným mechanismem popsaným v Automatická pole a dynamické odkazy pro maily a SMS.

Obrázky ​

API vrací u loga a fotek identifikátor *_ois (např. partner_logo_ois, gallery_bin_object_ois). Adresu obrázku si klient poskládá sám — základ vezme z tokenu, nikoliv z vlastní konfigurace:

<app_domain>get/document-by-ois?ois=<ois>

Pozor: dokumenty a obrázky jsou na app_domain, ne pod base_api_url. base_api_url slouží jen pro volání API. Například pro app_domain = https://firma.stafio.cz/ je adresa obrázku https://firma.stafio.cz/get/document-by-ois?ois=….

Obrázek se stahuje běžným GET a nevyžaduje token, takže se dá vložit rovnou do <img src="…">.

gallery_bin_object_ois je pole, inzerát tedy může mít více obrázků.

Ukázka volání ​

bash
curl -X POST https://<instance>/api/rpc/call \
  -H 'Content-Type: application/json' \
  -H 'Content-Profile: api' \
  -H 'Prefer: params=single-object' \
  -H 'Authorization: Bearer <JWT>' \
  -d '{"version":8,"func":"job.list","params":{"limit":20}}'

Ukázková aplikace ​

Funkční ukázka integrace běží na api-demo.stafio.cz — jednoduchá PHP aplikace, která přes toto API zobrazuje seznam a detail inzerátů, umožňuje odpovědět na inzerát a zaregistrovat se.

Zdrojový kód je na github.com/stafiocz/stafio-api-demo-php a je možné ho použít jako výchozí bod pro vlastní integraci: ukazuje přihlášení přes proxy, převzetí adresy API z tokenu, volání jednotlivých funkcí i skládání adres obrázků. Jde o jednoduchou PHP aplikaci bez knihoven — stačí PHP s rozšířeními curl a json.

Oprávnění ​

Uživateli, pod kterým má integrace běžet, přiřaďte roli STAFIO.API. Bez ní volání API skončí chybou oprávnění.

Doporučení: založte pro každou integraci vlastního uživatele, ne sdíleného. Vydaný token nelze odvolat, takže při jeho úniku je jediná možnost zablokovat nebo změnit heslo dotčeného uživatele — a to se pak nedotkne ostatních integrací.

Dokumentace personálního systému Stafio