API

Run the same searches as the site from your own code: emails, phone numbers, usernames and names across every source, and the lookup tools. Each request is a JSON POST, and results stream back as they arrive, one JSON object per line.

Get an API key

Make one on the API keys page. A search costs 1 credit, the same as on the site. $500 buys 1,600 credits and $1,000 buys 3,500, $0.29 a credit at the top.

Authentication

Send your key in the x-api-key header and the body as JSON, with content-type: application/json. A key is 48 characters, 0 to 9 and a to f. The short code next to a key on the API keys page only tells keys apart and won’t work in its place.

Search

POST https://api.osint.sx/search

Each search costs 1 credit. A username search uses one of your free username searches first, if you have any left today. If most sources fail and nothing is found, the credit is given back.

Body

moduleTypeemail phone username name
identifierWhat to search for. Phone numbers in +E.164 format, like +14155550123; a number that can’t exist is refused with a 400 and costs nothing.
alertModeOptional, true or false. Includes sources that may notify the person.

Lines in the response

{"totalModules": 427}How many sources will run.
{"progress": 0.35}Share of sources that have answered.
{"fastComplete": true}The fast sources are done; slower ones may still answer.
{"className": ..., "result": {"show": ...}}A hit. Misses and errors aren’t sent.
import json, requests

resp = requests.post(
    "https://api.osint.sx/search",
    headers={"x-api-key": "YOUR_API_KEY", "content-type": "application/json"},
    json={"moduleType": "email", "identifier": "river.hale@example.com"},
    stream=True,
)
if resp.status_code != 200:
    raise SystemExit(f"{resp.status_code}: {resp.json()['error']}")

for line in resp.iter_lines(decode_unicode=True):
    if not line:
        continue
    data = json.loads(line)
    if "result" in data and "show" in data["result"]:
        print(data["className"], data["result"]["show"])

Tools

Same header, same newline-delimited JSON. A $50 credit pack or bigger adds free tool searches every day for 30 days; after those, and without one, each search costs 1 credit. A search that finds nothing, or fails, costs nothing.

Endpoints, all POST

/google/searchGoogle accounts
/microsoft/searchMicrosoft accounts
/epic/searchEpic Games accounts
/instagram/searchInstagram share link trace
/tiktok/searchTikTok share link trace
/twitter/searchX profile and archive history
/steam/lookupSteam profile and archive history

Body

queryTypeGoogle: name email domain gaiaId. Microsoft: name email domain cid. Epic: username accountId platform. X: username user_id url.
queryWhat to search for. For Steam, a custom URL, SteamID64 or profile URL.
platformEpic platform searches only: xbl psn steam nintendo discord twitch github google apple facebook.
urlInstagram and TikTok: the share link to trace.

Lines in the response

{"type": "meta", ...}How many results to expect, and your usage.
{"type": "result", "data": ...}One result.
{"type": "done", ...}The end, with your updated usage.
import json, requests

resp = requests.post(
    "https://api.osint.sx/google/search",
    headers={"x-api-key": "YOUR_API_KEY", "content-type": "application/json"},
    json={"queryType": "email", "query": "river.hale@example.com"},
    stream=True,
)
if resp.status_code != 200:
    raise SystemExit(f"{resp.status_code}: {resp.json()['error']}")

for line in resp.iter_lines(decode_unicode=True):
    if not line:
        continue
    msg = json.loads(line)
    if msg["type"] == "result":
        print(msg["data"])

Rate limits

Up to 10 searches can run at once per account. Each key, and each IP address, also has a limit per minute; responses carry RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset headers for it. Over a limit you get a 429. A 503 when the service is busy comes with a Retry-After header in seconds.

Errors

A refused request gets a status code and a JSON body with the reason, like {"error": "No searches remaining"}.

400The body is missing something or isn’t valid.
401The API key is missing, revoked, or not a key. The error says which.
402No credits or free searches left.
403The account is suspended.
404A share link trace found no sharer for that link.
429Too many requests at once, or too many in a minute.
502A source behind the search didn’t respond.
503Busy, or the tool is paused for maintenance. Retry after a few seconds.