API, které si přečtete dřív, než podepíšete.
Specifikace je veřejná, plochy jsou neutrální, podpis webhooku lze na vaší straně ověřit na deset řádků. Tato stránka dokumentuje, co API vystavuje dnes — nic víc, a je to záměr: co není dodáno, není zdokumentováno.
- Specifikace OpenAPI čitelná bez klíče i bez účtu
- Nikdy oznámení podezřelého obchodu, nikdy doslovný klientský obsah
- Podepsané webhooky, ověřitelné mimo Vigilae
Servíruje ji samo API: kontrakt, který čtete, je ten, který běží.
Neutrální plochy, už z konstrukce.
API vystavuje to, co integrátor může konzumovat, aniž by se dotkl tajemství spisů: deník sledování a čítače. Obsah spisu obezřetnosti, doklady ani oznámení podezřelého obchodu tímto API neprocházejí — není to omezení tarifu, je to architektura.
Deník sledování
Události pKYC kanceláře — prošlý doklad, změna skutečného majitele, opětovné prověření k posouzení — v neutrální podobě: sekvence, typ, závažnost, datum. Odpovědi vždy omezené na 500 událostí.
Agregáty portfolia
Čítače, nikdy spis: objemy podle stavu, prodlevy, úplnost. Dost na vykreslení dashboardu ve vašem nástroji, aniž by do něj vstoupil jediný klientský údaj.
Kvalifikace
Jediný zápis: kvalifikace události deníku (stav qualifie nebo clos, vyřízení planifie, traite nebo ecarte). Vyžaduje scope zápisu — zásada nejmenších oprávnění je pravidlem, ne volbou.
API je navrženo pro komunikaci server–server: klíč v kódu odeslaném do prohlížeče je zveřejněný klíč. Klíč ať drží proxy na straně serveru, nikdy stránka.
Klíče s vymezenými scopes, zobrazené jednou, okamžitě odvolatelné.
- Formát. Každý klíč začíná
vgk_a posílá se jakoAuthorization: Bearer vgk_…. Tajemství se zobrazuje pouze při vytvoření: neuchováváme nic než jeho otisk SHA-256. - Scopes.
lecture(čtení, výchozí) aecriture(zápis). Klíč bez požadovaného scopu dostane 403 — viz #scopes. - Platnost. Jeden rok od vytvoření (viditelné v konzoli kanceláře). Prošlý klíč dostane explicitní 401 — viz #cle-expiree.
- Limit. 60 požadavků/minutu na klíč (lze upravit pro jednotlivý klíč). Odpověď 429 nese
Retry-Aftera hlavičkyX-RateLimit-Limit / -Remaining / -Reset. - Odvolání. Okamžité, z konzole. Vyhledání probíhá podle otisku: klíče nelze enumerovat.
Tři volání curl a viděli jste všechno.
# Stav služby + ověření klíče
curl -s https://vigilae.org/api/v1/sante \
-H "Authorization: Bearer vgk_your_key"
# Deník sledování, od začátku, po stránkách po 100
curl -s "https://vigilae.org/api/v1/evenements?depuisSeq=0&limite=100" \
-H "Authorization: Bearer vgk_your_key"
# Kvalifikovat událost 42 (scope zápisu)
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ánkování v jednom pravidle
Předejte depuisSeq (při prvním volání 0) a limite (strop 500): odpověď je seřazena vzestupně podle seq a vrací prochainSeq, který při dalším volání předáte beze změny. Stránka kratší než limite znamená konec deníku — prochainSeq pak zůstává stabilní a slouží jako kurzor pro polling. Bez depuisSeq dostanete pohled „nejnovější napřed“, omezený na 500.
Portfolio se dotazuje na /api/v1/portefeuille/agregats — čítače, jedna odpověď, žádné stránkování.
Podepsané, s časovým razítkem, doručené alespoň jednou.
Místo dotazování na deník jej přijímejte: Vigilae doručuje události na vaši URL, v pořadí, v dávkách po nejvýše 100. Doručení je at-least-once — kurzor se posouvá jen po vašem 2xx, dávku po dávce — a idempotence se řídí seq: každou sekvenci zpracujte právě jednou (#idempotence).
Ověření podpisu
Každé doručení nese hlavičku x-vigilae-signature: t=<unix>,v1=HMAC-SHA256(secret, t + "." + body). Přepočítejte v1 ze surového přijatého těla a odmítněte každé časové razítko t starší než 5 minut: to je ochrana proti replay útoku. Během rotace tajemství nese hlavička jedno v1 za každé dosud platné tajemství (překryv 24 hodin): přijměte, pokud kterékoli z nich odpovídá.
// Node — ověření 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; // ochrana proti 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 — stejné ověření
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 # ochrana proti 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 FalsePřechodné: starý formát sha256=HMAC(body) se stále emituje v hlavičce x-vigilae-signature-legacy pro už zavedené příjemce; jeho odstranění je plánováno s webhooky v2. Noví příjemci ověřují výše uvedené schéma s časovým razítkem, ne to staré.
Rotace se spouští z konzole (POST /connect/webhook/rotation na straně aplikace): po 24 hodin staré tajemství stále podepisuje — čas na nasazení nového na vaší straně bez okna výpadku.
Sandbox: na vyžádání.
Každá třída chyb API má stabilní adresu v referenčním přehledu chyb: #authentification, #scopes, #cloisonnement, #debit, #signature… Chybové odpovědi API budou na tyto kotvy odkazovat.
API nevystavuje oznámení podezřelého obchodu ani doslovný klientský obsah, už z konstrukce (čl. L.561-18 francouzského CMF). Žádné rozhodnutí v rámci obezřetnosti nečiní API: vystavuje a kvalifikuje události; rozhoduje profesionál.