KYC.hr API – upute za integraciju
Pregled
KYC.hr API omogućuje da provjeru stranaka pokrenete izravno iz svog sustava (core banking, CRM, web shop, aplikacija za registraciju korisnika), bez ručnog unosa u aplikaciju KYC.hr. Jednim pozivom stranka se provjerava na:
- sankcijskim listama (UN, EU, OFAC, UK i ostale liste koje KYC.hr prati),
- listama politički izloženih osoba (PEP), samo za fizičke osobe,
- listi crnih banaka, ako pošaljete naziv banke stranke,
- negativnim medijskim objavama (adverse media), ako to zatražite.
Rezultat provjere je status podudaranja i popis pronađenih pogodaka. Svaka provjera se sprema i možete je kasnije ponovno dohvatiti ili pregledati u aplikaciji KYC.hr.
Osnovna adresa API-ja: https://api.kyc.hr
Svi zahtjevi i odgovori su u JSON formatu (Content-Type: application/json). Datumi su u ISO 8601 formatu (npr. 2026-10-02T14:35:12Z).
Kako dobiti pristup
- Ugovorite API paket u aplikaciji KYC.hr. API pretplata je zasebna i neovisna o pretplati na korištenje aplikacije.
- Nakon aktivacije paketa u aplikaciji KYC.hr, na stranici za API ključeve generirajte svoj ključ.
- Ključ se prikazuje samo jednom, odmah nakon generiranja. Spremite ga na sigurno mjesto. KYC.hr ne čuva ključ u čitljivom obliku i ne može vam ga ponovno prikazati. Ako ga izgubite, generirajte novi ključ, a stari time prestaje vrijediti.
API ključ ima oblik kyc_live_ iza kojeg slijede 64 znaka. Ključ nikada ne ugrađujte u kod koji se izvršava kod korisnika (preglednik, mobilna aplikacija). API pozivajte isključivo sa svog poslužitelja.
Autentikacija
Svaki zahtjev mora sadržavati API ključ u headeru X-Api-Key:
X-Api-Key: kyc_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Ako ključ nedostaje, nije ispravan, istekao je ili je pretplata neaktivna, API vraća 401 Unauthorized:
{
"error": "unauthorized",
"message": "Provide a valid X-Api-Key header."
}
Nova provjera stranke
POST /v1/screenings
Pokreće provjeru jedne stranke. Provjera traje od jedne do nekoliko sekundi, ovisno o tome koje se provjere izvršavaju.
Parametri zahtjeva
| Polje | Tip | Obavezno | Opis |
|---|---|---|---|
subjectType |
string | da | person (fizička osoba) ili company (pravna osoba) |
name |
string (do 200) | da | Ime fizičke osobe ili naziv pravne osobe |
surname |
string (do 200) | ne | Prezime fizičke osobe |
dateOfBirth |
datum | ne | Datum rođenja, npr. 1975-04-21 |
identificationNumber |
string (do 50) | ne | OIB ili drugi identifikacijski broj |
countryCode |
string (do 3) | ne | Kod države, npr. HR |
bankName |
string (do 200) | ne | Naziv banke stranke. Ako je poslan, banka se provjerava na listi crnih banaka. |
includeAdverseMedia |
boolean | ne | Ako je true, provjeravaju se i negativne medijske objave. Zadano false. |
externalReference |
string (do 200) | ne | Vaša oznaka stranke (npr. broj klijenta u vašem sustavu). Vraća se u odgovoru i olakšava povezivanje rezultata. |
Provjera politički izloženih osoba radi se samo za subjectType = person.
Primjer zahtjeva (curl)
curl -X POST https://api.kyc.hr/v1/screenings \
-H "X-Api-Key: kyc_live_xxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"subjectType": "person",
"name": "Ivan",
"surname": "Horvat",
"dateOfBirth": "1975-04-21",
"countryCode": "HR",
"includeAdverseMedia": true,
"externalReference": "KLIJENT-10045"
}'
Primjer odgovora (201 Created)
{
"screeningId": "3f2b8c1e-5d7a-4e9b-9c21-7a6f0d4e8b13",
"subjectType": "person",
"name": "Ivan",
"surname": "Horvat",
"externalReference": "KLIJENT-10045",
"createdAt": "2026-10-02T14:35:12Z",
"durationMs": 1240,
"matchStatus": "NMTCH",
"checks": {
"sanctions": { "performed": true, "hit": false, "hitCount": 0 },
"pep": { "performed": true, "hit": false, "hitCount": 0 },
"bankBlackList": { "performed": false, "hit": false, "hitCount": 0 },
"adverseMedia": { "performed": true, "hit": false, "hitCount": 0 }
},
"hits": []
}
Odgovor sadrži i header Location s adresom na kojoj se ista provjera može ponovno dohvatiti.
Polja odgovora
| Polje | Opis |
|---|---|
screeningId |
Jedinstveni identifikator provjere (GUID). Spremite ga ako provjeru želite kasnije dohvatiti. |
matchStatus |
Ukupni status podudaranja, vidi Statusi podudaranja. |
checks |
Za svaku vrstu provjere: je li izvršena (performed), ima li pogodaka (hit) i koliko (hitCount). |
hits |
Popis pronađenih pogodaka, vidi ispod. |
durationMs |
Trajanje provjere u milisekundama. |
Pogoci (hits)
Svaki pogodak opisuje jedno pronađeno podudaranje. Ovisno o vrsti pogotka, popunjena su različita polja:
| Polje | Opis |
|---|---|
hitType |
Vrsta pogotka (sankcije, PEP, crna banka, negativne medijske objave) |
matchedName |
Ime ili naziv s liste koje se podudara sa strankom |
score |
Ocjena podudaranja imena (veći broj znači veću sličnost) |
sourceName |
Izvor, npr. naziv sankcijske liste |
institution, title |
Institucija i funkcija, kod PEP pogodaka |
url, text, publishedAt |
Poveznica, izvadak teksta i datum objave, kod negativnih medijskih objava |
Dohvat jedne provjere
GET /v1/screenings/{screeningId}
Vraća spremljenu provjeru u istom obliku kao odgovor na POST /v1/screenings. Dohvatiti možete samo provjere napravljene vašim ključevima. Ako provjera ne postoji, API vraća 404 Not Found.
curl https://api.kyc.hr/v1/screenings/3f2b8c1e-5d7a-4e9b-9c21-7a6f0d4e8b13 \
-H "X-Api-Key: kyc_live_xxxxxxxx"
Popis provjera
GET /v1/screenings?from=&to=&page=&pageSize=
| Parametar | Opis |
|---|---|
from, to |
Razdoblje provjera (neobavezno), npr. 2026-10-01 |
page |
Broj stranice, od 1. Zadano 1. |
pageSize |
Broj provjera po stranici, najviše 200. Zadano 50. |
Svaka stavka popisa sadrži screeningId, subjectType, name, surname, externalReference, createdAt, matchStatus te oznake sanctionsHit, pepHit, bankBlackListHit i adverseMediaHit. Detalje pogodaka dohvatite pozivom za jednu provjeru.
curl "https://api.kyc.hr/v1/screenings?from=2026-10-01&page=1&pageSize=50" \
-H "X-Api-Key: kyc_live_xxxxxxxx"
Statusi podudaranja
| Status | Značenje | Preporučeno postupanje |
|---|---|---|
MTCH |
Podudaranje | Stranka se podudara s osobom ili subjektom s liste. Obustavite postupak i provjerite pogotke. |
CMTCH |
Djelomično podudaranje | Pronađeno je slično ime. Ručno provjerite pogotke (datum rođenja, država, identifikacijski broj). |
NMTCH |
Nema podudaranja | Na provjerenim listama nema pogodaka. |
Status podudaranja je rezultat automatske provjere imena i ne zamjenjuje procjenu rizika stranke koju ste dužni provesti prema Zakonu o sprječavanju pranja novca i financiranja terorizma.
Ograničenja i masovne provjere
Da bi API ostao brz i dostupan svim korisnicima, primjenjuju se sljedeća ograničenja:
- najviše 20 zahtjeva u minuti po API ključu,
- najviše 4 provjere istovremeno na razini cijelog API-ja, uz kratki red čekanja,
- mjesečna kvota provjera prema ugovorenom paketu.
Kada se ograničenje prekorači, API vraća 429 Too Many Requests. Kod prekoračenja broja zahtjeva odgovor sadrži header Retry-After s brojem sekundi nakon kojih zahtjev možete ponoviti. Kod prekoračene mjesečne kvote odgovor je:
{
"error": "quota_exceeded",
"message": "..."
}
Kako provjeriti veći broj stranaka
Svaka stranka provjerava se zasebnim pozivom, a jedna provjera traje od jedne do nekoliko sekundi. Za masovne provjere (npr. cijela baza klijenata):
- šaljite zahtjeve jedan za drugim, a ne sve odjednom,
- ne šaljite više od 20 zahtjeva u minuti,
- na odgovor
429pričekajte broj sekundi iz headeraRetry-Afteri ponovite isti zahtjev, - u
externalReferencešaljite svoju oznaku stranke, kako biste rezultate lakše povezali sa svojom bazom.
Primjer: C#
using System.Net;
using System.Net.Http.Json;
var http = new HttpClient { BaseAddress = new Uri("https://api.kyc.hr") };
http.DefaultRequestHeaders.Add("X-Api-Key", "kyc_live_xxxxxxxx");
foreach (var stranka in stranke)
{
while (true)
{
var response = await http.PostAsJsonAsync("/v1/screenings", new
{
subjectType = "person",
name = stranka.Ime,
surname = stranka.Prezime,
dateOfBirth = stranka.DatumRodjenja,
externalReference = stranka.BrojKlijenta
});
if (response.StatusCode == (HttpStatusCode)429)
{
var retryAfter = response.Headers.RetryAfter?.Delta ?? TimeSpan.FromSeconds(60);
await Task.Delay(retryAfter);
continue;
}
response.EnsureSuccessStatusCode();
var rezultat = await response.Content.ReadFromJsonAsync<ScreeningResponse>();
// spremite rezultat.ScreeningId i rezultat.MatchStatus uz stranku
break;
}
await Task.Delay(TimeSpan.FromSeconds(3)); // najviše 20 zahtjeva u minuti
}
Primjer: JavaScript (Node.js)
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
for (const stranka of stranke) {
while (true) {
const response = await fetch("https://api.kyc.hr/v1/screenings", {
method: "POST",
headers: {
"X-Api-Key": process.env.KYC_API_KEY,
"Content-Type": "application/json"
},
body: JSON.stringify({
subjectType: "person",
name: stranka.ime,
surname: stranka.prezime,
externalReference: stranka.brojKlijenta
})
});
if (response.status === 429) {
const retryAfter = Number(response.headers.get("Retry-After") ?? 60);
await sleep(retryAfter * 1000);
continue;
}
const rezultat = await response.json();
// spremite rezultat.screeningId i rezultat.matchStatus uz stranku
break;
}
await sleep(3000); // najviše 20 zahtjeva u minuti
}
Kodovi odgovora
| Kod | Značenje |
|---|---|
200 OK |
Uspješan dohvat provjere ili popisa |
201 Created |
Provjera je izvršena i spremljena |
400 Bad Request |
Neispravan zahtjev, npr. nedostaje name ili subjectType nije person ili company. Odgovor sadrži popis grešaka po poljima. |
401 Unauthorized |
API ključ nedostaje, nije ispravan, istekao je ili pretplata nije aktivna |
404 Not Found |
Provjera s tim screeningId ne postoji ili ne pripada vama |
429 Too Many Requests |
Prekoračen broj zahtjeva, broj istovremenih provjera ili mjesečna kvota |
Testno okruženje
Za razvoj i testiranje integracije dostupno je zasebno testno okruženje na adresi https://testapi.kyc.hr. Radi jednako kao produkcijski API, ali s testnim podacima i zasebnim testnim ključem. Testni ključ zatražite na support@kyc.hr.