Uw AI-register uitlezen vanuit een eigen systeem
Een directie die elk kwartaal om een overzicht vraagt. Een Power BI-rapport waar de rest van de organisatie al in kijkt. Een assistent die vragen over uw AI-systemen moet kunnen beantwoorden. Daarvoor is deze API er: alleen lezen, met een token dat u zelf aanmaakt en weer intrekt.
Aan de slag in drie stappen
- Maak een token aan. Ga naar Instellingen, tabblad Koppelingen. Geef aan waar u het voor gebruikt en bewaar het token meteen: u ziet het één keer.
- Controleer de verbinding. Roep
/api/v1/meaan. Die geeft uw organisatienaam terug en verder niets. - Haal op wat u nodig heeft. Elk endpoint hieronder werkt met hetzelfde token.
curl -H "Authorization: Bearer aich_..." \
https://www.aicompliancehub.nl/api/v1/meEndpoints
Alles onder /api/v1/, alles met de methode GET. Er bestaan geen schrijf-endpoints.
| Pad | Wat het geeft |
|---|---|
/me | De organisatie, het pakket en het label van uw token. Geeft geen registerdata, dus hiermee controleert u of een verbinding werkt. |
/systems | De AI-systemen en AI-agents die deze organisatie in haar register heeft staan, met risicoclassificatie, rol onder de AI Act, status en reviewplanning. |
/obligations | De compliance-verplichtingen per AI-systeem, met de vindplaats in de AI Act, de status en de eventuele deadline. |
/tasks | De compliance-taken van de organisatie: wat er nog moet gebeuren, met prioriteit, deadline en het artikel waar de taak uit voortkomt. |
/documents | De compliance-documenten van de organisatie, als metadata. De inhoud van een document komt hier bewust niet doorheen; die staat in het platform zelf. |
/systems/{id} | Eén AI-systeem met alle detailvelden erbij, inclusief de agent-eigenschappen en de onderbouwing van de classificatie. |
/score | De compliance-score zoals het dashboard hem rekent, opgesplitst in wettelijk en governance, met de kritieke gaten apart. |
Filters per endpoint
Een onbekende waarde of een onbekende parameternaam levert een 400 op met de reden erbij, nooit stilzwijgend een ongefilterde lijst. Alle lijsten pagineren met limit (maximaal 200) en offset.
/systems- risk_category
- — Risicocategorie onder de AI Act. 'high' is Bijlage III of Bijlage I, 'limited' raakt de transparantieplicht van Artikel 50. Toegestaan: minimal, limited, high, prohibited, unclassified.
- status
- — Levensfase van het systeem binnen de organisatie. Toegestaan: active, inactive, archived, under_review.
- org_role
- — De rol van deze organisatie bij dit systeem. Die rol bepaalt welke verplichtingen gelden: een aanbieder draagt andere plichten dan een gebruiksverantwoordelijke. Toegestaan: provider, deployer, importer, distributor.
- approval_status
- — Of een beheerder het systeem heeft beoordeeld en goedgekeurd. Toegestaan: niet_beoordeeld, goedgekeurd, afgekeurd.
- is_agent
- — true geeft alleen AI-agents, false alleen gewone systemen.
- updated_since
- — Alleen systemen die sinds deze datum zijn gewijzigd. ISO-8601.
- q
- — Zoekt in de naam van het systeem.
/obligations- ai_system_id
- — Alleen de verplichtingen van dit ene AI-systeem.
- status
- — Status van de verplichting. Toegestaan: not_started, in_progress, completed, not_applicable.
- due_before
- — Alleen verplichtingen met een deadline op of vóór deze datum.
/tasks- status
- — Status van de taak. Toegestaan: open, in_progress, done, wontfix.
- priority
- — Prioriteit van de taak. Toegestaan: low, normal, high.
- ai_system_id
- — Alleen taken bij dit AI-systeem.
- due_before
- — Alleen taken met een deadline op of vóór deze datum.
/documents- document_type
- — Documenttype, bijvoorbeeld ai_policy of fria. Toegestaan: human_oversight_procedure, transparency_notice, worker_info_notice, affected_persons_notice, fria, eu_database_registration, risk_assessment, data_governance, technical_docs, ai_policy, supplier_questionnaire, ai_procurement_terms, incident_report, audit_tooling_beleid, training_cert, evidence_upload, other.
- ai_system_id
- — Alleen documenten bij dit AI-systeem.
De MCP-server
Op /api/v1/mcp draait een server die het Model Context Protocol spreekt. Daarmee bevraagt een AI-assistent uw register zelf, in plaats van dat iemand antwoorden overtypt. Hij gebruikt hetzelfde token en kan precies hetzelfde als de API hierboven: lezen.
claude mcp add --transport http aicompliancehub \
https://www.aicompliancehub.nl/api/v1/mcp \
--header "Authorization: Bearer aich_..."Beschikbare tools
register_list_systems— De AI-systemen en AI-agents die deze organisatie in haar register heeft staan, met risicoclassificatie, rol onder de AI Act, status en reviewplanning.register_list_obligations— De compliance-verplichtingen per AI-systeem, met de vindplaats in de AI Act, de status en de eventuele deadline.register_list_tasks— De compliance-taken van de organisatie: wat er nog moet gebeuren, met prioriteit, deadline en het artikel waar de taak uit voortkomt.register_list_documents— De compliance-documenten van de organisatie, als metadata. De inhoud van een document komt hier bewust niet doorheen; die staat in het platform zelf.register_get_system— Eén AI-systeem uit het register met alle detailvelden: beschrijving, versie, de agent-eigenschappen en de onderbouwing van de risicoclassificatie. Het id komt uit register_list_systems.register_get_score— De compliance-score van de organisatie zoals het dashboard hem rekent, opgesplitst in een wettelijk deel en een governance-deel, met per onderdeel het artikel uit de AI Act en de kritieke gaten apart.
De grens van de MCP-server vandaag
Inloggen gaat met een vast token, zonder OAuth. Claude Code en elke andere client die een vaste header meestuurt, sluiten daarmee direct aan. In claude.ai werkt het als custom connector via de instelling Request headers, die Anthropic op dit moment als bèta openzet voor een deel van de organisaties. Inloggen met OAuth bouwen we zodra een klant erom vraagt.
Een assistent leest ook de vrije tekst uit uw register, zoals de beschrijving van een systeem. Wie die tekst invult, kan er instructies in zetten die het model opvolgt. Gebruikt uw assistent ook tools die namens u mailen, bestanden delen of iets wijzigen, bevestig dan elke actie van die tools zelf.
Antwoorden en fouten
Elk antwoord draagt een ok-vlag. Bij een lijst zit er een pagination-blok bij met het totaal, zodat u weet of er meer is.
{
"ok": true,
"data": [ … ],
"pagination": { "limit": 50, "offset": 0, "total": 214, "has_more": true }
}| Code | HTTP | Betekenis |
|---|---|---|
missing_token | 401 | Er zat geen Authorization-header op het verzoek. |
invalid_token | 401 | Het token is onbekend of ingetrokken. |
not_available | 403 | API-toegang hoort bij Scale. |
not_found | 404 | Het gevraagde systeem bestaat niet binnen uw organisatie. |
invalid_parameter | 400 | De melding noemt het filter of de pagineerwaarde die fout is. |
rate_limited | 429 | Uurlimiet bereikt. De Retry-After-header zegt hoelang. |
server_error | 500 | Er ging iets mis aan onze kant. |
Het aanmeldpunt voor agents
Lezen gaat via de API hierboven. Aanmelden gaat via een apart aanmeldpunt, met een eigen token dat een beheerder aanzet onder AI-register, tabblad AI-agents (vanaf Scale). Een agent, een CI-pipeline of een coding-assistent stuurt daar een manifest naartoe. Niets komt daarmee rechtstreeks in het register: een nieuwe agent en een gewijzigde agent wachten allebei op een beheerder.
Het token gaat in een header, nooit in de URL. Zet het in de pipeline als secret, bijvoorbeeld AICOMPLIANCEHUB_AGENT_TOKEN.
POST https://www.aicompliancehub.nl/api/agent-intake
Authorization: Bearer <agent-token>
Content-Type: application/jsonHet manifest
Bewaar het per agent in de repo als aicompliancehub-agent.json. Het JSON Schema staat op /schemas/agent-manifest.v1.json, zodat een editor of assistent het bestand kan controleren. De namen description en version uit de A2A Agent Card werken ook.
| Veld | Waarde | Wat |
|---|---|---|
agent_ref | tekst | Vaste sleutel van deze agent, bijvoorbeeld repo plus map. Daarmee herkent het register een latere melding als dezelfde agent, ook als naam of eigenaar verandert. |
version | tekst | Versie van de agent. Telt niet als inhoudelijke wijziging. |
nameverplicht | tekst | Naam van de agent. |
purposeverplicht | tekst | Wat de agent doet, in één tot drie zinnen. |
owner_nameverplicht | tekst | Naam van de eigenaar. |
owner_emailverplicht | tekst | E-mailadres van de eigenaar. |
department | tekst | Afdeling. Telt niet als inhoudelijke wijziging. |
platform | tekst | Bouwomgeving, bijvoorbeeld Copilot Studio, n8n, Claude Code of eigen code. |
model | tekst | Onderliggend model. |
autonomy_level | suggest_only | human_approval | autonomous | Doet de agent alleen voorstellen, wacht hij op akkoord, of handelt hij zelf. |
autonomous_actions | true of false | Waar als de agent zelfstandig handelingen met gevolgen uitvoert, zoals mailen, betalen of muteren. |
connected_systems | lijst van tekst | Namen van de systemen waar de agent bij kan. Hoogstens twintig. |
connected_agents | lijst van tekst | Namen van andere agents die bij deze agent of zijn gegevens kunnen. Hoogstens twintig. |
data_sensitivity | geen | intern | persoonsgegevens | gevoelig | De gevoeligste gegevens waar de agent mee werkt. |
memory | none | session | persistent | Wat de agent onthoudt buiten een taak om. |
data_retention | tekst | Wat er bewaard wordt, hoelang en hoe het gewist wordt. |
kill_switch | tekst | Hoe de agent wordt uitgezet en wie dat mag. |
trigger | manual | scheduled | event | Handmatig, op een schema of bij een gebeurtenis. |
oversight_mode | in_the_loop | on_the_loop | post_hoc | Kijkt een mens bij elke stap mee, op afstand, of pas achteraf. |
Wat het antwoord zegt
Een geslaagde melding geeft HTTP 200 met een veld status. Een agent die al in het register staat, wordt vergeleken met de laatst goedgekeurde versie. Witruimte, hoofdletters en de volgorde van een lijst tellen daarbij niet mee. Voor zo'n agent is herhaald melden vanuit een pipeline dus veilig. Een nieuwe agent die is afgewezen, staat niet in het register en komt bij een volgende melding opnieuw in de wachtrij. Een waarde die niet in de lijst van een veld staat, wordt genegeerd; de beheerder vult het veld dan aan.
| Status | Betekenis |
|---|---|
wacht_op_beoordeling | Nieuwe agent. De aanmelding staat in de wachtrij van een beheerder. |
ongewijzigd | De agent staat goedgekeurd in het register en er is inhoudelijk niets veranderd. Alleen de datum van de laatste melding en de versie worden bijgewerkt. |
wijziging_wacht_op_beoordeling | De agent wijkt af van de goedgekeurde versie. Het veld gewijzigde_velden noemt wat er verschilt. Tot een beheerder beslist, geldt de goedgekeurde versie. |
eerder_afgewezen | De agent staat in het register en deze versie is als wijziging al eens afgewezen. De melding wordt genoteerd en de wachtrij blijft leeg. |
Melden vanuit de pipeline
Deze stap meldt elk manifest in de repo zodra het verandert. Voorbeelden voor GitLab CI en Azure Pipelines staan in het platform bij de instructies voor bouwers.
# .github/workflows/ai-register.yml
name: AI-register
on:
push:
branches: [main] # de standaardbranch van de repo
paths: ["**/aicompliancehub-agent.json"]
jobs:
melden:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Agents melden bij het AI-register
env:
AGENT_TOKEN: ${{ secrets.AICOMPLIANCEHUB_AGENT_TOKEN }}
run: |
set -eu
set -o pipefail
git ls-files 'aicompliancehub-agent.json' '**/aicompliancehub-agent.json' | while IFS= read -r f; do
echo "Melden: $f"
curl -sS --fail-with-body -X POST "https://www.aicompliancehub.nl/api/agent-intake" \
-H "Authorization: Bearer $AGENT_TOKEN" \
-H "Content-Type: application/json" \
--data @"$f"
echo
doneOrganisatiebreed inrichten
Bouwen meerdere teams in veel repo's, dan hoeft niet elke repo een eigen stap. Eén centrale workflow in één repo van de organisatie loopt elke dag alle repo's langs en meldt elk manifest op de standaardbranch. Bouwers zetten dan alleen nog een manifest in hun repo. Een manifest zonder agent_ref krijgt automatisch repo plus map als sleutel.
De workflow draait bij u, met een GitHub App die u zelf aanmaakt: alleen-lezen toegang tot Contents en Metadata, geïnstalleerd op de organisatie. Wij krijgen alleen de manifesten te zien. Een melding komt hooguit een dag na de merge binnen; wie direct wil melden, gebruikt de stap per repo hierboven. Met AI_REGISTER_REPOS beperkt u de scan tot een paar repo's, voor een proef.
Een verplichte workflow via een GitHub-ruleset gebruiken we hier niet: die draait op pull requests en zou versies melden die nooit worden gemerged.
# .github/workflows/ai-register.yml in één repo van de organisatie
# Eenmalig: een GitHub App met alleen-lezen Contents en Metadata op alle repo's,
# geïnstalleerd op de organisatie. Zet in deze repo de variabele AI_REGISTER_APP_ID
# en de secrets AI_REGISTER_APP_KEY (private key) en AICOMPLIANCEHUB_AGENT_TOKEN.
name: AI-register (hele organisatie)
on:
schedule:
- cron: "17 5 * * *" # elke dag
workflow_dispatch:
permissions:
contents: read
jobs:
scannen:
runs-on: ubuntu-latest
steps:
- id: app
uses: actions/create-github-app-token@v3
with:
client-id: ${{ vars.AI_REGISTER_APP_ID }}
private-key: ${{ secrets.AI_REGISTER_APP_KEY }}
owner: ${{ github.repository_owner }}
permission-contents: read
permission-metadata: read
- name: Alle manifesten melden bij het AI-register
env:
GH_TOKEN: ${{ steps.app.outputs.token }}
AGENT_TOKEN: ${{ secrets.AICOMPLIANCEHUB_AGENT_TOKEN }}
run: |
set -eu
set -o pipefail
OWNER="${OWNER:-$GITHUB_REPOSITORY_OWNER}"
MANIFEST="${MANIFEST:-aicompliancehub-agent.json}"
werk=$(mktemp -d)
if [ -n "${AI_REGISTER_REPOS:-}" ]; then
for r in $AI_REGISTER_REPOS; do
printf '%s\t%s\n' "$r" "$(gh api "repos/$OWNER/$r" --jq .default_branch)"
done > "$werk/repos"
else
# Met een App-token: de repo's waar de App bij mag. Anders de organisatie.
gh api --paginate installation/repositories --jq '.repositories[] | select(.archived | not) | [.name, .default_branch] | @tsv' > "$werk/repos" 2>/dev/null ||
gh api --paginate "orgs/$OWNER/repos?per_page=100" --jq '.[] | select(.archived | not) | [.name, .default_branch] | @tsv' > "$werk/repos"
fi
aantal=0
while IFS="$(printf '\t')" read -r repo branch; do
if ! gh api "repos/$OWNER/$repo/git/trees/$branch?recursive=1" > "$werk/boom" 2>/dev/null; then
echo "Overgeslagen: $repo (leeg of geen toegang)"
continue
fi
# tr -d: jq op Windows schrijft CRLF; op Linux verandert het niets.
if [ "$(jq -r '.truncated' "$werk/boom" | tr -d '\r')" = "true" ]; then
echo "Let op: de bestandsboom van $repo is te groot en afgekapt; zet het manifest hoger in de repo."
fi
jq -r --arg f "$MANIFEST" '.tree[] | select(.type == "blob") | .path | select(. == $f or endswith("/" + $f))' "$werk/boom" | tr -d '\r' > "$werk/paden"
while IFS= read -r pad; do
map=$(dirname "$pad")
if [ "$map" = "." ]; then ref="$repo"; else ref="$repo/$map"; fi
gh api -H "Accept: application/vnd.github.raw+json" "repos/$OWNER/$repo/contents/$pad?ref=$branch" |
jq --arg ref "$ref" '.agent_ref //= $ref' > "$werk/manifest.json"
echo "Melden: $repo/$pad"
curl -sS --fail-with-body -X POST "https://www.aicompliancehub.nl/api/agent-intake" \
-H "Authorization: Bearer $AGENT_TOKEN" \
-H "Content-Type: application/json" \
--data @"$werk/manifest.json"
echo
aantal=$((aantal + 1))
done < "$werk/paden"
done < "$werk/repos"
echo "Klaar: $aantal manifest(en) gemeld."De instructie voor coding-assistenten centraal. Claude Code laadt een CLAUDE.md die IT centraal uitrolt, via MDM of Group Policy, of met de sleutel claudeMd in managed-settings.json. Een ontwikkelaar kan die niet los uitsluiten, zoals een gewone CLAUDE.md. GitHub Copilot kent instructies op organisatieniveau; volgens GitHub gelden die voor sessies op github.com en voor code review, niet lokaal in de editor. Zet de bouwersinstructie uit het platform op die plek, dan maakt de assistent het manifest zelf aan.
Wat de API niet levert
Schrijven. Een register is pas bewijs als aantoonbaar is dat een mens elk systeem heeft beoordeeld. Een script dat rijen aanmaakt haalt die bodem weg, dus er komen geen schrijf-endpoints. Moeten uw agents zich wél automatisch aanmelden, gebruik dan het aanmeldpunt: aanmeldingen en wijzigingen landen in een wachtrij waar een beheerder ze beoordeelt.
De inhoud van documenten. De API geeft de registratie van een document, met titel, type en datum. Het document zelf blijft in het platform.
Interne sleutels en notities. Wie een systeem heeft goedgekeurd komt als naam en e-mailadres mee, niet als database-sleutel. Beoordelingsnotities blijven binnen het platform: de API levert het register, het gesprek erover blijft intern.