Create Search
Queue a new search task and optionally configure a webhook callback.
POST
/
search
Create a new search
curl --request POST \
--url https://api.osint.ly/search \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"query": {
"value": "<string>"
},
"modules": {
"mode": "all",
"ids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
]
},
"leaks": {
"mode": "default",
"custom_mapping": false,
"sources": []
},
"features": {
"crosssearch": false,
"breached_accounts": false,
"registered_accounts": "include"
},
"cache": {
"mode": "prefer"
},
"delivery": {},
"byok": {
"mode": "default"
}
}
'import requests
url = "https://api.osint.ly/search"
payload = {
"query": { "value": "<string>" },
"modules": {
"mode": "all",
"ids": ["3c90c3cc-0d44-4b50-8888-8dd25736052a"]
},
"leaks": {
"mode": "default",
"custom_mapping": False,
"sources": []
},
"features": {
"crosssearch": False,
"breached_accounts": False,
"registered_accounts": "include"
},
"cache": { "mode": "prefer" },
"delivery": {},
"byok": { "mode": "default" }
}
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: {value: '<string>'},
modules: {mode: 'all', ids: ['3c90c3cc-0d44-4b50-8888-8dd25736052a']},
leaks: {mode: 'default', custom_mapping: false, sources: []},
features: {crosssearch: false, breached_accounts: false, registered_accounts: 'include'},
cache: {mode: 'prefer'},
delivery: {},
byok: {mode: 'default'}
})
};
fetch('https://api.osint.ly/search', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.osint.ly/search",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'query' => [
'value' => '<string>'
],
'modules' => [
'mode' => 'all',
'ids' => [
'3c90c3cc-0d44-4b50-8888-8dd25736052a'
]
],
'leaks' => [
'mode' => 'default',
'custom_mapping' => false,
'sources' => [
]
],
'features' => [
'crosssearch' => false,
'breached_accounts' => false,
'registered_accounts' => 'include'
],
'cache' => [
'mode' => 'prefer'
],
'delivery' => [
],
'byok' => [
'mode' => 'default'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.osint.ly/search"
payload := strings.NewReader("{\n \"query\": {\n \"value\": \"<string>\"\n },\n \"modules\": {\n \"mode\": \"all\",\n \"ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ]\n },\n \"leaks\": {\n \"mode\": \"default\",\n \"custom_mapping\": false,\n \"sources\": []\n },\n \"features\": {\n \"crosssearch\": false,\n \"breached_accounts\": false,\n \"registered_accounts\": \"include\"\n },\n \"cache\": {\n \"mode\": \"prefer\"\n },\n \"delivery\": {},\n \"byok\": {\n \"mode\": \"default\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.osint.ly/search")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"query\": {\n \"value\": \"<string>\"\n },\n \"modules\": {\n \"mode\": \"all\",\n \"ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ]\n },\n \"leaks\": {\n \"mode\": \"default\",\n \"custom_mapping\": false,\n \"sources\": []\n },\n \"features\": {\n \"crosssearch\": false,\n \"breached_accounts\": false,\n \"registered_accounts\": \"include\"\n },\n \"cache\": {\n \"mode\": \"prefer\"\n },\n \"delivery\": {},\n \"byok\": {\n \"mode\": \"default\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.osint.ly/search")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"query\": {\n \"value\": \"<string>\"\n },\n \"modules\": {\n \"mode\": \"all\",\n \"ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ]\n },\n \"leaks\": {\n \"mode\": \"default\",\n \"custom_mapping\": false,\n \"sources\": []\n },\n \"features\": {\n \"crosssearch\": false,\n \"breached_accounts\": false,\n \"registered_accounts\": \"include\"\n },\n \"cache\": {\n \"mode\": \"prefer\"\n },\n \"delivery\": {},\n \"byok\": {\n \"mode\": \"default\"\n }\n}"
response = http.request(request)
puts response.read_body{
"data": {
"search": {
"id": "d290f1ee-6c54-4b01-90e6-d701748f0851",
"status": "pending",
"query": {
"type": "Email Address",
"value": "[email protected]"
},
"created_at": "2026-05-27T12:00:00.000Z"
},
"execution": {
"run_id": "run_1234567890",
"cache_mode": "prefer"
},
"links": {
"self": "https://api.osint.ly/search/d290f1ee-6c54-4b01-90e6-d701748f0851",
"stream": "https://api.osint.ly/search/d290f1ee-6c54-4b01-90e6-d701748f0851/stream",
"results": "https://api.osint.ly/search/d290f1ee-6c54-4b01-90e6-d701748f0851/results",
"leaks": "https://api.osint.ly/search/d290f1ee-6c54-4b01-90e6-d701748f0851/results/leaks"
}
},
"meta": {
"environment": "production",
"timestamp": "2026-05-27T12:00:00.000Z"
}
}
Domain Name and IP Address still work in this endpoint, but they will soon stop being supported in the Search API. Their replacements for new lookups are Domain Intelligence and IP Intelligence. No cutoff date has been announced. The website’s free previews are not available through this endpoint.Enable CrossSearch
CrossSearch follows profile links found in result cards and runs compatible modules within the same search. For example, a Linktree result can lead to a YouTube or Instagram result when a matching module accepts the detected link. CrossSearch is disabled by default in the API. Setfeatures.crosssearch to true in each search request to enable it. Omitting the option or setting it to false leaves it disabled.
curl --request POST 'https://api.osint.ly/search' \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"query": {
"type": "Pseudonym",
"value": "mike"
},
"modules": {
"mode": "all"
},
"features": {
"crosssearch": true,
"registered_accounts": "exclude"
}
}'
In the Osintly app, CrossSearch is available on Pro and Ultimate, including those organization plans. It is enabled by default for eligible app searches and can be disabled in search settings. App subscriptions and API subscriptions are separate; API searches require the explicit option above.
Run a temporary search
To run a search without Osintly storing it or its results, send the same body toPOST /search/temporary. The response is a Server-Sent Events stream instead of a JSON body, and the search cannot be fetched afterwards. Delivery webhooks and BYOK are not available in this mode.
This endpoint does not accept a temporary field: it returns 400 USE_TEMPORARY_ENDPOINT and starts no search.
See Temporary Searches for the stream format and limits.Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
application/json
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Bring your own external OSINT provider API keys for this search.
Show child attributes
Show child attributes
Was this page helpful?
⌘I
Create a new search
curl --request POST \
--url https://api.osint.ly/search \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"query": {
"value": "<string>"
},
"modules": {
"mode": "all",
"ids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
]
},
"leaks": {
"mode": "default",
"custom_mapping": false,
"sources": []
},
"features": {
"crosssearch": false,
"breached_accounts": false,
"registered_accounts": "include"
},
"cache": {
"mode": "prefer"
},
"delivery": {},
"byok": {
"mode": "default"
}
}
'import requests
url = "https://api.osint.ly/search"
payload = {
"query": { "value": "<string>" },
"modules": {
"mode": "all",
"ids": ["3c90c3cc-0d44-4b50-8888-8dd25736052a"]
},
"leaks": {
"mode": "default",
"custom_mapping": False,
"sources": []
},
"features": {
"crosssearch": False,
"breached_accounts": False,
"registered_accounts": "include"
},
"cache": { "mode": "prefer" },
"delivery": {},
"byok": { "mode": "default" }
}
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: {value: '<string>'},
modules: {mode: 'all', ids: ['3c90c3cc-0d44-4b50-8888-8dd25736052a']},
leaks: {mode: 'default', custom_mapping: false, sources: []},
features: {crosssearch: false, breached_accounts: false, registered_accounts: 'include'},
cache: {mode: 'prefer'},
delivery: {},
byok: {mode: 'default'}
})
};
fetch('https://api.osint.ly/search', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.osint.ly/search",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'query' => [
'value' => '<string>'
],
'modules' => [
'mode' => 'all',
'ids' => [
'3c90c3cc-0d44-4b50-8888-8dd25736052a'
]
],
'leaks' => [
'mode' => 'default',
'custom_mapping' => false,
'sources' => [
]
],
'features' => [
'crosssearch' => false,
'breached_accounts' => false,
'registered_accounts' => 'include'
],
'cache' => [
'mode' => 'prefer'
],
'delivery' => [
],
'byok' => [
'mode' => 'default'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.osint.ly/search"
payload := strings.NewReader("{\n \"query\": {\n \"value\": \"<string>\"\n },\n \"modules\": {\n \"mode\": \"all\",\n \"ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ]\n },\n \"leaks\": {\n \"mode\": \"default\",\n \"custom_mapping\": false,\n \"sources\": []\n },\n \"features\": {\n \"crosssearch\": false,\n \"breached_accounts\": false,\n \"registered_accounts\": \"include\"\n },\n \"cache\": {\n \"mode\": \"prefer\"\n },\n \"delivery\": {},\n \"byok\": {\n \"mode\": \"default\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.osint.ly/search")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"query\": {\n \"value\": \"<string>\"\n },\n \"modules\": {\n \"mode\": \"all\",\n \"ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ]\n },\n \"leaks\": {\n \"mode\": \"default\",\n \"custom_mapping\": false,\n \"sources\": []\n },\n \"features\": {\n \"crosssearch\": false,\n \"breached_accounts\": false,\n \"registered_accounts\": \"include\"\n },\n \"cache\": {\n \"mode\": \"prefer\"\n },\n \"delivery\": {},\n \"byok\": {\n \"mode\": \"default\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.osint.ly/search")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"query\": {\n \"value\": \"<string>\"\n },\n \"modules\": {\n \"mode\": \"all\",\n \"ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ]\n },\n \"leaks\": {\n \"mode\": \"default\",\n \"custom_mapping\": false,\n \"sources\": []\n },\n \"features\": {\n \"crosssearch\": false,\n \"breached_accounts\": false,\n \"registered_accounts\": \"include\"\n },\n \"cache\": {\n \"mode\": \"prefer\"\n },\n \"delivery\": {},\n \"byok\": {\n \"mode\": \"default\"\n }\n}"
response = http.request(request)
puts response.read_body{
"data": {
"search": {
"id": "d290f1ee-6c54-4b01-90e6-d701748f0851",
"status": "pending",
"query": {
"type": "Email Address",
"value": "[email protected]"
},
"created_at": "2026-05-27T12:00:00.000Z"
},
"execution": {
"run_id": "run_1234567890",
"cache_mode": "prefer"
},
"links": {
"self": "https://api.osint.ly/search/d290f1ee-6c54-4b01-90e6-d701748f0851",
"stream": "https://api.osint.ly/search/d290f1ee-6c54-4b01-90e6-d701748f0851/stream",
"results": "https://api.osint.ly/search/d290f1ee-6c54-4b01-90e6-d701748f0851/results",
"leaks": "https://api.osint.ly/search/d290f1ee-6c54-4b01-90e6-d701748f0851/results/leaks"
}
},
"meta": {
"environment": "production",
"timestamp": "2026-05-27T12:00:00.000Z"
}
}