POST /v1/breaches/check takes one email address and returns the known data breaches it appears in, with the kinds of data it was found under — never the values. It answers “is this address in a breach, and what leaked with it?”. For the whole catalogue, with no address, use the breach list. To find the leaked records themselves — files, stealer logs, pastes — use Intelligence Search, with a key and from your daily quota.

When to use it

  • Tell someone whether their address is in a known breach, like the breach search on the orelys.io homepage.
  • See what leaked with it: found_types such as pass or phone tell what to change or watch.
  • Check an address from a tool whose users have no Orelys account.
  • A handful of addresses at a time: it allows 10 searches a minute per address, so it is not for bulk checks.
Check only addresses you are entitled to check. The Terms and the Acceptable Use Policy apply.

Request

POST /v1/breaches/check, with a JSON body and Content-Type: application/json. No key.
A search takes from a few seconds up to about 45 seconds. Past that it answers 504 upstream_timeout, so give your HTTP client a timeout of a minute, as above.
The address stays private. It goes in the body, never in the URL — URLs end up in logs, browser history and proxies, so a GET on this route is refused with 405 method_not_allowed. Orelys does not store the address and does not log it. The answer is kept in memory for at most 60 seconds, under a hash of the address, so that the same search sent twice does not go to our breach-data provider again; then it is gone.

What you get back

The search tells which kinds of data were found, never the values: no password, phone number or street address is ever returned. An address found nowhere answers 200 with found: false, count: 0, hidden: 0 and breaches: []. So does an address removed at its owner’s request, or one on a removed domain.

Cost and limits

The breach search is free: no key, no account, no credits, nothing taken from a quota. It works the same with any plan, or with none. Its limits are per address:
  • An IPv6 address counts for its whole /48 network in the limit of 1 at the same time.
  • Every search sent counts in the 10 a minute, even one refused for an invalid address.
  • The minute is a sliding window. When a limit is reached, wait for Retry-After seconds: until a slot frees up in the minute, or 5 seconds when your search is still running.
  • When too many breach searches are running across the API at once (6), a new one answers 503 breach_check_unavailable with Retry-After: 5, whatever your address. Part of those places is kept for the breach search of the orelys.io homepage.
  • The whole service has an hourly and a daily cap on breach searches, all callers together. Once it is reached, every breach search answers 503 breach_check_unavailable until the hour or the day ends; Retry-After gives the seconds left.
  • Calls made straight to the API (not through orelys.io) share an hourly and a daily part of that cap between them. Once it is used, their breach searches answer 503 breach_check_unavailable until the hour or the day ends, while the orelys.io homepage keeps working.
  • One address (an IPv6 address: its /48) can also start only a limited number of new breach searches an hour through the API. Past it, 429 rate_limited until the hour ends; Retry-After gives the seconds left. A search answered from the 60-second memory is refused too: the limit does not depend on the address searched.
  • The breach search on the orelys.io homepage uses this same route: searches made there from your address count in the same 10 a minute.

Errors

Errors use the usual envelope: { "error": { "code": "…", "message": "…" } }.

Tips

  • Give it a full minute. A search keeps its place until our breach-data provider answers, even if your client hangs up. Retrying quickly after a short client timeout only reaches the limit of 1 at the same time.
  • Queue, do not fan out. Run one search at a time from one address, and space them to stay within 10 a minute.
  • found: true with count: 0 means the address is only in hidden breaches: say how many (hidden), since you cannot say which.
  • Show names and summaries as text. They come from third parties: never render them as HTML.
  • Call it from your backend. The API does not answer browser calls from other sites, so a web page should send the address to its own server, which calls the API.

Reference

Breach search

Request and response schemas, every error, and a playground to try it.