API, ko var izlasīt pirms parakstīšanas.
Specifikācija ir publiska, virsmas ir neitrālas, webhook parakstu jūsu pusē var pārbaudīt desmit rindās. Šī lapa dokumentē to, ko API atklāj šodien — neko vairāk, un tas ir apzināti: kas nav piegādāts, tas netiek dokumentēts.
- OpenAPI specifikācija lasāma bez atslēgas un bez konta
- Nekad neviens aizdomīga darījuma ziņojums, nekad klienta saturs vārds vārdā
- Parakstīti webhooki, pārbaudāmi ārpus Vigilae
To pasniedz pats API: līgums, ko lasāt, ir tas, kas darbojas.
Neitrālas virsmas — pēc uzbūves.
API atklāj to, ko integrētājs var patērēt, neskarot lietu noslēpumu: uzraudzības žurnālu un skaitītājus. Uzraudzības lietas saturs, dokumenti, aizdomīgu darījumu ziņojumi caur šo API neplūst — tas nav plāna ierobežojums, tā ir arhitektūra.
Uzraudzības žurnāls
Biroja pKYC notikumi — dokuments ar beigušos termiņu, patiesā labuma guvēja maiņa, izskatāma atkārtota pārbaude — neitrālā formā: secība, tips, smaguma pakāpe, datums. Atbildes vienmēr ierobežotas līdz 500 notikumiem.
Portfeļa agregāti
Skaitītāji, nekad lieta: apjomi pa statusiem, kavējumi, pilnīgums. Pietiek, lai jūsu rīkā attēlotu infopaneli, tajā neienākot ne vienam vienīgam klienta datam.
Kvalificēšana
Vienīgā rakstīšanas darbība: žurnāla notikuma kvalificēšana (statuss qualifie vai clos, risinājums planifie, traite vai ecarte). Tai vajadzīgs rakstīšanas tvērums — mazāko privilēģiju princips ir noteikums, nevis izvēles iespēja.
API ir veidots darbam serveris–serveris: atslēga kodā, kas tiek piegādāts pārlūkam, ir publicēta atslēga. Lai atslēgu tur servera puses starpnieks, nekad — lapa.
Atslēgas ar ierobežotu tvērumu, parādītas vienreiz, atsaucamas nekavējoties.
- Formāts. Katra atslēga sākas ar
vgk_un tiek sūtīta kāAuthorization: Bearer vgk_…. Noslēpums tiek parādīts tikai izveides brīdī: mēs glabājam vienīgi tā SHA-256 nospiedumu. - Tvērumi.
lecture(lasīšana, noklusējums) unecriture(rakstīšana). Atslēga bez vajadzīgā tvēruma saņem 403 — sk. #scopes. - Derīguma termiņš. Viens gads pēc izveides (redzams biroja konsolē). Atslēga ar beigušos termiņu saņem nepārprotamu 401 — sk. #cle-expiree.
- Limits. 60 pieprasījumi minūtē uz atslēgu (pielāgojams katrai atslēgai). 429 atbilde nes
Retry-Afterun galvenesX-RateLimit-Limit / -Remaining / -Reset. - Atsaukšana. Tūlītēja, no konsoles. Atpazīšana notiek pēc nospieduma: atslēgas nevar uzskaitīt.
Trīs curl izsaukumi — un jūs esat redzējuši visu.
# Veselības pārbaude + atslēgas autentifikācija
curl -s https://vigilae.org/api/v1/sante \
-H "Authorization: Bearer vgk_your_key"
# Uzraudzības žurnāls no sākuma, pa 100 lapā
curl -s "https://vigilae.org/api/v1/evenements?depuisSeq=0&limite=100" \
-H "Authorization: Bearer vgk_your_key"
# Kvalificēt notikumu 42 (rakstīšanas tvērums)
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"}'Lapošana vienā noteikumā
Nododiet depuisSeq (0 pirmajā izsaukumā) un limite (ne vairāk kā 500): atbilde ir kārtota pēc augoša seq un atgriež prochainSeq, ko nākamajā izsaukumā nodod tālāk nemainītu. Lapa, kas īsāka par limite, nozīmē žurnāla beigas — prochainSeq tad paliek stabils un kalpo kā aptaujas kursors. Bez depuisSeq jūs saņemat skatu „jaunākie vispirms”, ierobežotu līdz 500.
Portfeli vaicā ar /api/v1/portefeuille/agregats — skaitītāji, viena atbilde, bez lapošanas.
Parakstīti, ar laikspiedolu, piegādāti vismaz vienreiz.
Tā vietā, lai žurnālu aptaujātu, saņemiet to: Vigilae piegādā notikumus uz jūsu URL, secībā, partijās pa ne vairāk kā 100. Piegāde ir at-least-once — kursors virzās uz priekšu tikai pēc jūsu 2xx, partiju pa partijai — un idempotence ir pēc seq: apstrādājiet katru secību tieši vienu reizi (#idempotence).
Paraksta pārbaude
Katra piegāde nes galveni x-vigilae-signature: t=<unix>,v1=HMAC-SHA256(secret, t + "." + body). Pārrēķiniet v1 no saņemtā neapstrādātā ķermeņa un noraidiet jebkuru laikspiedolu t, kas vecāks par 5 min: tā ir aizsardzība pret atkārtošanu. Noslēpuma rotācijas laikā galvene nes vienu v1 katram vēl derīgajam noslēpumam (24 h pārklāšanās): pieņemiet, ja sakrīt jebkurš no tiem.
// Node — paraksta pārbaude (bez atkarībām)
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 — tā pati pārbaude
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 FalsePārejas posmā: vecais formāts sha256=HMAC(body) jau esošajiem saņēmējiem joprojām tiek izsūtīts galvenē x-vigilae-signature-legacy; tā izņemšana ir plānota kopā ar webhooks v2. Jauni saņēmēji pārbauda augstāk aprakstīto laikspiedola shēmu, nevis veco.
Rotāciju iedarbina no konsoles (lietojumprogrammas pusē POST /connect/webhook/rotation): 24 h vecais noslēpums vēl paraksta — laiks izvietot jauno jūsu pusē bez atteices loga.
Smilškaste: pēc pieprasījuma.
Katrai API kļūdu klasei ir stabila adrese kļūdu uzziņā: #authentification, #scopes, #cloisonnement, #debit, #signature… API kļūdu atbildes norādīs uz šiem enkuriem.
API pēc uzbūves neatklāj ne aizdomīgu darījumu ziņojumus, ne klientu saturu vārds vārdā (Francijas CMF L.561-18. pants). API nepieņem nevienu uzraudzības lēmumu: tas atklāj un kvalificē notikumus; lemj profesionālis.