Chat & lobby links
Inventory theft
Creator impersonation
Launcher sign-in clones
Publishers · Platforms · Studios

The link in the lobby is the attack surface

Players do not get phished by email. They get phished by a friend whose account was stolen last night, by a giveaway that expires in nine minutes, by a trading site that looks exactly like the one they used yesterday. Screening every hostname a player can be shown — in chat, in a profile, in a party invite, on a marketplace listing — against a DNS-verified list of live phishing domains is a server-side call that costs a fraction of a cent.

390,000+DNS-verified phishing domains, all currently resolving
Under 50 msTypical lookup, fast enough to sit in the message path
100 / callDomains per batch request, one lookup each
$0.0008Per lookup at the largest monthly plan
Scroll
In-game chat & party invites
Item marketplaces & trading
Player profiles & clan pages
Creator & streamer channels
Support & appeal queues
Under-18 player safety
Home / Use Cases / Gaming & Esports
Why the account is the prize

A game account is a wallet that also has friends

Two properties make it worth stealing, and the second one is what turns a single theft into a campaign.

Start with what is inside. A long-running account on a major platform is holding five separate things worth money.

  • A purchased library built up over years.
  • A currency balance that can be spent the moment the account is entered.
  • Cosmetics that were tradeable when they dropped and are not any more.
  • A payment method saved for one-click purchases.
  • In some ecosystems, items with a genuine secondary-market price attached.

None of that requires the attacker to understand your game. They need the password, or the session, and a place to move the goods. That is the entire business model, and it is why an account with a decade of history is worth more to a thief than a credit card number: the card gets cancelled in a day, and a rare inventory has no chargeback.

The second property: a stolen account is a trusted sender

This is the one publishers underestimate. The moment an account is taken, it can post in every server, guild and party the real owner belongs to, message a friends list that has no reason to be suspicious, and reply in threads where the owner is a known regular. The link that arrives from a stolen account converts at a rate a cold email never will, because the social proof is real. The person really is your friend. The account really is theirs. Only the hands on the keyboard have changed.

Which makes the campaign a chain, not a blast

One account falls to a look-alike sign-in page. Its friends list receives a message. A percentage of those click, land on the same page, and lose their accounts, which then message their own friends. The domain in the middle of that chain is the one durable artefact: it has to resolve, it has to serve the fake page, and it has to stay up long enough to collect. Everything else about the campaign — the wording, the emoji, the urgency, which game it claims to be about — changes weekly. The hostname is the part you can act on mechanically.

Attackers read your release calendar. Domains that impersonate a launch, a beta key drop, a battle-pass event or a tournament registration appear on the schedule that you published, because the excitement they are exploiting is excitement you created. That works in your favour operationally: you know when the pressure spikes, and you can tighten screening and moderation around the days that matter rather than trying to sustain maximum vigilance year-round.
And a large share of the audience is under eighteen. They play on shared family hardware, have a parent's payment method attached to the account, and have been raised inside an economy where free currency and giveaway codes are a normal part of the culture. That is not a population you can train your way out of the problem with. It is a population you protect by making the destination unreachable before the click resolves into a form.
Campaign shapes

Six lures that account for most of what reaches players

Each one ends at a hostname the player has to reach. That is the common denominator, and the place to intervene.

Credentials

Launcher and storefront sign-in clones

A pixel-accurate copy of the platform sign-in flow, on a hostname one character away from the real one, complete with a working password-visibility toggle and a second screen that asks for the one-time code. The second screen is the giveaway that this is a live relay, not a static capture.

Account takeover
Bait

Free-currency and generator sites

The oldest lure in the category and still the most productive against younger players. Enter your username, pick an amount, complete a “human verification” step, then sign in to claim. There is no generator. There never was. The sign-in step is the entire product.

Under-18 exposure
Bait

Fake drops, giveaways and event codes

Timed to a real event on your calendar, worded to match your own announcements, and given a countdown so nobody stops to read the address bar. The stronger versions mirror your actual event artwork, pulled straight from your press kit.

Launch windows
Inventory

Trading site and marketplace clones

Impersonating third-party trading platforms rather than you, which is why they are so often missed: the player is not on your site, is expecting to sign in with a platform account, and has done exactly this a dozen times before. The clone asks for the sign-in and then drains the inventory.

Secondary market
Social

Creator and streamer impersonation

Two directions at once. Viewers get a fake channel giveaway or a cloned creator storefront; creators get a fake sponsorship brief with a “media kit” behind a sign-in wall. The second one is targeted, well-written, and arrives on the day a real deal would.

Creator economy
Pressure

Ban appeals and refund pretexts

“Your account has been reported for cheating — appeal within 24 hours or it is permanent.” Fear works faster than greed, and this one reaches the players who are most careful about giveaways. Refund and chargeback pretexts work the same way on the paying end.

Support queues

Look at those six together and the operational conclusion is not “train players to spot them”. Three of the six are indistinguishable from legitimate messages by design, one arrives from a genuinely trusted friend, and one exploits fear of losing an account rather than desire to gain something. Awareness helps at the margins and it is worth doing, but no amount of it produces a player who checks the certificate chain on a phone at eleven at night when a friend has just sent them a drop link.

The one thing every lure has in common

What all six share is a hostname that has to be live. The kit has to be hosted, the domain has to resolve, and it has to keep resolving for as long as the campaign runs. A list built specifically on the requirement that every entry currently resolves in DNS is aimed at exactly that window: not an archive of everything ever reported, but a picture of what is reachable right now, rebuilt every twenty-four hours so entries that go dark drop out instead of accumulating.

Two moments to check

Screen at post time, and screen again at click time

Both, or the gap between them becomes the campaign's window.

Post time is the obvious one. A player pastes a URL into a lobby, a clan description, a support ticket or a marketplace listing; before that content is stored and rendered to anyone else, the backend extracts the hostnames and checks them. A confirmed phishing domain gets the message rejected, silently dropped, or held for a moderator, depending on how aggressive you want to be and how much you trust your own false-positive tolerance. The check is a server-side call and the player never sees it happen. Latency at this point is essentially free: a message is already crossing a network boundary and being written to a store, and a lookup under fifty milliseconds disappears into that path.

Click time is the one people skip

It is also the one that catches the campaign you did not see coming, because content is not static. A profile description written six weeks ago is rendered thousands of times afterwards. A pinned message in a community server stays pinned. A marketplace listing with a link to an external gallery lives until it sells. The hostname in that content was clean when it was posted — possibly because it had not been weaponised yet, possibly because the domain changed hands, possibly because it was registered specifically to sit dormant and pass exactly the check you ran. Re-checking on click, or on render for high-traffic surfaces, closes that gap. If you route outbound links through your own redirector, this is a single lookup at the moment of the redirect, and it is the highest-value check in the whole design.

Property Post-time check Click-time check
Where it runs In the message or listing service, before the content is stored and rendered to anyone else In the redirector or the render path, at the moment the player actually follows the link
What it catches The fresh blast — a takeover posting one new domain across every server at once The sleeper — a pinned message or profile link that was clean the day it was written
Cache hit rate Lower. It is dominated by hostnames you have never seen, because that is what a novel campaign looks like High. Your own domains, the big video platforms and the wiki everybody links dominate the traffic
What drives credit spend The rate of genuinely new links, not the message volume The tail only — a modest time-to-live absorbs the overwhelming majority
Latency budget Essentially free: the message is already crossing a network boundary and being written to a store Synchronous, so it sits in the player's click. Under fifty milliseconds is comfortable
Player visibility None. The check happens server-side and the player never sees it An interstitial, which is what turns a block into a report you can act on

Cache the verdicts, not the raw responses, and keep the time-to-live short enough that a domain flagged this morning stops being served from a stale allow decision this afternoon. Where you then draw the line between block, warn and log is a product decision rather than a security one, and it should be made by someone who owns the player experience.

Block

A hard block on a confirmed phishing domain is defensible everywhere and almost never controversial. This is the default for chat, invites and anything a takeover can reach.

Warn

An interstitial that names the risk and requires a deliberate second click is the right treatment when the link sits on a surface where legitimate external links are normal.

Log

Silent logging with no player-facing effect is the correct starting configuration for the first two weeks. It tells you your real hit rate on your real traffic before you change anything anyone can see.

One more thing belongs at post time: the report path. Whatever you build, give players a one-tap way to flag a link, and route those reports somewhere a human reads. A verified list catches what has already been observed; your own players are the sensor that catches what has not. The pattern is the same one described on our messaging apps page, where user reports and automated screening feed the same queue.

The thing that makes gaming different: in most industries the phishing message comes from a stranger and the defence is teaching people to distrust strangers. Here it comes from a friend whose account was taken an hour ago, into a channel built entirely on trust between players — so the only intervention that scales is one that acts on the destination rather than on the sender.

Who deploys this

Three teams, three very different integration points

The same list, wired into whichever surface you actually control.

Publishers & studios

You own the client and the chat

Every text channel in the game is yours: lobby chat, party invites, clan descriptions, in-game mail, name fields that people abuse as link carriers. Screening happens in the message service before delivery, and the player sees nothing.

  • Extract hostnames server-side from every user-authored string that renders as a link
  • Hold or reject on a confirmed match, and log the sender for the trust and safety queue
  • Watch for one account posting the same fresh domain across many channels — that is a takeover in progress
Platforms & marketplaces

You own the transaction and the listing

Storefronts, item marketplaces and trading services carry outbound links in listings, seller profiles and dispute threads — and they carry the sign-in that everyone is trying to clone. Screening protects both directions at once.

  • Check every external link in a listing at submission and again when the listing is served
  • Sweep look-alikes of your own sign-in domain on a schedule and act on confirmed matches
  • Treat a phishing link in a dispute thread as a takeover signal on the account that posted it
Communities & creator tooling

You own the moderation layer

Community servers, guild sites, tournament platforms and creator dashboards see the highest link volume per user of anything in the ecosystem, and the least moderation capacity per message. This is where automation earns the most.

  • Screen links in chat and in channel descriptions, not only in messages
  • Give moderators a verdict and a reason, not just a deletion, so appeals are answerable
  • Check the sponsorship and partnership mail creators receive before anyone opens a “media kit”

The split matters because the three groups have entirely different constraints. A studio can put a check in the message service and never surface it to anyone. A marketplace has to think about seller experience and cannot afford to reject a legitimate listing at three in the morning with no appeal path. A community tool has thousands of independent operators with different tolerances, which usually means the verdict has to be exposed as configuration rather than baked in as policy.

What does not change across the three is the mechanics. Hostnames extracted server-side, checked against the same verified list, with the API key held in a backend environment and never shipped to a client. If a check is happening in code the player can read, the key is gone within a week and so is your credit balance.
The arithmetic

What screening a real chat volume actually costs

The naive number is frightening and wrong. The number after deduplication and caching is not.

1Credit per lookup, whether single or inside a batch
100Domains per batch request — one round trip, one hundred verdicts
12 moCredit validity, so seasonal spikes do not strand a budget
24 hDatabase rebuild cadence, with an added and removed changelog

Run the naive calculation first, because everyone does. Ten million messages a day, five per cent containing a link, is five hundred thousand lookups — and at that point somebody closes the tab. But that is not the workload. You are not checking messages; you are checking distinct hostnames. Strip everything that is not a link, reduce each URL to its registrable hostname, drop your own domains and the handful of platforms that account for most legitimate links, and deduplicate what remains inside a short window. The five hundred thousand collapses to a few thousand distinct hostnames a day, most of which you have already seen this week.

Then cache what is left

A verdict cache keyed on hostname with a time-to-live measured in hours absorbs the repeat traffic, and the credits go only to genuinely novel hostnames — which is precisely the population you care about, since a domain nobody in your ecosystem has ever linked before is the one most likely to be part of a fresh campaign. Batch the misses rather than calling one at a time: POST /api/v1/batch takes up to a hundred domains per request and charges one credit per domain, so a hundred novel hostnames from the last minute is one round trip instead of a hundred.

Now the packages make sense

A mid-sized live game running post-time and click-time screening with a sensible cache typically lands in Professional at $249/month for 100,000 lookups, or $0.0025 per lookup. A large platform screening a marketplace and a community layer as well sits in Enterprise at Enterprise at $999/month for 750,000 lookups, at $0.0013. The largest tiers exist for exactly this shape of workload: Enterprise at $999/month for 750,000 lookups works out at $0.0010 per lookup, and Enterprise at $999/month for 750,000 lookups brings it to $0.0008. Credits are paid by PayPal, billed monthly, and there is no subscription or per-seat licence on the API itself — which matters when your traffic triples for the two weeks around a launch and then settles again.

A second consumption model, if your volume genuinely is enormous

The daily feed delivers the whole database as CSV plus a changelog of what was added and removed, on a separate subscription, and that suits a service that would rather hold the list in memory and match locally than call out per hostname. It is the right answer for an edge layer or a resolver; it is the wrong answer for a moderation pipeline that wants a fresh verdict and a confidence value per link. Most gaming deployments use the API and let the cache do the work.

The chain reaction

One takeover, forty servers, ninety minutes

The panel beside this is what a single compromised account looks like from your side of the moderation queue. It is not a hypothetical shape; it is the reason link screening pays for itself on the surfaces where players talk to each other rather than on the ones where you talk to players. Notice where the leverage is: by the time reports arrive you are cleaning up, and by the time you have identified the domain the campaign has moved to the next one. The only step in that sequence where a machine beats a human is the first one — the moment the message is posted and the hostname is available to check, before anyone has clicked anything.

One creator is worth a million individual checks

The same reasoning applies to the creator economy sitting alongside your game. A creator with a large audience is a single point of failure: their channel description, their pinned links, their storefront and their sponsorship inbox all reach thousands of players who trust them by default. Screening the links they publish, and the briefs they receive, protects a chunk of your player base through one account rather than millions of individual checks. The cross-platform version of this problem is covered on our social media page.

Timeline of a friends-list blast

00:00 — Player signs in on a cloned launcher page and completes the one-time code prompt. Session is relayed live.
00:04 — Attacker posts the same short link to every server, guild and party the account belongs to.
00:11 — First friends click. The message came from someone they play with, so nobody checks the address.
00:38 — Second generation of stolen accounts begins posting. The domain has not changed yet.
01:30 — Your first player report arrives. Moderators start deleting messages that were read hours ago.

A post-time lookup ends this at 00:04, before a single friend sees the link.

Wiring it in

Endpoints, response shape and where the call belongs

Two endpoints, one rule about the key, and a cache in front of both.

The single-domain call is GET /api/v1/check?domain=<host>&apikey=<key>. It returns the domain, an is_phishing boolean, a category, the dns_status, a last_checked timestamp, a confidence value and the current database_size. That is the call a redirector makes at click time, and it is the one to reach for when a moderator wants a verdict on a single hostname while looking at a report.

The bulk call the pipeline uses

POST /api/v1/batch with a JSON body of {"apikey":"..","domains":[..]}, capped at a hundred domains per request and charged one credit per domain. That is what the message pipeline uses: accumulate the cache misses from a short window, send them in one request, write the verdicts back into the cache, and apply the policy. Both endpoints are server-side calls. The key travels in the query string or the POST body, so it belongs in your backend environment and nowhere near a game client, a browser bundle or a bot's public configuration file.

Post-time screening — batch the cache misses
# One hostname, at click time, from your redirector
curl -s "https://phishingdetectionapi.com/api/v1/check\
?domain=steamcommunlty-trade.example&apikey=$PDA_KEY"

# {"domain":"steamcommunlty-trade.example","is_phishing":true,
# "category":"phishing","dns_status":"active",
# "last_checked":"2026-07-27T04:31:00Z","confidence":"high",
# "database_size":392418}

# Up to 100 novel hostnames from the last message window, one call
curl -s -X POST https://phishingdetectionapi.com/api/v1/batch \
 -H 'Content-Type: application/json' \
 -d '{
 "apikey": "'"$PDA_KEY"'",
 "domains": [
 "free-vbux-generator.example",
 "discordgift-nitro.example",
 "cs-skins-market.example"
 ]
 }'
Normalise before you look up. Lowercase the host, strip the port and any trailing dot, decode percent-encoding, and resolve shortened links to their destination first — otherwise you are spending a credit to check a redirector you already trust. Our URL shorteners page covers the expansion step.
Fail open, and say so in the runbook. If the lookup errors or times out, deliver the message and queue the hostname for a retry. A chat system that stops delivering messages because a lookup failed is a worse outage than the risk it was mitigating — but the retry queue is what stops “fail open” quietly becoming “never checked”.
Never put the key in the client. Anything shipped in a game build, a browser bundle or a self-hosted bot's config is public. Proxy through your own endpoint, apply your own rate limit per player, and keep the key on the server.
The players you owe the most to

Young accounts, fear-based lures and the support queue

Three places where the standard advice — be careful what you click — is least likely to work.

Take the age question honestly. A large share of the audience for the most-played titles is under eighteen, and in the games where that share is highest the dominant lure is free currency. Follow one of those giveaways all the way through and you can see why awareness training is not the control that stops it.

The pitch

A giveaway that fits the culture perfectly

It costs nothing, it promises something the player wants and cannot buy, and it is wrapped in the vocabulary of an economy where codes, drops and giveaways are genuinely normal. It arrives in a server the player already trusts, often from an account they already know.

The form

Username first, because that feels safe

A twelve-year-old typing a username into a generator site is not being reckless by the standards of their own experience. They are doing what the last five legitimate promotions asked them to do, and a username is not a secret.

The friction

A verification step that manufactures trust

The countdown, the progress bar and the “human verification” gate exist to make the page feel like a real system doing real work. Friction reads as legitimacy to somebody who has never seen a fake one.

The capture

“Sign in to claim” — the entire product

Credentials go straight to a relay, and if the account has a one-time code it is requested on the next screen and replayed against the real platform within seconds. Nothing is ever generated, because there was never a generator.

The drain

Inventory moved before anyone notices

Tradeable items are transferred out and re-listed, the currency balance is spent, and the saved payment method is used for whatever converts fastest. The friends list gets the same link a few minutes later.

The aftermath

The consequences land on somebody who never played

The payment method on the account often belongs to a parent, and the recovery email is frequently one the child does not control. The first anyone hears about it is a chargeback, an angry support ticket from an adult who has never played the game, or a public post about your platform being unsafe.

Screening the links before they reach the player is the only control in that chain that does not depend on a child making an adult judgement under time pressure — and it pairs naturally with whatever household-level controls the family has already set up, discussed on our parental controls page.

Fear works on the players who are careful about greed

Fear-based lures deserve separate attention because they catch a different player. The ban-appeal message — your account has been reported, appeal within twenty-four hours or the ban is permanent — works on the careful players. Someone who would never touch a free-skins site will absolutely click a link that threatens an account they have spent years and real money on. The refund and chargeback variants work the same way on paying customers, and both classes of message have a detail that makes them mechanically detectable: they have to send the player to a hostname that is not yours, because the whole point is to capture a sign-in outside your control.

The surface nobody counts as an attack surface

Your own support and appeals queue. Players forward the message they received, paste the link, and ask whether it is real. Every one of those is a free sample of an active campaign, arriving with a timestamp and a player ID attached. If your ticketing system extracts the hostnames and checks them automatically, the agent gets a verified answer before they reply, your intel improves without anyone running an investigation, and the player gets a correct answer instead of a hedge. It is the cheapest intelligence source you own, and most publishers throw it away.

One more workflow is worth building while you are in there. When a confirmed phishing hostname appears in a message from a player account, treat that as a takeover signal on the sender rather than a moderation event on the message. Real players do not post links to credential-harvesting infrastructure at three in the morning across forty servers. The account that just did is not being malicious — it is being operated by somebody else, and the right response is a session invalidation and a recovery flow, not a mute.
Honest limits

What this catches, and what it will not

Better stated by you in the design review than discovered by someone else in an incident.

It only knows what has already been identified. A hostname gets into the record by being seen in circulation, checked as live in DNS, and classified as credential-harvesting infrastructure — which means a domain nobody has run into yet simply is not part of the answer. Product teams should read a clean verdict as “no record of this” and design the surrounding experience accordingly. A domain registered at breakfast and pushed into a friends-list blast the same evening sits inside that window; the twenty-four-hour rebuild and the liveness requirement make the window narrower than it would otherwise be, but they do not close it.
It works at the hostname level, not the page level. A phishing page hosted on a large file host, a form builder, a free-site service or a compromised page inside a site your players legitimately use cannot be handled by a domain verdict, because the domain is not the malicious unit and blocking it would break something real. That class of lure needs a different control: content inspection, link reputation on the specific path, or moderator escalation. Say so plainly rather than letting anyone believe the list covers it.
It does not see what happens off your platform. A player phished through a text message, a third-party community you do not operate, or a search result never touches a surface you can screen. That is the honest scope: you are protecting the links your systems show to players, which is a large and important share of the problem and not all of it. Publishers who treat this as one layer — alongside strong recovery flows, session invalidation on suspicious sign-ins, and a takedown process for look-alikes of their own brand as described on our brand protection page — get considerably more out of it than publishers who install it and consider the problem solved.
It does not fix an account recovery process that is easier to abuse than the phishing was. If your support flow will hand an account to whoever can name three recent purchases, attackers will stop building sign-in clones and start social-engineering your agents instead. The link layer and the identity layer have to move together; the reasoning on the identity side is set out on our identity protection page.
Questions from the build team

Seven things product and engineering ask first

The answers that decide whether this lands in the next sprint or the next roadmap.

Will a lookup slow down message delivery?

Typical lookup latency is under fifty milliseconds, and the vast majority of messages never trigger one because they contain no link at all. Of the ones that do, a verdict cache serves most of them without leaving your infrastructure. The lookups that actually go out are the novel hostnames, which is a small fraction of a small fraction.

If your delivery path is genuinely latency-critical, run the check asynchronously: deliver optimistically, check in parallel, and retract the message on a confirmed match. Players see a message vanish a moment after it appears, which is a far better outcome than a chat system that stutters on every link.

How do we keep the credit spend predictable during a launch?

Four levers, applied in this order, keep the spend flat while the traffic is not — because together they reduce it to novel hostnames only, and novel hostnames are the ones worth paying for.

  • Deduplicate to registrable hostnames before anything else — you are not checking messages.
  • Cache the verdicts, so the repeat traffic never leaves your infrastructure.
  • Allow-list the hostnames that dominate your legitimate traffic: your own domains, the major video and streaming platforms, the community wiki.
  • Batch the misses at a hundred domains per request, so the request count stays flat as volume rises.

lookups reset monthly and there is no subscription, so buying ahead of a launch window and drawing it down over the following quarters is a normal pattern. If you want a fixed ceiling, cap the lookups per minute in your own proxy and let the excess fall back to the cache with a longer time-to-live.

Can we run this inside a Discord bot or a community tool?

Yes, and it is one of the highest-value places to put it, because community servers carry enormous link volume with very little moderation capacity. The bot extracts hostnames from messages, checks them, and deletes or flags on a confirmed match while logging the verdict for the moderation team.

The one hard rule is where the key lives. If your bot is self-hosted by hundreds of independent server owners, the key cannot ship in the configuration — it will be extracted almost immediately. Run the lookups through a service you operate, authenticate each installation to that service, and apply your own per-server rate limits.

What do we do when a domain is flagged and we think it is wrong?

Keep a local allow list that is consulted before the API call, and put a hostname in it the moment you have verified it yourself. The check returns a confidence value alongside the verdict, so you can also choose to warn rather than block below a threshold you set, which gives you a softer failure mode on the surfaces where a false positive would be most annoying.

Review that allow list on a schedule. Domains change hands, and an exception added eighteen months ago for a legitimate community site is exactly the kind of entry that becomes a hole. A quarterly re-check of every allow-listed hostname costs one lookup each and takes a scripted minute.

Does this help with the domains impersonating our own brand?

Partly, and it is worth being precise about how. Generate the plausible look-alikes of your platform, launcher and storefront domains — character swaps, hyphen insertions, alternative top-level domains, common misspellings — and run them through the batch endpoint on a schedule. What comes back is a verified answer on which of them are live phishing infrastructure right now, which is exactly the evidence a takedown request needs.

What it is not is a monitoring service that watches registrations as they happen. It answers the question “is this specific hostname confirmed hostile today”, which is the question that matters when you are deciding whether to warn players and file with a registrar.

Should the check be visible to players or invisible?

Invisible at post time, visible at click time. Silently dropping a confirmed phishing link from chat needs no explanation and gives the attacker no feedback about what you detect. An interstitial at click time, on the other hand, is worth showing: it tells the player something specific happened, which is how the report reaches you. Write it like a person, and give it three things to say.

  • That the address was verified as a fake sign-in page, in those words.
  • That nothing was sent from their account by following the link.
  • That if they typed a password into a page like this recently, they should change it now.

A page that says only “blocked” produces a support ticket. A page that says what happened produces a report you can act on.

We already scan links with a general web reputation service. Why add this?

Because they answer different questions and disagree usefully. A general reputation service classifies broadly and covers many categories; this database does one thing, which is confirming that a specific hostname is live credential-harvesting infrastructure, with a DNS-verification requirement that keeps dead entries out. Overlap between the two is partial by nature, and the part that does not overlap is the part worth paying for.

Running both is normal and cheap, since the second lookup only happens for hostnames the first one cleared. If the two disagree on a hostname that is about to be shown to a million players, that disagreement is itself a signal worth routing to a human.

Screen the link before your player's friend does

Two endpoints, a cache, and a verdict on every hostname your systems are about to show someone. lookups reset monthly with no subscription, which suits traffic that triples for a launch and settles again a fortnight later.