breach.io · scope API

API documentation

v1.2.0 · no API key

Turn a public company domain into an evidence-backed asset inventory and a conservative scope file.

The API is public, read-only, and CORS-enabled. It uses public data sources plus bounded HTTP GET/HEAD requests. It does not exploit, authenticate to, or change the target.

Quickstart

Send exactly one JSON field, url, to the production endpoint. Bare domains and public HTTP(S) URLs are accepted.

curl -sS https://scope.breach.io/api/v1/recon \
  -H 'Content-Type: application/json' \
  -d '{"url":"example.com"}'

Browser or Node.js

const response = await fetch("https://scope.breach.io/api/v1/recon", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({ url: "example.com" }),
});

const payload = await response.json();
if (!response.ok) {
  throw new Error(payload.error.code + ": " + payload.error.message);
}

console.log(payload.data.scope.allowedHosts);

Response contract

Every v1 search response includes apiVersion and a unique requestId. The complete schema—including every asset, provenance, coverage, fingerprint, and scope field—is in the OpenAPI document.

{
  "apiVersion": "1.2.0",
  "requestId": "b842a62c-4dcb-47b2-a83f-207e63f58bb3",
  "data": {
    "apex": "example.com",
    "anchor": {
      "apex": "example.com",
      "registrantOrg": null,
      "registrantEmailDomain": null,
      "certOrgs": [],
      "githubOrgs": []
    },
    "assets": [],
    "github": [],
    "gitlab": [],
    "services": [],
    "githubReferences": [],
    "dnsRelations": [],
    "relatedDomains": [],
    "candidates": [],
    "dangling": [],
    "referenced": [],
    "origins": [],
    "fingerprints": { "signals": [], "matches": [] },
    "scope": {
      "name": "example.com-recon-2026-08-12",
      "authorized": false,
      "allowedHosts": ["example.com"],
      "excludedHosts": [],
      "allowedSchemes": ["http", "https"],
      "rateLimit": { "requestsPerSecond": 1, "parallelism": 1 },
      "notes": "Authorization must be attested by a human."
    },
    "perSource": {},
    "coverage": {
      "sources": {},
      "discoveredHosts": 0,
      "processedHosts": 0,
      "truncatedHosts": 0
    },
    "counts": {
      "CONFIRMED": 0,
      "THIRD_PARTY": 0,
      "CANDIDATE": 0,
      "DANGLING": 0
    }
  }
}

Asset classifications are CONFIRMED, THIRD_PARTY, CANDIDATE, or DANGLING. Only CONFIRMED hosts enter scope.allowedHosts. scope.authorized is always false until a human confirms written permission.

githubReferences records repository, Pages, deployment, selected-file, and exact-domain code-search evidence. dnsRelations records bounded TXT/CAA/SRV/HTTPS/SVCB relationships. relatedDomains keeps off-apex portfolio candidates separate from the generated scope and marks a domain confirmed only after two independent evidence families agree.

gitlab lists public projects only for groups linked by the target’s own site or security policy. services derives cloud and SaaS dependencies from CNAME and MX data already collected; these provider targets are never test scope.

Rate limits and caching

ControlLimit
Per client5 searches / minute
Per Cloudflare location100 searches / minute
Successful-result reuse15 minutes
Request body4 KiB
Search deadline50 seconds
Processed hosts500 maximum

Inspect X-Scope-Cache, RateLimit-Policy, and X-Request-Id. A 429 response also includes Retry-After: 60.

Errors

Non-2xx responses use one stable envelope. Log the request ID when reporting a failure.

{
  "apiVersion": "1.2.0",
  "requestId": "8dd7cecf-69f5-4309-b89f-2ee88c9ebc8f",
  "error": {
    "code": "INVALID_TARGET",
    "message": "Enter a public company domain, e.g. acme.com"
  }
}
400 INVALID_REQUEST / INVALID_TARGET
413 PAYLOAD_TOO_LARGE
415 UNSUPPORTED_MEDIA_TYPE
429 RATE_LIMITED
500 INTERNAL_ERROR
504 RECON_TIMEOUT

Security and use

  • No API key or cookies are accepted; cross-origin responses use Access-Control-Allow-Origin: * without credentials.
  • Private, loopback, link-local, internal, credential-bearing, non-HTTP(S), and disallowed-port targets are rejected.
  • Discovery is bounded and provider-dependent. Treat CANDIDATE, DANGLING, origin, and fingerprint results as evidence to review—not proof of ownership or authorization.
  • Using the generated scope for testing still requires written permission from the target owner.