Naar hoofdinhoud
Voor ontwikkelaars

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

  1. 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.
  2. Controleer de verbinding. Roep /api/v1/me aan. Die geeft uw organisatienaam terug en verder niets.
  3. Haal op wat u nodig heeft. Elk endpoint hieronder werkt met hetzelfde token.
curl -H "Authorization: Bearer aich_..." \
  https://www.aicompliancehub.nl/api/v1/me

Endpoints

Alles onder /api/v1/, alles met de methode GET. Er bestaan geen schrijf-endpoints.

PadWat het geeft
/meDe organisatie, het pakket en het label van uw token. Geeft geen registerdata, dus hiermee controleert u of een verbinding werkt.
/systemsDe AI-systemen en AI-agents die deze organisatie in haar register heeft staan, met risicoclassificatie, rol onder de AI Act, status en reviewplanning.
/obligationsDe compliance-verplichtingen per AI-systeem, met de vindplaats in de AI Act, de status en de eventuele deadline.
/tasksDe compliance-taken van de organisatie: wat er nog moet gebeuren, met prioriteit, deadline en het artikel waar de taak uit voortkomt.
/documentsDe 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.
/scoreDe 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 }
}
CodeHTTPBetekenis
missing_token401Er zat geen Authorization-header op het verzoek.
invalid_token401Het token is onbekend of ingetrokken.
not_available403API-toegang hoort bij Scale.
not_found404Het gevraagde systeem bestaat niet binnen uw organisatie.
invalid_parameter400De melding noemt het filter of de pagineerwaarde die fout is.
rate_limited429Uurlimiet bereikt. De Retry-After-header zegt hoelang.
server_error500Er 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/json

Het 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.

Velden van het agent-manifest
VeldWaardeWat
agent_reftekstVaste sleutel van deze agent, bijvoorbeeld repo plus map. Daarmee herkent het register een latere melding als dezelfde agent, ook als naam of eigenaar verandert.
versiontekstVersie van de agent. Telt niet als inhoudelijke wijziging.
nameverplichttekstNaam van de agent.
purposeverplichttekstWat de agent doet, in één tot drie zinnen.
owner_nameverplichttekstNaam van de eigenaar.
owner_emailverplichttekstE-mailadres van de eigenaar.
departmenttekstAfdeling. Telt niet als inhoudelijke wijziging.
platformtekstBouwomgeving, bijvoorbeeld Copilot Studio, n8n, Claude Code of eigen code.
modeltekstOnderliggend model.
autonomy_levelsuggest_only | human_approval | autonomousDoet de agent alleen voorstellen, wacht hij op akkoord, of handelt hij zelf.
autonomous_actionstrue of falseWaar als de agent zelfstandig handelingen met gevolgen uitvoert, zoals mailen, betalen of muteren.
connected_systemslijst van tekstNamen van de systemen waar de agent bij kan. Hoogstens twintig.
connected_agentslijst van tekstNamen van andere agents die bij deze agent of zijn gegevens kunnen. Hoogstens twintig.
data_sensitivitygeen | intern | persoonsgegevens | gevoeligDe gevoeligste gegevens waar de agent mee werkt.
memorynone | session | persistentWat de agent onthoudt buiten een taak om.
data_retentiontekstWat er bewaard wordt, hoelang en hoe het gewist wordt.
kill_switchtekstHoe de agent wordt uitgezet en wie dat mag.
triggermanual | scheduled | eventHandmatig, op een schema of bij een gebeurtenis.
oversight_modein_the_loop | on_the_loop | post_hocKijkt 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.

Statussen in het antwoord van het aanmeldpunt
StatusBetekenis
wacht_op_beoordelingNieuwe agent. De aanmelding staat in de wachtrij van een beheerder.
ongewijzigdDe 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_beoordelingDe agent wijkt af van de goedgekeurde versie. Het veld gewijzigde_velden noemt wat er verschilt. Tot een beheerder beslist, geldt de goedgekeurde versie.
eerder_afgewezenDe 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
          done

Organisatiebreed 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.

FAQ

Veelgestelde vragen

Kan ik met de API ook systemen aanmaken of wijzigen?
Nee. Dat blijft zo, want uw register is pas bewijs als aantoonbaar is dat een mens elk systeem heeft beoordeeld en goedgekeurd. Zou een script rijen kunnen aanmaken, dan is de vraag van een auditor wie iets heeft beoordeeld niet meer te beantwoorden. Wilt u wél dat systemen zich automatisch aanmelden, dan is het aanmeldpunt voor agents daarvoor bedoeld: aanmeldingen komen in een wachtrij die een beheerder goedkeurt. Meldt een agent die al in het register staat zich opnieuw met andere eigenschappen, dan wordt dat een wijzigingsaanvraag aan dat systeem, met het verschil per veld.
Werkt de MCP-server als connector in claude.ai?
Ja, als uw organisatie in claude.ai de optie Request headers heeft. U voegt de server dan toe als custom connector, kiest bij Authentication voor No sign-in en zet het token als Authorization-header, met Bearer en een spatie ervoor. Anthropic biedt die optie op dit moment als bèta aan een deel van de organisaties. Ziet u hem niet, dan blijft inloggen met OAuth over. Dat bouwen we zodra een klant erom vraagt. Claude Code en elke andere client die een vaste header meestuurt, werken altijd.
Wat gebeurt er met mijn tokens als ik naar een ander pakket ga?
API-toegang hoort bij Scale. Gaat uw organisatie naar een ander pakket, dan stoppen bestaande tokens met werken zodra ze weer worden gebruikt. U kunt ze wel altijd blijven zien en intrekken onder Instellingen, tabblad Koppelingen.
Hoeveel verzoeken mag ik doen?
600 per uur per token. Komt u daarboven, dan krijgt u een 429 met een Retry-After-header die zegt hoelang u moet wachten. Haalt u periodiek data op, plan dat dan op een vast moment in plaats van in een lus.
Zien mijn eigen medewerkers de tokens?
Alleen eigenaars en beheerders. Het tabblad Koppelingen zit achter beheerrechten. Het token zelf ziet u bij het aanmaken, daarna nooit meer: wij bewaren er alleen een versleutelde afdruk van, dus wij kunnen hem ook niet opnieuw tonen.