API Documentation

REST API for Breach House: ransomware victims, data breaches, leads, infostealer logs, and threat-actor groups. All endpoints return JSON. Available to advanced and enterprise customers.

Overview

The Breach House API is a read-mostly JSON API rooted at /api/v1. All responses are application/json. Requests must be authenticated with a bearer token obtained from the customer panel or via POST /api/v1/auth/token.

Base URL: https://breach.house/api/v1

Authentication

Send your API token on every request using one of the following:

Authorization: Bearer <your_token>
X-API-Key: <your_token>
?token=<your_token>          (query string, less recommended)

Example:

curl -H "Authorization: Bearer $TOKEN" \
  "https://breach.house/api/v1/me"

Rate Limits

Each token is rate-limited by its plan's daily query budget. Current usage is visible in your customer panel (queries today / daily limit). When the budget is exhausted, requests return 429 Too Many Requests.

Errors

Errors are returned as a JSON object with an error key:

{
  "error": "invalid_token",
  "message": "Optional human-readable description"
}
StatusError codeMeaning
400invalid_typeBad query parameter value.
400missing_qThe q parameter is required.
401missing_tokenNo token supplied.
401invalid_tokenToken unknown or revoked.
401expired_tokenToken expired.
401invalid_credentialsEmail or password incorrect on /auth/token.
404not_foundResource ID does not exist.

Common Filters

The list endpoints (/ransomware, /breaches, /leads, /stealers, /latest) share these query parameters:

ParameterTypeDescription
idint / stringExact identifier match. Searches BOTH the numeric id and the alphanumeric victim_id — pass either value.
victim_idstringAlias of id: same combined match across both id and victim_id.
countrystringISO country code, case-insensitive (e.g. US).
groupstringExact group name, case-insensitive.
qstringFree-text search across title, description, website, country, name. Also matches an exact id or victim_id.
sinceYYYY-MM-DDOnly items discovered on or after this date.
untilYYYY-MM-DDOnly items discovered on or before this date.
statusstringlisted / pending → listing-only (NOT indexed by HIBR); published / indexed → only HIBR-indexed. Applies to /ransomware and /breaches. See HIBR indexing & listing-only.
indexedboolAlias of status: false = listing-only, true = indexed. published=false and hibr_indexed=false behave identically.
limitintPage size, default 50, max 500.
offsetintPagination offset, default 0.

HIBR Indexing & Listing-only

Every /ransomware and /breaches record carries three fields derived from what Have I Been Ransom has indexed:

FieldTypeDescription
hibr_indexedbooltrue when the record is present in the HIBR index (its leaked data has been processed/indexed).
is_indexedboolSame value as hibr_indexed — both names are provided.
indexedstring / nullThe HIBR index timestamp (YYYY-MM-DDTHH:MM:SS.ffffff) when indexed, otherwise null.

A record with no indexed date is listing-only: it appears in our data but HIBR has not indexed its contents. Filter by state with any of these equivalent forms (all resolve to the same "indexed vs not" test):

# listing-only (NOT indexed) — equivalent:
curl -H "Authorization: Bearer $TOKEN" "https://breach.house/api/v1/ransomware?status=listed"
curl -H "Authorization: Bearer $TOKEN" "https://breach.house/api/v1/ransomware?status=pending"
curl -H "Authorization: Bearer $TOKEN" "https://breach.house/api/v1/ransomware?published=false"
curl -H "Authorization: Bearer $TOKEN" "https://breach.house/api/v1/ransomware?indexed=false"

# only HIBR-indexed:
curl -H "Authorization: Bearer $TOKEN" "https://breach.house/api/v1/breaches?status=published"
curl -H "Authorization: Bearer $TOKEN" "https://breach.house/api/v1/breaches?indexed=true"

The full indexed set (ransomware leaks + traditional breaches) is also available as its own feed at GET /indexed.

Endpoint Reference

POST/api/v1/auth/token

Exchange credentials for a token

Issues a new API token. Use the same username/password as your account.

curl -X POST https://breach.house/api/v1/auth/token \
  -H "Content-Type: application/json" \
  -d '{"username":"alice","password":"...","name":"my-laptop","expires_in_days":30}'

Returns { "token": "...", "name": "...", "created_at": "...", "expires_at": "..." }.

GET/api/v1/me

Current user info

curl -H "Authorization: Bearer $TOKEN" https://breach.house/api/v1/me
GET/api/v1/ransomware

List ransomware victims

Accepts common filters.

curl -H "Authorization: Bearer $TOKEN" \
  "https://breach.house/api/v1/ransomware?country=US&limit=20"

Ransomware-specific response fields (in addition to the common victim fields):

idintNumeric record id (the sequential dataransom.json id). Accepted by /ransomware/{id} and the id filter.
victim_idstringStable alphanumeric victim id. Also accepted by /ransomware/{id} and the victim_id filter.
t2_timestringPublic-disclosure timestamp (t2 of the exposure "Window Zero"), YYYY-MM-DD HH:MM:SS.ffffff.
hibr_indexedboolWhether HIBR has indexed this victim. See HIBR indexing & listing-only.
is_indexedboolSame value as hibr_indexed.
indexedstring / nullHIBR index timestamp, or null when the victim is listing-only.
hibrobjectOptional. Have I Been Ransom metadata for the victim's domain, present only when indexed. Includes domain, infostealer (hits/employee_hits), breaches, ransomware, emails, ids and a leaks breakdown.

Example response item (truncated):

{
  "id": 12345,
  "victim_id": "fThjSoJ6g4oJ",
  "post_title": "Banco Azzoaglio",
  "group_name": "lockbit3",
  "country": "IT",
  "website": "bancoazzoaglio.it",
  "discovered": "2023-01-15 10:22:00.000000",
  "t2_time": "2023-02-01 00:00:00.000000",
  "hibr_indexed": true,
  "is_indexed": true,
  "indexed": "2025-06-08T16:41:23.807397",
  "meta_description": "...",
  "hibr": {
    "domain": "bancoazzoaglio.it",
    "infostealer": { "hits": 3071, "employee_hits": 75 },
    "breaches": 120,
    "ransomware": 8,
    "emails": { "total": 1875, "unique": 1640, "internal": 980, "external": 660 },
    "ids": { "distinct_leaks": 14 },
    "leaks": [ { "post_title": "...", "group_name": "...", "is_ransomware": true } ]
  }
}
GET/api/v1/ransomware/{id}

Get a single ransomware victim

{id} accepts EITHER the numeric record id OR the alphanumeric victim_id. Returns the full victim object, including both identifiers, t2_time and the hibr block when available (see the list endpoint).

curl -H "Authorization: Bearer $TOKEN" \
  https://breach.house/api/v1/ransomware/12345
curl -H "Authorization: Bearer $TOKEN" \
  https://breach.house/api/v1/ransomware/wAmZhughls2y
GET/api/v1/breaches

List data breaches

Accepts common filters. Each breach includes the HIBR-index flags hibr_indexed / is_indexed and the indexed date (or null when listing-only).

curl -H "Authorization: Bearer $TOKEN" \
  "https://breach.house/api/v1/breaches?since=2026-01-01&limit=50"
GET/api/v1/breaches/{id}

Get a single breach

curl -H "Authorization: Bearer $TOKEN" \
  https://breach.house/api/v1/breaches/789
GET/api/v1/indexed

All HIBR-indexed records (ransomware + breaches)

Everything Have I Been Ransom has indexed — ransomware leaks and traditional breaches — in a single feed. Also accepts the common filters (country, group, q, since, until, limit, offset).

ParameterValuesDescription
typeall, ransomware, breachesWhich indexed set to return. Default all.
curl -H "Authorization: Bearer $TOKEN" \
  "https://breach.house/api/v1/indexed?type=ransomware&limit=20"

Response fields (each row is enriched against local data):

typestringRansomware Leak or Traditional Breach.
indexedstringHIBR index timestamp — always present here, since every row is indexed.
localbooltrue if the record also exists in the local dataset; false for index-only records (indexed by HIBR but not yet ingested locally).
victim_idstringFor ransomware rows present locally, the local victim_id.
{
  "type": "ransomware",
  "total": 1447,
  "count": 20,
  "generated_at": "2026-07-23T09:15:00.100000",
  "source": "https://haveibeenransom.com/breaches/full",
  "results": [
    {
      "id": "677",
      "post_title": "Bangkok Airways",
      "group_name": "lockbit",
      "type": "Ransomware Leak",
      "indexed": "2025-06-08T16:41:23.807397",
      "hibr_indexed": true,
      "is_indexed": true,
      "local": true,
      "victim_id": "F1KDHgI5VSkm"
    }
  ]
}
GET/api/v1/leads

List leads

Accepts common filters.

curl -H "Authorization: Bearer $TOKEN" \
  "https://breach.house/api/v1/leads?q=acme"
GET/api/v1/leads/{id}

Get a single lead

curl -H "Authorization: Bearer $TOKEN" \
  https://breach.house/api/v1/leads/456
GET/api/v1/stealers

List infostealer logs

Accepts common filters.

curl -H "Authorization: Bearer $TOKEN" \
  "https://breach.house/api/v1/stealers?country=ES"
GET/api/v1/stealers/{id}

Get a single stealer log

curl -H "Authorization: Bearer $TOKEN" \
  https://breach.house/api/v1/stealers/321
GET/api/v1/groups

List threat-actor groups

ParameterValuesDescription
typeall, breaches, stealers, leadsGroup source. Default all.
qstringSubstring match on group name.
limitintPage size, default 100, max 500.
offsetintPagination offset.
curl -H "Authorization: Bearer $TOKEN" \
  "https://breach.house/api/v1/groups?type=breaches&q=lock"
GET/api/v1/groups/{name}

Get a single group

{name} accepts either the slug or the raw name.

curl -H "Authorization: Bearer $TOKEN" \
  https://breach.house/api/v1/groups/lockbit
GET/api/v1/latest

Latest activity (mixed)

Most recent items across sources. Accepts common filters. Ransomware victims in the response carry t2_time and, when available, the hibr block (see /ransomware).

curl -H "Authorization: Bearer $TOKEN" \
  "https://breach.house/api/v1/latest?limit=10"
GET/api/v1/countries

Country metadata

curl -H "Authorization: Bearer $TOKEN" \
  https://breach.house/api/v1/countries
GET/api/v1/countries/<cc>/report

Monthly country intelligence report

Everything a monthly country report renders from, pre-aggregated: headline KPIs against the previous month, a per-day timeline, sector and threat-actor breakdowns, the year-to-date series and a year-on-year comparison.

ParameterTypeDescription
ccpathISO 3166-1 alpha-2 country code, e.g. GR
periodstringYYYY-MM. Omit it and you get the most recent month that actually has data.
curl -H "Authorization: Bearer $TOKEN" \
  "https://breach.house/api/v1/countries/GR/report?period=2026-04"

What is not in the response, and why. Victim revenue, exfiltrated volume, dwell time, intrusion vector and editorial prose are not tracked in our datasets, so they come back null and are itemised in meta.unavailable with the reason — we never estimate them. Honest stand-ins are listed in meta.substitutions. Check meta.data_coverage for the real window, and meta.requested_period_has_data before reading a month of zeros as a quiet month.

GET/api/v1/sectors

Industry-sector vocabulary

The canonical sector list with slugs and victim counts, plus aliases — retired spellings that still resolve to the surviving sector, so older integrations keep working.

curl -H "Authorization: Bearer $TOKEN" \
  https://breach.house/api/v1/sectors
GET/api/v1/sectors/<slug>/report

Monthly sector intelligence report

The same report scoped to an industry sector instead of a country: the sector's share of global activity, the country breakdown month over month, most active groups with the long tail counted separately, and the YTD series.

ParameterTypeDescription
slugpathSector slug from /api/v1/sectors, e.g. construction-real-estate
periodstringYYYY-MM. Defaults to the latest month with data.
countrystringOptional ISO-2 code to narrow the report to one country.
curl -H "Authorization: Bearer $TOKEN" \
  "https://breach.house/api/v1/sectors/construction-real-estate/report?period=2026-05"

Breach rows carry no sector of their own, so the breach dimension of a sector report is reported as 0 and flagged in meta.unavailable rather than silently omitted.

GET/api/v1/gateway Enterprise only

Tor gateway — open a .onion leak site

Fetches an onion service over Tor from our side and returns the page as sanitised, script-free HTML, so an analyst can read a leak site without running Tor Browser. Links inside the page are rewritten back through the gateway, so you can walk the site. There is a browser UI for the same thing at /gateway.

ParameterTypeDescription
urlstringThe .onion address. Scheme optional (http:// is assumed).
curl -H "Authorization: Bearer $TOKEN" \
  "https://breach.house/api/v1/gateway?url=lockbit3753ekiocyo5epmpy6klmejchjtzddoekjlnt6mu3qh4de2id.onion"

Returns url, final_url, content_type, elapsed_s, bytes, links, images_blocked and the sanitised html.

Deliberate limits. Only .onion hosts are accepted — this is a research viewer, not a web proxy, and the restriction is what stops it being used to reach internal or clearnet addresses. Only text/html and text/plain are rendered: binaries are never fetched. Scripts, forms, iframes, event handlers and images are stripped. Capped at 2 MB, 60 s and 60 requests/hour per user. Errors come back as {"error":"gateway_error","message":"…"} with 400 (bad target), 403 (wrong plan), 429 (rate limit) or 502 (unreachable).

GET/api/v1/resolve No token

Resolve a victim to its id

Open endpoint: maps a (group, victim name) pair to the internal id, returning the most recent on duplicate names.

ParameterTypeDescription
groupstringGroup name. Required.
namestringVictim name. Required.
matchstringexact (default) or domain, which also matches the domain label (e.g. inrixINRIX.COM).
curl "https://breach.house/api/v1/resolve?group=qilin&name=ACME+Corp"
POST/api/v1/ingest/breach Shared secret

Ingest breaches

Adds one or more breaches. Authenticated with X-Ingest-Secret (not an API token). Send an object or a list of objects; post_title is required, and the server generates the id — ids that already exist are skipped. Caches invalidate by mtime, so a new breach appears without a restart.

curl -X POST -H "X-Ingest-Secret: $SECRET" -H "Content-Type: application/json" \
  -d '{"post_title":"ACME Corp","group_name":"qilin","country":"ES"}' \
  https://breach.house/api/v1/ingest/breach

Responds with counts of received / added / skipped / invalid and the affected ids.

Need a token? Head to your panel.

Open Customer Panel