Ett API du kan läsa innan du skriver under.
Specifikationen är publik, ytorna är neutrala, webhooksignaturen kan verifieras på tio rader på din sida. Den här sidan dokumenterar vad API:t exponerar i dag — inget mer, och det är avsiktligt: det som inte är levererat är inte dokumenterat.
- OpenAPI-specifikation som kan läsas utan nyckel och utan konto
- Aldrig en rapport om misstänkt transaktion, aldrig ordagrant kundinnehåll
- Signerade webhookar, verifierbara utanför Vigilae
Serveras av API:t självt: kontraktet du läser är det som körs.
Neutrala ytor, genom själva konstruktionen.
API:t exponerar det en integratör kan konsumera utan att röra ärendenas sekretess: övervakningsjournalen och räknare. Innehållet i ett vaksamhetsärende, handlingarna, rapporterna om misstänkta transaktioner passerar inte genom detta API — inte en planbegränsning, utan arkitekturen.
Övervakningsjournal
Byråns pKYC-händelser — utgången handling, byte av verklig huvudman, omscreening att granska — i neutral form: sekvens, typ, allvarlighetsgrad, datum. Svaren är alltid begränsade till 500 händelser.
Portföljaggregat
Räknare, aldrig ett ärende: volymer per status, ledtider, fullständighet. Tillräckligt för att rendera en instrumentpanel i ditt verktyg utan att en enda kunduppgift kommer in i det.
Kvalificering
Den enda skrivoperationen: att kvalificera en journalhändelse (status qualifie eller clos, disposition planifie, traite eller ecarte). Den kräver skrivscopet — minsta möjliga behörighet är regeln, inte ett tillval.
API:t är utformat för server-till-server: en nyckel i kod som skickas till webbläsaren är en publicerad nyckel. Låt en proxy på serversidan hålla nyckeln, aldrig sidan.
Nycklar med avgränsat scope, visade en gång, omedelbart återkallbara.
- Format. Varje nyckel börjar med
vgk_och skickas somAuthorization: Bearer vgk_…. Hemligheten visas bara när nyckeln skapas: vi behåller inget annat än dess SHA-256-hash. - Scope.
lecture(läsning, standard) ochecriture(skrivning). En nyckel utan det scope som krävs får 403 — se #scopes. - Utgång. Ett år efter skapandet (syns i byråns konsol). En utgången nyckel får en uttrycklig 401 — se #cle-expiree.
- Anropstakt. 60 anrop/minut per nyckel (kan justeras per nyckel). En 429 bär
Retry-Afteroch huvudenaX-RateLimit-Limit / -Remaining / -Reset. - Återkallelse. Omedelbar, från konsolen. Uppslagningen sker via hash: nycklar kan inte räknas upp.
Tre curl-anrop och du har sett allt.
# Hälsa + nyckelautentisering
curl -s https://vigilae.org/api/v1/sante \
-H "Authorization: Bearer vgk_your_key"
# Övervakningsjournalen, från början, i sidor om 100
curl -s "https://vigilae.org/api/v1/evenements?depuisSeq=0&limite=100" \
-H "Authorization: Bearer vgk_your_key"
# Kvalificera händelse 42 (skrivscope)
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 en regel
Skicka depuisSeq (0 vid första anropet) och limite (högst 500): svaret sorteras efter stigande seq och returnerar prochainSeq, som skickas tillbaka oförändrad vid nästa anrop. En sida kortare än limite betyder journalens slut — prochainSeq förblir då stabil och fungerar som pollningsmarkör. Utan depuisSeq får du vyn ”senaste först”, begränsad till 500.
Portföljen frågas på /api/v1/portefeuille/agregats — räknare, ett svar, ingen paginering.
Signerade, tidsstämplade, levererade minst en gång.
I stället för att polla journalen kan du ta emot den: Vigilae levererar händelser till din URL, i ordning, i omgångar om högst 100. Leveransen är at-least-once — markören flyttas bara fram vid din 2xx, omgång för omgång — och idempotensen bygger på seq: behandla varje sekvens exakt en gång (#idempotence).
Verifiera signaturen
Varje leverans bär huvudet x-vigilae-signature: t=<unix>,v1=HMAC-SHA256(secret, t + "." + body). Räkna om v1 från den råa kropp som togs emot, och avvisa varje tidsstämpel t äldre än 5 min: det är anti-replay-skyddet. Under en hemlighetsrotation bär huvudet ett v1 per ännu giltig hemlighet (24 h överlappning): acceptera om någon av dem stämmer.
// Node — signaturverifiering (utan beroenden)
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 — samma verifiering
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 FalseÖvergångsvis: det gamla formatet sha256=HMAC(body) sänds fortfarande på x-vigilae-signature-legacy för mottagare som redan är på plats; borttagningen planeras till webhooks v2. Nya mottagare verifierar det tidsstämplade schemat ovan, inte det gamla.
Rotationen utlöses från konsolen (POST /connect/webhook/rotation på applikationssidan): i 24 h signerar den gamla hemligheten fortfarande — tid att driftsätta den nya på din sida utan ett felfönster.
Sandbox: på begäran.
Varje felklass i API:t har en stabil adress i felreferensen: #authentification, #scopes, #cloisonnement, #debit, #signature… API:ts felsvar kommer att peka på dessa ankare.
API:t exponerar varken rapporter om misstänkta transaktioner eller ordagrant kundinnehåll, genom själva konstruktionen (art. L.561-18 i den franska CMF). Inget vaksamhetsbeslut fattas av API:t: det exponerar och kvalificerar händelser; yrkesutövaren beslutar.