Et API, De kan læse, før De skriver under.
Specifikationen er offentlig, fladerne er neutrale, webhook-signaturen kan verificeres på ti linjer hos Dem. Denne side dokumenterer, hvad API'et eksponerer i dag — intet mere, og det er med vilje: hvad der ikke er leveret, er ikke dokumenteret.
- OpenAPI-specifikation, der kan læses uden nøgle eller konto
- Aldrig en underretning om mistænkelig transaktion, aldrig ordret kundeindhold
- Signerede webhooks, der kan verificeres uden for Vigilae
Serveret af API'et selv: den kontrakt, De læser, er den, der kører.
Neutrale flader, i selve konstruktionen.
API'et eksponerer det, en integrator kan konsumere uden at røre sagernes fortrolighed: overvågningsjournalen og tællere. Indholdet af en vigilanssag, bilagene, underretningerne om mistænkelige transaktioner passerer ikke gennem dette API — ikke en planbegrænsning, men arkitekturen.
Overvågningsjournal
Kontorets pKYC-hændelser — udløbet dokument, ændring af reel ejer, re-screening til gennemgang — i neutral form: sekvens, type, alvorlighed, dato. Svar altid begrænset til 500 hændelser.
Porteføljeaggregater
Tællere, aldrig en sag: volumener pr. status, frister, fuldstændighed. Nok til at tegne et dashboard i Deres værktøj, uden at en eneste kundeoplysning kommer ind i det.
Kvalificering
Den eneste skrivning: at kvalificere en journalhændelse (status qualifie eller clos, disposition planifie, traite eller ecarte). Det kræver skrive-scopet — mindste privilegium er reglen, ikke en valgmulighed.
API'et er designet server-til-server: en nøgle i kode, der sendes til browseren, er en offentliggjort nøgle. Lad en server-side proxy holde nøglen, aldrig siden.
Nøgler med scopes, vist én gang, kan tilbagekaldes øjeblikkeligt.
- Format. Hver nøgle begynder med
vgk_og sendes somAuthorization: Bearer vgk_…. Hemmeligheden vises kun ved oprettelsen: vi opbevarer intet andet end dens SHA-256-digest. - Scopes.
lecture(læsning, standard) ogecriture(skrivning). En nøgle uden det krævede scope modtager en 403 — se #scopes. - Udløb. Ét år efter oprettelsen (synligt i kontorets konsol). En udløbet nøgle modtager en eksplicit 401 — se #cle-expiree.
- Rategrænse. 60 forespørgsler/minut pr. nøgle (kan tilpasses pr. nøgle). En 429 bærer
Retry-Afterog headerneX-RateLimit-Limit / -Remaining / -Reset. - Tilbagekaldelse. Øjeblikkelig, fra konsollen. Opslag sker via digest: nøgler kan ikke opregnes.
Tre curl-kald, og De har set det hele.
# Sundhedstjek + nøgleautentificering
curl -s https://vigilae.org/api/v1/sante \
-H "Authorization: Bearer vgk_your_key"
# Overvågningsjournal, fra begyndelsen, i sider af 100
curl -s "https://vigilae.org/api/v1/evenements?depuisSeq=0&limite=100" \
-H "Authorization: Bearer vgk_your_key"
# Kvalificer hændelse 42 (skrive-scope)
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, i én regel
Send depuisSeq (0 ved første kald) og limite (loft på 500): svaret er sorteret efter stigende seq og returnerer prochainSeq, som sendes tilbage uændret ved næste kald. En side kortere end limite betyder journalens slutning — prochainSeq forbliver da stabil og fungerer som polling-cursor. Uden depuisSeq får De visningen "nyeste først", begrænset til 500.
Porteføljen forespørges på /api/v1/portefeuille/agregats — tællere, ét svar, ingen paginering.
Signerede, tidsstemplede, leveret mindst én gang.
I stedet for at polle journalen: modtag den. Vigilae leverer hændelser til Deres URL, i rækkefølge, i batches på højst 100. Leveringen er at-least-once — cursoren rykker kun frem ved Deres 2xx, batch for batch — og idempotens sker pr. seq: behandl hver sekvens præcis én gang (#idempotence).
Verificering af signaturen
Hver levering bærer headeren x-vigilae-signature: t=<unix>,v1=HMAC-SHA256(secret, t + "." + body). Genberegn v1 ud fra den rå body, De har modtaget, og afvis ethvert tidsstempel t ud over 5 min.: det er anti-replay-værnet. Under en rotation af hemmeligheden bærer headeren én v1 pr. stadig gyldig hemmelighed (24 timers overlap): acceptér, hvis blot én af dem matcher.
// Node — signaturverificering (ingen afhængigheder)
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 — samme verificering
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 FalseOvergangsordning: det gamle format sha256=HMAC(body) udsendes stadig på x-vigilae-signature-legacy til allerede etablerede modtagere; fjernelsen er planlagt sammen med webhooks v2. Nye modtagere verificerer det tidsstemplede skema ovenfor, ikke det gamle.
Rotationen udløses fra konsollen (POST /connect/webhook/rotation på applikationssiden): i 24 timer signerer den gamle hemmelighed stadig — tid til at udrulle den nye hos Dem uden et fejlvindue.
Sandbox: på forespørgsel.
Hver fejlklasse i API'et har en stabil adresse i fejlreferencen: #authentification, #scopes, #cloisonnement, #debit, #signature… API'ets fejlsvar vil pege på disse ankre.
API'et eksponerer hverken underretninger om mistænkelige transaktioner eller ordret kundeindhold, i selve konstruktionen (art. L.561-18 i den franske CMF). Ingen vigilansbeslutning træffes af API'et: det eksponerer og kvalificerer hændelser; fagpersonen beslutter.