Perpetual KYC and adverse media: event-driven screening between reviews
Perpetual KYC is customer due diligence that updates when something changes, not when the calendar says so. Instead of reviewing every customer every one, three or five years depending on risk tier, a perpetual KYC (pKYC) program watches for trigger events, such as a change of ownership, unusual transactions or new adverse media, and reviews the customer when one occurs. Periodic reviews often remain as a backstop.
Adverse media is harder to run continuously than internal triggers because the data lives outside the institution’s own systems. This article is for the engineers and analysts who build that pipeline. It is not legal advice, and nothing here makes a program compliant: your compliance function decides what screening is required and how hits are adjudicated.
What public guidance says
Three public sources, all checked on 2026-09-17, are useful for framing the design. They come from different jurisdictions and have different legal status, so read them as context, not as a checklist.
European Banking Authority, ML/TF Risk Factors Guidelines (EBA/GL/2021/02, consolidated version):
- Among customer risk factors, it asks whether there are adverse media reports about the customer and says firms “should determine the credibility of allegations on the basis of the quality and independence of the source of the data and the persistence of reporting of these allegations.” It adds that the absence of criminal convictions alone may not be sufficient to dismiss allegations.
- Guideline 4.76 states that firms must keep CDD information up to date, and 4.78 says a change in the customer’s circumstances is likely to trigger a requirement to apply CDD measures, without necessarily re-applying all of them.
- Guideline 4.71 says firms should determine the frequency and intensity of monitoring on a risk-sensitive basis.
- Its general list of enhanced due diligence measures (4.64) includes adverse media searches, and several of its sector-specific guidelines mention carrying out “open source or adverse media searches.”
FinCEN, CDD Rule FAQs (fincen.gov), for covered US financial institutions: FAQ F.6 says “there is no categorical requirement that financial institutions update customer information on a continuous or periodic schedule,” and that the requirement to update “is risk based and occurs as a result of normal monitoring.” FAQ B.18 makes the same point for beneficial ownership information: updates are triggered by risk-relevant information found in monitoring, not by routine periodic reviews alone. The CDD Final Rule page describes the requirement to conduct ongoing monitoring and, on a risk basis, to maintain and update customer information.
The Wolfsberg Group, Negative News Screening FAQs (2022) (wolfsberg-group.org). Wolfsberg is an association of banks, not a regulator, but its FAQs are practical: it notes there is no single, universally agreed approach to negative news screening, recommends precise wrongdoing terms over generic ones that inflate alert volumes, discusses assessing source reliability and materiality, and suggests that after onboarding it may only be necessary to screen against new media events.
Read together, the design constraints are clear: monitoring intensity follows risk, a material change should prompt a review, source quality matters, and ongoing screening should focus on what is new.
Periodic review versus event-driven review
| Periodic review | Event-driven (pKYC) | |
|---|---|---|
| When a review starts | On a fixed date per risk tier | When a trigger fires, plus a backstop date |
| Work allocation | Spread evenly across the book | Concentrated on customers whose risk changed |
| Detection lag for new adverse media | Up to the full review interval | The screening interval, often days |
| Data dependency | Mostly internal | Internal plus external feeds that must run reliably |
| Main failure mode | Stale files for most of the cycle | Missed triggers when a feed silently stops |
The last row is the one engineers own. A periodic program that skips a review is visible in a backlog report. An event-driven program whose news feed stopped three weeks ago looks exactly like a quiet month. Coverage monitoring is not optional.
Trigger events and where they come from
| Trigger | Source |
|---|---|
| New adverse media about the customer or a beneficial owner | External: news and search screening |
| Sanctions or PEP list change | External: list vendor feeds (not news queries) |
| Change of ownership or control | Customer disclosure, company registries, business press |
| Transaction behaviour inconsistent with profile | Internal: transaction monitoring |
| Suspicious activity report filed | Internal |
| New product, channel or jurisdiction | Internal: account events |
| Expired identity or registry documents | Internal |
This article covers the first row. The rest belong to other systems, and a pKYC orchestration layer consumes all of them.
Designing the adverse media delta screen
Onboarding screen versus ongoing screen
The onboarding screen is broad: full name variants, several risk-term families, several languages, multiple result pages, and a human review of everything that matches. The ongoing screen is narrow: the same subject, the same templates, but only results that were not seen before get to a reviewer.
The delta can be enforced in two layers:
- Query layer. Google documents
after:andbefore:operators on its Refine Google searches help page (checked 2026-09-17). Addingafter:2026-09-01to a Google Search query narrows results by date. Verify on your own templates that it narrows Google News queries the way you expect before relying on it. - Store layer. Keep every URL already shown to a reviewer for that subject, with the decision. This layer is the one to trust, because date signals on the web are imperfect.
Query templates
Structure templates the same way for onboarding and ongoing screens so decisions stay comparable:
"{full_name}" (fraud OR "money laundering" OR bribery OR corruption)
"{full_name}" (indicted OR charged OR convicted OR sentenced)
"{full_name}" (sanctioned OR "enforcement action" OR fined OR "cease and desist")
"{full_name}" {disambiguator} (lawsuit OR "ponzi" OR embezzlement)
Precise wrongdoing terms keep alert volumes manageable. For individuals with common names, add a disambiguator such as employer, city or industry, and route anything ambiguous to a person, not an auto-dismiss rule. Screen in the languages relevant to the subject, not only English.
Cadence by risk tier
The frequency is your policy decision. A starting shape many teams test:
| Customer risk tier | Adverse media rescreen | Backstop full review |
|---|---|---|
| High (incl. PEPs where applicable) | Weekly | Annual |
| Medium | Monthly | Every few years per policy |
| Low | Quarterly or on trigger | Per policy |
The screening call
A single check for one subject in one market:
curl -X POST https://api.answerline.dev/v1/monitor/google/news \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"query": "\"Jane Example\" (fraud OR \"money laundering\" OR bribery)",
"country": "GB",
"hl": "en"
}'
The response carries result.newsResults[] with position, title, link, snippet, source, date and page. Request fields are on the Google News engine page. The same screen against Google Search uses POST /v1/monitor/google and reads result.organicResults[], which also surfaces court-reporting sites, regulator pages and blogs that News does not cluster.
For a book of customers, submit async tasks in batches of up to 500 with a webhook and an idempotency key per subject, template and screening cycle. The adverse media screening use case has the full batch, webhook, storage and matching code; this article does not repeat it.
From hit to trigger: the delta and re-scoring logic
When a completed task arrives, the pipeline decides whether anything new and material happened.
from urllib.parse import urlsplit, urlunsplit
def canonical(url):
p = urlsplit(url)
return urlunsplit((p.scheme, p.netloc.lower().removeprefix("www."), p.path.rstrip("/"), "", ""))
def new_hits(subject, news_results, seen_urls):
names = [n.lower() for n in subject["names"]]
for item in news_results:
url = canonical(item["link"])
if url in seen_urls:
continue
text = f"{item.get('title', '')} {item.get('snippet', '')}".lower()
if not any(n in text for n in names):
continue
yield {
"subject_id": subject["id"],
"url": url,
"title": item.get("title"),
"snippet": item.get("snippet"),
"publisher": item.get("source"),
"displayed_date": item.get("date"),
}
Every yielded hit goes to a reviewer, never straight to a rating change. The reviewer records three judgments that the EBA and Wolfsberg material both point to:
- Identity match. Is this article about our customer, or someone with the same name?
- Credibility. Quality and independence of the publisher, and whether other independent outlets report the same allegation.
- Materiality. Does the information indicate heightened financial crime or reputational risk?
Only a hit that passes all three becomes a trigger event. A trigger then does two things in the orchestration layer: it recalculates the customer risk score with the new factor, and if the score crosses a threshold or the category is severe, it opens a targeted review. A targeted review asks for what the event makes relevant, for example source of funds after a fraud allegation, rather than repeating the whole onboarding file.
Using AI answers carefully
Assistants such as ChatGPT or Gemini will summarise what they find about a name. That is useful for a reviewer who wants a quick orientation on a corporate customer, and risky for anything else. An answer can merge two people with the same name, present old allegations as current, or state things its sources do not say.
If you include AI answers, store them as context attached to the review item, read the sources they cite, and base every decision on the underlying articles. Never let an AI answer create a trigger event on its own.
The audit trail pKYC needs
An event-driven program has to show why a customer was or was not reviewed. For each screening run, store:
- subject id, template id, engine, market, language, and the task id
- the request payload and the task completion time
- every result shown to a reviewer, with the reviewer, decision, reason and timestamp
- the risk score before and after any trigger, and the review it opened
Store the task id with every hit. It ties any decision back to the exact check that produced it.
Coverage is a control
Because a silent feed looks like a quiet book, measure the feed itself:
| Metric | Definition |
|---|---|
| Screening coverage | Subjects whose scheduled screen completed on time ÷ subjects due |
| Language coverage | Subjects screened in each required language ÷ subjects needing it |
| Failed-task rate | Tasks that ended FAILED ÷ tasks created, per day |
| Triage latency | Hit creation to reviewer decision, by risk tier |
| Trigger conversion | Hits confirmed as trigger events ÷ hits reviewed |
Alert on coverage dropping, not only on hits appearing. GET /v1/async/status and the task status on each webhook give you the raw numbers.
Cost planning
Credits per async task: Google News 3, Google Search 3, each extra results page 2. A ChatGPT question is 5.
| Tier | Customers | Templates | Screens per month | Credits per month |
|---|---|---|---|---|
| High | 2,000 | 2 news | 4 | 2,000 × 2 × 4 × 3 = 48,000 |
| Medium | 20,000 | 2 news | 1 | 20,000 × 2 × 3 = 120,000 |
| Low | 100,000 | 1 news | 1 per quarter (≈0.33) | 100,000 × 1 × 3 ÷ 3 = 100,000 |
Multiply by languages and markets where they apply. Compare the totals with plans on the pricing page, and prototype templates on the free tier’s 500 monthly credits before committing to volume. The dominant cost in most programs is reviewer time, not data, which is why template precision and URL suppression matter more than query price.
Pitfalls
- Rescreening the full history every cycle. Reviewers see the same old articles; suppression by URL fixes it.
- Auto-dismissing on name mismatch alone. Transliterations and middle names break exact matching; send ambiguous cases to people.
- English-only templates for customers whose coverage is in other languages.
- Treating a feed outage as a quiet period. Track coverage.
- Letting a hit change a rating without review. Identity, credibility and materiality are human judgments.
- Assuming the data is complete. Search and news results show what was published and indexed for that query at that moment. They are not an archive.
Related: third-party risk monitoring applies the same pattern to vendors, and the Google News API guide covers the endpoint in more depth.
Start with the quickstart to run your first screen.
Questions
What is perpetual KYC?
Perpetual KYC (pKYC) is an operating model in which customer due diligence information and risk ratings are updated when relevant events occur, rather than only at fixed periodic review dates. Adverse media, ownership changes and unusual activity are typical triggers.
Do regulators require perpetual KYC?
The public guidance checked for this article requires keeping customer information up to date and monitoring on a risk basis, but none of it mandates an operating model called perpetual KYC. Which model satisfies your obligations is a question for your compliance and legal teams; this article is not legal advice.
How is adverse media used in perpetual KYC?
A scheduled screen looks for new negative coverage about each customer. A confirmed, material hit becomes a trigger event that can raise the customer's risk rating and start a targeted review, instead of waiting for the next periodic review.
Should customers be rescreened against the full news history every time?
Usually not. After a full screen at onboarding, the Wolfsberg Group's Negative News Screening FAQs suggest it may only be necessary to screen against new media events. Store what was already reviewed and alert only on new items.
What does an adverse media rescreen cost with this API?
Each Google News or Google Search async task costs 3 credits. A customer screened with two news queries once a month costs 6 credits a month; a high-risk customer screened weekly with the same queries costs about 24.