Where else does this handle exist?
The Username OSINT API checks a username across platforms as clean JSON.
1 active endpoint. Every call is 3 credits.
- POST/username-osint/v1/username
What Username Search endpoints does ReefAPI ship?
1 live read endpoint. Read-only data API: no writes, no account actions, no dashboard access on the target site.
Username Search API
1 of 1 endpoints, ready to run
One handle checked across the public platform set: for every site, the platform name, its category, whether an account was found and the public profile link when there was one — plus a summary counting how many platforms were checked, how many hit, how they break down by category, and how many sites answered with something other than yes or no.
{ "ok": true, "meta": { "api": "digital-footprint", "endpoint": "username", "mode": "live", "latency_ms": 6350.8, "record_count": 70, "cache_hit": false }, "data": { "input_type": "username", "query": "torvalds", "results": [ { "platform": "Bit.ly", "category": "links", "status": "found" }, { "platform": "BitBucket", "category": "coding", "status": "found" }, { "platform": "Bluesky", "category": "messaging", "status": "found" } ], "summary": { "platforms_checked": 161, "platforms_found": 70, "found_platforms": [ "Bit.ly", "BitBucket", "Bluesky" ], "category_distribution": { "links": 1, "coding": 9, "messaging": 2, "news": 2, "video": 3, "art": 1, "discussion": 1, "cn": 2, "business": 1, "education": 1, "social": 4, "design": 1, "shopping": 1, "tech": 2, "blog": 6, "photo": 3, "music": 5, "kr": 1, "br": 1, "gaming": 17, "sharing": 1, "trading": 1, "tasks": 1, "streaming": 1, "ru": 1, "wiki": 1 }, "status_counts": { "found": 70, "rate_limited": 30, "unknown": 5, "not_found": 56 } }, "sites_scanned": 161, "engine": "maigret-0.6.1", "coverage_note": "Accounts are checked against a curated set of public platforms. Results are based on each site's own public profile pages, so coverage is partial: 'not_found' means no public account was seen on the platforms we check (not proof none exists anywhere); 'unknown' means the platform did not give a clear answer this time. Login-only platforms (Reddit, Instagram, X, TikTok) are not covered and are never reported as a false match." } }
How the Username Search API works
Username Search is a normal ReefAPI surface — the same four rules that hold for every other engine on the key.
No OAuth app, no request signing, no per-site account. One key covers all 184 engines.
Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.
Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.
One envelope everywhere. meta carries latency_ms, record_count and the endpoint that answered.
Sizing a scan to the answer you need
A wide scan and a narrow one are the same call with a different budget. The cost is time, and the useful move is almost always to go narrow after going wide once.
{"username": "torvalds", "top": 150}The broad pass. The category breakdown in the summary is what tells you where this handle actually lives.
{"username": "torvalds", "tags": ["coding"]}One category only, and far quicker — the same answer for the part of the internet you cared about.
{"username": "torvalds", "sites": ["GitHub", "Reddit"]}Named platforms only, for monitoring a handful of handles on a schedule rather than exploring.
A first pass that tells you where to look, and a repeatable narrow check cheap enough to run often.
curl -X POST https://api.reefapi.com/username-osint/v1/username \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"username":"torvalds","top":30}'{
"ok": true,
"data": { … },
"meta": {
"api": "username-osint",
"endpoint": "username",
"mode": "live",
"latency_ms": …,
"record_count": …
},
"error": null
}Four statuses, and why the numbers do not add up the way you expect
Every row in results[] carries one of four statuses, and only one of them is an assertion. summary.status_counts is the field to read before you trust a headline number, because a scan of 109 sites can easily contain twenty rows that never produced a verdict at all. Figures below come from live scans of one real handle and three we invented.
| Field or status | Measured on a real handle, top=100 | What it means |
|---|---|---|
| status "found" | 54 rows, each with a profile_url | a public profile page answered for that handle; see the FAQ on sites that answer for anything |
| status "not_found" | 34 rows, no profile_url | no public profile was seen on that specific site, not proof the person has no account |
| status "rate_limited" | 18 rows, no profile_url | the site throttled the check; no verdict either way, and it still counts toward platforms_checked |
| status "unknown" | 3 rows | the site answered but not clearly enough to call it; also no verdict |
| summary.platforms_checked | 109 | found + not_found + rate_limited + unknown; 21 of the 109 produced no verdict at all |
| top | asked for 100, sites_scanned came back 109 | top selects the N most popular sites, then aliases and mirrors of those sites are added on top |
| tags | tags=coding, top=100 gave sites_scanned 79 and 22 found, category_distribution {coding: 22} | filters to Maigret site tags such as gaming, social, coding, photo, music, forum, finance |
| sites | sites=GitHub,Telegram,Reddit,Instagram gave sites_scanned 10 | naming 4 sites pulled in 6 mirror entries such as "GitHubGist [GitHub]" and "Pixwox [Instagram]" |
| input_type | "username" for a handle, "steam_id" for a 17-digit SteamID64 | a Steam numeric id or profile URL is detected and routed to 4 Steam-specific checks |
| engine | "maigret-0.6.1" | the site definitions and their detection rules come from the Maigret project |
An email address is refused rather than treated as a handle: a call with [email protected] returned ok:false with error.code INVALID_PARAM and the message "username must be 1-40 chars: letters, digits, . _ - (no spaces/@)". A handle that exists nowhere is not an error; a made-up handle returned ok:true with platforms_found 1 and status_counts {found: 1, not_found: 80, rate_limited: 18, unknown: 10}.
What a hit proves, what a miss does not, and how to hold the results
Measured on a widely-used real handle, an invented one nobody uses, a platform-id form of the input, a handle with characters that are not allowed, and scans narrowed by category and by named site.
A wide scan came back with all three: platforms that confirmed an account, platforms that confirmed none, and a meaningful group that rate-limited or answered ambiguously. Treating everything that is not 'found' as absence overstates what the scan proved, sometimes badly. The status counts are in the summary of every response precisely so that you do not have to make that mistake, and re-running a scan will move sites between those groups.
An invented handle that nobody uses still came back found on one platform, because that site serves a profile page for any handle you ask for. One hit is a lead and nothing more. What carries weight is a cluster — the same handle present across several unrelated platforms, which the category breakdown makes visible at a glance.
Asking for a given number of sites scanned slightly more than that, consistently, because the set is resolved per input and related properties come along with the ones you named — asking for one code-hosting platform also checked its sister service. The response reports how many sites were actually scanned, and names that it does not recognise are ignored rather than treated as an error.
A numeric platform id was recognised as that kind of id and checked against a handful of relevant platforms instead of the full set — a much faster and much more accurate call than treating the digits as a username. A handle containing a space or an at-sign is rejected up front with the rule it broke, rather than scanned and returned empty, which would have looked like a person with no accounts.
Everything returned is a public profile page on the platform's own site: the platform, the category and the link. Nothing behind a login, no contact details, and no attempt to assemble an identity beyond the links themselves. Every response carries a coverage note stating that 'not found' means no public account was seen on the platforms checked, which is not the same as none existing. The lawful basis for looking someone up is yours to hold, and nothing here decides it for you.
What people build with Username Search
The jobs this data is most often used for.
endpoints
credits per call
OSINT investigators call username to map a handle across social and dev platforms.
Fraud teams check an account's footprint during investigation.
Brand protection finds impersonator accounts using a brand handle.
What Username Search data costs
The cheapest call here is 3 credits, so $15/mo (Pro) buys 3,333 of them — $1.50 per 1,000 credits. Credits roll over and never expire, and failed or blocked calls are not charged.
Full pricing →- 1,000 free credits on signup, no card
- One key, all 184 APIs, one credit pool
- Failed and blocked calls are never charged
- Credits roll over and never expire
Call it in two lines
Sign up, get 1,000 credits and one key that works on every engine. Then this is the whole protocol.
curl -X POST https://api.reefapi.com/username-osint/v1/username \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"username":"torvalds","top":30}'import requests
r = requests.post(
"https://api.reefapi.com/username-osint/v1/username",
headers={"x-api-key": REEF_KEY},
json={
"username": "torvalds",
"top": 30
},
)
print(r.json()["data"])Have a question? We got answers.
The questions people actually ask before wiring up Username Search.
Get a free key →Does status "found" prove the account exists?▾
Not on every site. We scanned three handles we invented and CNET returned status "found" with a constructed profile_url for all three, because that site answers with a page for any profile path. Nothing about the result marks it as weaker than a GitHub hit. Before you act on a single-site result, check the same site against a handle you know is unused. As a control, GitHub, Bit.ly and Instagram all correctly returned not_found for the same invented handles.
A scan reported 54 platforms found. Is that 54 different services?▾
No. 18 of those 54 rows were regional editions of one gaming service, listed as OP.GG LoL North America, OP.GG LoL Europe West, OP.GG LoL Korea and so on, all in category gaming. Two more rows were GitHub and GitHubGist, which are the same account. If you are reporting a footprint size, deduplicate on the bracketed parent name in platform first, and read summary.category_distribution, which showed gaming 18 against coding 5 and social 4 for that scan.
How complete is one scan?▾
Partial by design, and the response quantifies it. In a 109-site scan, 18 sites came back rate_limited and 3 unknown, so 21 checks produced no verdict at all. The coverage_note says it directly: not_found means no public account was seen on the platforms checked, not proof none exists anywhere, and unknown means the platform did not give a clear answer this time. Re-run a scan if a specific platform matters, since which sites throttle varies between runs.
I set top to 100 but sites_scanned says 109.▾
top selects the N most popular sites from the ranked set, and then mirror and alias entries attached to those sites are scanned as well, which is why the final count runs over. The same effect is much larger with the sites parameter: naming four platforms produced a 10-site scan, adding entries like GitHubGist [GitHub], coder.social [GitHub], ImgInn [Instagram], Pixwox [Instagram], Dumpor [Instagram] and instaprofi.ru [Instagram]. Read sites_scanned and summary.platforms_checked as the true scope of what was run.
Are Reddit, Instagram, X and TikTok covered?▾
Not in the default popularity set. The coverage_note states that login-only platforms are excluded so they are never reported as a false match. You can still request them by name through the sites parameter, and in that mode they answered: a measured scan naming GitHub, Telegram, Reddit and Instagram returned Instagram as found for the real handle, and the same explicit scan returned Instagram not_found for two invented handles. Treat those results as usable but worth a second check, since login-walled sites are exactly the ones whose logged-out pages change behavior.
Can I search by tag instead of scanning everything?▾
Yes, and it is the cheapest way to get a usable answer. A measured scan with tags=coding returned sites_scanned 79 and 22 found, all in category coding, including GitHub, BitBucket, Gitea, Docker Hub, NPM, RubyGems, HuggingFace, StackOverflow, LeetCode and Codewars. category_distribution came back as a single bucket, {coding: 22}, which makes the result far easier to report than a mixed scan. Tags are the Maigret ones: gaming, social, coding, photo, music, forum, finance and country codes such as us and ru.
What happens if I pass a Steam ID instead of a handle?▾
It is detected and routed. A 17-digit SteamID64 returned input_type "steam_id" rather than "username", scanned 4 Steam-specific entries instead of the full popularity set, and returned Steam (by id) [Steam] as found with a steamcommunity.com/profiles/ URL built from that id. The other three Steam entries came back rate_limited on that run. A steamcommunity.com/profiles/ URL is accepted the same way.
What does a completely unused handle return?▾
ok:true with an almost empty summary, not an error. A handle we invented returned platforms_checked 109, platforms_found 1, found_platforms ["CNET"] and status_counts {found: 1, not_found: 80, rate_limited: 18, unknown: 10}. The single hit is the always-answers site described above. So the practical read of a clean scan is platforms_found at or near zero once you have discounted the sites that answer for anything, with the rate_limited count telling you how much of the scan is simply missing.
What is the Username Search API?▾
Username Search API is a ReefAPI endpoint group for username search It returns live JSON through POST requests under /username-osint/v1.
Is the Username Search API free to try?▾
Yes. ReefAPI starts with 1,000 free credits, no card required. Username Search calls use the same shared credit balance as every other ReefAPI engine.
Do I need an Username Search login or account?▾
No login to Username Search is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.
How fresh is the Username Search data?▾
The page example is captured from a live username call, and production requests fetch live data through ReefAPI rather than a static sample.
How many credits does the Username Search API use?▾
Username Search actions currently cost 3 credits per successful call. Failed or blocked calls are free, and all APIs draw from one credit pool.
Can I call Username Search from an AI assistant or MCP client?▾
Yes. Connect ReefAPI once through MCP and your assistant can call username-osint actions with the same key, credit pool and JSON envelope used by normal REST requests.
10 Social Media APIs on the same key
One key, one credit pool, one response envelope. If you are pulling Username Search, you are one call away from the rest of the category — no second contract, no second integration.
Need something this API does not do?
Name the endpoint, the field, or a source we do not carry yet. We ship new APIs every week and you would be first to get the key. Real people read every message and reply the same day.
Try it on your own data before you pay anything
The call above is the real endpoint, not a recording. A free key gives you 1,000 credits, the other 183 APIs, and the same envelope everywhere.
Endpoints, parameters and credit costs on this page are read from the live catalog and cannot drift from what the API accepts. Field notes were captured on 2026-08-30.