API, ktoré si prečítate skôr, než podpíšete.
Špecifikácia je verejná, plochy sú neutrálne, podpis webhoku si na svojej strane overíte v desiatich riadkoch. Táto stránka dokumentuje to, čo API vystavuje dnes — nič viac, a je to zámer: čo nie je nasadené, nie je zdokumentované.
- Špecifikácia OpenAPI čitateľná bez kľúča aj bez účtu
- Nikdy žiadne hlásenie neobvyklej obchodnej operácie, nikdy doslovný klientsky obsah
- Podpísané webhooky, overiteľné mimo Vigilae
Servíruje ju samotné API: kontrakt, ktorý čítate, je ten, ktorý beží.
Neutrálne plochy, už z konštrukcie.
API vystavuje to, čo môže integrátor konzumovať bez dotyku s tajomstvom spisov: monitorovací denník a počítadlá. Obsah spisu obozretnosti, doklady ani hlásenia neobvyklých obchodných operácií týmto API neprechádzajú — nejde o obmedzenie cenového plánu, ale o architektúru.
Monitorovací denník
Udalosti pKYC kancelárie — doklad po platnosti, zmena konečného užívateľa výhod, opätovné preverenie na posúdenie — v neutrálnej podobe: sekvencia, typ, závažnosť, dátum. Odpovede vždy ohraničené na 500 udalostí.
Agregáty portfólia
Počítadlá, nikdy spis: objemy podľa stavu, omeškania, úplnosť. Dosť na vykreslenie prehľadu vo vašom nástroji bez toho, aby doň vstúpil čo i len jeden klientsky údaj.
Kvalifikácia
Jediný zápis: kvalifikácia udalosti denníka (stav qualifie alebo clos, dispozícia planifie, traite alebo ecarte). Vyžaduje zapisovací rozsah — najmenšie oprávnenie je pravidlo, nie možnosť.
API je navrhnuté server-server: kľúč v kóde odoslanom do prehliadača je zverejnený kľúč. Kľúč nech drží serverová proxy, nikdy stránka.
Kľúče s vymedzenými oprávneniami, zobrazené raz, okamžite odvolateľné.
- Formát. Každý kľúč sa začína
vgk_a posiela sa akoAuthorization: Bearer vgk_…. Tajomstvo sa zobrazí len pri vytvorení: neuchovávame nič okrem jeho odtlačku SHA-256. - Rozsahy oprávnení.
lecture(čítanie, predvolené) aecriture(zápis). Kľúč bez požadovaného rozsahu dostane 403 — pozri #scopes. - Platnosť. Jeden rok od vytvorenia (viditeľná v konzole kancelárie). Expirovaný kľúč dostane explicitnú 401 — pozri #cle-expiree.
- Limit. 60 požiadaviek/minútu na kľúč (dá sa upraviť pre jednotlivý kľúč). Odpoveď 429 nesie
Retry-Aftera hlavičkyX-RateLimit-Limit / -Remaining / -Reset. - Odvolanie. Okamžité, z konzoly. Rozlíšenie prebieha podľa odtlačku: kľúče sa nedajú enumerovať.
Tri volania curl a videli ste všetko.
# Stav + autentifikácia kľúčom
curl -s https://vigilae.org/api/v1/sante \
-H "Authorization: Bearer vgk_your_key"
# Monitorovací denník, od začiatku, po stránkach po 100
curl -s "https://vigilae.org/api/v1/evenements?depuisSeq=0&limite=100" \
-H "Authorization: Bearer vgk_your_key"
# Kvalifikácia udalosti 42 (zapisovací rozsah)
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"}'Stránkovanie v jednom pravidle
Odovzdajte depuisSeq (pri prvom volaní 0) a limite (strop 500): odpoveď je zoradená vzostupne podľa seq a vracia prochainSeq, ktorý pri ďalšom volaní odovzdáte bezo zmeny. Stránka kratšia než limite znamená koniec denníka — prochainSeq vtedy zostáva stabilný a slúži ako kurzor na periodické dopytovanie. Bez depuisSeq dostanete pohľad „najnovšie najprv“, ohraničený na 500.
Portfólio sa dopytuje na /api/v1/portefeuille/agregats — počítadlá, jedna odpoveď, žiadne stránkovanie.
Podpísané, s časovou pečiatkou, doručené aspoň raz.
Namiesto dopytovania denníka ho prijímajte: Vigilae doručuje udalosti na vašu URL, v poradí, v dávkach najviac po 100. Doručovanie je at-least-once — kurzor sa posúva len po vašej 2xx, dávku po dávke — a idempotencia je podľa seq: každú sekvenciu spracujte práve raz (#idempotence).
Overenie podpisu
Každé doručenie nesie hlavičku x-vigilae-signature: t=<unix>,v1=HMAC-SHA256(secret, t + "." + body). Prepočítajte v1 zo surového prijatého tela a odmietnite každú časovú pečiatku t staršiu než 5 min: to je ochrana proti opakovanému prehratiu. Počas rotácie tajomstva nesie hlavička jedno v1 za každé ešte platné tajomstvo (prekrytie 24 h): prijmite, ak sa zhoduje ktorékoľvek z nich.
// Node — overenie podpisu (bez závislostí)
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 — rovnaké overenie
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 FalsePrechodné obdobie: starý formát sha256=HMAC(body) sa pre už nasadené prijímače stále emituje v hlavičke x-vigilae-signature-legacy; jeho odstránenie je plánované s webhookmi v2. Nové prijímače overujú vyššie uvedenú schému s časovou pečiatkou, nie tú starú.
Rotácia sa spúšťa z konzoly (POST /connect/webhook/rotation na strane aplikácie): počas 24 h staré tajomstvo stále podpisuje — čas na nasadenie nového na vašej strane bez okna výpadku.
Sandbox: na požiadanie.
Každá trieda chýb API má stálu adresu v referencii chýb: #authentification, #scopes, #cloisonnement, #debit, #signature… Chybové odpovede API budú na tieto kotvy odkazovať.
API nevystavuje hlásenia neobvyklých obchodných operácií ani doslovný klientsky obsah, už z konštrukcie (čl. L.561-18 francúzskeho CMF). API neprijíma žiadne rozhodnutie o obozretnosti: vystavuje a kvalifikuje udalosti; rozhoduje profesionál.