🚀 PhishGuard is live! We're improving daily — results are good but always double-check critical decisions. Share feedback →

Phishing Detection API — Free URL Scanner (REST + JSON)

Integrate phishing detection into your apps, bots, or security pipelines. Free tier: 500 requests/day.

API Key Auth Webhooks 500 req/day free HTTPS only

Plans

PlanPriceDaily LimitWebhooksSupport
Free₹0500 req/dayUp to 3Community
ProComing soon50,000 req/dayUp to 20Email
EnterpriseContact usUnlimitedUnlimitedPriority

Get Your Free API Key

API keys require a verified PhishGuard account — this keeps free-tier access from being handed out anonymously.

Quick Start

Analyze a URL (replace YOUR_KEY):

curl -X POST https://phishguard.in/api/analyze-url \ -H "X-API-Key: YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{"url": "https://example-suspicious.tk/verify"}'

Python example:

import requests API_KEY = "YOUR_KEY" URL_TO_SCAN = "https://example-suspicious.tk/verify" response = requests.post( "https://phishguard.in/api/analyze-url", headers={"X-API-Key": API_KEY, "Content-Type": "application/json"}, json={"url": URL_TO_SCAN} ) result = response.json() print(f"Risk Level: {result['risk_level']}") print(f"Risk Score: {result['risk_score']}/100")

API Endpoints

POST /scan — check a single URL

Submit a URL and receive a phishing risk score along with the signals that contributed to it, in JSON.

GET /report/:id — retrieve scan result

Fetch the full result of a previously submitted scan using its report ID.

GET /history — list past scans

Retrieve a paginated list of your account's previous scan requests and their results.

Request/response schema

All endpoints accept and return JSON. See the field reference below for request parameters and response shape.

Rate-limit headers explained

Every response includes rate-limit headers showing your remaining quota and reset time, so you can build backoff logic into your integration.

Error codes reference

Standard HTTP status codes are used throughout — 429 for rate limits, 401 for invalid API keys, 400 for malformed requests.

Webhook signature verification

Webhook payloads are signed so you can verify they genuinely came from PhishGuard before acting on them.

POST/api/analyze-url

Analyze a URL for phishing. Returns risk level, score, and detailed breakdown.

{"url": "https://example.com"}

POST/api/check-ssl

Check SSL certificate validity and details for a domain.

{"domain": "example.com"}

POST/api/dns-lookup

Get DNS records (A, AAAA, MX, NS, TXT, CNAME), SPF and DMARC presence.

{"domain": "example.com"}

POST/api/expand-link

Trace redirect chain of a shortened/redirect URL.

{"url": "https://bit.ly/xyz"}

POST/api/ip-reputation

Get geolocation and proxy/hosting reputation for an IP or domain.

{"ip": "1.2.3.4"}

POST/api/website-age

Check domain registration age via WHOIS.

{"domain": "example.com"}

GET/api/developer/usage

Check your API key usage stats.

POST/api/webhooks

Register a webhook to receive alerts when HIGH or SUSPICIOUS URLs are detected.

{"url": "https://your-server.com/webhook"}

DELETE/api/webhooks/{id}

Remove a webhook.

Webhooks

Register a webhook to get notified whenever PhishGuard detects a HIGH or SUSPICIOUS URL. We'll POST to your URL with a signed payload.

Verify webhook authenticity using the X-PhishGuard-Signature header:

import hmac, hashlib def verify_webhook(payload_body: bytes, signature_header: str, secret: str) -> bool: expected = "sha256=" + hmac.new( secret.encode(), payload_body, hashlib.sha256 ).hexdigest() return hmac.compare_digest(expected, signature_header)

Example webhook payload:

{ "event": "url_scanned", "risk_level": "HIGH", "risk_score": 87, "url": "https://paypal-secure-verify.tk/login", "domain": "paypal-secure-verify.tk", "category": "Brand Impersonation", "timestamp": "2026-02-21T12:34:56Z" }

Rate Limits

EndpointLimit
/api/analyze-url30 req/min
/api/check-ssl20 req/min
/api/dns-lookup20 req/min
/api/expand-link30 req/min
/api/ip-reputation20 req/min
/api/website-age20 req/min
All endpoints200 req/hour global

HTTP 429 is returned when limits are exceeded. Retry after the indicated time.