API koji možete pročitati prije potpisa.
Specifikacija je javna, potpis webhooka provjerava se u deset redaka na vašoj strani. Ova stranica dokumentira ono što API izlaže danas — ništa više, i to namjerno: što nije isporučeno, nije ni dokumentirano.
- OpenAPI specifikacija čitljiva bez ključa i bez računa
- Nikada prijava sumnjive transakcije, nikada doslovni sadržaj stranke
- Potpisani webhookovi, provjerljivi izvan Vigilae
Poslužuje je sam API: ugovor koji čitate onaj je koji se izvršava.
Cijeli postupak i dva izuzeća koja se neće mijenjati.
Vaš softver može voditi spis od početka do kraja: kreirati stranku, otvoriti spis, predati dokumente, pokrenuti provjeru prema popisima, navesti stvarne vlasnike, očitati ocjenu rizika i preuzeti dokazni spis. Dvije stvari nikada neće proći tim putem, a nije riječ o ograničenju pretplate: nijedna prijava sumnjive transakcije i nijedna doslovna izjava vaše stranke. Prvo je radnja koju zakon zadržava za osobu koja prijavljuje; drugo nema što tražiti u integracijskom kanalu.
Spis od početka do kraja
Stranke, spisi, popratni dokumenti, provjera prema popisima, stvarni vlasnici, ocjena rizika, dokazni spis, provjera cjelovitosti. Svaki resurs ima svoj opseg: vaš ključ otvara samo ono što ste mu dali.
Dnevnik i zbirni pokazatelji
pKYC događaji ureda — istekao dokument, promjena stvarnog vlasnika, ponovna provjera koju treba obraditi — i brojači portfelja za vašu nadzornu ploču. Odgovor je uvijek ograničen, kursor stabilan.
Svaki upis ima ime
Predati, provjeriti, kvalificirati: svaki upis traži svoj opseg i bilježi operatera. Anonimna kvalifikacija se odbija — integracija bilježi ljudsku odluku, a sama je ne donosi.
API je zamišljen za komunikaciju poslužitelj – poslužitelj: ključ u kodu isporučenom pregledniku objavljeni je ključ. Neka ključ drži proxy na poslužiteljskoj strani, nikada stranica.
Ključevi s ograničenim opsegom, prikazani jednom, opozivi odmah.
- Format. Svaki ključ počinje s
vgk_i šalje se kaoAuthorization: Bearer vgk_…. Tajna se prikazuje samo pri stvaranju: čuvamo isključivo njezin SHA-256 sažetak. - Opsezi. Ključ nosi samo opsege označene pri njegovu stvaranju: opće
lecture(čitanje, zadano) iecriture(pisanje) ili fine opsege, resurs po resurs —clients:,dossiers:,pieces:,criblage:(ulectureiliecriture),origine-fonds:lecture,journal:lecture.
Nasljeđivanje ide po sufiksu i samo u jednom smjeru:lecturepokriva svaki*:lecture,ecrituresvaki*:ecriture; fini opseg ne otvara ništa izvan sebe.
Šest opsega izlazi iz tog para i stoga se ne nasljeđuje ni iz jednog općeg ključa:alertes:qualifier,embed:emettre,adversemedia:consulter,conformite:consulter,dispositif:consulter,integrite:consulter. Svaki se delegira zasebno, pri stvaranju ključa.
Ključ bez potrebnog opsega dobiva 403 — vidi #scopes. - Istek. Godinu dana nakon stvaranja (vidljivo u konzoli ureda). Istekli ključ dobiva izričit 401 — vidi #cle-expiree.
Ključ se može prestati prihvaćati i prije tog datuma, kad API više nije dio pretplate ureda. Zaustavljanje tada nastupa najmanje 30 dana nakon prve e-poruke uredu, na datum koji navodi druga e-poruka, poslana najmanje 7 dana unaprijed. Čim se odredi, taj je datum vidljiv u konzoli ureda (poljecoupure_leuGET /connect/cles), a svaki ga odgovor na prihvaćeni poziv najavljuje u zaglavljuSunsetdok ne nastupi. Nakon tog datuma poziv dobiva 401 opisan u #authentification, s"motif": "fin_option_api"; ako se API vrati u pretplatu, ključ se ponovno prihvaća, do isteka vlastitog roka valjanosti.
Opozvani ključ ne vraća se s API-jem. A kad se cijela pretplata suspendira ili završi, ključevi se odmah prestaju prihvaćati, bez tog roka. - Ograničenje. 60 zahtjeva/minuti po ključu (podesivo po ključu). Odgovor 429 nosi
Retry-Afteri zaglavljaX-RateLimit-Limit / -Remaining / -Reset. - Opoziv. Trenutačan, iz konzole. Razrješavanje ide preko sažetka: ključevi se ne mogu nabrajati.
Tri curl poziva i vidjeli ste sve.
# Zdravlje + autentifikacija ključa
curl -s https://vigilae.org/api/v1/sante \
-H "Authorization: Bearer vgk_your_key"
# Dnevnik praćenja, od početka, u stranicama od 100
curl -s "https://vigilae.org/api/v1/evenements?depuisSeq=0&limite=100" \
-H "Authorization: Bearer vgk_your_key"
# Kvalificiraj događaj 42 (opseg za pisanje)
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"}'Straničenje, u jednom pravilu
Proslijedite depuisSeq (0 pri prvom pozivu) i limite (najviše 500): odgovor je sortiran po rastućem seq i vraća prochainSeq, koji pri sljedećem pozivu proslijedite nepromijenjen. Stranica kraća od limite znači kraj dnevnika — prochainSeq tada ostaje stabilan i služi kao kursor za periodično dohvaćanje. Bez depuisSeq dobivate prikaz „najnovije prvo”, ograničen na 500.
Portfelj se dohvaća na /api/v1/portefeuille/agregats — brojači, jedan odgovor, bez straničenja.
Potpisani, vremenski označeni, isporučeni barem jednom.
Umjesto da dnevnik stalno prozivate, primajte ga: Vigilae isporučuje događaje na vaš URL, redom, u serijama od najviše 100. Isporuka je at-least-once — kursor napreduje samo na vaš 2xx, seriju po seriju — a idempotentnost ide po seq: svaku sekvencu obradite točno jednom (#idempotence).
Provjera potpisa
Svaka isporuka nosi zaglavlje x-vigilae-signature: t=<unix>,v1=HMAC-SHA256(secret, t + "." + body). Ponovno izračunajte v1 iz sirovog primljenog tijela i odbacite svaku vremensku oznaku t stariju od 5 min: to je zaštita od ponavljanja. Tijekom rotacije tajne zaglavlje nosi po jedan v1 za svaku još valjanu tajnu (preklapanje 24 h): prihvatite ako se bilo koji podudara.
// Node — provjera potpisa (bez ovisnosti)
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 — ista provjera
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 FalsePrijelazno: stari format sha256=HMAC(body) i dalje se emitira na x-vigilae-signature-legacy za već postavljene prijamnike; uklanjanje je planirano s webhookovima v2. Novi prijamnici provjeravaju gornju shemu s vremenskom oznakom, ne staru.
Rotacija se pokreće iz konzole (POST /connect/webhook/rotation na aplikacijskoj strani): stara tajna potpisuje još 24 h — dovoljno da na svojoj strani postavite novu bez prozora ispada.
Stanje praćenja, u vašim zaslonima.
Vaš softver već stvara spise putem API-ja; widgeti mu daju površinu koja je nedostajala: prikaz stanja praćenja spisa u vašoj kartici klijenta, bez ponovne izgradnje sučelja za usklađenost. Tijek ima tri koraka — vaš poslužitelj izdaje kratkotrajni token, vraćeni URL smješta se u iframe, widget prikazuje. On samo prikazuje: nijedna odluka, nijedna kvalifikacija, nijedno pisanje nikada ne prolazi kroz widget. Klikom se otvara aplikacija Vigilae, gdje djeluje identificirana osoba.
1. Izdavanje tokena — na poslužiteljskoj strani, nikada u stranici
Ključ vgk_ nikada ne dodiruje preglednik. Vaš poslužitelj poziva mint s namjenskim opsegom embed:emettre (označenim pri stvaranju ključa, nikada naslijeđenim) i samo kratki token silazi do stranice: petnaest minuta prema zadanim postavkama, ograničeno na 5-60, vezano uz jedan spis, jednu komponentu, jedan deklarirani izvor. Putuje u fragmentu URL-a — ne dopire ni do naših dnevnika, ni do vaših.
# Token za Compliance Button, oznaka odabrana iz kataloga
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. Postavljanje iframea — pokretač, u deset redaka
Pokretač vigilae-embed.js stvara sandboxirani iframe, obavlja handshake i prati veličinu widgeta (ograničenu — iframe nikada ne diktira svoju visinu vašoj stranici). Što se tiče CSP-a, vaša stranica otvara samo jednu direktivu: frame-src https://vigilae.org. Nije potreban nikakav inline skript, nikakva ovisnost. Ručno napisan iframe funkcionira jednako dobro.
<script src="https://vigilae.org/embarque/vigilae-embed.js" defer></script>
<div id="vigilance"></div>// U vašoj skripti: url dolazi s VAŠEG poslužitelja, koji je pozvao mint
var widget = VigilaeEmbed.monter({
conteneur: 'vigilance',
url: urlReturnedByTheMint,
renouvelerJeton: function () { // pri isteku: ponovno izdajte token na poslužiteljskoj strani
return fetch('/my-server/vigilae-token').then(function (r) { return r.text(); });
},
});
// widget.rafraichir(token) šalje svjež token; widget.demonter() uklanja sve.3. Compliance Button: vaša oznaka, naše stanje
Oznaka gumba bira se iz zatvorenog kataloga — nikad slobodan tekst na površini koja govori o praćenju — shell te oznake prikazuje na francuskom ili engleskom (parametar ?lang=), još ne na vašem jeziku; popis niže objašnjava njihovo značenje:
controler_client— „Provjeri ovog klijenta” (zadano)lancer_vigilance— „Pokreni dubinsku analizu”verifier_be— „Provjeri stvarne vlasnike”preparer_dossier— „Pripremi SPNFT spis”
Statusna točkica, međutim, prikazuje stanje koje izračunava Vigilae: a_jour (zeleno — provjera i ocjena ažurne), a_revoir (žuto — provjera ili ocjena zastarjele, ili je izvor otkazao u posljednjem prolazu), alerte (crveno — barem jedno upozorenje za obradu), inconnu (sivo — spis nikada nije provjeren). Oznaka se konfigurira, semantika nikad: boja je vezana uz stanje unutar samog shella, koji ignorira svaki pokušaj njezina nadjačavanja putem postMessagea. Spis u statusu upozorenja prikazuje upozorenje, bez obzira na stiliziranje.
Ugovor postMessage, u cijelosti
Widget emitira vigilae:pret, vigilae:taille (automatsko prilagođavanje veličine), vigilae:expire (ponovno izdajte token na poslužiteljskoj strani, zatim pošaljite vigilae:jeton) i vigilae:ouvrir. Nikada ime, rizik ili upozorenje unutar poruke: vaš softver već ima sve putem API-ja poslužitelj-poslužitelj, i ovaj kanal neće postati drugi takav kanal.
frame-ancestors shella. Administrator ga deklarira izravno u Vigilae, na zaslonu „Integracije i sigurnost”: najviše deset izvora https://, izričito naveden host, bez zamjenskih znakova; komponente koje aktivira; i masovni opoziv koji jednim potezom poništava sve već izdane tokene. http://localhost dopušten je samo na probnom uredu — pišite na contact@vigilae.org (predmet „Ugrađeni widgeti”) da se jedan otvori za trajanje vaše integracije. Nijedan izvor nije deklariran: mint odbija sa 400. Instanca čije spremište izvora nije povezano: izričit 501 — vidi #embed-indisponible.Sandbox: na zahtjev.
Svaka klasa API pogrešaka ima stabilnu adresu u referenci pogrešaka: #authentification, #scopes, #cloisonnement, #debit, #signature… Odgovori API-ja s pogreškom upućivat će na ta sidra.
API ne izlaže ni prijave sumnjivih transakcija ni doslovne sadržaje stranaka, po samoj arhitekturi (čl. L.561-18 francuskog CMF-a). API ne donosi nijednu odluku dubinske analize: on izlaže i kvalificira događaje; profesionalac odlučuje.