BYOA Borrowing Capacity of Foo
De eigen agent van kredietverstrekker Foo, aangesloten op het Stater AI Platform via Bring-Your-Own-Agent. Hij beoordeelt of een hypotheekaanvraag in aanmerking komt voor de Nationale Hypotheek Garantie — volgens Foo's eigen regels, niet die van Stater.
Wat deze agent doet
Eén berekening, volledig deterministisch — geen LLM. Foo bepaalt de maximale leencapaciteit volgens het Foo Acceptatiekader Leencapaciteit 2026:
- het hoofdinkomen (het hoogste) telt volledig mee;
- elk medeaanvragersinkomen telt voor 80% mee — een tweede inkomen is echt, maar naar Foo's oordeel minder duurzaam;
- op dat toetsinkomen geldt een staffel: factor 4.05 onder € 45.000, en factor 4.80 daarvanaf.
Stater hanteert daarentegen één vlakke factor van 4,5 over het volledige gezamenlijke inkomen. De twee regels wijken beide kanten op af: bij één aanvrager leent Foo doorgaans meer, bij een gezamenlijke aanvraag minder. Dat is precies wat een eigen acceptatiekader betekent — geen fout, maar beleid.
Het antwoord bevat altijd assessor: "foo-borrowing-capacity", zodat in
het audit-spoor onmiskenbaar is dat Foo's agent het oordeel gaf en niet die van Stater.
Waar hij in de keten zit
Het platform vervangt alleen de middelste stap. Staters invoer- en uitvoerstappen blijven er altijd omheen staan:
Wat Foo niet te zien krijgt
Het platform deelt uitsluitend een dossierNumber — een verwijzing,
geen dossier. Er gaan dus helemaal geen persoonsgegevens over de grens: geen namen,
geen loonstroken, geen bedragen. Foo zoekt dat nummer op in zijn eigen documentsysteem,
precies zoals een echte kredietverstrekker dat zou doen.
Deze agent belt daarvoor niets van Stater aan: geen MCP-gateway, geen DMS, geen platform-API. Hij draait buiten het netwerk van het platform en is volledig zelfstandig. Dat is geen beperking van de demo maar het eerlijke model: wat een externe partij niet krijgt, kan zij ook niet gebruiken — en wat zij zelf weet, weet het platform niet.
Endpoints
| Endpoint | Doel |
|---|---|
GET / | deze pagina |
GET /.well-known/agent-card.json |
de A2A Agent Card — de URL die de AI-beheerder van Foo in het platform importeert |
GET /health | liveness |
POST /a2a |
de invoke — A2A v1.0 JSON-RPC (SendMessage); bearer-token
vereist zodra het secret geleverd is |
GET /docs | OpenAPI-UI |
Zelf uitproberen
Dit is de contractvorm die een echte tenant implementeert: standaard A2A v1.0 JSON-RPC, geen
Stater-specifieke envelope. Het platform stuurt de aanvraag als een SendMessage-call met
het dossiernummer in een DataPart; deze agent antwoordt met hetzelfde patroon, het
oordeel in result.message.parts[0].data. De governance-context (o.a.
X-Tenant-Id, X-Use-Case-Slug, X-Env) komt mee als HTTP-headers,
niet in de JSON-RPC-body — die draagt uitsluitend wat de A2A-spec zelf definieert. Een afwijzing van
de aanvraag zelf (bijvoorbeeld een leeg dossiernummer) is geen HTTP-fout maar een JSON-RPC
error-member bij HTTP 200 — zo blijft een aanroep die de envelope wél goed vormde, maar
een slechte payload droeg, te onderscheiden van een kapotte aanroep.
curl -X POST https://borrowing-capacity-agent.foo.aiplatform.triplebeta.nl/a2a \
-H 'Authorization: Bearer <token>' \
-H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":"1","method":"SendMessage",
"params":{"message":{"messageId":"m-1","role":"ROLE_USER",
"parts":[{"data":{"dossierNumber":"G7H8J9"}}]}}}'
{
"jsonrpc": "2.0",
"id": "1",
"result": {
"message": {
"messageId": "<uuid>",
"role": "ROLE_AGENT",
"parts": [
{
"data": {
"agentId": "borrowing-capacity",
"maxBorrowingCapacity": 331776.0,
"applicants": [
{
"name": "Pieter Jansen",
"grossIncome": 3400.0
},
{
"name": "Fatima el Amrani",
"grossIncome": 2950.0
}
],
"explanation": "Foo Acceptatiekader Leencapaciteit 2026: Hoofdinkomen EUR 40.800 telt volledig mee; medeaanvrager EUR 35.400 telt voor 80% mee. Toetsinkomen: EUR 69.120. Foo hanteert factor 4.80 (toetsinkomen vanaf EUR 45.000), wat uitkomt op een maximale leencapaciteit van EUR 331.776.",
"assessor": "foo-borrowing-capacity"
}
}
]
}
}
}