curl --request POST \
--url https://api.orelys.io/v1/search/identity-portal \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"query": "john@example.com"
}
'import requests
url = "https://api.orelys.io/v1/search/identity-portal"
payload = { "query": "john@example.com" }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({query: 'john@example.com'})
};
fetch('https://api.orelys.io/v1/search/identity-portal', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"mode": "identity-portal",
"request": {
"query": "john@example.com"
},
"count": 1,
"results": [
{
"name": "john@example.com",
"linea": "john@example.com:London:UK",
"date": "2023-02-08T00:00:00Z",
"bucket": "leaks.private.general"
}
],
"charged": true,
"quota": {
"limit": 500,
"used": 15,
"remaining": 485,
"resets_at": "2026-09-26T00:00:00.000Z"
}
}{
"error": {
"code": "invalid_request",
"message": "The request has invalid fields.",
"details": [
"Max results must be a whole number between 1 and 1000.",
"Sort must be one of: relevance, date_asc, date_desc."
]
}
}{
"error": {
"code": "invalid_api_key",
"message": "This API key is not valid. It may have been regenerated or revoked."
}
}{
"error": {
"code": "plan_required",
"message": "API access comes with the Professional and Enterprise plans. This account is on Starter."
}
}{
"error": {
"code": "payload_too_large",
"message": "The request body is larger than 16 KB."
}
}{
"error": {
"code": "unsupported_media_type",
"message": "Send the body as JSON with `Content-Type: application/json`."
}
}{
"error": {
"code": "rate_limited",
"message": "An account on the Professional plan can make at most 60 searches a minute."
}
}{
"error": {
"code": "source_error",
"message": "The search service returned an error."
}
}{
"error": {
"code": "service_unavailable",
"message": "Search is temporarily unavailable."
}
}{
"error": {
"code": "source_timeout",
"message": "The search service did not answer within 30 seconds."
}
}Identity Portal
Identity records for a selector such as an email address or a domain. When the provider gives the raw line a record came from, it is kept in linea.
curl --request POST \
--url https://api.orelys.io/v1/search/identity-portal \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"query": "john@example.com"
}
'import requests
url = "https://api.orelys.io/v1/search/identity-portal"
payload = { "query": "john@example.com" }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({query: 'john@example.com'})
};
fetch('https://api.orelys.io/v1/search/identity-portal', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"mode": "identity-portal",
"request": {
"query": "john@example.com"
},
"count": 1,
"results": [
{
"name": "john@example.com",
"linea": "john@example.com:London:UK",
"date": "2023-02-08T00:00:00Z",
"bucket": "leaks.private.general"
}
],
"charged": true,
"quota": {
"limit": 500,
"used": 15,
"remaining": 485,
"resets_at": "2026-09-26T00:00:00.000Z"
}
}{
"error": {
"code": "invalid_request",
"message": "The request has invalid fields.",
"details": [
"Max results must be a whole number between 1 and 1000.",
"Sort must be one of: relevance, date_asc, date_desc."
]
}
}{
"error": {
"code": "invalid_api_key",
"message": "This API key is not valid. It may have been regenerated or revoked."
}
}{
"error": {
"code": "plan_required",
"message": "API access comes with the Professional and Enterprise plans. This account is on Starter."
}
}{
"error": {
"code": "payload_too_large",
"message": "The request body is larger than 16 KB."
}
}{
"error": {
"code": "unsupported_media_type",
"message": "Send the body as JSON with `Content-Type: application/json`."
}
}{
"error": {
"code": "rate_limited",
"message": "An account on the Professional plan can make at most 60 searches a minute."
}
}{
"error": {
"code": "source_error",
"message": "The search service returned an error."
}
}{
"error": {
"code": "service_unavailable",
"message": "Search is temporarily unavailable."
}
}{
"error": {
"code": "source_timeout",
"message": "The search service did not answer within 30 seconds."
}
}linea. It is often empty.Authorizations
Your API key, from https://orelys.io/account/api. It starts with orl_ (keys made before the rename start with fly_ and keep working). X-API-Key: <key> works too. A key in the URL is refused.
Body
What to search for: an email address, a username, a domain…
1 - 200"john@example.com"
Response
The identity records found.
intelligent, phonebook, identity-portal, uuid, storage, stealer-export The search as sent to the archive, after normalisation: dates as DD/MM/YYYY, choices in lower case, numbers as strings.
Show child attributes
Show child attributes
Number of items in results.
Show child attributes
Show child attributes
Whether this search took 1 request from the daily quota. When the archive answers "no results", nothing is charged, within a daily allowance (your daily quota, at least 10); a search that completes with an empty list is charged, as in the dashboard.
Today's quota. It resets every day at 02:00 Paris time.
Show child attributes
Show child attributes
Only present when records were removed because they contain a removed selector.
Other fields the archive sent next to the list (a total, for example), passed through unchanged.

