Adverse media screening

Search news and web sources for negative coverage of a name, and get a risk score with the articles behind it.

Searches open news and web sources for a name, then reviews each article to work out whether it says anything adverse about that particular person. The response leads with a risk score and a summary, and carries the articles it was drawn from underneath, so every score can be traced back to what produced it.

This is not a sanctions check. Sanctions screening matches a name against authoritative government lists, and a match is a fact. Adverse media reads open sources and forms a judgement. A high score is a reason to investigate, never a determination.

How the score is formed

Searching a name and counting how often words like fraud appear is the naive approach, and it fails in a specific way: a prosecutor's name returns articles about the crimes they prosecuted, and they get flagged as a criminal. Everything below exists to prevent that.

Each article is labelled with the part the subject plays in it, and only two of those parts can contribute risk. The score is then calculated from those labels rather than asked for directly, so the same labels always give the same score and the number does not drift when the underlying model changes.

Two further checks run independently of that judgement. The model is required to name who the wrongdoing is attributed to, and a finding attributed to somebody other than the subject is discarded and flagged. Separately, every article is tested for whether it actually names the subject, ignoring accents and name particles, which catches articles about similarly-named people.

Scoring is driven by the single most serious finding, then nudged up for corroboration across independent publications. It is deliberately not a sum: search returns near-duplicates of the same story, and adding them up would rank a widely-syndicated minor case above an under-reported conviction.

Request

FieldTypeRequiredDescription
namestringYesThe person or company to screen.
contextstringNoAn employer, country or role. Use it to pin down a common name — it narrows the search without excluding results outright.
modestringNoadverse, the default, pairs the name with risk vocabulary. general searches the bare name.
max_resultsnumberNoHow many articles to retrieve and review, 1 to 20. Defaults to 10.
topicstringNogeneral, news or finance. news is the one that reliably carries publication dates.
search_depthstringNobasic, the default, advanced, fast or ultra-fast. Trades how widely the search reaches against how long it takes.
time_rangestringNoday, week, month or year. Or give start_date and end_date as YYYY-MM-DD.
countrystringNoWeights results towards one country. Only accepted when topic is general.
include_domains / exclude_domainsstring[]NoHostnames such as reuters.com. Not URLs.
additional_call_infoobject | stringNoYour own reference, stored alongside the usage record. Must be valid JSON.
curl -X POST https://api.amlscreen.io/api/v2/adverse-media-search \
  -H "Content-Type: application/json" \
  -H "x-api-key: aml_sk_xxx" \
  -d '{ "name": "Jho Low", "context": "1MDB", "max_results": 8 }'

Response

{
  "risk": {
    "score": 92,
    "band": "high",
    "summary": "4 of 8 reviewed articles link Jho Low to money laundering and bribery across 3 sources.",
    "categories": ["bribery", "money_laundering"],
    "highest_severity": "high",
    "implicating_articles": 4,
    "corroborating_sources": 3
  },
  "adverse media results": [
    {
      "title": "1MDB fugitive Jho Low placed in Macau",
      "url": "https://www.aljazeera.com/economy/...",
      "domain": "aljazeera.com",
      "snippet": "In November 2018, he was indicted by US authorities for alleged money laundering, bribery and US campaign law violations.",
      "score": 0.677,
      "published_date": "2023-05-30",
      "name_match": true,
      "assessment": {
        "about_subject": true,
        "role": "accused",
        "severity": "high",
        "categories": ["money_laundering", "bribery"],
        "note": "indicted by US authorities"
      }
    }
  ],
  "summary": { "returned": 8, "name_verified": 6 },
  "screening": { "classified": true, "analysis_status": "ok" },
  "api_usage_id": "caa73377-…"
}

The risk block:

FieldTypeDescription
scorenumber | null0 to 100. Null when the articles could not be assessed, which is not the same as a score of zero.
bandstringnone, low, medium, high, or unknown when the score is null.
summarystringA sentence or two on what the articles show. Always present, always consistent with the score.
categoriesstring[]Predicate offences drawn only from articles that implicate the subject, such as fraud or money_laundering.
highest_severitystring | nullThe worst severity among the implicating articles, which is what the score is built from.
implicating_articlesnumberHow many of the returned articles actually implicate the subject. Usually far fewer than were returned.
corroborating_sourcesnumberDistinct publications among those. One outlet repeating a story is not corroboration.

Each entry in the results:

FieldTypeDescription
title, url, domain, snippetstring | nullThe article itself.
scorenumber | nullSearch relevance, not risk. A high relevance score on an article about someone else is still irrelevant.
name_matchbooleanWhether the article actually names the subject. Worked out from the text without a model, so it holds even when analysis is unavailable.
assessmentobject | nullThe judgement on this article: about_subject, role, severity, categories and a short note. Null when analysis did not run.

Roles

Every assessed article carries one role, and the role decides whether the article can move the score at all. The four that never score are what separate a defendant from the people around a case.

FieldTypeDescription
accusedscoresThe subject is investigated, charged, convicted, fined or sanctioned.
associatescores lowerThe subject is not accused, but is tied to someone or something that is — a partner, an employer, an implicated company.
enforcementnever scoresThe subject is the prosecutor, judge, investigator, regulator or official acting against the wrongdoing.
victimnever scoresThe subject was harmed, or is a claimant.
commentatornever scoresThe subject is quoted or cited as an expert or spokesperson.
unrelatednever scoresA different person with the same name, or an article with no bearing on the subject.
unclearnever scoresThe article was not assessed, which happens when part of a screening degrades.

Severity accompanies the role: high for a conviction, indictment or sanction, medium for charges or a live investigation, low for allegations and civil matters. Roles that never score always carry severity none, whatever else is in the article.

Search without scoring

/api/v2/adverse-media-search-raw takes the same request and runs the same search, but returns the articles unjudged: no risk block and no assessments. Use it when you intend to run your own classification and do not want to pay for ours.

name_match is still included, since it is worked out from the text rather than by a model.

This one takes an API key only. The scored endpoint also accepts a signed-in user's bearer token, because the dashboard screens from the browser where a key cannot safely live; the raw endpoint has no such caller and so has no such path.

When analysis is unavailable

Search failing fails the call. Analysis failing does not: the endpoint still returns 200 with the articles, and reports what happened in screening.analysis_status — ok when every article was judged, partial when some batches did not complete, and unavailable when none did.

A score of 0 and a score of null mean different things. Zero means the subject was screened and nothing adverse was found. Null, with a band of unknown, means the articles could not be assessed at all. Treating the second as a clean result is the dangerous mistake, so they are deliberately distinct in the response.

Where analysis is degraded, the unjudged articles come back with a role of unclear and screening.analysis_error names the cause.

Errors

The statuses on the API overview apply here too. These two are particular to this endpoint.

FieldTypeDescription
400Bad RequestA missing or blank name, an unrecognised mode, topic, search_depth or time_range, a date that is not a real calendar date, or a domain given as a URL rather than a hostname.
502 / 503 / 504Search unavailableThe search provider was unreachable, busy, or too slow. Retry: nothing was screened, and the underlying provider is never named in the response.

Search failing is the one thing that fails the call, and that is deliberate: a screening that quietly returned nothing would be indistinguishable from a subject with no adverse coverage. Every call, errors included, is written to your usage history with a search type of adverse_media.

We use cookies to improve your experience on our website. By browsing this website, you agree to our use of cookies.