API reference
AML & CTF Screening
/v1/aml/screeningsScreen individuals and businesses against international and national sanctions lists, politically exposed persons, adverse media, watchlists and high-risk jurisdictions — once at onboarding, or continuously with ongoing monitoring.
- Screen
- POST /v1/aml/screenings
- Batch
- POST /v1/aml/screenings/batches
- Subjects
- individuals · businesses
- Webhooks
- aml_screening.completed · aml_screening.alert
Overview
Anti-money laundering and counter-terrorist financing (AML/CTF) screening tells you whether a customer, merchant or counterparty appears on a list that should stop or escalate the relationship. One call runs every check you select and returns a single risk_level and risk_score, the individual hits that drove them, and a structured pep block.
Because RDCPASS is the national identity, screening a subject by their RDCPASS ID removes the main weakness of name-only screening: homonyms. The subject’s certified name, date of birth and nationality are used for matching, which sharply reduces false positives on common Congolese names. When the subject resolves to an RDCPASS identity, the response also carries the basic KYC block and any additional scopes your application is granted.
Like every RDCPASS endpoint, this call requires the full authentication stack described in Authentication.
Regulatory context in the DRC
Banks, microfinance institutions, mobile money issuers, insurers, money transfer operators and other reporting entities in the DRC are subject to the national AML/CTF legal framework and, for the financial sector, to the instructions of the Banque Centrale du Congo (BCC). These obligations include customer due diligence, identification of politically exposed persons and beneficial owners, the application of targeted financial sanctions, and the reporting of suspicious transactions to CENAREF, the national financial intelligence unit.
Request modes
AML & CTF Screening supports all four request modes. See Single, batch & async for the full model.
| Mode | Endpoint | Returns |
|---|---|---|
| Single · synchronous | POST /v1/aml/screenings | 200 with the aml_screening |
| Single · asynchronous | POST /v1/aml/screenings + Prefer: respond-async | 202 with a job |
| Batch · synchronous | POST /v1/aml/screenings/batches | 200 with every result — up to 50 items |
| Batch · asynchronous | POST /v1/aml/screenings/batches + Prefer: respond-async | 202 with a batch — up to 10,000 items |
Checks
Select checks with checks. When omitted, all five run.
| check | Description |
|---|---|
| sanctions | Targeted financial sanctions: UN Security Council, OFAC SDN, EU, UK HMT and the CENAREF national list. |
| pep | Politically exposed persons — domestic, foreign and international-organisation — and their family members and close associates. |
| adverse_media | Negative news coverage linked to financial crime, corruption, fraud, terrorism or organised crime. |
| watchlists | Law-enforcement and regulatory watchlists, including persons and entities flagged by confirmed RDCPASS fraud cases. |
| high_risk_jurisdictions | Exposure to jurisdictions identified by the FATF as high-risk or under increased monitoring, through nationality, residence or registered office. |
Lists covered
Hits name the source list in hits[].list. Lists are synchronised continuously with their publishers.
| List | Publisher | category |
|---|---|---|
| UN Security Council Consolidated List | United Nations Security Council | sanctions |
| OFAC SDN | U.S. Treasury — Office of Foreign Assets Control | sanctions |
| EU consolidated list | European Union — financial sanctions | sanctions |
| UK HMT | HM Treasury — consolidated list of financial sanctions targets | sanctions |
| CENAREF national list | CENAREF — persons and entities designated at national level | sanctions |
| PEP database | Domestic (national, provincial, local) and foreign PEPs, family members and close associates | pep |
Subjects
Provide exactly one form of subject:
{ "identifier": { … } }— an individual by RDCPASS ID, passport, CENI voter card, driving licence or national ID. Recommended: matching uses certified identity data and the KYC scope is applied.{ "full_name", "date_of_birth", "nationality" }— an individual known only by name, for example a beneficiary or counterparty without an RDCPASS identity. Provide date_of_birth and nationality whenever you can to reduce false positives.{ "business": { "identifier": { … } } }— a legal entity by RCCM, ID NAT or NIF. The entity’s legal and trade names are screened; to screen its directors and beneficial owners, retrieve them with KYB Verification and screen each one.
Request body
Send the following fields as JSON. As with every RDCPASS request, this is the plaintext shape before AES-256-GCM encryption — see Authentication.
| Field | Type | Required | Description |
|---|---|---|---|
| subject | object | Yes | Who to screen. One of the three forms described in Subjects. |
| subject.identifier | object | No | { "type": "rdcpass_id" | "passport" | "ceni" | "driving_licence" | "national_id", "value": "…" }, e.g. rdcpass_id COD-1907-5521-0386. |
| subject.full_name | string | No | Full name, when screening by name. |
| subject.date_of_birth | string | No | YYYY-MM-DD, when screening by name. |
| subject.nationality | string | No | ISO 3166-1 alpha-3, e.g. COD, when screening by name. |
| subject.business.identifier | object | No | { "type": "rccm" | "id_nat" | "nif", "value": "CD/KIN/RCCM/23-B-01234" }, when screening a business. |
| checks | string[] | No | Any of sanctions, pep, adverse_media, watchlists, high_risk_jurisdictions. Defaults to all. |
| monitoring | boolean | No | true to keep the subject under ongoing monitoring and receive aml_screening.alert webhooks. Defaults to false. |
| purpose | string | Yes | Must be approved for your application — typically regulatory_compliance, customer_onboarding or fraud_prevention. |
| scopes | string[] | No | Additional KYC scopes to return when the subject resolves to an RDCPASS identity. Defaults to all scopes granted to the application. |
| reference | string | No | Your own identifier for the subject, echoed back in the response and in monitoring alerts. Required per item in batches. |
Example request
A bank screens an existing customer by RDCPASS ID and enrols her in ongoing monitoring:
{
"reference": "cust-0001",
"subject": {
"identifier": { "type": "rdcpass_id", "value": "COD-1907-5521-0386" }
},
"checks": ["sanctions", "pep", "adverse_media", "watchlists", "high_risk_jurisdictions"],
"monitoring": true,
"purpose": "regulatory_compliance",
"scopes": ["kyc.addresses", "kyc.professions"]
}The same call as a full request in your language. Header values are illustrative placeholders — see Authentication to compute them.
# Body shown in plaintext — encrypt it per /docs/authentication before sending.
curl https://api.rdcpass.cd/v1/aml/screenings \
-X POST \
-H "X-RDCPASS-Key-Id: key_live_8f2a1c0e9b" \
-H "X-RDCPASS-Timestamp: 1790418900" \
-H "X-RDCPASS-Nonce: 8d4b2f6e-1a7c-4e93-b05d-6c2e9a1f3b78" \
-H "X-RDCPASS-IV: Lm3sR9wQ0tYc2VxN" \
-H "X-RDCPASS-Signature: e82c5a...41f6" \
-H "Idempotency-Key: c1a7e3f9-4b2d-4a68-9e0c-7d5b3f1a2e84" \
-H "Content-Type: application/json" \
-d '{
"reference": "cust-0001",
"subject": { "identifier": { "type": "rdcpass_id", "value": "COD-1907-5521-0386" } },
"checks": ["sanctions", "pep", "adverse_media", "watchlists", "high_risk_jurisdictions"],
"monitoring": true,
"purpose": "regulatory_compliance",
"scopes": ["kyc.addresses", "kyc.professions"]
}'{
"id": "aml_3f9b2c7e10",
"object": "aml_screening",
"livemode": true,
"reference": "cust-0001",
"status": "completed",
"subject": {
"type": "individual",
"identifier": { "type": "rdcpass_id", "value": "COD-1907-5521-0386" }
},
"checks": ["sanctions", "pep", "adverse_media", "watchlists", "high_risk_jurisdictions"],
"risk_level": "medium",
"risk_score": 48,
"hits": [
{
"list": "PEP database",
"category": "pep",
"match_score": 0.97,
"matched_name": "Mbuyi Ilunga Nsimba",
"listed_on": "2019-07-15",
"details_url": "https://api.rdcpass.cd/v1/aml/screenings/aml_3f9b2c7e10/hits/0"
},
{
"list": "Adverse media",
"category": "adverse_media",
"match_score": 0.74,
"matched_name": "M. Ilunga Nsimba",
"listed_on": "2024-02-09",
"details_url": "https://api.rdcpass.cd/v1/aml/screenings/aml_3f9b2c7e10/hits/1"
}
],
"pep": {
"is_pep": true,
"level": "domestic",
"positions": [
{
"title": "Provincial Minister of Finance",
"jurisdiction": "Haut-Katanga",
"start_date": "2019-07-15",
"end_date": "2024-05-31"
}
]
},
"monitoring": { "enabled": true, "monitor_id": "mon_6a1d9c4e27" },
"account": {
"rdcpass_id": "COD-1907-5521-0386",
"status": "active",
"certified": true,
"created_at": "2024-11-02T08:47:19Z",
"level_of_assurance": "LOA3"
},
"kyc": {
"basic": {
"full_name": "Mbuyi Ilunga Nsimba",
"first_name": "Mbuyi",
"last_name": "Nsimba",
"date_of_birth": "1979-09-21",
"age": 47,
"gender": "female",
"nationality": "COD"
},
"addresses": [
{
"province": "Haut-Katanga",
"city": "Lubumbashi",
"commune": "Lubumbashi",
"quartier": "Makutano",
"avenue": "Avenue Lumumba",
"number": "112",
"is_primary": true,
"verified_at": "2025-01-14T10:03:00Z"
}
],
"professions": [
{
"title": "Consultant",
"employer": "Nsimba Conseil SARL",
"sector": "Professional services",
"since": "2024-07-01"
}
]
},
"scopes_applied": ["kyc.basic", "kyc.addresses", "kyc.professions"],
"scopes_withheld": [],
"purpose": "regulatory_compliance",
"created_at": "2026-09-26T10:15:02Z"
}Response
A successful synchronous call returns 200 OK with an aml_screening. This subject is a former provincial minister, so the screening returns a PEP hit and a related adverse-media article, and a medium risk level.
| Field | Type | Description |
|---|---|---|
| id | string | Unique identifier of the screening, prefixed aml_. |
| object | string | Always "aml_screening". |
| status | string enum | completed on synchronous calls; async and batch items can be failed. |
| subject | object | The screened subject: type (individual or business) and the identifier used. |
| checks | string[] | The checks that ran. |
| risk_level | string enum | Overall risk: low, medium or high. See Risk levels. |
| risk_score | integer | Overall risk score from 0 to 100. |
| hits | object[] | Every list entry matched. Empty when nothing matched. |
| hits[].list | string | Name of the source list, e.g. "UN Security Council Consolidated List". |
| hits[].category | string enum | sanctions, pep, adverse_media, watchlists or high_risk_jurisdictions. |
| hits[].match_score | number | Similarity between the subject and the list entry, from 0 to 1. |
| hits[].matched_name | string | The name as it appears on the list. |
| hits[].listed_on | string | Date the entry was added to its source list (YYYY-MM-DD). |
| hits[].details_url | string | Where to retrieve the full entry, with the same authentication as this call. |
| pep | object | { "is_pep", "level", "positions" }. level is domestic, foreign, international_organization or null; positions lists title, jurisdiction, start_date and end_date. |
| monitoring | object | { "enabled", "monitor_id" }. monitor_id identifies the monitor in alerts. |
| account / kyc | object | Present only when the subject resolved to an RDCPASS identity: the account block and kyc.basic, plus any additional scopes applied — same shape as KYC Validation. |
| scopes_applied / scopes_withheld | string[] | Scopes returned, and scopes requested but with no data on record. |
The account and kyc blocks follow exactly the same shape and scope rules as KYC Validation. Name-only and business subjects never return them.
Risk levels
risk_level is derived from risk_score, which weighs the category, match score and recency of every hit:
| risk_level | risk_score | Typical handling |
|---|---|---|
| low | 0–29 | No relevant hit. Proceed under standard due diligence. |
| medium | 30–69 | A PEP, adverse-media or jurisdiction hit that calls for enhanced due diligence and senior-management approval under your policy. |
| high | 70–100 | A probable sanctions or watchlist match. Freeze the onboarding or transaction, review the hit and apply your targeted financial sanctions procedure. |
Never tell the subject why
Screening results are compliance information. Do not disclose a hit, a risk level or a monitoring alert to the person concerned — doing so can amount to tipping-off under AML/CTF rules.Screening a business
Screen a merchant or corporate counterparty by its RCCM number:
{
"reference": "merchant-0452",
"subject": {
"business": {
"identifier": { "type": "rccm", "value": "CD/KIN/RCCM/23-B-01234" }
}
},
"checks": ["sanctions", "watchlists", "adverse_media", "high_risk_jurisdictions"],
"purpose": "customer_onboarding"
}{
"id": "aml_8c0e4b2a95",
"object": "aml_screening",
"livemode": true,
"reference": "merchant-0452",
"status": "completed",
"subject": {
"type": "business",
"identifier": { "type": "rccm", "value": "CD/KIN/RCCM/23-B-01234" }
},
"checks": ["sanctions", "watchlists", "adverse_media", "high_risk_jurisdictions"],
"risk_level": "low",
"risk_score": 6,
"hits": [],
"pep": { "is_pep": false, "level": null, "positions": [] },
"monitoring": { "enabled": false, "monitor_id": null },
"purpose": "customer_onboarding",
"created_at": "2026-09-26T10:17:40Z"
}Ongoing monitoring
Set "monitoring": true and RDCPASS re-screens the subject every time a covered list changes, and whenever the subject’s RDCPASS identity is updated. You receive aml_screening.alert only when something material changes — a new hit, a changed risk level or a change in PEP status — so your analysts review deltas rather than re-running your whole portfolio.
Each monitored subject counts as one active monitor for billing. Monitors are listed on the application in the console, where your compliance officer can stop them — for example when a customer relationship ends.
{
"id": "evt_4e7a1c9b20",
"object": "event",
"type": "aml_screening.alert",
"livemode": true,
"created_at": "2026-10-14T03:20:11Z",
"data": {
"object": {
"monitor_id": "mon_6a1d9c4e27",
"screening_id": "aml_3f9b2c7e10",
"reference": "cust-0001",
"reason": "new_hit",
"previous_risk_level": "medium",
"risk_level": "high",
"risk_score": 81,
"hits": [
{
"list": "CENAREF national list",
"category": "sanctions",
"match_score": 0.95,
"matched_name": "Mbuyi Ilunga Nsimba",
"listed_on": "2026-10-13",
"details_url": "https://api.rdcpass.cd/v1/aml/screenings/aml_3f9b2c7e10/hits/2"
}
]
}
}
}data.reason is one of new_hit, risk_level_changed or pep_status_changed.
Batch: portfolio re-screening
Re-screen your whole customer base — after a major list update, before an audit, or when you first connect to RDCPASS — in one asynchronous batch of up to 10,000 subjects. Batch-level purpose applies to every item; each item carries its own reference and may enable monitoring individually.
# Portfolio re-screening — body shown in plaintext; encrypt it per /docs/authentication
curl https://api.rdcpass.cd/v1/aml/screenings/batches \
-X POST \
-H "X-RDCPASS-Key-Id: key_live_8f2a1c0e9b" \
-H "X-RDCPASS-Timestamp: 1790418900" \
-H "X-RDCPASS-Nonce: 8d4b2f6e-1a7c-4e93-b05d-6c2e9a1f3b78" \
-H "X-RDCPASS-IV: Lm3sR9wQ0tYc2VxN" \
-H "X-RDCPASS-Signature: e82c5a...41f6" \
-H "Idempotency-Key: c1a7e3f9-4b2d-4a68-9e0c-7d5b3f1a2e84" \
-H "Prefer: respond-async" \
-H "Content-Type: application/json" \
-d @portfolio.json{
"purpose": "regulatory_compliance",
"items": [
{
"reference": "cust-0001",
"subject": { "identifier": { "type": "rdcpass_id", "value": "COD-1907-5521-0386" } },
"monitoring": true
},
{
"reference": "cust-0002",
"subject": { "full_name": "Kabeya Mwamba Tshisekedi", "date_of_birth": "1988-04-12", "nationality": "COD" }
},
{
"reference": "corp-0017",
"subject": { "business": { "identifier": { "type": "rccm", "value": "CD/GOM/RCCM/19-B-00871" } } }
}
]
}{
"id": "bat_2f8d6b1e03",
"object": "batch",
"service": "aml_screening",
"status": "pending",
"total_items": 9420,
"processed_items": 0,
"succeeded_items": 0,
"failed_items": 0,
"created_at": "2026-09-26T22:00:00Z",
"completed_at": null,
"results_url": "/v1/batches/bat_2f8d6b1e03/results"
}You receive batch.completed (or batch.completed_with_errors) when every item is processed. Page through results with GET /v1/batches/{batch_id}/results:
{
"object": "list",
"data": [
{
"reference": "cust-0002",
"status": "succeeded",
"result": {
"id": "aml_b71e3d09c4",
"object": "aml_screening",
"risk_level": "low",
"risk_score": 4,
"hits": [],
"pep": { "is_pep": false, "level": null, "positions": [] },
"monitoring": { "enabled": false, "monitor_id": null }
}
},
{
"reference": "corp-0017",
"status": "failed",
"error": {
"code": "invalid_identifier",
"message": "subject.business.identifier.value is not a valid RCCM number."
}
}
],
"next_cursor": "cur_9a4c21e7"
}Batches of 50 items or fewer can run synchronously without Prefer: respond-async and return 200 OK with every result; larger synchronous batches are rejected with 413 batch_too_large.
Asynchronous single screening
Add Prefer: respond-async to receive 202 Accepted with a job immediately — useful when screening sits on a queue rather than in a user flow.
curl https://api.rdcpass.cd/v1/aml/screenings \
-X POST \
-H "X-RDCPASS-Key-Id: key_live_8f2a1c0e9b" \
-H "X-RDCPASS-Timestamp: 1790418900" \
-H "X-RDCPASS-Nonce: 8d4b2f6e-1a7c-4e93-b05d-6c2e9a1f3b78" \
-H "X-RDCPASS-IV: Lm3sR9wQ0tYc2VxN" \
-H "X-RDCPASS-Signature: e82c5a...41f6" \
-H "Prefer: respond-async" \
-H "Content-Type: application/json" \
-d @screening.json{
"id": "job_9e3c7a1f58",
"object": "job",
"service": "aml_screening",
"status": "pending",
"created_at": "2026-09-26T10:15:00Z",
"result_url": "/v1/jobs/job_9e3c7a1f58"
}When it completes you receive aml_screening.completed (and job.completed) with the full aml_screening in data.result. You can also poll GET /v1/jobs/{job_id}.
{
"id": "evt_0b5d8e2f71",
"object": "event",
"type": "aml_screening.completed",
"livemode": true,
"created_at": "2026-09-26T10:15:04Z",
"data": {
"object": {
"job_id": "job_9e3c7a1f58",
"result": { "id": "aml_3f9b2c7e10", "object": "aml_screening", "risk_level": "medium", "...": "…" }
}
}
}Errors
Errors specific to this service, in the standard error format. See Errors for the full list.
| HTTP | code | Description |
|---|---|---|
| 400 | invalid_identifier | The identifier value is not valid for its type. |
| 400 | unsupported_identifier_type | The identifier type is not supported for this subject form. |
| 403 | purpose_not_approved | purpose is not among the purposes approved for your application. |
| 403 | scope_not_granted | A requested scope is not granted to the application. |
| 403 | service_not_enabled | AML & CTF Screening is not enabled on this application. |
| 403 | production_access_required | The call used production keys before production access was approved. |
| 413 | batch_too_large | A synchronous batch contained more than 50 items. Resend it with Prefer: respond-async. |
| 402 | insufficient_balance | Prepaid wallet empty. Top up to resume production calls. |
Next steps
- KYB Verification — Retrieve a company’s officers and beneficial owners, then screen each one.
- Fraud Reporting — Report confirmed money laundering or terrorist financing cases to the network.
- KYC scopes & subscriptions — What each additional scope returns and how to subscribe.
- Going to production — Including the AML/CTF policy required for financial-sector organisations.