curl --request POST \
--url https://api.orelys.io/v1/search/phonebook \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"query": "@example.com",
"type": "email"
}
'import requests
url = "https://api.orelys.io/v1/search/phonebook"
payload = {
"query": "@example.com",
"type": "email"
}
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: '@example.com', type: 'email'})
};
fetch('https://api.orelys.io/v1/search/phonebook', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"mode": "phonebook",
"request": {
"query": "@example.com",
"type": "email"
},
"count": 2,
"results": [
{
"selector": "contact@example.com",
"date": "2022-11-03T00:00:00Z"
},
{
"selector": "jobs@example.com",
"date": "2021-04-19T00:00:00Z"
}
],
"charged": true,
"quota": {
"limit": 500,
"used": 14,
"remaining": 486,
"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."
}
}Phonebook
List the selectors — email addresses, domains or URLs — the archive knows for a domain, an email address or a URL, with the date each was found. To list the email addresses of a domain, send @example.com with type: "email".
curl --request POST \
--url https://api.orelys.io/v1/search/phonebook \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"query": "@example.com",
"type": "email"
}
'import requests
url = "https://api.orelys.io/v1/search/phonebook"
payload = {
"query": "@example.com",
"type": "email"
}
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: '@example.com', type: 'email'})
};
fetch('https://api.orelys.io/v1/search/phonebook', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"mode": "phonebook",
"request": {
"query": "@example.com",
"type": "email"
},
"count": 2,
"results": [
{
"selector": "contact@example.com",
"date": "2022-11-03T00:00:00Z"
},
{
"selector": "jobs@example.com",
"date": "2021-04-19T00:00:00Z"
}
],
"charged": true,
"quota": {
"limit": 500,
"used": 14,
"remaining": 486,
"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."
}
}type is what you want back: email lists email addresses, domain lists domains and subdomains, url lists URLs.
@ — "query": "@example.com" with "type": "email". Without the @, the archive finds nothing, so the API adds it when it is missing.| You want | query | type |
|---|---|---|
| Email addresses at a domain | @example.com | email |
| Subdomains of a domain | example.com | domain |
| URLs on a domain | example.com | url |
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
The domain, email address or URL to look up. With type: "email", write the domain with a leading @ (@example.com); the API adds it if you leave it out.
1 - 200"@example.com"
What kind of selectors to list. Case does not matter.
domain, email, url "email"
Response
The selectors 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.

