Threat classification

One label, applied honestly

Every domain in the database carries the category phishing/malware and a dns_status of resolves. This page explains why the classification is deliberately single-valued, what it does and does not tell you, and the campaign shapes that make up the corpus behind it.

domain category dns_status is_phishing confidence last_checked database_size
The classification

There is exactly one category, and that is on purpose

A taxonomy you cannot populate accurately is worse than no taxonomy at all, because it invites decisions the data cannot support.

phishing/malware

The only category value the API returns

When a lookup finds a domain, category is set to phishing/malware, dns_status is resolves, and confidence is 0.98. When it does not, all three fields come back null, null and 0.0 respectively. There is no third state and no sub-category.

Deliberate, not an omission. The pipeline can prove two things about every domain it publishes: that collection reported it as a phishing host, and that it resolved to a live A record at build time. It cannot prove which brand a kit imitated, which credentials it harvested, or who deployed it — so it does not claim to.
categorystring | null Always phishing/malware for a hit, always null for a clean domain. Present in both the API response and the third column of the feed CSV.
dns_statusstring | null Always resolves for a hit, because nothing that fails to resolve is published. null for a clean domain.
confidencefloat 0.98 for a confirmed phishing host, 0.0 for a domain that is not in the database. A deliberate ceiling below 1.0 — it is high confidence, not certainty.
Behind the label

Six campaign shapes that end up under the same value

The API does not return these as sub-types. They are how security teams describe what they find when they investigate a hit, and knowing them tells you what to do next.

A single label is easy to enforce on and hard to reason about, so it is worth being explicit about the range of things it spans. Everything below has one property in common — a hostname that a person is persuaded to visit, standing up live infrastructure at the moment the build ran. What differs is who is being deceived, what is being taken, and which team inside your organisation meets the consequence.

Use this as an investigation aid, not a schema. When a hit comes back and you need to know how urgently to react, the shape of the hostname and the context it appeared in will place it in one of these six within a minute.
01

Credential-harvest clones

The archetype: a pixel-accurate copy of a login page, reached from a message about a blocked payment, an expiring password or a held delivery. Modern kits render the full multi-step journey, including whatever reassurance step the genuine site added to prove authenticity.

Why speed beats detail here: harvested credentials are replayed within minutes, so the value of a lookup is entirely in how fast it arrives.
signature: brand word + security word in the hostname
02

Second-factor relay pages

A page that solicits a one-time code, a card-reader response or a push approval, and relays it into a live session against the genuine platform in real time. The victim sees a plausible spinner while an action completes on the other side.

Why MFA does not stop it: the factor is genuine and the approval was real — it was simply solicited by a domain nobody checked.
signature: verify / confirm / approve in the path or host
03

Kits parked on reputable platforms

Look at the real sample rows in the feed: weebly.com, firebaseapp.com, pages.dev, web.app. These are free or near-free hosting platforms with impeccable parent-domain reputations, which is precisely why kits are deployed on them.

Why host-level matters: any control reasoning about the registrable parent, or about popularity, waves all of these straight through. See the rank vs detection page.
signature: random subdomain on a large hosting platform
04

Payment-diversion lookalikes

A near-copy of a supplier's domain, differing by one character or a swapped TLD, carrying a request to update remittance details before a scheduled payment run. The finance team acts on it and initiates a legitimate, correctly authenticated transfer to the wrong account.

Why the payments stack misses it: the transfer is authorised, so it clears every control. The only stopping point was the domain in the sender address and the reply-to.
signature: one-character delta from a known partner domain
05

Bulk-generated campaign batches

Read the sample rows again and notice 00-ede.pages.dev, 001-ede.pages.dev, 002-s.pages.dev. Serialised names are the fingerprint of bulk registration or bulk subdomain creation, where dozens of hosts are provisioned in one session and rotated through as each is taken down.

Operational consequence: a single hit is rarely a single domain. When you find one, search your logs for its siblings before you close the case.
signature: numeric or sequential prefixes on a shared suffix
06

Out-of-band delivery landings

Landing pages reached from SMS, messaging apps, QR codes or search advertising rather than email. Because the link never touches a mail gateway, and is frequently opened on a personal device, neither the secure email gateway nor the endpoint agent ever sees it.

Where you still catch it: the domain is the same kind of object as any other, and it surfaces in DNS telemetry the moment someone on the corporate network opens it.
signature: short host, no email trail, high contact-centre volume
Scope

What the label claims, and what it refuses to

The boundary is as useful as the coverage, because it tells you which controls still need somebody else.

What a hit does mean

This hostname was reported as a phishing or malware-distribution host by curated threat-intelligence and OSINT collection, and it was independently confirmed to resolve to an active A record at the time of the most recent daily build. It is live infrastructure, not a historical indicator, and it is safe to treat as an enforcement target with a proportionate consequence.

What it does not mean

It does not identify which brand was impersonated, which threat actor deployed the kit, what the page asked for, or how many people reached it. It is not a malware verdict on a file, not a URL-level judgement on a specific path, and not a certainty — the confidence ceiling of 0.98 is there to remind you that a review path is still required.

Equally, a false is not a clean bill of health. It means the hostname is not one of the 390,000+ live phishing hosts currently tracked — nothing more. Keep whatever content inspection, attachment sandboxing and impersonation policy you already run; this sits alongside them.

Where the label appears

The same three values in the API and in the feed

A lookup response and a feed row are generated from the same daily build, so they can never disagree about a domain.

Field / column Value on a hit Value on a clean domain Where it appears
domainThe normalised hostnameThe normalised hostnameAPI response and feed CSV column 1
categoryphishing/malwarenullAPI response and feed CSV column 2
dns_statusresolvesnullAPI response and feed CSV column 3
is_phishingtruefalseAPI response only
confidence0.980.0Single check response only
last_checkedBuild date, YYYY-MM-DDBuild date, YYYY-MM-DDSingle check response only
database_sizeCurrent domain countCurrent domain countSingle check response only

How to use one label well

Five habits that get more out of a single-valued classification than a rich taxonomy would.

  • Route on phishing_found from a batch rather than inspecting each result — zero means log and continue, non-zero means act on the named hosts.
  • Record the last_checked date with every verdict you store, so an audit can reconstruct what was known on the day.
  • Search for siblings when you get a hit — serialised hostnames mean a batch, and one is rarely alone.
  • Enforce on the full hostname, never on the registrable parent, because most kits are subdomains of reputable platforms.
  • Keep a local allow-list ahead of the call and never spend a lookup on a domain you already trust.
Questions

Classification questions

Five that come up as soon as somebody reads the response schema properly.

Will more categories be added later?

The field is typed as a string precisely so that it can carry more values without breaking a client, and you should parse it rather than assume the constant. Today the only value returned for a hit is phishing/malware.

Write the integration so an unknown category value never falls through a branch. Route on the is_phishing boolean; record category as descriptive metadata.
Why is confidence fixed at 0.98 rather than varying per domain?

Because the qualification for entry is binary. A domain is either reported by collection and confirmed resolving, or it is not published. There is no scoring model in between that would produce a meaningful spread, and inventing one would imply a precision the pipeline does not have.

The ceiling below 1.0 is a deliberate honesty signal — high confidence, not certainty. Make the consequence proportionate to how expensive a reversal is. Expanded in the response format reference.
Does the classification tell me which brand is being impersonated?

No. Brand attribution requires inspecting the page content at the moment it was live, and that is a different kind of collection with a different failure mode — kits are frequently taken down or cloaked before an inspection runs, and a wrong attribution is worse than none.

In practice the hostname carries most of the signal an analyst needs: brand word plus security word means a clone; a serialised subdomain on a hosting platform means one of a batch. That is what the six shapes above are for.
Are subdomains classified separately from their parent?

Yes, and this is one of the most important properties of the dataset. Each hostname is an independent entry. 0-amazon.weebly.com being present says nothing whatsoever about weebly.com, which is not and will not be in the list.

That is why enforcement must be at the full hostname. Collapsing to the registrable domain either misses every kit on a large platform or blocks the platform itself — neither is acceptable.
What happens to the classification when a domain is taken down?

It stops resolving, fails the DNS verification stage on the next daily build, and is removed from both the API and the feed. It appears in that day's changelog under removals, so an incremental loader drops it without any expiry logic on your side.

A list that only ever grows eventually contains reclaimed domains belonging to somebody legitimate. Pruning on failure to resolve is what keeps this one safe to point a production resolver at — see the daily feed page.

One label is all you need to act on

Get a key, batch a list of hostnames, and route on the boolean. The six shapes above are for the investigation that follows — not for the decision that blocks.