API

Everything the dashboard shows is available as JSON. Create a token in Settings and send it as a bearer token. Limit: 120 requests a minute.

curl https://ishacked.com/api/v1/sites -H "Authorization: Bearer ih_…"
MethodPathWhat it does
GET/accountPlan, site limit, on-demand allowance, alert channels
GET/sitesAll sites with status, issue count and top issue
POST/sitesAdd sites: {"urls": ["https://a.com", "b.org, Client label"]}
GET/sites/:idFindings, the full checklist, accepted keys and the latest raw snapshot
PATCH/sites/:idSet the label or client recipients: {"label": "Acme", "alert_emails": ["[email protected]"]}
DELETE/sites/:idStop monitoring a site
POST/sites/:id/checkCheck now (202 when queued, 429 when cooling down or out of allowance)
POST/check-allCheck every site now, within the daily allowance
GET/sites/:id/scansThe last 60 scans: status, findings, new keys
GET/sites/:id/scans/:scanIdOne scan, with its full snapshot for the latest 10

Run a check after every deploy

curl -fsS -X POST https://ishacked.com/api/v1/sites/$SITE_ID/check -H "Authorization: Bearer $HACKBEACON_TOKEN"

Webhook payload

Sent for new high and medium issues (alert) and when a site is clean again (resolved). text and content let Slack and Discord display it as is.

{
  "event": "alert",
  "site": { "id": "6f1c…", "url": "https://client-shop.com/" },
  "report_url": "https://ishacked.com/app/sites/6f1c…",
  "findings": [
    { "key": "cloak-spam:casino", "severity": "high", "category": "seo",
      "title": "Googlebot sees spam that visitors do not", "detail": "…", "evidence": ["casino"] }
  ],
  "text": "⚠️ IsHacked: 1 new issue(s) on client-shop.com …",
  "sent_at": "2026-10-16T12:00:00.000Z"
}

Finding keys

Each finding has a stable key, for example spf-lookups, tls-expiring:14 or wp-user:adminbackup. Alerts fire once per key, and marking a key as expected silences it for that site.

Send feedback

A bug, an idea, a question about this page: anything. It goes straight to the founder.