API REFERENCE

Scam Archive API

A free, read-only JSON API for accessing the Scam Archive database. No authentication required. All endpoints return application/json.

No auth required Read-only Free to use Base URL: https://scamarchive.org

Scams

GET /api/scams

List and search all scams. Supports filtering, sorting, and pagination.

Query Parameters

Parameter Type Description
q string Search across title, description, category, channels, and tags.
channel string Filter by delivery channel. e.g. "email", "sms".
category string Filter by scam category. e.g. "phishing".
verified "true" | "false" Filter by verification status.
sort "az" | "recent" | "reports" | "risk" Sort order. Defaults to "az".
limit number Max results to return. Omit for all.
offset number Pagination offset. Defaults to 0.

Example Request

GET https://scamarchive.org/api/scams?q=paypal&sort=recent&limit=5

Response Shape

{
  "meta": {
    "total": 42,
    "returned": 5,
    "offset": 0,
    "limit": 5,
    "query": { "q": "paypal", "sort": "recent", ... }
  },
  "filters": {
    "categories": ["phishing", "refund-invoice", ...],
    "channels": ["Email", "SMS/Text", ...]
  },
  "rows": [
    {
      "id": "paypal-invoice-scam",
      "title": "PayPal Invoice Scam",
      "desc": "...",
      "category": "phishing",
      "channels": ["Email"],
      "risk": "High",
      "verified": false,
      "variationsCount": 4,
      "reports": 0,
      "lastSeen": "2025-11-01T00:00:00.000Z",
      "hero": "/images/paypal-invoice-scam/...",
      "tags": ["PayPal", "Invoice", ...]
    }
  ]
}
GET /api/scams/{id}.json

Retrieve a single scam and all its variations by scam ID (slug).

Path Parameters

Parameter Description
id The scam slug, e.g. paypal-invoice-scam

Example Request

GET https://scamarchive.org/api/scams/paypal-invoice-scam.json

Response Shape

{
  "post": {
    "id": "paypal-invoice-scam",
    "slug": "paypal-invoice-scam",
    "data": {
      "scamName": "PayPal Invoice Scam",
      "category": "phishing",
      "severity": "High",
      "description": "...",
      "howItWorks": [...],
      "dos": [...],
      "donts": [...],
      "tags": [...]
    }
  },
  "variations": [
    {
      "id": "paypal-invoice-scam/armory",
      "title": "Armory PayPal Invoice",
      "channel": "Email",
      "dateObserved": "2025-10-01",
      "images": ["/images/paypal-invoice-scam/armory.png"],
      "navigation": "/scams/paypal-invoice-scam/armory"
    }
  ]
}

Variations

Each scam has one or more variations — specific real-world instances with their own screenshots, channel, and observed date.

GET /api/variations

List and search all variations across every scam. Supports filtering by scam, channel, and severity.

Query Parameters

Parameter Type Description
q string Search across title, description, scam name, and tags.
scam string Filter by parent scam slug. e.g. paypal-invoice-scam
channel string Filter by delivery channel. e.g. "email", "sms".
severity string Filter by severity. e.g. "high".
sort "recent" | "az" Sort order. Defaults to "recent".
limit number Max results to return. Omit for all.
offset number Pagination offset. Defaults to 0.

Example Request

GET https://scamarchive.org/api/variations?scam=remote-job-offer-text-scam&sort=recent

Response Shape

{
  "meta": {
    "total": 8,
    "returned": 8,
    "offset": 0,
    "limit": null,
    "query": { "q": "", "scam": "remote-job-offer-text-scam", "channel": "", "severity": "", "sort": "recent" }
  },
  "rows": [
    {
      "id": "remote-job-offer-text-scam/robert-half",
      "scamSlug": "remote-job-offer-text-scam",
      "variationSlug": "robert-half",
      "scamName": "Remote Job Offer Text Scam",
      "title": "Robert Half text job offer $250-$500/day",
      "description": "...",
      "channel": "SMS (iMessage)",
      "dateObserved": "2025-10-13",
      "severity": "High",
      "images": ["/images/remote-job-offer-text-scam/robert-half-team.png"],
      "tags": ["Robert Half", "Remote Job", "SMS"],
      "associations": ["+1 (202) 651-1350"],
      "url": "/scams/remote-job-offer-text-scam/robert-half"
    }
  ]
}

Identifiers

Identifiers are phone numbers, email addresses, domains, curator-reviewed person names, curator-reviewed brand names, and other IOCs (indicators of compromise) extracted from scam variations.

GET /api/identifiers

List and search all identifiers with appearance counts and category breakdowns.

Query Parameters

Parameter Type Description
q string Search across value, kind, and top categories.
kind string Filter by identifier type. e.g. "phone", "email", "domain", "person-name", or "brand-name".
category string Filter by scam category the identifier appears in.
min number Minimum number of appearances. Defaults to 0.
sort "appearances" | "kind" | "az" Sort order. Defaults to "appearances".
limit number (1–500) Max results. Defaults to 100.
offset number Pagination offset. Defaults to 0.

Example Request

GET https://scamarchive.org/api/identifiers?kind=phone&min=2&sort=appearances

Response Shape

{
  "meta": {
    "total": 38,
    "returned": 10,
    "offset": 0,
    "limit": 100,
    "query": { "q": "", "kind": "phone", "min": 2, "sort": "appearances" }
  },
  "rows": [
    {
      "kind": "phone",
      "value": "+1 (202) 651-1350",
      "normalized": "+12026511350",
      "slug": "phone--+12026511350",
      "summary": {
        "appearances": 3,
        "top": [
          { "name": "phishing", "count": 2 },
          { "name": "investment", "count": 1 }
        ],
        "more": 0
      }
    }
  ]
}
GET /api/identifiers/{slug}

Look up a specific identifier or reported name. Returns full appearance history and co-occurring identifiers seen in the same scams.

Path Parameters

Parameter Description
slug Identifier slug from the list endpoint, e.g. phone--+12026511350 or brand-name--paypal

Query Parameters

Parameter Default Description
co 1 Include co-occurrences. Set to 0 to omit.
apps 1 Include appearance list. Set to 0 to omit.

Example Request

GET https://scamarchive.org/api/identifiers/phone--+12026511350

Response Shape

{
  "identifier": {
    "kind": "phone",
    "value": "+1 (202) 651-1350",
    "normalized": "+12026511350",
    "slug": "phone--+12026511350"
  },
  "stats": {
    "appearancesCount": 2,
    "firstSeen": "2025-10-13",
    "lastSeen": "2025-10-13"
  },
  "appearances": [
    {
      "scamId": "remote-job-offer-text-scam",
      "variationSlug": "robert-half",
      "scamName": "Remote Job Offer Text Scam",
      "url": "/scams/remote-job-offer-text-scam/robert-half",
      "channel": "SMS (iMessage)",
      "firstSeen": "2025-10-13",
      "lastSeen": "2025-10-13",
      "primaryImage": "/images/...",
      "excerpt": "..."
    }
  ],
  "cooccurrences": [
    {
      "kind": "phone",
      "value": "+63 951 926 0696",
      "normalized": "+639519260696",
      "count": 1,
      "url": "/identifiers/phone--+639519260696"
    }
  ]
}

Notes

  • All endpoints are read-only. No API key is required.
  • Responses are cached between 60 seconds and 5 minutes. Build with that in mind.
  • /api/scams/{id}.json is statically generated at build time. /api/scams and the identifier endpoints are server-rendered.
  • If you build something with this API, we'd love to know — reach out via the report page.