Bank Security & Fraud Engineering

The plumbing between a customer's screenshot and a verdict your bank can act on

Your fraud desk already receives the domains. They arrive in report-phishing mailboxes, in disputed-transaction case notes, in contact-centre call logs and in proxy telemetry from four hundred branches. What is missing is not intelligence — it is a mechanical, sub-50-millisecond answer that every one of those systems can call. This page is a build guide for the four places that answer belongs inside a bank's own operations.

390,000+DNS-verified phishing domains, all currently resolving
<50 msTypical lookup — inside the length of a keystroke
100Domains per batch call, one lookup each
24 hFull rebuild cycle, with a daily changelog
Transaction-monitoring enrichment
Customer-report triage
Outbound link screening
Branch workstation DNS
Contact-centre lookup
Case-file evidence
Home / Use Cases / Banking & Finance
The engineering problem

The bank usually knows. It just cannot answer inside the window that matters

Nothing here is about awareness or vendor selection. It is about the seconds between a domain arriving in a queue and somebody having to decide.

Ask any bank's fraud operations manager what happens when a customer reports a suspicious text message, and the honest answer is a sequence of manual steps. Somebody opens the report. Somebody copies the link out of a screenshot, often retyping it because the image is a photograph of a phone screen taken at an angle. Somebody pastes it into a browser on an isolated machine, or into a public scanning service, or into a group chat where a colleague who is good at this sort of thing takes a look. Ten to forty minutes later there is an opinion, and it is an opinion — not a record, not something the case file can carry, and not something the next analyst who gets an identical report will benefit from.

The gap sits between two teams' tooling

The reason this persists is not incompetence. The security operations centre has feeds, a SIEM and enrichment playbooks, but the customer report never reaches them; it lands in an operations mailbox owned by the fraud function. The fraud function has case management, transaction monitoring and a rules engine, but none of those systems has any concept of a hostname, because they were built to reason about accounts, amounts, counterparties and devices. The domain is the one artefact common to almost every modern retail fraud case, and it is the only artefact neither system can evaluate.

One narrow function, not another platform

What closes that gap is a single narrow function — given a hostname, is it currently live phishing infrastructure — exposed as an endpoint that any of the bank's systems can call without a project, a procurement cycle or a data-sharing agreement about customer records. Once that function exists, it can be dropped into a monitoring rule, a triage script, an agent desktop, a template renderer and a resolver policy, and each of those integrations is measured in days rather than quarters. This page is about those integrations specifically, at the level of who owns them and what they change on a Monday morning.

What this page deliberately leaves out

It does not cover the strategic case. If what you need is the sector-level picture — why banks are the most impersonated vertical, what the attack taxonomy looks like, and how the control maps against DORA, PSD2, FFIEC and PCI DSS obligations — that argument lives on the banking and financial services industry page, and it is written for a different reader. What follows assumes you have already decided the control is worth having and now need to know where the wires go.

An enrichment, never a decision engine

Everything below treats the lookup as an enrichment. It adds a fact to something your bank already does: a case that already exists, a report already submitted, a notification already being rendered, a DNS query already being resolved. That framing keeps the risk of the integration proportional. A control that only ever adds an attribute cannot break a payment, cannot lock a customer out, and cannot fail in a way that requires an incident bridge at three in the morning.

Four placements

Where the lookup goes inside the bank's own operations

Four systems, four owners, four completely different latency budgets. Each one can be built independently of the other three.

1
Signal

Transaction-monitoring enrichment

Monitoring rules reason about amounts, velocity, counterparty history and device fingerprints. They have no vocabulary for hostnames, which means the single most informative artefact in a modern retail fraud case never reaches the model that scores it. The fix is not to teach the rules engine about domains — it is to attach the verdict as a case attribute before an analyst opens the alert, so the domain is already labelled by the time human judgement is applied.

The domain as an attribute

Any hostname already attached to the case — from a customer statement, a referrer, a support note — gets a boolean, a timestamp and a category written alongside it when the case is created.

At alert time, not authorisation

Do not put this in the authorisation path. Payments must not depend on an outbound call. Enrich when the alert is raised, which is asynchronous and forgiving by design.

What it must not do

A hit is not grounds to auto-decline. It raises the priority of an alert a human was already going to see, and it gives that human a fact rather than a hunch.

2
Queue

Customer-report triage

Every retail bank runs a report-phishing address, and every one of them is a firehose of near-duplicate reports about the same handful of campaigns. Triage is almost entirely mechanical: extract the hostnames, deduplicate them, check them, and let the analyst spend their attention on the small residue that is genuinely novel. The batch endpoint was built for exactly this shape of work — a hundred hostnames in a single call, one credit per domain.

Overnight triage sweep — one call, one hundred reports
POST https://phishingdetectionapi.com/api/v1/batch
{ "apikey": "YOUR_API_KEY",
 "domains": ["secure-app-verify.example.com", "…up to 100 hostnames"] }

-> { "results": [ … ], "checked": 100,
 "phishing_found": 63, "credits_used": 100 }

Deduplicate before you triage

Four hundred reports typically collapse to a few dozen distinct hostnames. Collapse first and the credit cost, the analyst workload and the noise all fall together.

What the analyst opens

A queue already sorted into confirmed live phishing, not-on-the-list, and unresolved — instead of four hundred undifferentiated forwarded emails.

3
Render

Outbound link screening in statements and notifications

This is the placement banks think about last and regret first. A bank publishes an enormous number of third-party URLs it did not write: merchant names and links in enriched transaction descriptions, links inside e-documents from partners, servicing notifications generated from templates edited by people outside the security function, and secure-message content forwarded between systems. If any of those resolve to a phishing host, the bank is the delivery mechanism, and the customer's reasonable assumption is that anything inside the banking app was checked.

Enriched statement data

Merchant logos and links arriving from an enrichment provider are third-party content rendered under your brand. Screen the hostnames on ingest, not on display.

Templates and campaigns

Servicing and marketing templates change often and are edited far from the security function. A nightly batch over every distinct hostname in the template set costs almost nothing.

Screen at render, not send

A statement generated in March may be opened in September. Check when the document is served, and re-check the stored hostname set on a schedule.

4
Network

Branch and teller workstation DNS

Branch estates are the quiet part of a bank's attack surface: thousands of shared workstations, staff who read email between customers, thin local IT presence, and a mail flow full of genuine third-party correspondence that makes lookalike domains hard to spot. This is the one placement where the per-lookup API is the wrong tool. Load the daily CSV export into the resolver policy zone or the firewall category and every device in every branch fails to resolve every domain on the list, with no application changes and no outbound call at decision time.

The feed, not the API

Pull the rebuilt CSV each morning, diff it against yesterday using the changelog, and push the delta into the policy zone. Enforcement is local and costs nothing per query.

Shared workstations

Teller machines have no per-user policy worth relying on and no realistic prospect of a security conversation mid-shift. Network-layer enforcement is the only control that behaves identically for everyone.

One central allowlist

Hold the exceptions in one place, applied ahead of the list, so a branch never needs a local override and a removal is one change rather than four hundred.

The queue on a Monday

What actually lands on the desk, and which parts a domain check touches

Not a taxonomy of attacks — a description of the work, and an honest split between the parts this helps with and the parts it does not.

Day 0 · Registration

A name is filed, and nothing anywhere can see it

The domain is registered, usually at a reseller that takes payment in an untraceable form and asks for very little else. At this point it resolves nowhere, serves nothing, and appears on no list — including this one. Any control that claims to catch a campaign at this moment is reading registrar data, which is a different product answering a different question.

Hours later · DNS answers

The kit goes up and the entry becomes eligible

The name is pointed at a host, a cloned login page is deployed, and the domain starts resolving. That is the moment it becomes eligible for the database, because every entry is confirmed to have a live DNS record before it is published, and the next 24-hour rebuild is what carries it to your resolver and your API calls.

The send · Saturday night

One send reaches tens of thousands at once

Portal-clone reports arrive in clusters because a single send lands with tens of thousands of customers simultaneously, and the reports that reach the mailbox are a small, self-selecting sample of the people who noticed.

Monday 08:00 · The queue

The first hour of the shift is weekend residue

The first hour of a Monday shift in a retail fraud operation is dominated by what accumulated while nobody was working the mailbox. These are the easiest cases for a domain check to improve, because the hostname is right there in the report and forty tickets usually collapse into one campaign the moment you deduplicate.

Monday 08:20 · Triaged

Twenty minutes instead of two hours

The measurable change is not detection — it is that the analyst finishes the cluster in twenty minutes instead of two hours and has a domain list to hand to the takedown process.

Same day · Takedown filed

A request that names a host somebody already verified

The takedown request goes to the registrar or the hosting abuse desk against a hostname that has been confirmed as resolving, with the verification timestamp attached. That is materially easier for an abuse team to act on than a forwarded screenshot, and it is the reason the deduplicated domain list is worth producing even when the analyst already knows what the campaign is.

After · The record

The site goes dark; the dated verdict does not

The page comes down, the name stops resolving, and the entry drops out of the next rebuild rather than lingering as dead history. What stays behind is the verdict written into the case file at the time — which is the part that still matters when the loss, the liability and the customer's complaint are reviewed six months later.

Four other shapes that reach the same desk

One-time-code interception

The second category lands differently. The customer's account was accessed with a genuine second factor that the customer genuinely approved, having been asked for it by a page nobody checked. By the time this reaches the desk, the money has usually moved, so the value of the lookup is retrospective rather than preventive: knowing that the domain in the customer's browser history was confirmed live phishing at that timestamp turns an ambiguous liability discussion into a documented one. The same evidence trail matters for the claims process described on our insurance page.

App impersonation and smishing

These produce the highest report volume and the least usable evidence, because the customer's report is a photograph of a phone. That is worth designing for explicitly: the triage tooling should make it trivial for the analyst to type a hostname into a single field and get an answer, because that is the actual interaction, and the alternative is that they do not check at all. This is also where contact-centre integration pays for itself, since a caller reading a URL aloud is the same interaction wearing different clothes.

Payment diversion against corporate customers

This is the shape a domain check helps with least at the fraud desk and most at the gateway. By the time it becomes a case, the payment has been correctly authorised by a real person acting on a deception that occurred weeks earlier. Nothing in a case-management enrichment stops that. What can stop it is checking supplier and reply-to hostnames as messages arrive, which is a mail-flow integration rather than an operations one — see our email security page for that shape.

Mule recruitment, which arrives as something else

Mule recruitment is not a fraud case at all when it arrives. It surfaces as an account-opening or account-behaviour question in financial crime, and the domains involved are recruitment portals and payment-agent landing pages. Running the "employer" hostnames a customer supplied during onboarding through a batch call is a cheap, unglamorous check that occasionally lights up an entire cluster of accounts opened in the same fortnight — and it is a check nobody thinks to build because nobody owns it.

The list underneath

What every one of those four placements is actually consulting

One database, one verification standard, one rebuild cycle. The placements differ; the answer does not.

4Placements that cover a bank's own operational plumbing
1Credit per domain, whether single or inside a batch
12Months that purchased credits remain valid
0Customer identifiers transmitted in a lookup
Every entry confirmed resolving in DNS
Dead domains dropped, not retained
Rebuilt every 24 hours
Daily added/removed changelog
Server-side key, never in client code
Database-stats endpoint for monitoring
Customer-facing behaviour

What the customer sees, and why that decision is not the security team's alone

The interface response to a hit is a product decision with a fraud consequence, and it is the part most likely to be got wrong under pressure.

The instinct when a check returns positive on something a customer is about to open is to block it outright. In an internal system that is the right call. In a customer-facing channel it is frequently the wrong one, because a hard block with no explanation produces a support call, and support calls about blocked links are indistinguishable from support calls about broken banking — which means your contact centre absorbs the cost of your security control without being told it exists. Worse, a customer who is blocked without explanation often retries on a personal device outside your estate, which is precisely the outcome you were trying to prevent.

What the interstitial should say, and nothing more

The interstitial that works says three things: this destination is not part of your bank, it has been identified as a site set up to steal login details, and here is what to do instead. It gives the customer an unambiguous way to proceed to their intended task through a route you control, and it gives them a one-click way to report that they received this link, which feeds straight back into the triage queue described earlier. It does not lecture, it does not use the word "phishing" without explaining it, and it does not present a proceed-anyway button as an equal-weight option.

Who has to be in the room when the wording is agreed

Getting this right requires the fraud, digital product and customer-communications teams in the same conversation, because the wording is a brand artefact as much as a security one. It is also worth agreeing in advance what happens when the verdict is wrong, since it eventually will be. The reasonable posture is warn-and-allow on customer-facing surfaces, hard-block on internal surfaces where a false positive costs one person one minute, and a documented path for a merchant or partner to get a domain reviewed. Publishing that path is what turns an occasional false positive from a complaint into a process.

The surface an interstitial can never reach

There is a second, less obvious customer-facing surface: the bank's own outbound messaging. If a servicing email or in-app notification contains a link the bank did not screen, the interstitial cannot help — the customer is already gone. That is the argument for screening at render time as well as at click time, and for holding the stored set of outbound hostnames in one inventory that gets re-checked on a schedule rather than trusting that the template was clean when it was written.

Requirement to capability

What the desk asks, and what a lookup can actually return

Five operational questions, and the specific field or workflow that answers each one. Where nothing answers it, that is said plainly.

What the fraud desk asks

"Is the domain in this customer's screenshot one of ours or a clone?"
"Was this host actually live at the time the payment left the account?"
"Are these forty reports one campaign or forty separate problems?"
"Can I attach something to the case file that survives a review?"
"Is anything in our own outbound messaging pointing at this?"

What the lookup returns

is_phishing — a boolean from a verified list, not an analyst's opinion.
dns_status plus last_checked — proof it was resolving, and exactly when.
Deduplicating hostnames before triage collapses the cluster to its true size.
The full JSON body, stored verbatim, is the evidence — dated and reproducible.
A nightly batch over every hostname in your template inventory answers it.
Same question, four systems, one answer
Choosing a placement

The four placements compared on the axes operations actually cares about

Not features. Latency budget, who acts on a hit, how easily a wrong answer is undone, and what it costs to run.

Placement Latency budget Who acts on a hit Reversibility Cost shape
Transaction-monitoring enrichment Seconds — asynchronous, at alert creation A fraud analyst who was already going to open the case Total — it is one attribute among many Distinct domains per case; very low volume
Customer-report triage Minutes — batched, scheduled or on demand Tier-1 triage, before the queue is worked Total — nothing customer-facing happens Up to 100 per call; a few hundred credits a day
Outbound link screening Inline at render — under 50 ms, cached The renderer, automatically, with a warning interstitial Partial — warn rather than remove Distinct third-party hosts per day, heavily cached
Branch workstation DNS None — enforced locally from the loaded list Nobody; the name simply fails to resolve Needs a central allowlist entry to undo Feed subscription; no per-query credit cost

Start with triage if you own a fraud-ops queue

It is the fastest thing to build, it needs no change to any customer-facing system, and it produces a visible result in the first week: a report backlog that sorts itself into campaigns. It also generates the domain inventory you will want for every other placement, which makes it the natural first step even if the resolver is your eventual target.

Start with the resolver if you own the network

Loading the daily feed into a policy zone gives the widest blast radius for the least integration work — every branch, every head-office desk, every VPN client, with no application aware of it. The trade is that undoing a wrong answer requires a central allowlist change, so build that process before you enable enforcement rather than after.

Most institutions end up running both: the daily feed for network enforcement and the API for the application and operations layers. The equivalent split for card acquirers and processors is set out on the payment processors page, and for digital-first institutions on the fintech page.

Limits and logging

What this does not do, and what you should be careful about writing down

A known-bad lookup is a floor. Stating the edges precisely is what stops the control being oversold in a steering committee.

Not the newest infrastructure

It does not catch a domain that has not been verified as resolving yet. Every entry on the list was confirmed to have a live DNS record at the last rebuild, which is what keeps the database free of dead history and makes it safe to enforce at the network layer — but it also means a domain registered this morning and fired into a campaign tonight may not appear until the next cycle. Anyone presenting this control internally should say that plainly, because the alternative is a steering committee that believes it bought prevention and later discovers it bought a very good floor.

Not authorised push payment fraud

It does not help at the moment of payment. When a customer has been socially engineered over six weeks and then correctly authenticates a transfer they genuinely intended to make, no domain check in the payment path changes the outcome. The place a lookup contributes to that class of loss is upstream, in the mail flow where the deception was carried, and afterwards, in the evidence trail that establishes what happened and when. Confusing those two contributions is the most common way this control gets misdescribed.

Not path-level abuse on a real site

It says nothing about a phishing page hosted in a directory on a compromised legitimate site. That hostname belongs to a real business, resolves to their real infrastructure, and will still be theirs next month; a domain-membership test cannot express path-level abuse. In practice this is why the network-layer deployment should sit alongside your existing web filtering rather than replacing it, and why the triage workflow needs a route for the residue that the check cannot classify.

What to write down, and what to leave out

The useful logging discipline is to record the domain, the verdict, the last_checked timestamp and the case or message identifier — and nothing about the customer beyond the identifier you already hold. The lookup itself transmits only a hostname and your API key: no account number, no message body, no full URL with its query string, no customer IP. Strip paths and parameters before you call, and the request contains strictly less than an ordinary DNS query for the same name. Retain the verdicts, because they are what makes a case defensible six months later, and resist the temptation to store the raw customer screenshots alongside them. Teams building the surrounding case workflow will find the handling pattern on our incident response page.

Build questions

What bank engineering teams ask during design review

Seven questions that come up once the decision has been made and the work is being scoped.

Who should own this control — fraud operations or the SOC?

Ownership follows the queue, not the technology. Whoever works the customer-report mailbox owns the triage integration, because they are the ones whose day changes. The SOC owns the network and log-enrichment placements, because they own the resolver and the SIEM.

Both functions must consult the same list. The failure mode banks actually experience is fraud and security giving a customer different answers about the same domain on the same day, which is a governance problem long before it is a technical one.
Can this sit in the payment authorisation path?

It should not. Authorisation is a hard-real-time path with a strict latency budget and no tolerance for an external dependency, and adding one to it converts a security enhancement into an availability risk on your most critical flow.

Enrich at alert creation instead, which is asynchronous by design, or enforce at the network layer from a locally loaded list where there is no outbound call at all. Both give you the signal without putting a third party between a customer and their money.
How many credits does a report-triage queue actually consume?

Far fewer than the report volume suggests, because you deduplicate first. A retail bank receiving several thousand customer reports a day typically resolves those to a few hundred distinct hostnames, and a local cache removes most of the repeats within the day.

Model on distinct hostnames per day, not reports per day. At a few hundred a day the Growth or Professional package covers a year comfortably; the full table is on the pricing page, and one credit is one lookup whether it arrives singly or inside a batch of a hundred.
What happens if the API is unreachable during a busy period?

Every integration described here is designed so that the answer arriving late is acceptable. Triage retries on the next sweep, case enrichment retries when the job runs again, and the resolver placement never makes a call at all because it enforces from a list already loaded locally.

Return an explicit unknown rather than a false, and make sure the case record shows "not checked" rather than "clean". An enrichment that silently records the wrong verdict is worse than one that records nothing.
How do we handle a false positive on a merchant or partner domain?

Design the consequence so it is cheap to reverse. Warn rather than block on customer-facing surfaces, hard-block only where a wrong answer costs one internal user one minute, and hold a single central allowlist that is consulted before the list on every placement.

Publish a route for a merchant or partner to request review, and give the contact centre a script for it. A documented path turns an occasional wrong answer into a process rather than an escalation, which is the difference between a control people trust and one they route around.
Can contact-centre agents use this during a live call?

Yes, and it is one of the highest-value placements per hour of engineering. A single field in the agent desktop that takes a hostname and returns a verdict in under 50 milliseconds turns a five-minute hold and an escalation into an answer given while the customer is still speaking.

Build it as a thin internal endpoint that holds the key server-side, applies your allowlist, and returns only the verdict. That gives you per-agent rate limiting and an audit record of who checked what, both of which your assurance function will ask for.
Does this replace the web filtering and email security we already run?

No — it sits beside them and gives them a second, independent opinion. Your existing gateway parses content, sandboxes attachments and applies impersonation policy; what it usually lacks is a separately sourced, DNS-verified view of the domains it is judging.

The second opinion is worth most when a campaign is novel and your primary vendor has not seen it yet. It also extends the same list to channels the gateway never touches: a URL read aloud on a phone call, a link inside your own outbound messaging, and DNS traffic from branch devices with no mail client at all.

Run last night's report mailbox through one batch call

Extract the hostnames, deduplicate them, and check a hundred at a time. If the list is doing its job, your triage queue will sort itself into campaigns before an analyst opens it.