Erabili zure erakundearen API helbidea eta irismen mugatuko kredentzial bat. Hasi irakurketa-eskaera batekin, egiaztatu erantzuna eta gorde sekretuak iturburu-kodetik eta dokumentazio-adibideetatik kanpo.
Quire-k API publiko bat du: REST HTTPS bidez, OpenAPI 3.1 dokumentu batean deskribatua, gertaeretarako sinatutako webhookekin eta IA-laguntzaileentzako MCP zerbitzariarekin. APIaren erreferentziak endpoint eta gertaera guztiak zerrendatzen ditu.
Helbideak
Erakunde bakoitzak helbide propioa du, eta APIa haren azpian dago:
https://acme.quirelms.com/api/v1/coursesKredentzialak zehazten du erakundea. Erakunde bateko gakoa beste baten helbidean erabiltzen bada, eskaera ukatu egiten da.
OpenAPI dokumentua edozein erakunderen helbidean dago eskuragarri /api/v1/openapi.json helbidean; beraz, bezero-sorgailuek deitzen ari zaren bertsioa ikusten dute beti.
Autentifikazioa
API gakoak script eta zerbitzaritik zerbitzarirako integrazioetarako dira. Administratzaile batek /admin/integrations/api-keys helbidean sortzen du, haren irismenak aukeratzen ditu eta behin bakarrik ikusten du. Bidali bearer token gisa:
curl -H "Authorization: Bearer qk_live_..." https://acme.quirelms.com/api/v1/users?limit=50Gakoak qk_live_ edo qk_test_ aurrizkiarekin hasten dira. Eman integrazio bakoitzari gako propioa.
OAuth 2.1 saioa hasita duen pertsona baten moduan jarduten duten aplikazioetarako da. Erregistratu bezero bat /admin/integrations/oauth-clients helbidean; gero, erabili PKCE duen baimen-kodearen fluxua (/oauth/authorize, /oauth/token) edo bezero-kredentzialak makina-bezero baterako. Aurkikuntza /.well-known/oauth-authorization-server helbidean dago. Irismen batek tokenak egin dezakeena mugatzen du; ez dio pertsonak baino gehiago egiten uzten.
Irismenak resource:read, resource:write eta resource:delete dira; esaterako, courses:read edo enrolments:write. Lau pribilegiatuak dira eta abisu batekin erakusten dira baimen-pantailan: audit:read, roles:write, tenants:write eta users:delete.
Eskaerak
- Orrialdekatzea: zerrenda guztiak kurtsoreen bidez orrialdekatzen dira. Bidali
limit; hartunext_cursorpage-tik eta erabilicursorgisahas_moretrue den bitartean (beheko adibidea). Ez dago offsetik. - Aldaketak data batetik aurrera:
updated_sinceaukerak une batetik aurrera aldatutakoak ematen ditu. Erabiliinclude_deleted=trueparametroarekin batera edo irakurri/<resource>/deletions, zer kendu den jakiteko. - Kanpoko identifikatzaileak: baliabide gehienek zure
external_idpropioa onartzen dute;/<resource>/ext:{external_id}bideak horren bidez irakurtzen edo eguneratzen/sortzen du, sinkronizazioak Quire-ren identifikatzaileak gorde behar izan ez ditzan. - Idempotentzia: bidali
Idempotency-KeygoiburuaPOST,PATCHetaDELETEeskaeretan. Gako bera duen berriro saiakerak lehen erantzuna itzultzen du, lana bi aldiz egin beharrean. Multzoko endpointek derrigor behar dute. - Bertsioak: bertsio nagusia bidean dago (
/v1). Haren barruan, aldaketa bateraezin bakoitzak data duen berrikuspen bat du,Quire-Versiongoiburuaren bidez hautatzen dena, esaterakoQuire-Version: 2026-09-20. Goibururik gabe, kredentziala jaulki zeneko berrikuspena jasotzen duzu.
Zerrenda baten orrialde bat:
{"data": [...], "page": {"next_cursor": "eyJ2Ijox...", "has_more": true, "limit": 100}}Erroreak
Errore guztiak RFC 9457 arauko arazo-dokumentuak dira:
{"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..."}Erabakia hartzeko, erabili egonkorra den code; detail pertsonentzat idatzita dago, erakusteko segurua da eta alda daiteke. Kodea ezagutzen ez baduzu, sailkatu errorea category-ren arabera:
| Kategoria | Egoera | Berriz saiatu |
|---|---|---|
validation |
422, eremuen xehetasunak errors-en |
Ez |
authentication |
401 | Ez |
authorization |
403 | Ez |
not_found |
404 | Ez |
conflict |
409 | Batzuetan |
precondition |
412 | Ez |
quota |
402 planarentzat, 413 tamainarentzat | Ez |
rate_limit |
429, Retry-After goiburuarekin |
Bai |
upstream |
502 edo 504 | Bai |
internal |
500 | Bai |
Jarri request_id laguntzarekin harremanetan jartzean.
Webhooks
Harpidetu /admin/webhooks helbidean edo APIaren bidez, /webhook_subscriptions helbidean. Aukeratu gertaerak izenaren arabera (enrolment.created), eremuaren arabera (enrolment.*) edo guztiak (*). Quire-k lehenik webhook.ping bidaltzen du; zure endpointak erantzuten dionean hasten da harpidetza.
Bidalketek Standard Webhooks zehaztapena jarraitzen dute:
POST /hooks/quire
webhook-id: 01JB7XQK4Z8FQ2M3N4P5R6S7T8
webhook-timestamp: 1790000000
webhook-signature: v1,g0hM9SsE+OTPJTGt/tmIKtSyZlE3uFJELVlNIOLJ1OE=Bidalketa egiaztatzeko:
- Eraiki
{webhook-id}.{webhook-timestamp}.{raw body}katea jasotako byte zehatzekin, JSONa aztertu aurretik. - Kalkulatu HMAC-SHA256 haren gainean, harpidetzaren sekretua erabiliz, eta kodetu base64 formatuan.
- Konparatu denbora konstantean
v1,balio bakoitzawebhook-signaturegoiburuan. Sekretua biratzen ari bada, bi egon daitezke; bat datorren edozein balio da zuzena. - Baztertu zure erlojutik bost minutu baino gehiagora dagoen denbora-zigilua.
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);
});
}Saihestu bikoizketak webhook-id erabiliz: bidalketa bat behin baino gehiagotan hel daiteke. Gorputzak identifikatzaileak eta laburpen bat ditu; eskuratu baliabidea haren uneko egoera ikusteko. Huts egindako bidalketak berriz saiatzen dira, gero eta tarte handiagoekin, 72 orduz gehienez; bidalketa-erregistrotik berriro erreproduzi daitezke.
MCP
Quire-ren MCP zerbitzaria /mcp helbidean dago erakundearen helbidean, HTTP streaming bidez. MCP bezero batek OAuth zerbitzaria aurkitzen du /.well-known/oauth-protected-resource helbidean; pertsonak saioa hasi eta baimena ematen du OAuth bezero guztietan bezala. Tresnek pertsona horren baimenekin jarduten dute, eta ekintza suntsitzaileek berrespena eskatzen dute. Administratzaileek /admin/integrations/mcp helbidean aukeratzen dute zer tresna dauden erabilgarri.
Planak eta APIa
API gakoak, OAuth bezeroak, webhooks eta MCP zerbitzaria planaren API-eskubidearen barruan daude, eta plan estandar guztiek dute eskubide hori. Eskubidea barne hartzen ez duen plan batean, gakoa, bezeroa edo harpidetza sortzea ukatzen da; REST idazketak eta MCP konexioak ere ukatzen dira. REST irakurketek funtzionatzen jarraitzen dute datuak esportatu ahal izateko. Uko egitea arazo-dokumentu bat da, commerce.plan_entitlement kodearekin eta precondition kategorian.
Luzapenak
Quire-ren jarduera-motak, blokeak, matrikulazio- eta saio-hasiera metodoak, galdera-motak, txostenak, gaiak eta integrazioak luzapen-erregistro berean deklaratzen dira; autoostatatutako instalazio batek ere gehi ditzake. Luzapenak aplikazioan konpilatzen dira: ez dago exekuzioan pluginak kargatzeko mekanismorik, eta ostatatutako erakunde batek ezin du halakorik gehitu. Administratzaileek luzapen bakoitza erakunderako aktibatu edo desaktibatzen dute /admin/extensions helbidean (ikus administratzailearen gida).
Luzapen bat idazteko, hasi packages/integration/extensions/src/sample.ts-ko bloke eta gai laginekin. Aukeratu luzapen-puntua eta irakurri haren kontratua points.ts fitxategian; gero, deklaratu luzapena ID, bertsio eta lizentzia batekin, zer eskaintzen eta behar duen zehaztuta eta erakunde batek desaktiba dezakeen adierazita. Erregistratu web-aplikazioa eta worker-a elkartzen diren lekuan, biak ados egon daitezen. Erregistroak puntu bakoitzaren arauak egiaztatzen ditu eraikitzean eta register deitzen duzun bakoitzean; baliogabea den multzoa ukatu eta arazo guztiak izendatzen ditu, eta erregistroa aldatu gabe uzten du. Luzapenaren probek egiaztatu behar dute extensionContractProblems hutsik dagoela eta desaktibatzeak eragiten duen gauza aldatzen duela.