A missing blocklist match does not establish safety. Missing risk fields are not treated as a zero-risk verdict.
EIGHT ENDPOINTS. ONE OPEN API.
The reference.
ROUTE PREFIX /v1
GET
/v1/check
Look up a domain or URL and inspect its threat verdict and available detection signals. Input is normalized: scheme, credentials, port and path are removed and internationalized names are converted to punycode. Subdomains inherit a parent listing, except under shared-hosting suffixes such as appspot.com or pages.dev.
Single domain check parameters
Parameter
Type
Description
domainrequired
string
A domain or URL to check. d and url are accepted as aliases.
Lists that contain the matched domain. Only matching lists are present.
flags
Detection signal names, when present.
matched_domain
The listed name that matched: the input, its www. variant, or a parent domain.
listed_since
When the matched domain was first listed. Confirmed entries carry the original detection time; null means unknown.
whitelisted
Present and true when the domain was reviewed and cleared as a false positive, with an appeal_url.
suspicious / heuristic_score
For unlisted domains with risky keywords or top-level domains. A heuristic signal, not a blocklist match.
checked_at
The check timestamp supplied by the API, when present.
POST
/v1/check/bulk
Check up to 500 domains in a single request. Send a JSON body and the Content-Type: application/json header. The body may be at most 256 KB. Results are keyed by the normalized domain, and non-string or unparsable entries are counted in summary.invalid and echoed (first 50) in invalid_inputs.
Bulk check request body
Body field
Type
Description
domainsrequired
string[]
An array of domain names, with a maximum of 500 entries.
Inspect the returned body and HTTP status. A failed request is not a clean verdict for the submitted domains.
GET
/v1/search
Find blocklisted domain names containing a substring. The query is matched literally, including % and _. Search results are domain indicators, not links to visit.
Download a full list for firewalls, DNS filters and ad blockers. Feeds are static files regenerated only when a list changes. They support ETag and Last-Modified conditional requests and gzip, and are cacheable for 5 minutes. Append a format to the list name; without one you get JSON.
Retrieve current dataset counts, synchronization information, and the API version. Figures are precomputed after every synchronization, which runs every 15 minutes. No parameters are required.
Check database reachability and synchronization freshness before relying on results. Never cached. Returns HTTP 503 when the database is unreachable or the last synchronization is older than two hours.
List the available feeds with their entry counts, update times, and download URLs. Each file includes its size and SHA-256 checksum so you can verify downloads.
Stay in sync without downloading full lists. Download the full .txt feed once, then request changes since the previous response's until. When truncated is true, continue from next_since. Removals are retained for 30 days; an older since returns HTTP 410 with the full feed URL.
Feed delta parameters
Parameter
Type
Description
sincerequired
string
ISO-8601 timestamp, for example 2026-10-09T08:00:00Z, or the next_since cursor from a truncated response.
limit
integer
Maximum entries per page (added and removed combined). Default 50,000; maximum 100,000.
One call that answers “what do we know about this link?” — for any domain or URL, listed or not. verdict is the authoritative blocklist result. assessment is a prediction from PhishDestroy data with a risk of high, elevated, low or none and the signals behind it. context is a plain-text summary with numbered sources, ready to hand to a language model.
Investigation signals
Signal
Meaning
brand_in_name
The name contains a brand that phishers put in domain names.
brand_homoglyph
The brand is spelled with look-alike characters, such as a Cyrillic “а” in “metamаsk”. display_name shows how the name renders.
lookalike_of_known_phishing
Close spelling of a known phishing domain.
shared_name_pattern
Known phishing domains built from the same words.
phishing_infrastructure_ip
Hosted on an IP that serves other known phishing domains and no established sites.
scam_terms / high_risk_tld
Words such as verify, claim or recovery; a top-level domain heavily used for abuse.
newly_registered
Registered within the last 90 days. Most phishing domains are under 30 days old when caught.
Established high-traffic domains (Tranco top 1M) and registrations held for three years or more are capped at low risk, because phishing domains are almost always new; registration comes from the registry’s RDAP service, never from the domain itself. On a held-out sample, 68% of phishing domains detected in the last week scored elevated or high, against 1 of 300 established sites scored without the Tranco cap. A none result is not evidence of safety, and a prediction is not a confirmed listing.
GET
/v1/intel/search
Search confirmed phishing records by words — brands, kits, drainers, scam types, registrars — and get the best matches with a citable context. At most 10 results per call and no paging: it answers a question, it does not export the dataset.
Threat search parameters
Parameter
Type
Description
qrequired
string
Words, at least 3 letters or digits. Quoted phrases and or work.
Pull the full intelligence record for a confirmed domain: who it impersonates, how it scores across reputation sources, where it is hosted, its lifecycle, a fingerprint, and a machine-written analyst report. A domain that is not in the dataset returns found: false. WHOIS emails and personal data are never exposed, and the AI report is generated analysis, not a legal determination.
Domain intel parameters
Parameter
Type
Description
domainrequired
string
A listed domain or URL. The www. variant is also tried.
Generated title, description, summary and generated_at.
GET
/v1/similar
Find other domains run by the same actor as a seed domain. Clustering uses a shared favicon hash, IP address or phishing kit, but only when that signal is specific to one actor — generic shared infrastructure such as a blank favicon, a shared CDN address or a broad kit is dropped so the cluster stays meaningful instead of sweeping in unrelated sites. The response reports which signals it clustered_by, and every row carries its own matched_by.
See a whole impersonation campaign at once. Pass brand (or kit) to get every tracked domain for that target with total, alive and distinct_ips and a page of domains. Pass nothing to get type: "brand_index", the top 50 brands by tracked-domain count. These counts describe tracked impersonation domains, not takedowns.
Campaign parameters
Parameter
Type
Description
brand
string
Impersonated brand (case-insensitive). Mutually exclusive with kit.
Every error is JSON with an error field. An error is never a clean verdict.
Rate limits
Each client has two quotas that refill continuously. Public blocklist data is generous; intelligence costs more and also has a daily cap. Limits are per IP address (IPv6 per /64): no API key, no sign-up. Claude and ChatGPT connectors, which share a few IPs between many users, get the higher quota automatically.
Responses that are not edge-cached carry RateLimit-Policy, RateLimit, X-RateLimit-Remaining and X-RateLimit-Cost. A 429 gives the exact wait in Retry-After and retry_after. Health checks, MCP connection and tool listing are free; MCP tool calls spend the same quota as their REST route. Checking thousands of domains an hour? Download a feed once and follow its delta instead.
HTTP status codes
Status
Meaning
What to do
400
Missing or invalid input, such as a domain or since.
Fix the request.
404
Unknown route or list.
Use a documented path and list name.
405
Method not allowed. The Allow header lists valid methods.
Switch the method.
410
Delta since is older than 30 days.
Download the full feed again.
413
Bulk body larger than 256 KB.
Split the request.
429
{"error":"rate_limited","retry_after":7,"bucket":"intel"} with an exact Retry-After header.
Wait the given seconds; do not retry sooner.
500
Unexpected server error.
Retry later; do not treat it as clean.
503
Only on /v1/health: the service is down or data is stale.
Pause automated decisions.
READ THE SIGNALS
A score needs context.
The published API reference describes these signal weights. Use the server's returned verdict; don't reconstruct a verdict from a domain name alone.
Curated blocklist+40
DNS active+30
Community reported+20
Multiple sources+10
Suspicious keyword+5 each
Risky top-level domain+5
Documented severity bands
Critical70–100
High40–69
Medium20–39
Low1–19
Not every response includes a score. Missing data does not mean zero risk.
MACHINE-READABLE BY DESIGN
For the tools that use your tools.
Use an OpenAPI description for integrations, or a clean Markdown reference for agents. Both describe the same public endpoints.
Compatible browsers can expose check-phishing and bulk-check-threats through WebMCP. Both use this console's validation and results. REST remains the portable integration path.
POST
/mcp
A Model Context Protocol server (Streamable HTTP, JSON responses, no authentication). Add https://api.destroy.tools/mcp as a remote MCP server in an AI client and the model gets these tools: investigate_domain, check_domain, bulk_check_domains, search_threat_intel and get_campaign. Each tool runs the same code as its REST route and spends the same quota; connecting and listing tools is free.
In Claude, open Settings, Connectors, Add custom connector and paste the URL. In ChatGPT, turn on developer mode and create a connector with this URL and no authentication. Claude Code, Cursor and VS Code take the config below. The server needs no OAuth and never asks for a login.
CLIENT CONFIG
# Claude Code
claude mcp add --transport http phishdestroy https://api.destroy.tools/mcp
# Cursor: ~/.cursor/mcp.json
{"mcpServers":{"phishdestroy":{"url":"https://api.destroy.tools/mcp"}}}
# VS Code: .vscode/mcp.json
{"servers":{"phishdestroy":{"type":"http","url":"https://api.destroy.tools/mcp"}}}
# Clients that only run local (stdio) servers
{"mcpServers":{"phishdestroy":{"command":"npx","args":["-y","mcp-remote","https://api.destroy.tools/mcp"]}}}
The project's public documentation lists these sources in its intelligence pipeline. A source appearing here does not imply endorsement or a formal partnership.
Handle unsuccessful HTTP statuses, timeouts, and invalid responses. Respect rate-limit responses and avoid tight retry loops. The documentation does not promise an availability SLA.
Unlisted isn't verified safe.
Combine threat intelligence with other evidence. New threats and false positives are possible. This API returns intelligence; it does not initiate takedowns.