Documentation beta

How to use the scanner — the web app and the JSON API. Results are informational only, produced by automated tests.

Beta access beta

During the closed beta the scanner is invite-only. You need a personal access code — it looks like bk-…. No code yet? Request beta access.

Web app beta

API beta

Send your code on every request, in either header (X-Access-Key or a Bearer token):

curl -s -X POST https://scan.stalkphish.io/api/scan \
  -H 'Content-Type: application/json' \
  -H 'X-Access-Key: bk-yourcode' \
  -d '{"url":"https://suspicious-example.com/login"}'

# equivalently:
#   -H 'Authorization: Bearer bk-yourcode'
ResponseMeaning
202Accepted — a scan was queued.
401Missing, invalid, or revoked access code.
429Your code's quota is spent — see the Retry-After header.

Each code has its own quota. Please scan responsibly, and use “⚑ Report a false positive or issue” on any wrong verdict — that feedback is exactly what the beta is for.

Using the web app

  1. Paste a URL on the Scan page and press Scan URL. Defanged URLs are accepted — hxxps://evil[.]com is read as https://evil.com. If you omit the scheme, https:// is assumed.
  2. The scan runs asynchronously. You are taken to a result page that updates live: Queued… → the current phase (Resolving DNS & hosting, Querying threat intelligence, Fetching & analysing the page, Rendering the page…) → the final result.
  3. Under heavy load a submission may be rejected with a “scanner is busy” message — retry in a moment.

The web app never fetches the target from your browser. The URL is analysed from isolated infrastructure, through proxies — your IP is never used.

Reading a result

The header shows a score out of 100 and a verdict:

VerdictScoreMeaning
CRITICAL80–100Almost certainly phishing.
HIGH55–79Strong phishing indicators.
MEDIUM35–54Suspicious — investigate further.
LOW18–34Weak signals.
VERY LOW0–17No significant indicators.

The report is organised in sections:

Every hostile URL is shown defanged (hxxp://…[.]…) so it can't be clicked by accident. Each result also carries the scan time (UTC).

Think a verdict is wrong? Use “⚑ Report a false positive or issue” at the bottom of the result — it attaches the exact scan so we can reproduce and tune.

Limits & privacy

API

Everything the web app does is available over a JSON API. The interactive reference is Swagger UI:

beta Authentication required. Every POST /api/scan needs your access code (X-Access-Key: bk-…) — see Beta access above.

Asynchronous flow

A scan is a job: submit a URL, receive a uuid, then poll until it's done.

MethodPathPurpose
POST/api/scanSubmit a URL → 202 {uuid, status:"queued"}
GET/api/scan/{uuid}Status & result (queued → running → done | error)
GET/api/scan/{uuid}/screenshotRendered screenshot (PNG)
POST/api/reportReport a false positive / issue on a scan

Example

# 1. Submit — returns a UUID immediately
curl -s -X POST https://scan.stalkphish.io/api/scan \
  -H 'Content-Type: application/json' \
  -d '{"url":"https://suspicious-example.com/login"}'
# → {"uuid":"a1b2c3d4-...","status":"queued"}

# 2. Poll until status == "done"
curl -s https://scan.stalkphish.io/api/scan/a1b2c3d4-...
# → {"status":"done","result":{"score":92,"verdict":"CRITICAL", ... }}

# 3. (optional) fetch the screenshot
curl -s https://scan.stalkphish.io/api/scan/a1b2c3d4-.../screenshot -o shot.png

The edge only enqueues — it never fetches the target itself (SSRF containment). Responses 429 (per-IP quota) and 503 (scanner busy) mean “retry later”. Defanged URLs are accepted.

← Back to the scanner

Results come from automated tests, for information only and without warranty. They may be inaccurate and are not a definitive verdict — StalkPhish.io accepts no liability; always verify independently.