Deep Search for Social Media: How Recursive Username Sweeps Work

One handle leads to another. A walkthrough of how OSINTsearch deep search extracts handles from bios and links, re-sweeps them across four depth levels, what each level costs, and which links are never followed.

Patrick Saif7 min read

ShareXLinkedInHacker News
Cover card for the deep search social media post
Cover card for the deep search social media post

Deep search for social media is the step after the first scan. A single username sweep returns the profiles that carry that exact handle. Deep search reads those profiles, pulls out every other handle they mention in bios, link fields and connected accounts, and sweeps those too, for a fixed number of hops. It is how a person's second account, their older name, and their link-in-bio destinations end up in the same result set as the handle you started with.

This post explains how OSINTsearch's deep search works from the inside: how handles are extracted, what is deliberately not followed, the four depth levels and their sweep caps, what each one costs against your weekly quota, and how to read the seed table in an export. I wrote the cost table, so where I am opinionated about it, that is why.

Extraction: turning a bio into candidates

Every hit from the first sweep carries free text and links. The extractor scans the bio for @mentions and platform URLs, parses the external URL field and any link-in-bio page, reads the structured socials list the platform exposes, and takes the local part of any public email as a candidate. Instagram former usernames are a further seed type. Each candidate is tagged with where it came from and how many independent places produced it, and that evidence count is the ranking key.

Seed typeExample sourceRank
social_linkStructured "linked accounts" on a profileStrongest
url_extractA profile URL in the website field or bio
wallet_addressA crypto address in a bio
bio_mention"also @nrthwnd on bsky"
email_prefixLocal part of a public email
former_usernameInstagram rename historyWeakest on its own

URL extraction is host-specific and end-anchored. instagram.com/northwind yields northwind; an unknown host yields nothing, because guessing that the last path segment is a username is how a scanner ends up sweeping the word about. The handle then passes username validation, which rejects file names, reserved words, platform names and strings that look like ids rather than names.

What is never followed

A false seed costs a full sweep of over 750 platforms and adds a bogus row to your results, so the deny list is checked before any pattern can rescue a link. Discord invite URLs, Telegram join links, and every common short-link domain are refused: the token is a random redirect key, not an account. Content URLs are refused too: YouTube videos and playlists, Spotify tracks, Instagram posts and reels, TikTok videos, tweet permalinks, Reddit comment threads, GitHub repository paths, Medium articles, LinkedIn company and job pages.

plaintext
discord.gg/abc123XYZ           denied: invite code
youtu.be/dQw4w9WgXcQ           denied: short link
github.com/torvalds/linux      denied: repository, not a profile
github.com/torvalds            kept: profile
t.me/joinchat/AAAA             denied: join link
t.me/northwind                 kept: profile

The spend gate is stricter than the display rule on purpose. A handle can be shown in a result and still be judged not worth a sweep, and the run logs every candidate it dropped at a cap, because a truncated sweep presented as exhaustive would make you conclude that an account does not exist when the tool simply stopped looking.

The four depth levels

Fan-out is multiplicative. Each level takes every result from the level above and re-sweeps the handles it revealed, and after dedupe and validation the observed branch factor sits around two to three. That is why the sweep cap grows by roughly 2.5x per level and the price doubles, rather than stepping by one. A linear price on an exponential workload is how one search box spends a month of upstream budget.

DepthNameHopsMax sweepsNew handles per resultCost (units)Prorated
1SurfaceHandles found directly on the subject8332
2LinkedOne hop out20463
3DeepTwo hops out, the default505126
4ExhaustiveThree hops out11062412

A unit is one ordinary search, which is one sweep of the username corpus. The prorated column applies when the seeding scan already ran in the same session: you have paid one unit for it, so the deep run costs half, rounded up. On Pro's 500 searches a week, a default depth-3 run after a normal scan costs 6 units, and an exhaustive run costs 12. Deep search is available on Pro and Enterprise; the pricing page has the plan matrix.

The per-result cap on new handles matters as much as the total. A link-in-bio page with 30 outbound links is a common shape, and without the cap one profile would consume the whole budget on its first hop. With it, the six strongest seeds from that page get swept and the rest are logged as dropped.

Reading the result

A deep search result is the first sweep's ranked hits plus a seed table. Each seed row records the handle, the depth it was found at, the seed type, the evidence count, how many platforms it was found on, and whether the four biggest platforms returned a hit. The export carries that table in its own section, as deep_search_seeds in JSON and as a marked block in CSV.

json
{
  "seed": "nrthwnd",
  "depth": 2,
  "kind": "bio_mention",
  "evidence": 2,
  "discovered": "Instagram bio",
  "platforms_found": 7,
  "instagram": true,
  "x": true
}

Evidence of two or more means separate places agreed on the handle, and those rows are the ones to trust first. A depth-3 seed with evidence of one and a hit on a single platform is a lead, not a link, until a display name, avatar or creation date corroborates it. Handles recovered from breach records on Pro enter the same table with their own seed type, so the breach layer and the live layer are read together.

Deep search for social media vs a hand-run loop

You can do all of this manually on any plan: scan a handle on osintsearch.org, read the bios, scan what they mention. The old usernames guide describes that loop. Deep search automates it with three things a hand loop lacks: a deny list that refuses the seeds a tired analyst would chase, a cap that stops a common name from becoming an afternoon, and a seed table that records why each handle was swept. Maigret's recursion does the first half of this without the budget, which the Maigret vs Sherlock post covers.

FAQ

What does deep search cost?

Three, six, twelve or twenty-four search units for depths one through four, halved when a seeding scan already ran in the session. A unit is one ordinary username search.

Pro and Enterprise. Starter and Free return the first-sweep results with extracted handles listed but do not run the recursive sweep.

Why was a handle in a bio not followed?

It failed the spend gate: an invite code, a short link, a post URL, a reserved word, or a string shaped like an id. Or the per-result cap was reached and the run logged it as dropped.

Can I choose the depth?

Yes, from one to four per run. Depth three is the default and covers two hops out, which is where most linked accounts sit.

Budget is the feature

Recursion is easy to write and hard to run responsibly. The deny list, the sweep caps and the seed table are what make deep search for social media usable at scale rather than a way to burn quota on the word "linktree". Start at depth one on a handle you know, look at the seed table, and go deeper only when the evidence counts tell you there is somewhere to go.

ShareXLinkedInHacker News
All articles

Try it

Run a live search on any username.

Free preview, no account needed. Sign up to view available profile details.

For other identifiers, try reverse email lookup or phone number lookup.