REST reference — v1

Phishing Detection API documentation

Four endpoints, one API key, JSON everywhere. This page is the complete reference: parameters, response fields, error codes, rate limits and worked examples in four languages.

4Endpoints in the v1 surface
100Domains per batch request
10/sRequests per second, per key
<50msTypical single-lookup latency
Getting started

Overview

What the API returns

The Phishing Detection API provides real-time access to a continuously updated database of DNS-verified active phishing domains. The database currently contains 390,000+ actively resolving phishing domains and is updated every 24 hours.

Deliberately simple: authenticate with an API key, send a domain, receive an instant JSON verdict.

Every entry in the database has passed a DNS resolution check before publication, so what you are querying is live infrastructure rather than a historical list of names. That constraint is the single most important thing to understand about the dataset, because it dictates both what the API is excellent at and where it deliberately stays silent. Domains that have been registered but are not yet serving do not appear; domains that have been suspended since the last build are dropped.

Your request
Key + credit check
Database lookup
JSON verdict

Key features

  • Single domain check — query one domain at a time via a GET request.
  • Batch check — check up to 100 domains in a single POST request.
  • Daily feed — download the complete database as CSV or JSON (subscription required).
  • Database stats — current database size and last update timestamp, with no key and no credit cost.
Quick start: buy a credit pack on the pricing page, collect your key from the dashboard, and make your first request in under 30 seconds. A step-by-step walkthrough with a working script is on the quick start page.
Getting started

Authentication

All API requests require an API key passed as a query parameter (apikey), or in the request body for POST endpoints. Your API key is your username from registration.

Passing the key
# API key as a query parameter
GET /api/v1/check?domain=example.com&apikey=your_api_key

# API key in a POST body
POST /api/v1/batch
{
  "apikey": "your_api_key",
  "domains": ["example1.com", "example2.com"]
}
Keep your API key secret. Do not expose it in client-side code. Always make API calls from your server. If a browser extension or mobile app needs a verdict, proxy the request through your own backend so the key never leaves your infrastructure.
Getting started

Base URL

All API endpoints are relative to a single host and version prefix. There is no regional routing to configure and no separate sandbox host.

Base URL
https://phishingdetectionapi.com/api/v1/
Endpoint

Single domain check

Check whether a single domain is present in the phishing database. This is the most common endpoint and the one to use for real-time URL filtering, contact-centre lookups and interactive analyst tooling.

GET /api/v1/check 1 credit

Parameters

ParameterTypeRequiredDescription
domainstringRequiredThe domain to check, for example suspicious-site.com. The API automatically strips http://, https:// and path segments.
apikeystringRequiredYour API key (the username from registration).

Example request

cURL
curl "https://phishingdetectionapi.com/api/v1/check?domain=suspicious-login.example.com&apikey=YOUR_KEY"

Success response — phishing domain found

200 OK
{
  "domain": "suspicious-login.example.com",
  "is_phishing": true,
  "dns_status": "resolves",
  "last_checked": "2026-07-28",
  "database_size": 120212553
}

Success response — clean domain

200 OK
{
  "domain": "google.com",
  "is_phishing": false,
  "dns_status": "resolves",
  "last_checked": "2026-07-28",
  "database_size": 120212553
}

Note that a clean domain is a 200, not a 404. Both outcomes have the same response shape, so client code has exactly one branch to write and no error handling to conflate a "not phishing" verdict with a transport failure. The dns_status field is evaluated in real time on every request and is never null: a hostname that does not currently exist in DNS returns does_not_resolve. A syntactically invalid domain returns a 400 error instead of a verdict.

Endpoint

Batch check

Check up to 100 domains in a single request. Each domain in the batch costs 1 API credit. This is the right endpoint for processing email link lists, log files and bulk URL scanning, because it removes the per-request round-trip cost from the hot path.

POST /api/v1/batch 1 credit per domain

Request body (JSON)

FieldTypeRequiredDescription
apikeystringRequiredYour API key.
domainsarrayRequiredArray of domain strings to check. Maximum 100 per request.

Example request

cURL — POST
curl -X POST "https://phishingdetectionapi.com/api/v1/batch" \
  -H "Content-Type: application/json" \
  -d '{
    "apikey": "YOUR_KEY",
    "domains": [
      "0-105.com",
      "google.com",
      "suspicious-bank-login.example.com"
    ]
  }'

Success response

200 OK
{
  "results": [
    {
      "domain": "0-105.com",
      "is_phishing": true,
      "dns_status": "resolves"
    },
    {
      "domain": "google.com",
      "is_phishing": false,
      "dns_status": "resolves"
    },
    {
      "domain": "suspicious-bank-login.example.com",
      "is_phishing": false,
      "dns_status": "does_not_resolve"
    }
  ],
  "checked": 3,
  "phishing_found": 1,
  "credits_used": 3,
  "database_size": 120212553
}
Treat phishing_found as a routing key rather than a verdict on the whole payload. Zero means continue and log; one or more means quarantine, push the matched domains to your own blocklist, and open a case with the specific hostnames attached rather than a generic alert.
Endpoint

Daily feed download

Download the complete phishing domain database as a CSV file. This endpoint requires a daily feed subscription. The database is updated at 04:30 UTC daily.

GET /api/v1/feed subscription
ParameterTypeRequiredDescription
apikeystringRequiredYour API key. Must have an active feed subscription.
formatstringOptionalResponse format: csv (default) or json.

Example

Feed download
# Download as CSV
curl -o phishing_domains.csv "https://phishingdetectionapi.com/api/v1/feed?apikey=YOUR_KEY"

# Download as JSON
curl "https://phishingdetectionapi.com/api/v1/feed?apikey=YOUR_KEY&format=json"

CSV format

phishing_domains.csv
domain,category,dns_status
0-105.com,phishing/malware,resolves
0-amazon.weebly.com,phishing/malware,resolves
0-amfc.firebaseapp.com,phishing/malware,resolves
...
The daily feed requires a subscription starting at $499 per month. Plans, the daily changelog and integration recipes for DNS sinkholes and SIEMs are on the daily threat feed page.
Endpoint

Database statistics

Get current statistics about the phishing domain database, including total domains, last update time and data source information.

GET /api/v1/stats no credits
Example response
{
  "total_active_domains": 212370,
  "total_all_time": 496443,
  "last_updated": "2025-07-09T04:30:00Z",
  "update_frequency": "daily",
  "dns_verification": true
}
This endpoint does not consume API credits and does not require authentication. It is safe to poll from a monitoring check to confirm the database is fresh before a scheduled job runs.
Reference

Response format

All API responses are returned as JSON. The five fields below make up the single-check response.

Single-check response fields

Every field is always present and never null, so client code has exactly one shape to handle.

domainstringThe domain that was checked, normalised.
is_phishingbooleantrue if the domain is in the phishing database, false otherwise.
dns_statusstringLive DNS resolution status, evaluated in real time on every request: resolves or does_not_resolve.
last_checkedstringDate of the check, formatted YYYY-MM-DD.
database_sizeintegerTotal domains in the combined domain-intelligence corpus behind the service: the 120M-domain categorization corpus plus the current DNS-verified active phishing set.
Reference

Error codes

The API uses standard HTTP status codes. Error responses include a JSON body with an error field.

StatusMeaningDescription
400Bad RequestMissing required parameter, for example domain.
401UnauthorizedMissing or invalid API key.
405Method Not AllowedWrong HTTP method, for example a GET on a POST-only endpoint.
429Too Many RequestsAPI credits exhausted or rate limit exceeded.
500Server ErrorInternal server error. Contact support if it persists.
Error response example
{
  "error": "API credits exhausted. Please purchase more credits."
}

A 429 is the only status that changes behaviour depending on cause: it is returned both when the per-second rate limit is exceeded and when the credit balance reaches zero. Treat the first as retryable with backoff and the second as an operational alert, and read the error string to tell them apart.

Reference

Rate limits

Rate limits depend on your plan and credit balance. Each API call consumes 1 credit, and batch calls consume 1 credit per domain.

10/s
Requests per second
100
Domains per batch
Per plan
Monthly credits
Unlimited
Feed downloads
Limit typeValueNotes
Requests per second10Per API key.
Batch size100 domainsPer POST request.
Monthly creditsPer planSee the pricing page.
Feed downloadsUnlimitedWith an active feed subscription.

The practical lever on both cost and throughput is deduplication rather than concurrency. A mail gateway sees enormous message volume but a comparatively small set of distinct external hostnames per day, and a short-lived in-process cache collapses most of what remains. Size your credit pack on distinct domains per day, batch them a hundred at a time, and the per-second ceiling stops being a constraint.

Reference

Code examples

Four complete clients. Each one covers the single-check endpoint, and the first two also wrap the batch endpoint.

Python

Python — requests
import requests

API_KEY  = "your_api_key"
BASE_URL = "https://phishingdetectionapi.com/api/v1"

# Single domain check
def check_domain(domain):
    response = requests.get(
        f"{BASE_URL}/check",
        params={"domain": domain, "apikey": API_KEY}
    )
    return response.json()

# Batch check
def batch_check(domains):
    response = requests.post(
        f"{BASE_URL}/batch",
        json={"apikey": API_KEY, "domains": domains}
    )
    return response.json()

# Usage
result = check_domain("suspicious-site.com")
if result["is_phishing"]:
    print(f"BLOCKED: {result['domain']} is phishing!")

# Batch usage
results = batch_check(["site1.com", "site2.com", "site3.com"])
for r in results["results"]:
    if r["is_phishing"]:
        print(f"Phishing: {r['domain']}")

Node.js

Node.js — fetch
const API_KEY  = 'your_api_key';
const BASE_URL = 'https://phishingdetectionapi.com/api/v1';

// Single check
async function checkDomain(domain) {
  const url = `${BASE_URL}/check?domain=${domain}&apikey=${API_KEY}`;
  const res = await fetch(url);
  return res.json();
}

// Batch check
async function batchCheck(domains) {
  const res = await fetch(`${BASE_URL}/batch`, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ apikey: API_KEY, domains })
  });
  return res.json();
}

// Usage
const result = await checkDomain('suspicious-site.com');
if (result.is_phishing) {
  console.log(`BLOCKED: ${result.domain}`);
}

PHP

PHP
<?php
$apiKey  = 'your_api_key';
$baseUrl = 'https://phishingdetectionapi.com/api/v1';

// Single check
function checkDomain($domain) {
    global $apiKey, $baseUrl;
    $url = $baseUrl . '/check?' . http_build_query([
        'domain' => $domain,
        'apikey' => $apiKey
    ]);
    return json_decode(file_get_contents($url), true);
}

// Usage
$result = checkDomain('suspicious-site.com');
if ($result['is_phishing']) {
    echo "BLOCKED: {$result['domain']} is phishing!\n";
}

cURL

cURL
# Single check
curl "https://phishingdetectionapi.com/api/v1/check?domain=suspicious.com&apikey=YOUR_KEY"

# Batch check
curl -X POST "https://phishingdetectionapi.com/api/v1/batch" \
  -H "Content-Type: application/json" \
  -d '{"apikey":"YOUR_KEY","domains":["site1.com","site2.com"]}'

# Download daily feed
curl -o phishing.csv "https://phishingdetectionapi.com/api/v1/feed?apikey=YOUR_KEY"
Reference

SDKs & libraries

The API uses standard REST conventions, so any HTTP client works. No SDK is required. Make GET or POST requests with your API key and parse the JSON response.

Integration tips

  • Email gateways — check URLs extracted from email bodies before delivery, using the batch endpoint for efficiency. Walkthrough on the email security use case.
  • DNS filtering — subscribe to the daily feed and import the CSV into your DNS sinkhole, such as Pi-hole, Bind or Unbound. See the DNS filtering use case.
  • Browser extensions — call the single-check endpoint on page load to warn users, proxying through your own backend so the key stays server-side.
  • SIEM integration — enrich security logs by checking domains against the API during log ingestion. Detail on the SIEM integration use case.
  • Firewalls — automate daily blocklist updates with a cron job that downloads the feed CSV each morning.
Need help integrating? Contact us at [email protected] and we will help you get set up.

Ready to make your first call?

Buy a credit pack, take your key from the dashboard, and run the Python block above against a domain you already suspect. If the pipeline has seen it, you will know in fifty milliseconds.