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_typessuch aspassorphonetell 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.
Request
POST /v1/breaches/check, with a JSON body and Content-Type: application/json. No key.
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-Afterseconds: 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_unavailablewithRetry-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_unavailableuntil the hour or the day ends;Retry-Aftergives 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_unavailableuntil 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_limiteduntil the hour ends;Retry-Aftergives 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: truewithcount: 0means 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.

