Adverse media — exactly how it works, and what it does not do.
Adverse-media screening looks for negative news about your subject: financial crime,
regulatory action, cyber offences, organised crime. This page documents the whole pipeline — where
the articles come from, how a subject is bound to an article, what evidence you get back, what the
Unavailable status means, and the limits we have measured and not hidden.
Unavailable — we did not check — instead of returning a clean pass.
1 · Where the data comes from
We use GDELT — the Global Database of Events, Language and Tone — a free, open news monitoring project that indexes worldwide news coverage. We use two of its surfaces:
| Surface | What it gives us | How we use it |
|---|---|---|
DOC 2.0api.gdeltproject.org |
Article metadata only: URL, headline, publisher domain, index date, language. It full-text-searches the archive, but it never returns the article body. | Retrieval. Finds candidate articles for a subject name combined with financial-crime terms. |
| GKG 2.0 (Global Knowledge Graph) data.gdeltproject.org |
The entities GDELT itself extracted from each article — including the person entities named in it — plus themes and a document tone score. | Evidence. Tells us whether GDELT's own extractor identified your subject as a person named in that article. |
GKG is what makes the feature work at all. DOC matches an article's full text but only hands back the headline — and real adverse coverage very often does not name the subject in the headline. A genuine hit like “Goldman Sachs settles shareholder lawsuit over 1MDB scandal” names no person at all. Reading GDELT's extracted person entities recovers exactly those articles.
2 · The prefetch model — a screen never calls the network
Adverse media is not fetched live during your request. A background sweep populates a cache; the screening request reads that cache and nothing else. The screening-time provider has no HTTP client at all — it is structurally incapable of making a network call.
-
The sweep runs in the background
For monitored, previously-screened and newly-enqueued subjects, the sweep queries GDELT DOC for candidate articles, then downloads the GKG slice each article was indexed in and joins them by URL to recover the extracted person entities.
-
Evidence is scored and stored
Each article is bound to the subject and scored (see below). What survives is stored as evidence — headline, publisher, date, category, matched person.
-
Your screen reads the cache
POST /v1/screenings/checkperforms one indexed read. No third-party call sits in your latency budget, and a news-source outage or rate limit cannot slow down or break a screen. -
An unknown subject is enqueued
A subject nobody has ever screened has no prefetched evidence. That screen returns
Unavailableinstantly and enqueues the name. The sweep polls every 15 minutes, so evidence is normally available within minutes — and the next screen is real.
This is a deliberate inversion. The previous design made a synchronous call to GDELT inside every screen; GDELT rate-limits a shared cluster egress IP, so we were paying seconds of latency to obtain nothing. Taking the call off the hot path is what makes the feature both fast and honest.
3 · Unavailable is not a pass — read this before you integrate
adverseMediaStatus. An empty media result with status
Unavailable means the check did not happen. Your integration
MUST NOT treat it as a clean pass. A control that silently reports “no adverse media”
when it never looked is 100% false negatives while still looking like coverage — that is the single worst
failure mode this feature can have, so we surface it explicitly instead of hiding it.
adverseMediaStatus | Meaning | Is an empty result a clean pass? |
|---|---|---|
Skipped |
You opted out for this screen ("adverseMedia": false), or the feature is disabled. |
No — we did not look. |
Ok |
Evidence was read successfully. | Yes — an empty result is trustworthy. |
Stale |
Evidence was served from an older cached lookup. It may be out of date. | Qualified — treat with the age in mind. |
Unavailable |
No evidence exists yet for this subject. The subject has been enqueued for the next sweep. | No. Adverse media was not checked. |
The status is persisted with the screening and rendered in the PDF report and the regulator pack, so an auditor can see, months later, whether a given screen actually checked the news.
4 · How a subject is bound to an article
Naive name matching on news text is how an adverse-media feature earns an analyst's contempt and gets switched off. Two controls stand between a name and a hit.
Ordered, adjacent name binding
A name must appear as an ordered, adjacent span — not a bag of tokens. A token-set match would let “Adam Smith and John Maynard Keynes” resolve to the subject “John Smith”. It cannot, here.
The rarity gate
A common name can never clear the bar on the name alone. For a high-collision surname, an extracted person entity is not accepted as identification, and we fall back to stronger headline evidence. The surname list is generated from our own corpus of 490,072 names — every surname shared by 25 or more distinct individuals.
The reason the second control exists is worth stating plainly: a better entity signal tells you an article is about a person of that name. It never tells you which one. Name ambiguity sets the bar; evidence has to clear it.
The rarity gate is also a fairness control, not only a precision lever. Common names concentrate in particular ethnic and national groups, so a matcher that floods on common names effectively discriminates by surname.
5 · What you get back with a hit
An adverse-media match is not a bare hyperlink. Every hit carries the evidence an analyst needs to triage it without clicking out, and an auditor needs to resolve it after the link has rotted.
| Field | What it is |
|---|---|
headline | The article headline. |
publisher | The publishing outlet's domain, for source credibility. |
publishedAt | When the article was published/indexed. A 2009 allegation and a 2026 conviction are not the same signal. |
externalId | The article URL. |
adverseMediaCategory | The FATF-style category (see below). |
matchedPerson | The person entity that bound the subject to the article. This is the “why” behind a hit whose headline names nobody. Null when the subject was identified from the headline alone. |
exculpatoryOutcome | An outcome term in the headline suggesting the subject was cleared rather than accused (“acquitted”, “charges dropped”). See below. |
articleTone | GDELT's own published tone score. Display-only. See §7. |
We never store article bodies. Adverse media on a natural person is criminal-conviction and offence data, so retention is kept to the metadata above. GDELT hands us every person it extracted from an article — typically several — and we store only the one that binds your data subject. The other names belong to people who never asked to be screened.
Exculpatory headlines are down-ranked, never suppressed
An article saying “Smith cleared of money laundering” puts the subject and a crime word in the same headline — which naive scoring reads as maximum adverse, for an article that exonerates him. Such a match is now down-ranked and flagged with the outcome term. It is not hidden: auto-suppressing it would trade a visible false positive for an invisible false negative, and an acquittal is still information an analyst wants to see.
6 · Categories
A hit is categorised from the financial-crime term that matched, so a tenant can set a different decision per category. The categories are:
| Category | Covers |
|---|---|
FinancialCrime | Money laundering, fraud, bribery, embezzlement, ponzi / financial scams. |
Cybercrime | Hacking, data breach, ransomware and other cyber-enabled offences. |
Regulatory | Regulatory / supervisory action: fines, censure, enforcement, licence revocation. |
HighRisk | Terrorism, trafficking, organised crime, smuggling. |
Unknown | Adverse media that could not be slotted into a specific category. |
The mapping is a keyword table, on purpose. It is auditable, and it can be shown to a regulator and contested by a data subject. A black-box classifier can be neither.
7 · Why we do not use sentiment analysis
The obvious idea is to score how negative an article is and flag the negative ones. We measured it, and it does not work — so tone is captured for display and is barred from every decision path (a build-time architecture test fails if tone ever reaches the scoring engine).
Negative ≠ relevant
An article can be scathing about a politician's dress sense — very negative, zero AML relevance. On a live sample of 1,440 articles, the most negative items were a prison riot, a depression story and a celebrity death. Zero predicate offences.
Relevant ≠ negative
A money-laundering indictment is often reported in clinical, neutral prose. A tone gate at −5 was measured to discard 44% of genuinely AML-relevant articles — an embezzlement suspension scores only −3.21.
Adversity is established by what the article is about — it matched a financial-crime term in its full text and the subject is named in it — not by how cross the journalist sounds. “The headline contains 'acquitted'” survives a regulator. “Tone: −1.8” does not.
8 · What it actually catches — measured
Against our adverse-media golden benchmark, replayed through the real filter, binder and emitter, at the shipped relevance threshold (0.7):
59.1% recall
13 of 22 benchmark positives — subjects with known, dated adverse media — are caught. Reading the PERSON entities GDELT already extracted, instead of the headline alone, lifted this from 22.7% (5 of 22) — nearly triple, with no change to the threshold.
100% precision on common names
15 of 15 clean common-name subjects (the false-positive stress set) produce no hit. This is the number that decides whether an analyst keeps the feature switched on — and it is unchanged by the recall work above: the recall was bought with better evidence, not a lower bar.
9 · The limits — what this does not do
An honest limit is worth more to you than an inflated claim.
| Limit | Detail |
|---|---|
| Source-coverage gaps are real | Some subjects are missed because the source never names them. Roger Ng (a convicted 1MDB banker) is missed by our benchmark: GDELT returns on-topic articles for him, but they are about Jho Low and Tim Leissner — GDELT's extractor never identifies him as a person entity in any of them. No amount of tuning on our side fixes that. It needs a different source. |
| We surface, we do not resolve | We can tell you an article is about a person with your subject's name. We do not confirm
it is your subject. Adverse media is a discovery layer that produces a
Review, not a verdict — a human dispositions the hit. |
| No article bodies, no licensed prose | We hold headline, publisher, date and link. We cannot reproduce article text — we have not licensed it, and we will not pretend otherwise. |
| No syndication dedup yet | One story carried by many outlets currently produces several matches, not one clustered event. |
| English financial-crime terms | GDELT indexes many languages, but our retrieval terms are English, so non-English coverage is under-represented today. |
| Not a human-curated dossier | A commercial vendor sells entity-resolved profiles with a researcher behind each record. This is not that. It is a source-linked, auditable discovery layer built on open data — which is why it is self-hostable and why it does not carry a per-lookup licence fee. |
10 · Using it from the API
Adverse media runs by default. Send "adverseMedia": false to opt out of it for a screen
(the status then comes back as Skipped).
# Screen with adverse media (the default)
curl -X POST https://aml-screening.dloizides.com/v1/screenings/check \
-H "X-Api-Key: $API_KEY" \
-H "Content-Type: application/json" \
-d '{ "fullName": "Jho Low", "adverseMedia": true }'
The response carries adverseMediaStatus alongside the matched entities. Check it
before you treat an empty media result as clean:
{
"decision": "Review",
"adverseMediaStatus": "Ok",
"matchedEntities": [
{
"sourceList": "ADVERSE_MEDIA",
"rejectionTag": "adverse_media",
"adverseMediaCategory": "FinancialCrime",
"headline": "...",
"publisher": "...",
"publishedAt": "...",
"matchedPerson": "..."
}
]
}
An adverse-media hit tags the screening adverse_media and drives a Review decision
by default. Per-category decisions are configurable per tenant. Bringing your own adverse-media endpoint is
also supported — see Data providers.
Attribution
Adverse-media results are derived from The GDELT Project (https://www.gdeltproject.org). Headlines, publishers and links are the property of their respective publishers. Screening assists your compliance programme; it is not legal advice, and an adverse-media hit is an indication to review, not a finding of wrongdoing.