Batch screening
curl --request POST \
--url https://api.compliapi.com/api/v1/screen/batch \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"items": [
{}
],
"lists": "<string>"
}
'import requests
url = "https://api.compliapi.com/api/v1/screen/batch"
payload = {
"items": [{}],
"lists": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({items: [{}], lists: '<string>'})
};
fetch('https://api.compliapi.com/api/v1/screen/batch', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.compliapi.com/api/v1/screen/batch",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'items' => [
[
]
],
'lists' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.compliapi.com/api/v1/screen/batch"
payload := strings.NewReader("{\n \"items\": [\n {}\n ],\n \"lists\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.compliapi.com/api/v1/screen/batch")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"items\": [\n {}\n ],\n \"lists\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.compliapi.com/api/v1/screen/batch")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"items\": [\n {}\n ],\n \"lists\": \"<string>\"\n}"
response = http.request(request)
puts response.read_bodyScreening
Batch screening
Screen up to 50 subjects of mixed types in one request
POST
/
screen
/
batch
Batch screening
curl --request POST \
--url https://api.compliapi.com/api/v1/screen/batch \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"items": [
{}
],
"lists": "<string>"
}
'import requests
url = "https://api.compliapi.com/api/v1/screen/batch"
payload = {
"items": [{}],
"lists": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({items: [{}], lists: '<string>'})
};
fetch('https://api.compliapi.com/api/v1/screen/batch', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.compliapi.com/api/v1/screen/batch",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'items' => [
[
]
],
'lists' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.compliapi.com/api/v1/screen/batch"
payload := strings.NewReader("{\n \"items\": [\n {}\n ],\n \"lists\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.compliapi.com/api/v1/screen/batch")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"items\": [\n {}\n ],\n \"lists\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.compliapi.com/api/v1/screen/batch")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"items\": [\n {}\n ],\n \"lists\": \"<string>\"\n}"
response = http.request(request)
puts response.read_bodyScreens up to 50 subjects in one call — crypto addresses, emails, websites, government IDs, countries and names, mixed freely. Each item is screened exactly as its own endpoint would screen it, and its result has that endpoint’s shape. Use it to re-screen a customer base on a schedule, to check every counterparty on an invoice run, or to screen everything known about one customer at once.
object[]
required
1–50 subjects. Each item:
| Field | Description |
|---|---|
type | crypto, email, website, government_id, country, name, vessel or aircraft — the same checks as /screen/crypto, /screen/email, /screen/website, /screen/id, /screen/country, /screen/name, /screen/vessel and /screen/aircraft |
value | The value to screen |
ref | Optional. Your own reference for the subject (a customer or invoice id, up to 200 characters), returned with its result (and inside it) and recorded on its audit rows |
lists | Optional. List slugs for this item, overriding the batch-level lists |
party_type, birth_date, country, id_number, threshold | Optional, name items only — the same options as /screen/name’s type, birth_date, country, id_number and threshold |
string
Comma-separated list slugs for every item (default: all enabled lists).
Example request
curl -X POST https://api.compliapi.com/api/v1/screen/batch \
-H "Authorization: Bearer $COMPLIAPI_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"items": [
{"type": "name", "value": "Jane Example", "birth_date": "1980", "ref": "cust-1042"},
{"type": "email", "value": "jane@example.com", "ref": "cust-1042"},
{"type": "crypto", "value": "0x098B716B8Aaf21512996dC57EB0615e2383E2f96", "ref": "wallet-77"}
]
}'
Response
results holds one entry per item, in request order, with its index, your ref, type, value and a status:
ok—resultis exactly what the item’s own endpoint returns: the screening envelope, or fornameitems the scored/screen/nameenvelope.error— the item’s input was rejected (an unknown list slug, a malformed birth date, an unknown country…);errorsays why, and the item is not metered.
screened and errors count the two, and flagged / sanctioned are true when any screened item is.
Example response
{
"screened": 3,
"errors": 0,
"flagged": true,
"sanctioned": true,
"results": [
{
"index": 0, "ref": "cust-1042", "type": "name", "value": "Jane Example", "status": "ok",
"result": { "value": "Jane Example", "flagged": false, "sanctioned": false, "lists_checked": ["ofac", "ofac_consolidated"], "threshold": 85, "excluded": 0, "matches": [] },
"error": null
},
{
"index": 1, "ref": "cust-1042", "type": "email", "value": "jane@example.com", "status": "ok",
"result": { "value": "jane@example.com", "flagged": false, "sanctioned": false, "lists_checked": ["ofac", "ofac_consolidated"], "matches": [] },
"error": null
},
{
"index": 2, "ref": "wallet-77", "type": "crypto", "value": "0x098B716B8Aaf21512996dC57EB0615e2383E2f96", "status": "ok",
"result": {
"value": "0x098B716B8Aaf21512996dC57EB0615e2383E2f96", "flagged": true, "sanctioned": true, "lists_checked": ["ofac", "ofac_consolidated"],
"matches": [{ "list": "ofac", "list_name": "US OFAC SDN", "list_type": "sanctions", "match": "exact", "value": "0x098B716B8Aaf21512996dC57EB0615e2383E2f96", "source_url": "https://sanctionssearch.ofac.treas.gov/Details.aspx?id=27307", "metadata": { "symbol": "ETH", "name": "Ethereum", "sdn_name": "LAZARUS GROUP" } }]
},
"error": null
}
]
}
Quota and billing
Each screened item is one request against your monthly quota; rejected items cost nothing. Before screening, the batch is checked against the requests remaining in your period: if they cannot cover every item, the whole batch is refused with429 (code: "QUOTA_EXCEEDED", the detail saying how many it needed and how many remain) and nothing is screened or charged — send a smaller batch or upgrade. Every screened item is written to your organization’s audit trail like a single call.
Batch screening requires an API token; it is not available with x402 pay-per-request, and PEP screening, VPN detection and geolocation are not batchable.