API, amelyet aláírás előtt elolvashat.
A specifikáció nyilvános, a webhook-aláírás tíz sorban ellenőrizhető az Ön oldalán. Ez az oldal azt dokumentálja, amit az API ma kitesz — semmi többet, és ez szándékos: amit nem szállítottunk le, azt nem dokumentáljuk.
- Az OpenAPI-specifikáció kulcs és fiók nélkül is olvasható
- Gyanús ügylet bejelentése soha, szó szerinti ügyféltartalom soha
- Aláírt webhookok, a Vigilae-n kívül is ellenőrizhetők
Maga az API szolgálja ki: a szerződés, amelyet olvas, ugyanaz, amely fut.
A teljes ügymenet, és két kizárás, amely nem fog megváltozni.
Az Ön szoftvere végig tudja vinni az aktát az elejétől a végéig: ügyfelet hoz létre, aktát nyit, dokumentumokat tölt fel, szűrést indít, bejelenti a tényleges tulajdonosokat, kiolvassa a besorolást és lehívja a bizonyítékdossziét. Két dolog soha nem megy át ezen az úton, és ez nem előfizetési korlát: semmilyen gyanúbejelentés, és az ügyfele egyetlen szó szerinti kijelentése sem. Az első olyan cselekmény, amelyet a törvény a bejelentést tevő személynek tart fenn; a másodiknak pedig semmi keresnivalója egy integrációs csatornában.
Az akta, az elejétől a végéig
Ügyfelek, akták, igazoló dokumentumok, szűrés, tényleges tulajdonosok, kockázati besorolás, bizonyítékdosszié, sértetlenség-ellenőrzés. Minden erőforrásnak megvan a maga hatóköre: a kulcsa csak azt nyitja meg, amit Ön ráruházott.
Napló és összesítők
Az iroda pKYC-eseményei — lejárt dokumentum, tényleges tulajdonos változása, elvégzendő újraszűrés — és portfóliószintű számlálók az Ön irányítópultjához. A válasz mindig korlátozott terjedelmű, a kurzor stabil.
Amit beír, ahhoz név tartozik
Feltöltés, szűrés, minősítés: minden írási művelet megköveteli a saját hatókörét, és rögzíti, ki végezte. A névtelen minősítést a rendszer elutasítja — az integráció emberi döntést rögzít, maga egyetlen döntést sem hoz.
Az API szerver–szerver használatra készült: a böngészőbe kiszállított kódban lévő kulcs nyilvánosságra hozott kulcs. A kulcsot szerveroldali proxy tartsa, soha ne az oldal.
Szabott hatókörű kulcsok, egyszer megjelenítve, azonnal visszavonhatók.
- Formátum. Minden kulcs
vgk_előtaggal kezdődik, ésAuthorization: Bearer vgk_…formában küldendő. A titok csak létrehozáskor jelenik meg: semmit sem őrzünk meg belőle az SHA-256 lenyomatán kívül. - Hatókörök. A kulcs csak a létrehozásakor bejelölt hatóköröket hordozza: az általános
lecture(olvasás, az alapértelmezés) ésecriture(írás) hatókört, vagy finom, erőforrásonkénti hatóköröket —clients:,dossiers:,pieces:,criblage:(lecturevagyecritureváltozatban),origine-fonds:lecture,journal:lecture.
Az öröklés az utótagot követi, és csak egy irányba működik: alecturelefedi az összes*:lecture, azecritureaz összes*:ecriturehatókört; egy finom hatókör önmagán túl semmit sem nyit meg.
Hat hatókör kilóg ebből a párból, ezért egyetlen általános kulcsból sem öröklődik:alertes:qualifier,embed:emettre,adversemedia:consulter,conformite:consulter,dispositif:consulter,integrite:consulter. Mindegyiket külön kell átruházni, a kulcs létrehozásakor.
A szükséges hatókör nélküli kulcs 403-at kap — lásd #scopes. - Lejárat. A létrehozás után egy évvel (látható az iroda konzoljában). A lejárt kulcs kifejezett 401-et kap — lásd #cle-expiree.
Egy kulcs elfogadása ennél a dátumnál korábban is megszűnhet, ha az API már nem része az iroda előfizetésének. A leállítás ilyenkor legalább 30 nappal az irodának küldött első e-mail után következik be, azon a napon, amelyet egy legalább 7 nappal előre elküldött második e-mail közöl. Amint ez a dátum rögzül, látható az iroda konzoljában (aGET /connect/clescoupure_lemezője), és minden elfogadott hívásra adott válasz jelzi aSunsetfejlécben, amíg el nem érkezik. Ezt követően a hívás az #authentification pontban leírt 401-et kapja, a"motif": "fin_option_api"mezővel; ha az API visszakerül az előfizetésbe, a kulcsot a rendszer ismét elfogadja, saját lejáratáig.
A visszavont kulcs nem tér vissza az API-val. Ha pedig a teljes előfizetést felfüggesztik, vagy az véget ér, a kulcsok elfogadása azonnal megszűnik, e határidő nélkül. - Sebességkorlát. Kulcsonként 60 kérés/perc (kulcsonként felülírható). A 429
Retry-After-t ésX-RateLimit-Limit / -Remaining / -Resetfejléceket hordoz. - Visszavonás. Azonnali, a konzolból. A feloldás lenyomat alapján történik: a kulcsok nem sorolhatók fel.
Három curl-hívás, és mindent látott.
# Állapot + kulcs-hitelesítés
curl -s https://vigilae.org/api/v1/sante \
-H "Authorization: Bearer vgk_your_key"
# Monitorozási napló, az elejétől, 100-as lapokban
curl -s "https://vigilae.org/api/v1/evenements?depuisSeq=0&limite=100" \
-H "Authorization: Bearer vgk_your_key"
# A 42-es esemény minősítése (írási hatókör)
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"}'Lapozás, egyetlen szabályban
Adja át a depuisSeq (első híváskor 0) és a limite (legfeljebb 500) paramétert: a válasz növekvő seq szerint rendezett, és visszaadja a prochainSeq értéket, amelyet a következő hívásban változatlanul kell visszaadni. A limite-nél rövidebb lap a napló végét jelenti — a prochainSeq ekkor stabil marad, és lekérdezési kurzorként szolgál. depuisSeq nélkül a „legfrissebb elöl” nézetet kapja, 500-ra korlátozva.
A portfólió a /api/v1/portefeuille/agregats végponton kérdezhető le — számlálók, egyetlen válasz, lapozás nélkül.
Aláírva, időbélyegezve, legalább egyszer kézbesítve.
A napló lekérdezgetése helyett fogadja azt: a Vigilae az eseményeket az Ön URL-jére kézbesíti, sorrendben, legfeljebb 100-as kötegekben. A kézbesítés at-least-once — a kurzor csak az Ön 2xx-ére lép tovább, kötegenként —, az idempotencia pedig a seq-en áll: minden sorszámot pontosan egyszer dolgozzon fel (#idempotence).
Az aláírás ellenőrzése
Minden kézbesítés az x-vigilae-signature: t=<unix>,v1=HMAC-SHA256(secret, t + "." + body) fejlécet hordozza. Számolja újra a v1-et a kapott nyers törzsből, és utasítson el minden 5 percnél régebbi t időbélyeget: ez a visszajátszás elleni védelem. Titokrotáció alatt a fejléc minden még érvényes titokhoz egy-egy v1-et hordoz (24 óra átfedés): fogadja el, ha bármelyik egyezik.
// Node — aláírás-ellenőrzés (függőség nélkül)
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; // visszajátszás elleni védelem
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 — ugyanaz az ellenőrzés
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 # visszajátszás elleni védelem
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Átmenet: a régi sha256=HMAC(body) formátumot a már működő fogadók kedvéért továbbra is kibocsátjuk az x-vigilae-signature-legacy fejlécen; eltávolítása a webhookok v2-jével tervezett. Az új fogadók a fenti, időbélyeges sémát ellenőrizzék, ne a régit.
A rotáció a konzolból indítható (alkalmazásoldalon POST /connect/webhook/rotation): 24 órán át a régi titok is aláír még — idő arra, hogy hibaablak nélkül élesítse az újat a saját oldalán.
Felügyeleti állapot, az Ön képernyőin.
Az Ön szoftvere már létrehozza a dossziékat az API-n keresztül; a widgetek megadják a hiányzó felületet: egy dosszié felügyeleti állapotának megjelenítését az ügyféllapon belül, anélkül hogy megfelelési felületet kellene újraépítenie. A folyamat három lépésből áll — az Ön szervere rövid élettartamú tokent bocsát ki, a kapott URL egy iframe-be kerül, a widget megjelenít. Kizárólag megjelenít: soha nem hoz döntést, nem minősít, és soha nem ír semmit egy widgeten keresztül. A kattintás megnyitja a Vigilae alkalmazást, ahol egy azonosított ember cselekszik.
1. A token kibocsátása — szerveroldalon, sosem az oldalon
A vgk_ kulcs sosem éri el a böngészőt. Az Ön szervere a dedikált embed:emettre hatókörrel hívja meg a kibocsátó végpontot (a kulcs létrehozásakor jelölendő be, sosem öröklődik), és csak a rövid token jut le az oldalra: alapértelmezésben tizenöt perc, 5–60 közé korlátozva, egy dossziéhoz, egy összetevőhöz és egy deklarált eredethez kötve. Az URL töredékében utazik — sem a mi naplóinkat, sem az Önökét nem éri el.
# Egy token a Compliance Button számára, katalógusból választott címkével
curl -s -X POST https://vigilae.org/api/v1/embed/jetons \
-H "Authorization: Bearer vgk_your_key" \
-H "Content-Type: application/json" \
-d '{"dossier_id":"D123","composant":"bouton",
"audience":"https://your-software.example","libelle":"controler_client"}'
# 201 -> { "jeton": "…", "expire_le": "…",
# "url": "https://vigilae.org/embarque/bouton?c=…#…" }2. Az iframe elhelyezése — az indítószkript, tíz sorban
A vigilae-embed.js indítószkript létrehozza a sandboxolt iframe-et, elvégzi a kézfogást, és követi a widget méretét (korlátozva — az iframe sosem diktálja a magasságát az Ön oldalának). CSP szempontjából az Ön oldala egyetlen direktívát nyit meg: frame-src https://vigilae.org. Nincs szükség inline szkriptre, sem függőségre. Egy kézzel írt iframe ugyanúgy működik.
<script src="https://vigilae.org/embarque/vigilae-embed.js" defer></script>
<div id="vigilance"></div>// Az Ön szkriptjében: az url a SAJÁT szerveréről érkezik, amely meghívta a kibocsátó végpontot
var widget = VigilaeEmbed.monter({
conteneur: 'vigilance',
url: urlReturnedByTheMint,
renouvelerJeton: function () { // lejáratkor: új token kibocsátása szerveroldalon
return fetch('/my-server/vigilae-token').then(function (r) { return r.text(); });
},
});
// widget.rafraichir(token) friss tokent küld; widget.demonter() mindent eltávolít.3. A Compliance Button: az Ön címkéje, a mi állapotunk
A gomb címkéje egy zárt katalógusból választható ki — sosem szabad szöveg egy olyan felületen, amely felügyeletről beszél — a beágyazott shell ezeket franciául vagy angolul jeleníti meg (?lang= paraméter), az Ön nyelvén egyelőre nem; az alábbi lista a jelentésüket adja meg:
controler_client— „Az ügyfél ellenőrzése” (alapértelmezett)lancer_vigilance— „Átvilágítás indítása”verifier_be— „Tényleges tulajdonosok ellenőrzése”preparer_dossier— „Az AML-dosszié előkészítése”
Az állapotjelző pont azonban egy, a Vigilae által számított állapotot jelenít meg: a_jour (zöld — a szűrés és a kockázati besorolás naprakész), a_revoir (borostyán — a szűrés vagy a kockázati besorolás elavult, vagy a forrás hibázott az utolsó lefutáskor), alerte (piros — legalább egy minősítendő riasztás), inconnu (szürke — a dossziét sosem szűrték). A címke konfigurálható, a szemantika sosem: a szín magához az állapothoz van kötve a shellen belül, amely figyelmen kívül hagy minden postMessage-en keresztüli felülírási kísérletet. A riasztás alatt álló dosszié riasztást mutat, bármilyen is a megjelenés.
A postMessage-szerződés, teljes egészében
A widget a következőket bocsátja ki: vigilae:pret, vigilae:taille (automatikus méretezés), vigilae:expire (szerveroldali újrakibocsátás, majd a vigilae:jeton elküldése) és vigilae:ouvrir. Soha egy nevet, egy kockázatot vagy egy riasztást egy üzeneten belül: az Ön szoftvere már mindent megkap a szerver–szerver API-n keresztül, és ez a csatorna nem válik egy második ilyenné.
frame-ancestors CSP-jét. Az adminisztrátor közvetlenül a Vigilae-ban deklarálja, az „Integrációk és biztonság” képernyőn: legfeljebb tíz https:// eredet, kifejtett gazdanév, sosem helyettesítő karakter; az általa bekapcsolt összetevők; és egy tömeges visszavonás, amely egyetlen gesztussal érvényteleníti az összes már kibocsátott tokent. http://localhost csak egy próbairodán engedélyezett — írjon a contact@vigilae.org címre („Beágyazott widgetek” tárggyal), hogy nyissunk egyet az integrációja idejére. Nincs deklarált eredet: a kibocsátó végpont 400-zal utasítja el. Egy olyan példány, amelynek eredettárolása nincs bekötve: kifejezett 501 — lásd #embed-indisponible.Sandbox: kérésre.
Minden API-hibaosztálynak stabil címe van a hibareferencián: #authentification, #scopes, #cloisonnement, #debit, #signature… Az API hibaválaszai ezekre a horgonyokra fognak mutatni.
Az API felépítéséből adódóan sem gyanús ügyletek bejelentéseit, sem szó szerinti ügyféltartalmat nem tesz ki (a francia CMF art. L.561-18). Átvilágítási döntést az API nem hoz: eseményeket tesz ki és minősít; a szakember dönt.