Przesiewanie osób fizycznych lub podmiotów pod kątem globalnych list…
Screen an individual or entity name against the US OFAC SDN list, the UN Security Council Consolidated List and the UK OFSI Consolidated List using Jaro-Winkler fuzzy matching The lists are downloaded from their publishers and refreshed every 24 hours;…
Żądanie
- x-api-key: <your-api-key>
- Content-Type: application/json
Odpowiedź
{
"dataset": {
"failedSources": [
{
"at": "<at>",
"error": "<error>",
"name": "Ada Lovelace"
}
],
"loadedAt": "<loaded at>",
"sources": [
{
"entries": 10,
"fetchedAt": "<fetched at>",
"name": "Ada Lovelace"
}
],
"totalEntries": 3
},
"matches": [
{
"country": "PL",
"countryName": "Poland",
"dob": "<dob>",
"id": "evt_723426",
"matchScore": 0.87,
"matchedName": "Ada Lovelace",
"primaryName": "Ada Lovelace",
"programs": [
"<program>"
],
"remarks": "<remarks>",
"sourceList": "castomapi",
"type": "standard"
}
],
"screeningResult": {
"highestScore": 0.87,
"matchStatus": "CLEARED",
"recommendation": "<recommendation>",
"totalMatchesFound": 2
},
"searchQuery": {
"country": "PL",
"name": "Ada Lovelace",
"normalizedName": "Ada Lovelace",
"threshold": 30,
"type": "standard"
},
"status": "success",
"tokensDeducted": 3
}Co robi
Screen an individual or entity name against the US OFAC SDN list, the UN Security Council Consolidated List and the UK OFSI Consolidated List using Jaro-Winkler fuzzy matching The lists are downloaded from their publishers and refreshed every 24 hours; `dataset` in the response says exactly which lists, how many listings, and when. Not covered: the EU consolidated list (requires a registered token) and PEP lists (no free licensed source exists). Answers 503, unbilled, if no list has loaded yet.
Żądanie
Treść
| Pole | Typ | Wymagane | Opis |
|---|---|---|---|
country | string | nie | Optional ISO 3166-1 Alpha-2 country code to refine match score (e.g. "RU", "DE", "US"). Only applied to listings that carry a nationality or address country. |
dob | string | nie | Optional Date of Birth (YYYY-MM-DD or YYYY) to refine match score |
name | string | tak | Individual or company name to screen |
threshold | integer | nie | Minimum match percentage threshold to report (50-100) |
type | enum | nie | Filter screening by subject entity type (vessels and aircraft are ENTITY) One of: ALL, INDIVIDUAL, ENTITY. |
Przykładowe żądanie
{
"country": "PL",
"dob": "<dob>",
"name": "Ada Lovelace",
"threshold": 75,
"type": "ALL"
}Odpowiedź
| Pole | Typ | Opis |
|---|---|---|
dataset | object | Which lists this verdict was measured against. A CLEARED with a non-empty failedSources is a partial screen. |
↳ failedSources | array<object> | |
↳ loadedAt | string | |
↳ sources | array<object> | |
↳ totalEntries | integer | |
matches | array<object> | |
↳ country | string | |
↳ countryName | string | |
↳ dob | string | |
↳ id | string | |
↳ matchScore | number | |
↳ matchedName | string | |
↳ primaryName | string | |
↳ programs | array<string> | |
↳ remarks | string | |
↳ sourceList | string | |
↳ type | string | |
screeningResult | object | |
↳ highestScore | number | |
↳ matchStatus | enum | One of: CLEARED, POSSIBLE_MATCH, CONFIRMED_MATCH. |
↳ recommendation | string | |
↳ totalMatchesFound | integer | |
searchQuery | object | |
↳ country | string | |
↳ name | string | |
↳ normalizedName | string | |
↳ threshold | integer | |
↳ type | string | |
status | string | |
tokensDeducted | integer |
Przykładowa odpowiedź
{
"dataset": {
"failedSources": [
{
"at": "<at>",
"error": "<error>",
"name": "Ada Lovelace"
}
],
"loadedAt": "<loaded at>",
"sources": [
{
"entries": 10,
"fetchedAt": "<fetched at>",
"name": "Ada Lovelace"
}
],
"totalEntries": 3
},
"matches": [
{
"country": "PL",
"countryName": "Poland",
"dob": "<dob>",
"id": "evt_723426",
"matchScore": 0.87,
"matchedName": "Ada Lovelace",
"primaryName": "Ada Lovelace",
"programs": [
"<program>"
],
"remarks": "<remarks>",
"sourceList": "castomapi",
"type": "standard"
}
],
"screeningResult": {
"highestScore": 0.87,
"matchStatus": "CLEARED",
"recommendation": "<recommendation>",
"totalMatchesFound": 2
},
"searchQuery": {
"country": "PL",
"name": "Ada Lovelace",
"normalizedName": "Ada Lovelace",
"threshold": 30,
"type": "standard"
},
"status": "success",
"tokensDeducted": 3
}Błędy
Każdy błąd ma tę samą kopertę: status HTTP, kod maszynowy i jedno zdanie.
400 | Treść albo parametr nie przeszły walidacji. Tablica details wskazuje pole. |
401 | Brak klucza, klucz cofnięty albo zły nagłówek. Wyślij x-api-key. |
402 | Portfel nie pokrywa tego wywołania. Doładuj albo poczekaj na miesięczny przydział. |
404 | Zasób nie istnieje albo nie jest Twój. Obie sytuacje odpowiadają identycznie i nic nie kosztują. |
429 | Przekroczony limit na minutę dla Twojego planu. Odczekaj i ponów. |
5xx | Usługa nadrzędna odmówiła albo przekroczyła czas. Wywołanie nie jest rozliczane. |
Kod
curl -X POST 'https://app.castomapi.com/v1/verify/sanctions' \
-H 'x-api-key: <your-api-key>' \
-H 'Content-Type: application/json' \
-d '{"country": "PL", "dob": "<dob>", "name": "Ada Lovelace", "threshold": 75, "type": "ALL"}'const res = await fetch('https://app.castomapi.com/v1/verify/sanctions', {
method: 'POST',
headers: { 'x-api-key': '<your-api-key>', 'Content-Type': 'application/json' },
body: JSON.stringify({"country": "PL", "dob": "<dob>", "name": "Ada Lovelace", "threshold": 75, "type": "ALL"})
});
const data = await res.json();
console.log(data);import { request } from 'node:https';
// Node 18+ has fetch built in
const res = await fetch('https://app.castomapi.com/v1/verify/sanctions', {
method: 'POST',
headers: { 'x-api-key': '<your-api-key>', 'Content-Type': 'application/json' },
body: JSON.stringify({"country": "PL", "dob": "<dob>", "name": "Ada Lovelace", "threshold": 75, "type": "ALL"})
});
const data = await res.json();
console.log(data);import requests
res = requests.post(
'https://app.castomapi.com/v1/verify/sanctions',
headers={'x-api-key': '<your-api-key>'},
json={"country": "PL", "dob": "<dob>", "name": "Ada Lovelace", "threshold": 75, "type": "ALL"},
timeout=30,
)
print(res.json())<?php
$ch = curl_init('https://app.castomapi.com/v1/verify/sanctions');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['x-api-key: <your-api-key>', 'Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode(['country' => 'PL', 'dob' => '<dob>', 'name' => 'Ada Lovelace', 'threshold' => 75, 'type' => 'ALL']),
]);
$data = json_decode(curl_exec($ch), true);
print_r($data);Koszt i limity
Ta operacja kosztuje 3 tokenów. Nieudane wywołanie nigdy nie jest rozliczane. Każde konto dostaje 1000 darmowych tokenów miesięcznie; opłacone saldo nie wygasa.
Limity żądań na minutę
| Bez klucza | 10 |
| Free | 60 |
| Pro | 300 |
| Enterprise | 1200 |
Pytania
Ile kosztuje Przesiewanie osób fizycznych lub podmiotów pod kątem globalnych list…?
3 tokenów za udane wywołanie, pobierane z portfela po odpowiedzi. Nieudane wywołania są bezpłatne. Każde konto dostaje 1000 darmowych tokenów miesięcznie.
Jak się uwierzytelnić?
Wyślij klucz w nagłówku x-api-key. Jeden klucz obejmuje każdy rozliczany endpoint; niczego nie trzeba włączać osobno.
Czy mogę wysłać nagłówek Authorization: Bearer zamiast klucza?
Nie dla rozliczanego endpointu — te przyjmują wyłącznie nagłówek x-api-key. Tokeny Bearer należą do strony konta: panel i API konta przyjmują sesję JWT, a castomapi-auth wydaje je standardowym uzgodnieniem OAuth2, z grantami authorization code, client credentials i refresh. Opisuje to strona usługi auth.
Jakie są limity?
10 żądań na minutę z jednego IP zupełnie bez klucza, 60 na minutę w planie Free, 300 w Pro, 1200 w Enterprise. Powyżej poziomu bez klucza limit jest na konto, łącznie dla wszystkich endpointów.
OpenAPI: https://app.castomapi.com/docs/json