Pro vývojáře
Partnerské API
Pošlete nám klienta pod vlastním pseudonymním identifikátorem - bez e-mailu, jména a dalších osobních údajů - a kdykoli si přečtěte stav jeho vzdělávání. Slouží jako compliance check před smlouvou, vkladem nebo výplatou.
Verze 1.1.0 · JSON přes HTTPS · OpenAPI
Jak to funguje
API je pro všechny partnery stejné. V pěti krocích:
- API vám pro firmu zapneme; ve své administraci si v záložce API vytvoříte API klíč.
- Když se má klient proškolit, váš systém zavolá POST /v1/users s vaším identifikátorem klienta.
- Založíme profil bez e-mailu a vrátíme vstupní odkaz (entryUrl); ten klientovi ukážete jako tlačítko.
- Klient na něj klikne a je rovnou v kurzu.
- Stav si kdykoli přečtete přes GET /v1/users/{identifier}, nebo ho vašemu serveru oznámíme webhookem.
Správcem identifikátoru jste vy, my zpracováváme jen pseudonymní data. Jako identifikátor nikdy neposílejte e-mail ani jméno - e-mailovou adresu API odmítne chybou 422.
Adresa a autentizace
Každé volání jde přes HTTPS na adresu níže a nese váš API klíč v hlavičce Authorization.
https://api.responsiblo.com Authorization: Bearer rsb_live_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
- rsb_live_... otevírá váš produkční program, rsb_test_... váš testovací program (sandbox).
- Klíč se ukáže jen jednou, při vytvoření; ukládáme si jen jeho otisk. Mějte ho jako tajemství na svém serveru - nikdy v prohlížeči ani v aplikaci.
- Klíč má oprávnění: read (stav osob) a write (posílání osob). Může být omezený na vaše IP adresy a mít platnost.
- Výměna: vytvoříte nový klíč, starý platí ještě 7 dní, pak vyprší.
- Odpovědi se nikdy neukládají do mezipaměti (Cache-Control: no-store) a API nepřijímá volání z prohlížeče (bez CORS).
POST /v1/users
Pošle osobu do programu klíče (oprávnění write).
curl -X POST https://api.responsiblo.com/v1/users \
-H "Authorization: Bearer $RSB_KEY" \
-H "Content-Type: application/json" \
-d '{"identifier":"client-48213","language":"cs","label":"campaign-2026-10"}'
| Pole | Povinné | Význam |
|---|---|---|
identifier |
ano | Váš pseudonym osoby, 1 až 128 znaků A-Z a-z 0-9 . _ : @ -; nikdy e-mailová adresa (odmítnuto chybou 422). |
program |
ne | Kód programu; když ho uvedete, musí to být program klíče. |
language |
ne | Jazyk kurzu (cs, en, ...); výchozí je první jazyk programu. |
label |
ne | Váš štítek - kohorta nebo kampaň, 1 až 64 znaků, nikdy osobní údaj. |
expiresAt |
ne | Poslední den přístupu, RRRR-MM-DD. |
201 Created pro novou osobu, 200 OK, když identifikátor už existuje - nic se nemění, volání lze bezpečně opakovat. Tělo je stav níže i s entryUrl. Vyčerpaný limit osob nebo licence programu vrací 403.
GET /v1/users/{identifier}
Stav osoby (oprávnění read): to, co compliance check potřebuje, nic navíc.
curl https://api.responsiblo.com/v1/users/client-48213 -H "Authorization: Bearer $RSB_KEY"
{
"identifier": "client-48213",
"program": "your-program",
"status": "in_progress",
"progress": 43,
"lessonsCompleted": 3,
"lessonsTotal": 7,
"quizScore": null,
"label": "campaign-2026-10",
"createdAt": "2026-10-20T10:02:11Z",
"startedAt": "2026-10-20T10:05:40Z",
"completedAt": null,
"lastActivityAt": "2026-10-20T10:31:40Z",
"expiresAt": null,
"certificate": null,
"entryUrl": "https://your-academy.responsiblo.com/entry/..."
}
status | Význam |
|---|---|
enrolled |
poslaná, ještě nevstoupila |
started |
vstoupila, zatím nic nedokončila |
in_progress |
má dokončené lekce, program ještě ne |
completed |
program je dokončený (completedAt) |
expired |
přístup skončil (uplynul expiresAt; osoba v sandboxu končí po 7 dnech) |
quizScore je výsledek závěrečného kvízu v %, jakmile je dokončený. Časy jsou v UTC na celé sekundy. Pole certificate je vyhrazené a ve verzi 1.1 má hodnotu null.
?include=detail
Přidá postup v každém kurzu a výsledek každého kvízu - nikdy jednotlivé odpovědi.
"courses": [{"id": "733db340-...", "name": "Introduction", "progress": 40, "lessonsCompleted": 2, "lessonsTotal": 5, "completed": false}],
"quizzes": [{"id": "d2e72fd7-...", "name": "Quiz of the introduction", "score": 85, "completedAt": "2026-10-20T10:31:40Z"}]
Vstupní odkaz
entryUrl ukažte osobě (tlačítko Spustit kurz ve vašem systému). Přihlásí ji do kurzu - bez e-mailu a bez hesla.
Odkaz platí 30 dní a lze ho použít opakovaně; každé volání GET /v1/users/{identifier} vrátí nový. Nikdy ho neposílejte nikomu jinému: kdo odkaz má, vstoupí jako ta osoba.
Webhooky
V záložce API své administrace nastavíte jeden webhook pro každý program: veřejnou HTTPS adresu svého serveru a události. Pak vám posíláme POST s JSON - jen identifikátory a stavy, nikdy vstupní odkaz.
| Událost | Kdy |
|---|---|
user.enrolled |
osoba byla poslána (poprvé, kdy ji váš webhook zná) |
user.started |
osoba vstoupila do kurzu |
user.completed |
osoba dokončila program |
user.expired |
osobě skončil přístup |
POST https://your-server.example/responsiblo/webhook
Content-Type: application/json
X-Responsiblo-Event: user.completed
X-Responsiblo-Delivery: 5b0c1f9e-2d1a-4a57-9a3e-0d6c9c1f2b77
X-Responsiblo-Signature: t=1760954400,v1=3f1c...e9
{
"id": "5b0c1f9e-2d1a-4a57-9a3e-0d6c9c1f2b77",
"type": "user.completed",
"createdAt": "2026-10-20T10:40:00Z",
"apiVersion": "1.1.0",
"program": "your-program",
"data": {
"identifier": "client-48213",
"status": "completed",
"progress": 100,
"lessonsCompleted": 7,
"lessonsTotal": 7,
"quizScore": 85,
"label": "campaign-2026-10",
"startedAt": "2026-10-20T10:05:40Z",
"completedAt": "2026-10-20T10:39:12Z",
"expiresAt": null
}
}
Podpis
Každá zpráva nese hlavičku X-Responsiblo-Signature: t=<unixový čas>,v1=<HMAC-SHA256 textu t.tělo s tajemstvím webhooku, hex>. Tajemství (whsec_...) se ukáže jednou při vytvoření webhooku. Než zprávě uvěříte, ověřte podpis i stáří t; jako klíč idempotence použijte X-Responsiblo-Delivery.
// PHP: $secret = "whsec_...", $header = X-Responsiblo-Signature, $body = the raw body
preg_match('/^t=(\d+),v1=([0-9a-f]{64})$/', $header, $m);
$valid = $m
&& abs(time() - (int) $m[1]) <= 300
&& hash_equals(hash_hmac('sha256', $m[1] . '.' . $body, $secret), $m[2]);
Doručení a opakování
Doručeno = odpověď 2xx do 10 sekund. Jinak to zkusíme znovu za 1 minutu, 5 minut, 30 minut, 2 hodiny a 12 hodin, pak to vzdáme. Přesměrování nesledujeme.
20 nedoručených zpráv po sobě webhook vypne, dokud ho znovu nezapnete; zprávy z té doby počkají. Tlačítko Otestovat pošle ping; log doručení najdete ve své administraci.
Chyby
Každá chyba má jeden tvar: status, code, reason a message; chyba 422 přidá errors (pole - co je špatně).
{ "status": "error", "code": 422, "reason": "invalidBody", "message": "The body is not valid.",
"errors": { "identifier": "identifier must be a pseudonym of the partner, never an e-mail address" } }
| HTTP | reason | Co dělat |
|---|---|---|
| 400 | invalidJson |
pošlete jeden objekt JSON |
| 401 | missingToken, invalidToken |
pošlete platný klíč (zrušený a prošlý klíč vypadají stejně); hlavička WWW-Authenticate říká Bearer |
| 403 | scopeDenied, ipNotAllowed, apiDisabled, partnerInactive, spaceUnavailable, httpsRequired, userLimitReached, seatsExhausted |
klíč tohle nesmí, API je pro vaši firmu vypnuté, nebo je program plný |
| 404 | userNotFound, notFound |
v programu klíče není osoba s tímto identifikátorem |
| 409 | identifierTaken |
identifikátor patří osobě jiného programu |
| 422 | invalidBody |
viz errors |
| 429 | rateLimited |
počkejte Retry-After sekund |
| 500 | internalError |
zkuste to později; naší podpoře uveďte incidentId |
Limity
120 volání za minutu na klíč. Po 30 odmítnutých klíčích z jedné adresy během deseti minut adresa 10 minut čeká.
Stav a kontrakt
GET /v1/status- bez klíče, vrací {"status":"ok","version":"1.1.0"}GET /openapi- bez klíče, dokument OpenAPI 3 celého API
Sandbox
Testovací klíč rsb_test_... otevírá váš testovací program se stejným kurzem. Osoby v něm končí po 7 dnech; webhook testovacího programu je oddělený od produkčního.
Původní rozhraní
GET /v1/user/{identifier} (plný export s každou odpovědí kvízu) funguje dál s JWT vašeho partnerského klíče a nově i s API klíčem s oprávněním read.
Historie verzí
- 1.1.0 (2026-10) - API klíče, POST /v1/users, GET /v1/users/{identifier} s ?include=detail, vstupní odkaz, webhooky, jeden tvar chyb, veřejný stav a OpenAPI, limity.
- 1.0.0 (2024) - GET /v1/user/{identifier} s JWT partnerského klíče.
Chcete API pro svou firmu? Napište nám