Používejte adresu API své organizace a přihlašovací údaj s omezeným rozsahem oprávnění. Začněte požadavkem pouze pro čtení, zkontrolujte odpověď a tajné údaje nikdy nevkládejte do zdrojového kódu ani do příkladů v dokumentaci.
Quire má jedno veřejné API: REST přes HTTPS popsané dokumentem OpenAPI 3.1, podepsané webhooky pro události a server MCP pro asistenty AI. Referenční dokumentace API uvádí všechny endpointy a události.
Adresy
Každá organizace má vlastní adresu a její API je dostupné pod ní:
https://acme.quirelms.com/api/v1/coursesOrganizaci určuje přihlašovací údaj. Použití klíče jedné organizace na adrese jiné organizace se odmítne.
Dokument OpenAPI je dostupný na /api/v1/openapi.json na adrese kterékoli organizace, takže generátory klienta vždy uvidí verzi, se kterou komunikujete.
Ověřování
Klíče API jsou určeny pro skripty a integrace mezi servery. Administrátor vytvoří klíč na /admin/integrations/api-keys, zvolí jeho rozsahy a zobrazí se mu pouze jednou. Odešlete ho jako bearer token:
curl -H "Authorization: Bearer qk_live_..." https://acme.quirelms.com/api/v1/users?limit=50Klíče začínají na qk_live_ nebo qk_test_. Každé integraci přidělte vlastní klíč.
OAuth 2.1 je určen aplikacím, které jednají jako přihlášený uživatel. Zaregistrujte klienta na /admin/integrations/oauth-clients a použijte autorizační tok s kódem a PKCE (/oauth/authorize, /oauth/token), případně přihlašovací údaje klienta pro strojového klienta. Metadata pro zjištění serveru jsou na /.well-known/oauth-authorization-server. Rozsah omezuje, co token může dělat; nikdy mu nedává větší oprávnění, než má daný uživatel.
Rozsahy jsou resource:read, resource:write a resource:delete, například courses:read nebo enrolments:write. Čtyři jsou privilegované a na obrazovce souhlasu se zobrazují s upozorněním: audit:read, roles:write, tenants:write a users:delete.
Požadavky
- Stránkování: každý seznam se stránkuje pomocí kurzoru. Předejte
limita potomnext_cursorzpagejakocursor, dokud jehas_morerovno true (viz příklad níže). Offset se nepoužívá. - Změny od určitého okamžiku:
updated_sincevrátí změny provedené po zadaném čase. Spojte ho sinclude_deleted=truenebo načtěte/<resource>/deletions, abyste zjistili, co bylo odstraněno. - Externí identifikátory: většina prostředků přijímá vlastní
external_id; přes/<resource>/ext:{external_id}lze prostředek načíst nebo vložit či aktualizovat podle tohoto identifikátoru. Synchronizace tak nemusí uchovávat identifikátory Quire. - Idempotence: s požadavky posílejte hlavičku
Idempotency-Keyv metodáchPOST,PATCHaDELETE. Opakovaný požadavek se stejným klíčem vrátí první odpověď místo opakování operace. Hromadné endpointy tento klíč vyžadují. - Verze: hlavní verze je v cestě (
/v1). Každá zpětně nekompatibilní změna uvnitř verze je datovaná revize zvolená hlavičkouQuire-Version, napříkladQuire-Version: 2026-09-20. Bez hlavičky získáte revizi platnou v době vydání přihlašovacího údaje.
Jedna stránka seznamu:
{"data": [...], "page": {"next_cursor": "eyJ2Ijox...", "has_more": true, "limit": 100}}Chyby
Každá chyba je problémový dokument podle RFC 9457:
{"type": "https://quire.com/errors/enrolment.seat_limit_reached",
"title": "Seat limit reached", "status": 409,
"code": "enrolment.seat_limit_reached", "category": "conflict",
"detail": "The course has no seats left, so this enrolment was not created. ...",
"request_id": "01JB7XQK4Z..."}Rozhodujte se podle stabilního code; detail je určen lidem, je bezpečné ho zobrazit a může se měnit. Pokud kód neznáte, zařaďte chybu podle category:
| Kategorie | Stav | Opakovat |
|---|---|---|
validation |
422, podrobnosti o poli v errors |
Ne |
authentication |
401 | Ne |
authorization |
403 | Ne |
not_found |
404 | Ne |
conflict |
409 | Někdy |
precondition |
412 | Ne |
quota |
402 pro tarif, 413 pro velikost | Ne |
rate_limit |
429, s hlavičkou Retry-After |
Ano |
upstream |
502 nebo 504 | Ano |
internal |
500 | Ano |
Při kontaktování podpory uveďte request_id.
Webhooky
Přihlaste se k odběru na /admin/webhooks nebo přes API na /webhook_subscriptions. Události vybírejte podle názvu (enrolment.created), oblasti (enrolment.*) nebo všechny (*). Quire nejprve odešle webhook.ping; odběr začne po odpovědi vašeho endpointu.
Doručování se řídí specifikací Standard Webhooks:
POST /hooks/quire
webhook-id: 01JB7XQK4Z8FQ2M3N4P5R6S7T8
webhook-timestamp: 1790000000
webhook-signature: v1,g0hM9SsE+OTPJTGt/tmIKtSyZlE3uFJELVlNIOLJ1OE=Ověření doručení:
- Z přesně přijatých bajtů sestavte řetězec
{webhook-id}.{webhook-timestamp}.{raw body}ještě před parsováním JSON. - Pomocí tajného klíče předplatného vypočítejte HMAC-SHA256 a zakódujte ho jako base64.
- V konstantním čase porovnejte výsledek s každou hodnotou
v1,vwebhook-signature. Při obměně tajného klíče mohou být dvě; platná je shoda s kteroukoli z nich. - Odmítněte časové razítko vzdálené od vašich hodin o více než pět minut.
import { createHmac, timingSafeEqual } from 'node:crypto';
function verify(secret, id, timestamp, rawBody, header) {
if (Math.abs(Date.now() / 1000 - Number(timestamp)) > 300) return false;
const expected = createHmac('sha256', Buffer.from(secret.replace(/^whsec_/, ''), 'base64'))
.update(`${id}.${timestamp}.${rawBody}`).digest();
return header.split(' ').some((part) => {
const [version, value] = part.split(',');
const given = Buffer.from(value ?? '', 'base64');
return version === 'v1' && given.length === expected.length && timingSafeEqual(given, expected);
});
}Zamezte duplicitám podle webhook-id: jedno doručení může přijít vícekrát. Tělo obsahuje identifikátory a stručné shrnutí; aktuální stav načtěte z prostředku. Neúspěšná doručení se s postupně delšími prodlevami opakují až 72 hodin a lze je znovu přehrát z protokolu doručení.
MCP
Server MCP Quire je na /mcp na adrese organizace a používá streamovatelný protokol HTTP. Klient MCP zjistí server OAuth z /.well-known/oauth-protected-resource; uživatel se přihlásí a udělí souhlas stejně jako kterémukoli klientovi OAuth. Nástroje jednají s oprávněními daného uživatele a před destruktivní operací vyžadují potvrzení. Administrátoři určují dostupné nástroje na /admin/integrations/mcp.
Tarify a API
Klíče API, klienti OAuth, webhooky a server MCP patří mezi oprávnění API v tarifu a obsahuje je každý standardní tarif. Tarif bez tohoto oprávnění nedovolí vytvářet klíče, klienty ani předplatná, odmítne zápisy REST a připojení MCP, ale ponechá čtení REST, aby bylo možné data exportovat. Odmítnutí je problémový dokument s kódem commerce.plan_entitlement a kategorií precondition.
Rozšíření
Typy aktivit, bloky, metody zápisu a přihlašování, typy otázek, reporty, motivy i integrace Quire se deklarují ve stejném registru rozšíření, do kterého může přidávat rozšíření self-hosted instalace. Rozšíření se kompilují do aplikace: za běhu se nenačítají žádné pluginy a hostovaná organizace je nemůže přidat. Administrátoři mohou pro svou organizaci jednotlivá rozšíření zapínat nebo vypínat na /admin/extensions (viz příručka pro administrátory).
Chcete-li rozšíření vytvořit, začněte ukázkovým blokem a motivem v packages/integration/extensions/src/sample.ts. Vyberte rozšiřující bod, přečtěte si jeho smlouvu v points.ts a deklarujte rozšíření s ID, verzí, licencí, tím, co poskytuje a vyžaduje, a informací, zda ho organizace může vypnout. Zaregistrujte ho v místě, kde se skládá webová aplikace a worker, aby se shodovaly. Registr při sestavení i při každém volání register kontroluje pravidla daného bodu. Neplatnou sadu odmítne, vypíše všechny problémy a stav registru nezmění. Vlastní testy rozšíření mají ověřit, že extensionContractProblems pro něj nic nevrací a že jeho vypnutí změní to, co rozšíření ovlivňuje.