Een API die u kunt lezen vóór u tekent.
De specificatie is publiek, de oppervlakken zijn neutraal, de webhookhandtekening is in tien regels aan uw kant te verifiëren. Deze pagina documenteert wat de API vandaag blootlegt — niets meer, en dat is bewust: wat niet is uitgeleverd, wordt niet gedocumenteerd.
- OpenAPI-specificatie leesbaar zonder sleutel of account
- Nooit een melding van een ongebruikelijke transactie, nooit letterlijke cliëntinhoud
- Ondertekende webhooks, verifieerbaar buiten Vigilae
Geserveerd door de API zelf: het contract dat u leest, is het contract dat draait.
Neutrale oppervlakken, door hun opzet.
De API legt bloot wat een integrator kan afnemen zonder aan het geheim van de dossiers te raken: het monitoringjournaal en tellers. De inhoud van een waakzaamheidsdossier, de documenten, de meldingen van ongebruikelijke transacties passeren niet via deze API — geen beperking van het abonnement, maar de architectuur.
Monitoringjournaal
De pKYC-gebeurtenissen van het kantoor — verlopen document, wijziging van uiteindelijk begunstigde (UBO), te beoordelen herscreening — in neutrale vorm: sequentie, type, ernst, datum. Antwoorden altijd begrensd tot 500 gebeurtenissen.
Portefeuilleaggregaten
Tellers, nooit een dossier: volumes per status, doorlooptijden, volledigheid. Genoeg om in uw tool een dashboard te tonen zonder dat er één cliëntgegeven in binnenkomt.
Kwalificatie
De enige schrijfactie: een journaalgebeurtenis kwalificeren (status qualifie of clos, dispositie planifie, traite of ecarte). Dit vereist de schrijfscope — least privilege is de regel, geen optie.
De API is ontworpen voor server-naar-server: een sleutel in code die naar de browser gaat, is een gepubliceerde sleutel. Laat een proxy aan serverzijde de sleutel bewaren, nooit de pagina.
Sleutels met scopes, één keer getoond, onmiddellijk intrekbaar.
- Formaat. Elke sleutel begint met
vgk_en wordt verstuurd alsAuthorization: Bearer vgk_…. Het geheim wordt alleen bij de aanmaak getoond: wij bewaren niets anders dan de SHA-256-digest ervan. - Scopes.
lecture(lezen, de standaard) enecriture(schrijven). Een sleutel zonder de vereiste scope krijgt een 403 — zie #scopes. - Vervaldatum. Eén jaar na de aanmaak (zichtbaar in de console van het kantoor). Een verlopen sleutel krijgt een expliciete 401 — zie #cle-expiree.
- Limiet. 60 verzoeken/minuut per sleutel (per sleutel aanpasbaar). Een 429 draagt
Retry-Afteren de headersX-RateLimit-Limit / -Remaining / -Reset. - Intrekking. Onmiddellijk, vanuit de console. De resolutie verloopt via de digest: sleutels kunnen niet worden opgesomd.
Drie curl-aanroepen en u hebt alles gezien.
# Health + authenticatie met sleutel
curl -s https://vigilae.org/api/v1/sante \
-H "Authorization: Bearer vgk_your_key"
# Monitoringjournaal, vanaf het begin, in pagina's van 100
curl -s "https://vigilae.org/api/v1/evenements?depuisSeq=0&limite=100" \
-H "Authorization: Bearer vgk_your_key"
# Gebeurtenis 42 kwalificeren (schrijfscope)
curl -s -X POST https://vigilae.org/api/v1/evenements/42/qualifier \
-H "Authorization: Bearer vgk_your_key" \
-H "Content-Type: application/json" \
-d '{"statut":"qualifie","disposition":"traite"}'Paginering, in één regel
Geef depuisSeq mee (0 bij de eerste aanroep) en limite (begrensd op 500): het antwoord is gesorteerd op oplopende seq en geeft prochainSeq terug, om bij de volgende aanroep ongewijzigd terug te sturen. Een pagina korter dan limite betekent het einde van het journaal — prochainSeq blijft dan stabiel en dient als pollingcursor. Zonder depuisSeq krijgt u de weergave "meest recent eerst", begrensd tot 500.
De portefeuille wordt bevraagd op /api/v1/portefeuille/agregats — tellers, één antwoord, geen paginering.
Ondertekend, tijdgestempeld, minstens één keer bezorgd.
Ontvang het journaal in plaats van het te pollen: Vigilae bezorgt gebeurtenissen op uw URL, in volgorde, in batches van hoogstens 100. De bezorging is at-least-once — de cursor schuift alleen op bij uw 2xx, batch per batch — en idempotentie loopt via seq: verwerk elke sequentie precies één keer (#idempotence).
De handtekening verifiëren
Elke bezorging draagt de header x-vigilae-signature: t=<unix>,v1=HMAC-SHA256(secret, t + "." + body). Herbereken v1 op basis van de ruwe body zoals ontvangen, en verwerp elke tijdstempel t voorbij 5 min: dat is de anti-replay. Tijdens een rotatie van het geheim draagt de header één v1 per nog geldig geheim (24 u overlap): aanvaard zodra er één overeenstemt.
// Node — verificatie van de handtekening (zonder dependency)
import { createHmac, timingSafeEqual } from 'node:crypto';
export function signatureValid(header, rawBody, secrets, toleranceMs = 5 * 60 * 1000) {
const t = Number((/(?:^|,)t=(\d+)/.exec(header) || [])[1]);
if (!t || Math.abs(Date.now() - t * 1000) > toleranceMs) return false; // anti-replay
const received = [...header.matchAll(/v1=([0-9a-f]{64})/g)].map((m) => m[1]);
return [].concat(secrets).some((secret) => {
const expected = createHmac('sha256', secret).update(t + '.' + rawBody).digest('hex');
return received.some((r) => r.length === expected.length
&& timingSafeEqual(Buffer.from(r), Buffer.from(expected)));
});
}# Python — dezelfde verificatie
import hmac, hashlib, re, time
def signature_valid(header: str, raw_body: bytes, secrets, tolerance_s: int = 300) -> bool:
m = re.search(r"(?:^|,)t=(\d+)", header)
if not m or abs(time.time() - int(m.group(1))) > tolerance_s:
return False # anti-replay
received = re.findall(r"v1=([0-9a-f]{64})", header)
for secret in secrets:
expected = hmac.new(secret.encode(), m.group(1).encode() + b"." + raw_body,
hashlib.sha256).hexdigest()
if any(hmac.compare_digest(expected, r) for r in received):
return True
return FalseOvergangsregeling: het oude formaat sha256=HMAC(body) wordt nog uitgezonden op x-vigilae-signature-legacy voor reeds bestaande ontvangers; de verwijdering ervan is gepland met webhooks v2. Nieuwe ontvangers verifiëren het tijdgestempelde schema hierboven, niet het oude.
De rotatie wordt gestart vanuit de console (POST /connect/webhook/rotation aan de applicatiekant): gedurende 24 u ondertekent het oude geheim nog — tijd om aan uw kant het nieuwe uit te rollen zonder venster van uitval.
Sandbox: op aanvraag.
Elke foutklasse van de API heeft een stabiel adres in de foutenreferentie: #authentification, #scopes, #cloisonnement, #debit, #signature… De foutantwoorden van de API zullen naar deze ankers verwijzen.
De API legt geen meldingen van ongebruikelijke transacties en geen letterlijke cliëntinhoud bloot, door haar opzet (art. L.561-18 van het Franse CMF). Geen enkele waakzaamheidsbeslissing wordt door de API genomen: zij legt gebeurtenissen bloot en kwalificeert ze; de professional beslist.