Voor ontwikkelaars
Partner-API
Stuur ons een klant door onder uw eigen pseudonieme identificatie - zonder e-mail, naam en andere persoonsgegevens - en lees op elk moment de stand van zijn opleiding uit. Dit dient als compliancecheck vóór een contract, een storting of een uitbetaling.
Versie 1.3.2 · JSON via HTTPS · OpenAPI
Zo werkt het
De API is voor alle partners hetzelfde. In vijf stappen:
- Wij zetten de API voor uw bedrijf aan; in uw beheeromgeving maakt u op het tabblad API een API-sleutel aan.
- Wanneer een klant een opleiding moet volgen, roept uw systeem POST /v1/users aan met uw identificatie van de klant.
- Wij maken een profiel aan zonder e-mail en geven een toegangslink (entryUrl) terug; die toont u de klant als knop.
- De klant klikt erop en zit direct in de cursus.
- De stand leest u op elk moment uit via GET /v1/users/{identifier}, of wij melden hem aan uw server via een webhook.
U bent de verwerkingsverantwoordelijke voor de identificatie, wij verwerken alleen gepseudonimiseerde gegevens. Stuur als identificatie nooit een e-mailadres of een naam - een e-mailadres weigert de API met de fout 422.
Adres en authenticatie
Elke aanroep gaat via HTTPS naar het adres hieronder en draagt uw API-sleutel in de header Authorization.
https://api.responsiblo.com Authorization: Bearer rsb_live_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
- rsb_live_... opent uw productieprogramma, rsb_test_... uw testprogramma (sandbox).
- De sleutel wordt maar één keer getoond, bij het aanmaken; wij bewaren alleen de vingerafdruk ervan. Bewaar hem als geheim op uw server - nooit in een browser of een app.
- De sleutel heeft rechten: read (de stand en de lijst van personen, het certificaat) en write (het doorsturen en anonimiseren van personen). Hij kan beperkt zijn tot uw IP-adressen en een geldigheid hebben.
- Vervanging: u maakt een nieuwe sleutel aan, de oude blijft nog 7 dagen geldig en verloopt dan.
- Antwoorden worden nooit in de cache opgeslagen (Cache-Control: no-store) en de API neemt geen aanroepen vanuit een browser aan (geen CORS).
POST /v1/users
Stuurt een persoon door naar het programma van de sleutel (recht 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"}'
| Veld | Verplicht | Betekenis |
|---|---|---|
identifier |
ja | Uw pseudoniem van de persoon, 1 tot 64 tekens A-Z a-z 0-9 . _ : @ -; nooit een e-mailadres (geweigerd met 422). |
program |
nee | Code van het programma; als u die opgeeft, moet het het programma van de sleutel zijn. |
language |
nee | Taal van de cursus (cs, en, ...); standaard de eerste taal van het programma. |
label |
nee | Uw label - een cohort of een campagne, 1 tot 64 tekens, nooit een persoonsgegeven. |
expiresAt |
nee | Laatste dag van de toegang, JJJJ-MM-DD. |
201 Created voor een nieuwe persoon, 200 OK als de identificatie al bestaat - er verandert niets, de aanroep kan veilig worden herhaald. De body is de stand hieronder, inclusief entryUrl. Een uitgeputte limiet van personen of van licenties van het programma geeft 403.
GET /v1/users/{identifier}
Stand van een persoon (recht read): wat een compliancecheck nodig heeft, niets meer.
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-company.responsiblo.com/entry/..."
}
status | Betekenis |
|---|---|
enrolled |
doorgestuurd, nog niet binnengekomen |
started |
binnengekomen, nog niets afgerond |
in_progress |
heeft lessen afgerond, het programma nog niet |
completed |
het programma is afgerond (completedAt) |
expired |
de toegang is beëindigd (expiresAt is verstreken; een persoon in de sandbox stopt na 7 dagen) |
quizScore is het resultaat van de eindquiz in %, zodra die is afgerond. Tijden zijn in UTC op hele seconden. Het veld certificate bevat het certificaat van de persoon (zie hieronder); zolang die er geen heeft, is het null.
?include=detail
Voegt de voortgang in elke cursus en het resultaat van elke quiz toe - nooit de afzonderlijke antwoorden.
"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"}]
GET /v1/users
Lijst van de personen die u naar het programma van de sleutel hebt doorgestuurd (recht read), per pagina: elk item heeft de vorm van de stand hierboven. Optioneel status (alleen personen in die stand), limit (1 tot 500, standaard 100) en cursor.
curl "https://api.responsiblo.com/v1/users?status=completed&limit=100" -H "Authorization: Bearer $RSB_KEY"
{
"items": [{ "identifier": "client-48213", "status": "completed", "...": "the state of GET /v1/users/{identifier}" }],
"nextCursor": "MjAyNi0xMC0yMFQxMDowMjoxMVp8...",
"limit": 100
}
curl "https://api.responsiblo.com/v1/users?status=completed&limit=100&cursor=MjAyNi0xMC0yMFQxMDowMjoxMVp8..." -H "Authorization: Bearer $RSB_KEY"
- Ga verder met cursor = nextCursor zolang nextCursor niet null is; de cursor is een ondoorzichtige tekst, stel hem nooit zelf samen.
- Personen komen op volgorde van het moment van doorsturen, in een vaste volgorde (ook bij hetzelfde moment), geen enkele twee keer; geanonimiseerde personen staan niet in de lijst.
- Met het filter status bekijken we per pagina hoogstens 2000 personen, een pagina kan daarom minder items hebben dan limit, of zelfs geen - ga verder zolang er een nextCursor is.
Certificaat van de persoon
Zodra de persoon het programma afrondt, geeft de cursus een certificaat af - onder het pseudoniem van de persoon (de bijnaam van het profiel ID XXXXXX), zonder naam en zonder e-mail. Er wordt niets per e-mail verstuurd; in de stand van de persoon staat het veld certificate met het nummer, de tijden en de openbare verificatiepagina, en de pdf downloadt u via GET /v1/users/{identifier}/certificate.
"certificate": {
"number": "RSP-7KQ2-M4XH-9TWB",
"issuedAt": "2026-10-20T10:39:15Z",
"expiresAt": "2028-10-20T10:39:12Z",
"verifyUrl": "https://responsiblo.com/verify/RSP-7KQ2-M4XH-9TWB"
}
curl https://api.responsiblo.com/v1/users/client-48213/certificate -H "Authorization: Bearer $RSB_KEY" -o client-48213.pdf
- De verificatiepagina verifyUrl toont alleen het pseudoniem, het programma, de partner en de geldigheid - nooit uw identificatie.
- De pdf geeft application/pdf terug (recht read). Zonder certificaat is het antwoord 404 certificateNotFound, terwijl de pdf nog wordt gemaakt 404 certificatePdfNotReady met Retry-After.
- Een ingetrokken certificaat wordt nooit uitgegeven (het veld certificate is dan null, de pdf 404); een certificaat waarvan de geldigheid is verstreken, blijft een waarheidsgetrouw bewijs en wordt uitgegeven.
- Een webhook meldt het certificaat met de gebeurtenis certificate.issued (direct na user.completed).
DELETE /v1/users/{identifier}
Anonimiseert een persoon (recht write): uw identificatie, het label en elk webhookbericht dat haar noemt, verdwijnen uit het profiel; de toegangslinks zijn niet meer geldig. Het certificaat en het resultaat van de cursus blijven onder het nummer van het certificaat bestaan - als compliancebewijs.
curl -X DELETE https://api.responsiblo.com/v1/users/client-48213 -H "Authorization: Bearer $RSB_KEY" HTTP/1.1 204 No Content
Antwoord 204 zonder body; elke volgende aanroep met dezelfde identificatie geeft 404 userNotFound, herhalen is dus veilig. Dezelfde identificatie kunt u daarna opnieuw doorsturen als een nieuwe persoon.
Toegangslink
Toon entryUrl aan de persoon (een knop Cursus starten in uw systeem). De link meldt de persoon aan in de cursus - zonder e-mail en zonder wachtwoord.
De link is 30 dagen geldig en kan meerdere keren worden gebruikt; elke aanroep GET /v1/users/{identifier} geeft een nieuwe. Stuur hem nooit naar iemand anders: wie de link heeft, komt binnen als die persoon.
Webhooks
Op het tabblad API van uw beheeromgeving stelt u per programma één webhook in: een openbaar HTTPS-adres van uw server en de gebeurtenissen. Daarna sturen wij u een POST met JSON - alleen identificaties en standen, nooit de toegangslink.
| Gebeurtenis | Wanneer |
|---|---|
user.enrolled |
de persoon is doorgestuurd (de eerste keer dat uw webhook haar kent) |
user.started |
de persoon is de cursus binnengekomen |
user.completed |
de persoon heeft het programma afgerond |
certificate.issued |
de persoon heeft een certificaat behaald; data bevatten certificate (nummer, tijden, verifyUrl) |
user.expired |
de toegang van de persoon is beëindigd |
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=1792492800,v1=3f1c...e9
{
"id": "5b0c1f9e-2d1a-4a57-9a3e-0d6c9c1f2b77",
"type": "user.completed",
"createdAt": "2026-10-20T10:40:00Z",
"apiVersion": "1.3.2",
"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
}
}
Handtekening
Elk bericht draagt de header X-Responsiblo-Signature: t=<Unix-tijd>,v1=<HMAC-SHA256 van de tekst t.body met het geheim van de webhook, hex>. Het geheim (whsec_...) wordt één keer getoond bij het aanmaken van de webhook. Controleer de handtekening en de leeftijd van t voordat u een bericht vertrouwt; gebruik X-Responsiblo-Delivery als idempotentiesleutel.
// 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]);
Aflevering en herhaling
Afgeleverd = antwoord 2xx binnen 10 seconden. Anders proberen we het opnieuw na 1 minuut, 5 minuten, 30 minuten, 2 uur en 12 uur, daarna geven we het op. Omleidingen volgen we niet.
20 niet-afgeleverde berichten op rij zetten de webhook uit tot u hem weer aanzet; de berichten uit die tijd wachten. De knop Test stuurt een ping; het afleverlogboek vindt u in uw beheeromgeving.
De gebeurtenis certificate.issued voegt u in de instellingen van een webhook toe; een webhook die vóór versie 1.2 is aangemaakt, krijgt hem niet vanzelf.
Fouten
Elke fout heeft één vorm: status, code, reason en message; een fout 422 voegt errors toe (veld - wat er mis is).
{ "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 | Wat te doen |
|---|---|---|
| 400 | invalidJson |
stuur één JSON-object |
| 401 | missingToken, invalidToken |
stuur een geldige sleutel (een ingetrokken en een verlopen sleutel zien er hetzelfde uit); de header WWW-Authenticate zegt Bearer |
| 403 | scopeDenied, ipNotAllowed, apiDisabled, partnerInactive, spaceUnavailable, httpsRequired, userLimitReached, seatsExhausted |
de sleutel mag dit niet, de API staat uit voor uw bedrijf, of het programma is vol |
| 404 | userNotFound, notFound |
in het programma van de sleutel is geen persoon met deze identificatie (ook geen geanonimiseerde) |
| 404 | certificateNotFound, certificatePdfNotReady |
de persoon heeft nog geen certificaat, of de pdf ervan wordt gemaakt - probeer het opnieuw na Retry-After |
| 409 | identifierTaken |
de identificatie hoort bij een persoon van een ander programma |
| 422 | invalidBody, invalidParameter |
zie errors (veld van de body of parameter van de query - wat er mis is) |
| 429 | rateLimited |
wacht Retry-After seconden |
| 500 | internalError |
probeer het later opnieuw; vermeld incidentId bij onze support |
Voor programma's en agents
- Beslis op basis van code en reason, nooit op basis van de tekst van message; errors is een object veld -> wat er mis is.
- Herhaal alleen 429, 500 en certificatePdfNotReady, en wel na Retry-After seconden (anders met een groeiende tussenpoos); herhaal andere 4xx dan 429 niet zonder de aanroep te corrigeren.
- POST /v1/users is idempotent op identifier (201 de eerste keer, daarna 200); DELETE geeft de eerste keer 204 en daarna 404 - beide kunnen veilig worden herhaald.
- Ontdubbel webhooks op X-Responsiblo-Delivery; de volgorde van de berichten is niet gegarandeerd, de stand in data is beslissend.
Leninggids
De leninggids is een korte cursus voor een aanvrager bij een kredietverstrekker: vóór de ondertekening van het contract doorloopt de aanvrager drie lessen, acht praktijksituaties en eventueel een quiz, alles met de cijfers van de eigen offerte, en bevestigt aan het einde de offerte. Op elk scherm kan de aanvrager om uitleg vragen. De offerte stuurt u via de API, u krijgt een toegangslink en een webhook meldt u het resultaat.
De leninggids activeren wij in overleg met u.
Ook hier is de aanvrager alleen uw pseudonieme profiel uit POST /v1/users. De offerte wordt bepaald door uw referenties (externalApplicationId, offerReference) en de documenten alleen door een link met een SHA-256-vingerafdruk - nooit een naam, e-mail, persoonsnummer, rekeningnummer of telefoonnummer. responsiblo keurt de lening niet goed, downloadt of bewaart de documenten niet, verifieert de identiteit niet en geeft voor de gids geen certificaat af.
- U maakt het profiel van de aanvrager aan: POST /v1/users met uw pseudoniem.
- U stuurt de offerte: POST /v1/users/{identifier}/loan-offers; het antwoord 201 bevat entryUrl.
- entryUrl geeft u aan de aanvrager via uw eigen geverifieerde kanaal. De link is 30 dagen geldig en kan meerdere keren worden gebruikt; de gids toont de cijfers van de offerte van de aanvrager.
- Het einde hoort u via een webhook (loanGuide.completed, loanGuide.assistanceRequested en andere).
- De stand leest u via GET …/loan-offers/{offerReference}, de vastlegging voor uw dossier via GET …/evidence. Gewijzigde offerte = nieuwe offerte met supersedes, ingetrokken aanvraag = POST …/cancel.
Tot de activering antwoorden de bewerkingen van de gids met 404 notFound of 409 loanGuideNotConfigured. Het recht write verstuurt en annuleert een offerte, read leest de stand en de vastlegging.
POST /v1/users/{identifier}/loan-offers
Stuurt een offerte naar het profiel van de aanvrager (recht write). De optionele header Idempotency-Key heeft 1 tot 255 zichtbare ASCII-tekens. Voorbeeld: een lening van CZK 10.000, terug te betalen CZK 10.800 in één betaling 30 dagen na de uitbetaling, JKP (jaarlijks kostenpercentage) 155,10%.
curl -X POST https://api.responsiblo.com/v1/users/applicant-30417/loan-offers \
-H "Authorization: Bearer $RSB_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: offer-30417-1" \
-d '{
"externalApplicationId": "APP-30417",
"offerReference": "OFF-30417-1",
"locale": "cs-CZ",
"currency": "CZK",
"principalMinor": 1000000,
"disbursedAmountMinor": 1000000,
"totalPayableMinor": 1080000,
"aprPercent": "155.10",
"interestRate": { "percent": "8", "period": "month" },
"repayment": {
"type": "singlePayment",
"amountMinor": 1080000,
"due": { "kind": "relative", "days": 30, "anchor": "disbursement" }
},
"documents": [
{ "role": "precontract_information", "reference": "DOC-PRE-30417", "title": "Předsmluvní informace",
"url": "https://documents.lender.example/pre/30417.pdf",
"sha256": "623f4a37e444268c076896d6c2f389b46f568d1a26539b013f2ba25d03846f72" },
{ "role": "contract_package", "reference": "DOC-CON-30417", "title": "Smlouva a podmínky",
"url": "https://documents.lender.example/contract/30417.pdf",
"sha256": "9c7bfe0077d1189914f0e1c483c961f4c5b36e9892385f3d2ab6168e0c088aa6" }
],
"validUntil": "2026-11-15T18:00:00Z"
}'
HTTP/1.1 201 Created
{
"offerReference": "OFF-30417-1",
"externalApplicationId": "APP-30417",
"offerStatus": "active",
"guideStatus": "created",
"validUntil": "2026-11-15T18:00:00Z",
"snapshotSha256": "8055bfa3c5f2c163691b85785eaf61221169a123bed67aff2c1dbaf2a8e44e7e",
"entryUrl": "https://your-company.responsiblo.com/entry/...",
"createdAt": "2026-11-10T09:14:05Z"
}
| Veld | Verplicht | Betekenis |
|---|---|---|
externalApplicationId |
ja | Uw aanvraagnummer, 1 tot 128 tekens A-Z a-z 0-9 . _ : -; nooit een e-mailadres. |
offerReference |
ja | Uw referentie van de offerte, dezelfde regels als externalApplicationId. |
locale |
ja | Taal en land van de gids: cs-CZ. |
currency |
ja | Valuta: CZK. |
principalMinor |
ja | Leenbedrag in heller (honderdste van een kroon), een geheel getal van 1 tot 10.000.000.000. |
disbursedAmountMinor |
ja | Uitbetaald bedrag in heller; moet gelijk zijn aan het leenbedrag. |
totalPayableMinor |
ja | Totaal terug te betalen bedrag in heller; minstens het leenbedrag en precies de som van de betalingen. |
aprPercent |
ja | JKP in procenten als tekst ("155.10"), door u berekend en gegarandeerd. Positieve kosten met een JKP van 0 weigert de API. |
interestRate |
nee | Rentevoet {percent, period}, period = year, month of day. |
repayment |
ja | Aflossing: singlePayment {amountMinor, due} met een datum (kind date) of een aantal dagen na de uitbetaling (kind relative, 1 tot 365), of installments {schedule: [{date, amountMinor}]} met 1 tot 360 termijnen in oplopende volgorde, geen enkele in het verleden. Het type moet overeenkomen met het product dat voor uw gids is ingesteld. |
documents |
ja | 2 tot 10 documenten {role, reference, title, url, sha256}; de rollen die de instellingen van uw gids vereisen, zijn gedekt (standaard precontract_information en contract_package). url alleen HTTPS op een host die in de instellingen van uw gids is toegestaan, hoogstens 2.048 tekens, zonder inloggegevens; sha256 = 64 hexadecimale tekens die u zelf opgeeft. |
validUntil |
ja | Geldigheid van de offerte, RFC 3339 met tijdverschuiving, in de toekomst en hoogstens 7 dagen vooruit. |
supersedes |
nee | offerReference van de actieve offerte van hetzelfde profiel die de nieuwe offerte vervangt. |
returnUrl |
nee | Optioneel: het adres waarnaar de pagina 'Klaar' de aanvrager na de gids terugstuurt. Alleen absolute HTTPS, maximaal 2.048 tekens, zonder inloggegevens; de symbolen {offerReference} en {externalApplicationId} vervangen wij door de referenties van de offerte. Zonder dit adres geldt het terugkeeradres uit de instellingen van uw gids. |
Dezelfde body opnieuw (onder dezelfde referenties of dezelfde Idempotency-Key) geeft 200 met de bestaande offerte en een nieuwe entryUrl; een andere body daaronder geeft 409 offerConflict. Een profiel heeft één actieve offerte: een volgende zonder supersedes geeft 409 activeOfferExists, een foutieve supersedes 409 notSupersedable. De instellingen van uw gids (quiz, contact) worden op dat moment voor de offerte vergrendeld.
Stand, vastlegging en annulering
GET /v1/users/{identifier}/loan-offers/{offerReference}- stand (recht read): offerStatus (active, expired, superseded, cancelled), guideStatus (created, in_progress, completed), afgeronde lessen, praktijk, quiz (null als die uit staat) en de momenten van het voorleggen van de offerte, de bevestiging en het verzoek om uitleg. Nooit antwoorden, waarden van de offerte of de link. De afronding blijft, ook als de offerte later verloopt.GET /v1/users/{identifier}/loan-offers/{offerReference}/evidence- vastlegging voor uw dossier (recht read): schemaVersion loan-guide-evidence/1, een momentopname van uw offerte met de vingerafdruk snapshotSha256, de uitgave van de cursus met vingerafdrukken van de lessen, gebeurtenissen in de volgorde sequence, elk antwoord met alle pogingen, de bevestiging en limitations - wat de vastlegging niet bewijst (voorgelegd betekent niet gelezen, de identiteit beweert u, documenten alleen via een link, geen certificaat, geen goedkeuring van de lening).POST /v1/users/{identifier}/loan-offers/{offerReference}/cancel- annuleert een actieve offerte (recht write), reasonCode = withdrawn_by_provider of application_closed; 200 geeft de stand terug, een offerte die niet actief is of waarvan de gids is afgerond, geeft 409 notActive.
curl https://api.responsiblo.com/v1/users/applicant-30417/loan-offers/OFF-30417-1 -H "Authorization: Bearer $RSB_KEY"
{
"offerReference": "OFF-30417-1",
"externalApplicationId": "APP-30417",
"offerStatus": "active",
"guideStatus": "completed",
"quizEnabled": true,
"lessonsCompleted": 3,
"lessonsTotal": 3,
"practiceCompleted": true,
"quizPassed": true,
"offerPresentedAt": "2026-11-10T18:32:47Z",
"confirmedAt": "2026-11-10T18:34:02Z",
"completedAt": "2026-11-10T18:34:02Z",
"assistanceRequested": false,
"assistanceRequestedAt": null,
"validUntil": "2026-11-15T18:00:00Z",
"evidenceErased": false,
"...": "..."
}
curl -X POST https://api.responsiblo.com/v1/users/applicant-30417/loan-offers/OFF-30417-1/cancel \
-H "Authorization: Bearer $RSB_KEY" \
-H "Content-Type: application/json" \
-d '{"reasonCode":"withdrawn_by_provider"}'
?externalApplicationId= is alleen nodig als één offerReference bij meerdere aanvragen van het profiel hoort (anders 409 ambiguousOfferReference).
Webhooks van de gids
De webhook van het programma (zie Webhooks) ontvangt de gebeurtenissen van de gids zonder apart abonnement. Handtekening, aflevering en herhaling zijn dezelfde als bij de andere gebeurtenissen; data bevatten identifier, offerReference, externalApplicationId, guideStatus, occurredAt en sequence (volgorde van de gebeurtenissen van één offerte) - nooit de vastlegging, waarden van de offerte of de toegangslink.
| Gebeurtenis | Wanneer |
|---|---|
loanGuide.completed |
de aanvrager heeft de gids doorlopen en de offerte bevestigd |
loanGuide.assistanceRequested |
de aanvrager heeft om uitleg gevraagd (neem telefonisch contact op) |
loanGuide.expired |
validUntil van de offerte is verstreken |
loanGuide.superseded |
een nieuwe offerte heeft de offerte vervangen (supersedes) |
loanGuide.cancelled |
u hebt de offerte geannuleerd |
POST https://your-server.example/responsiblo/webhook
Content-Type: application/json
X-Responsiblo-Event: loanGuide.completed
X-Responsiblo-Delivery: 0f6e2a4c-91d3-4b8e-a7c5-3e2d1b9f6a08
X-Responsiblo-Signature: t=1794335647,v1=8b2d...4c
{
"id": "0f6e2a4c-91d3-4b8e-a7c5-3e2d1b9f6a08",
"type": "loanGuide.completed",
"createdAt": "2026-11-10T18:34:07Z",
"apiVersion": "1.3.2",
"program": "your-program",
"data": {
"identifier": "applicant-30417",
"offerReference": "OFF-30417-1",
"externalApplicationId": "APP-30417",
"guideStatus": "completed",
"occurredAt": "2026-11-10T18:34:02Z",
"sequence": 23
}
}
Elke gebeurtenis komt bij één webhook hoogstens één keer aan (idempotentiesleutel = X-Responsiblo-Delivery). Een later aangemaakte webhook speelt oudere gebeurtenissen niet opnieuw af en gebeurtenissen ouder dan 28 dagen worden niet meer gemeld.
Bewaartermijn van de vastlegging
Wanneer het traject van een offerte eindigt (afgeronde, geannuleerde, verlopen of vervangen offerte), loopt de bewaartermijn uit de instellingen van uw gids (standaard 30 dagen). Daarna wordt de vastlegging verwijderd: GET …/evidence geeft 410 evidenceErased en de stand antwoordt verder met evidenceErased: true, de referenties en de momenten. Een actieve offerte wordt nooit verwijderd. De vastlegging die u moet bewaren, downloadt u direct na loanGuide.completed.
Fouten van de gids
Fouten hebben de vorm van de API hierboven. Daarnaast voor de gids:
| HTTP | reason | Wat te doen |
|---|---|---|
| 404 | offerNotFound |
het profiel heeft zo'n offerte niet (userNotFound = profiel bestaat niet) |
| 409 | offerConflict, activeOfferExists, notSupersedable |
de referenties of de Idempotency-Key horen al bij een andere body, of het profiel heeft een andere actieve offerte - stuur supersedes |
| 409 | loanGuideNotConfigured |
de gids is niet geactiveerd voor uw programma - schrijf ons |
| 409 | ambiguousOfferReference |
vul ?externalApplicationId= aan |
| 409 | notActive |
de offerte is niet actief of de gids is afgerond |
| 410 | evidenceErased |
de vastlegging is na de bewaartermijn verwijderd, de stand blijft |
| 422 | invalidOffer |
errors = {pad: code[,code]} met het pad in de body (repayment.schedule[2].date, documents[0].url); codes in de tabel hieronder |
| 422 | invalidBody |
supersedes, Idempotency-Key of de body van de annulering |
errors | Foutcodes van invalidOffer |
|---|---|
required |
veld ontbreekt |
invalidFormat |
verkeerde vorm (type, patroon, lengte, link zonder HTTPS of met inloggegevens) |
outOfRange |
buiten het toegestane bereik (bedrag, aantal documenten, termijnen of dagen) |
notEqualPrincipal |
het uitbetaalde bedrag is niet gelijk aan het leenbedrag |
sumMismatch |
de som van de betalingen is niet gelijk aan het totaal terug te betalen bedrag |
belowPrincipal |
het totaal terug te betalen bedrag is lager dan het leenbedrag |
aprContradiction |
JKP 0 bij positieve kosten |
typeMismatch |
het type aflossing komt niet overeen met het product dat voor uw gids is ingesteld |
missingRole |
er ontbreekt een document met een rol die de instellingen van uw gids vereisen |
hostNotAllowed |
de link van een document wijst naar een host die de instellingen van uw gids niet toestaan |
notAscending |
de data van de termijnen zijn niet oplopend of herhalen zich |
inPast |
de datum van een termijn of validUntil ligt in het verleden |
tooFar |
validUntil ligt meer dan 7 dagen vooruit |
unsupported |
niet-ondersteunde waarde (locale, currency, type, period, kind) |
unknownField |
veld dat de API niet kent |
looksLikeEmail |
referentie lijkt op een e-mailadres |
Een fout herhaalt nooit een waarde die u hebt gestuurd. Voorbeeld: dezelfde offerte met een betaling van CZK 10.700 in plaats van CZK 10.800 en een geldigheid van 9 dagen:
"repayment": { "type": "singlePayment", "amountMinor": 1070000, "due": { "kind": "relative", "days": 30, "anchor": "disbursement" } },
"validUntil": "2026-11-19T18:00:00Z"
HTTP/1.1 422 Unprocessable Entity
{
"status": "error",
"code": 422,
"reason": "invalidOffer",
"message": "The offer contains invalid data.",
"errors": {
"repayment.amountMinor": "sumMismatch",
"validUntil": "tooFar"
}
}
Limieten
120 aanroepen per minuut per sleutel. Na 30 geweigerde sleutels vanaf één adres binnen tien minuten wacht het adres 10 minuten.
Het logboek van de aanroepen (zonder bodies, de identificatie alleen als SHA-256-vingerafdruk) bewaren we 180 dagen, afgeleverde en opgegeven webhookberichten 30 dagen.
Status en contract
GET /v1/status- zonder sleutel, geeft {"status":"ok","version":"1.3.2"}GET /openapi- zonder sleutel, het OpenAPI 3-document van de partner-API
Sandbox
De testsleutel rsb_test_... opent uw testprogramma met dezelfde cursus. Personen daarin stoppen na 7 dagen; de webhook van het testprogramma staat los van die van productie.
Versiegeschiedenis
- 1.3.2 (2026-11) - Elke bewerking van het OpenAPI-document heeft een naam en een beschrijving, en de bewerkingen zijn in groepen ingedeeld. /v1/status en de webhooks melden de versie 1.3.2. De vorm van de verzoeken en antwoorden blijft ongewijzigd.
- 1.3.1 (2026-10) - Correcties zonder wijziging van de endpoints en hun antwoorden.
- 1.3.0 (2026-10) - Leninggids: POST /v1/users/{identifier}/loan-offers, stand, vastlegging en annulering van een offerte, webhooks loanGuide.*, bewaartermijn van de vastlegging. Optioneel veld returnUrl van een offerte (eigen terugkeeradres).
- 1.2.0 (2026-10) - GET /v1/users met paginering, het certificaat van de persoon (veld certificate, GET /v1/users/{identifier}/certificate, gebeurtenis certificate.issued), DELETE /v1/users/{identifier} (anonimisering), identificatie van hoogstens 64 tekens, bewaartermijn van het logboek.
- 1.1.0 (2026-10) - API-sleutels, POST /v1/users, GET /v1/users/{identifier} met ?include=detail, toegangslink, webhooks, één vorm van fouten, openbare status en OpenAPI, limieten.
- 1.0.0 (2024) - GET /v1/user/{identifier} met de JWT van de partnersleutel.
Wilt u de API voor uw bedrijf? Schrijf ons