{
  "data": {
    "id": "CfAicgPeuLIJQCQhA",
    "actId": "UVRRxRDftS1uibtwC",
    "userId": "NL4ThgItAwaoBlffQ",
    "startedAt": "2026-11-04T09:04:10.793Z",
    "finishedAt": "2026-11-04T09:04:20.410Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "CLI"
    },
    "stats": {
      "durationMillis": 9521,
      "runTimeSecs": 9.521,
      "computeUnits": 0.01057888888888889,
      "imageSizeBytes": 361338368
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "createdByOrganizationMemberUserId": "zifX0mkAFMHe8CatY",
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"Sherlock Username Search\",\n  \"description\": \"Look up one or more usernames across 400+ sites and return verified profiles with per-site status.\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"usernames\": {\n      \"title\": \"Usernames\",\n      \"type\": \"array\",\n      \"description\": \"Handles to look up. A leading @ is ignored. Use {?} to expand to _, - and . (e.g. john{?}doe).\",\n      \"editor\": \"stringList\",\n      \"default\": [\n        \"octocat\"\n      ],\n      \"prefill\": [\n        \"octocat\"\n      ],\n      \"items\": {\n        \"type\": \"string\"\n      }\n    },\n    \"username\": {\n      \"title\": \"Single username\",\n      \"type\": \"string\",\n      \"description\": \"Optional single handle merged into `usernames`. The `usernames` array is still required.\",\n      \"editor\": \"textfield\"\n    },\n    \"sites\": {\n      \"title\": \"Sites\",\n      \"type\": \"array\",\n      \"description\": \"Only check these sites. Accepts names (GitHub), domains (github.com) or profile URLs. Leave empty for every supported site.\",\n      \"editor\": \"stringList\",\n      \"default\": [],\n      \"prefill\": [\n        \"GitHub\"\n      ],\n      \"items\": {\n        \"type\": \"string\"\n      }\n    },\n    \"categories\": {\n      \"title\": \"Categories\",\n      \"type\": \"array\",\n      \"description\": \"Only check sites in these categories. Combined with `sites` as a union. Leave empty for all categories.\",\n      \"editor\": \"select\",\n      \"uniqueItems\": true,\n      \"items\": {\n        \"type\": \"string\",\n        \"enum\": [\n          \"social\",\n          \"dev\",\n          \"gaming\",\n          \"forum\",\n          \"media\",\n          \"business\",\n          \"education\",\n          \"adult\",\n          \"other\"\n        ]\n      }\n    },\n    \"includeNsfw\": {\n      \"title\": \"Include NSFW sites\",\n      \"type\": \"boolean\",\n      \"description\": \"Also check adult sites. Off by default.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"includeAvailable\": {\n      \"title\": \"Include available/blocked rows\",\n      \"type\": \"boolean\",\n      \"description\": \"Also emit rows for sites where the handle is free, blocked, unknown or illegal. Useful for availability checks.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"verifyClaims\": {\n      \"title\": \"Verify claimed profiles\",\n      \"type\": \"boolean\",\n      \"description\": \"Re-check every generic claimed site with a random decoy handle. Sites that claim any handle are demoted to unverified and kept out of `links`.\",\n      \"default\": true,\n      \"prefill\": true\n    },\n    \"enrichProfiles\": {\n      \"title\": \"Extract profile fields\",\n      \"type\": \"boolean\",\n      \"description\": \"Add display name, bio, avatar, follower counts, join date, location, website and verified flag where the site exposes them.\",\n      \"default\": true,\n      \"prefill\": false\n    },\n    \"outputMode\": {\n      \"title\": \"Output mode\",\n      \"type\": \"string\",\n      \"description\": \"How to shape dataset rows.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"perUsername\",\n        \"perSite\",\n        \"perHit\"\n      ],\n      \"enumTitles\": [\n        \"One row per username (legacy links + profiles)\",\n        \"One row per username × site\",\n        \"One row per claimed profile\"\n      ],\n      \"default\": \"perUsername\",\n      \"prefill\": \"perUsername\"\n    },\n    \"maxUsernames\": {\n      \"title\": \"Max usernames\",\n      \"type\": \"integer\",\n      \"description\": \"Cap the number of handles after wildcard expansion (1–100).\",\n      \"minimum\": 1,\n      \"maximum\": 100,\n      \"default\": 100,\n      \"prefill\": 1\n    },\n    \"maxSitesPerUsername\": {\n      \"title\": \"Max sites per username\",\n      \"type\": \"integer\",\n      \"description\": \"Check only the top N priority sites per handle. 0 checks every selected site (0–500).\",\n      \"minimum\": 0,\n      \"maximum\": 500,\n      \"default\": 0,\n      \"prefill\": 0\n    }\n  },\n  \"required\": [\n    \"usernames\"\n  ]\n}",
    "readme": "# Multi-Site Username Lookup & Profile Finder\n\nFind where a username exists across 400+ social networks, developer platforms, forums, gaming sites and marketplaces, and get a real profile URL instead of a guess. Every result carries a per-site status, HTTP code, detection method and verification flag, so a soft-404 page can never masquerade as a profile.\n\n## What this actor does\n\n- Checks up to **100 usernames per run** with concurrent site checks.\n- Uses **22 native probes** with exact API/XML/HTML detection for GitHub, GitLab, Steam, Chess.com, Lichess, Hacker News, Codeforces, Docker Hub, Roblox, YouTube, Mastodon, Dev.to, SoundCloud, Instagram, Pinterest, Twitch, X, LeetCode, Keybase, Stack Exchange, Dailymotion and Kick.\n- Runs **decoy verification** on the generic long tail: a site that claims a random handle is marked `unverified` and kept out of `links`.\n- Exposes site, category, status, HTTP status, detection method and response time for every check, plus an NSFW flag on adult-site rows.\n- Extracts profile fields where the site exposes them: display name, bio, avatar, followers, following, posts, join date, location, website and verified badge.\n- Hides **NSFW sites by default** and removes ten sites proved unable to distinguish real profiles from missing ones.\n- Supports one row per username (legacy-compatible), one row per site, or one row per claimed profile.\n- Needs **no login, cookie, API key or proxy**.\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `usernames` | array | `[\"octocat\"]` | Handles to look up (required). A leading `@` is ignored. `{?}` expands to `_`, `-` and `.`. |\n| `username` | string | – | Optional single handle merged into `usernames`; the array is still required. |\n| `sites` | array | `[]` | Names (`GitHub`), domains (`github.com`) or profile URLs. Empty means every site. |\n| `categories` | array | `[]` | `social`, `dev`, `gaming`, `forum`, `media`, `business`, `education`, `adult`, `other`. Combined with `sites` as a union. |\n| `includeNsfw` | boolean | `false` | Also check adult sites. |\n| `includeAvailable` | boolean | `false` | Also emit rows for free, blocked, unknown and illegal checks. |\n| `verifyClaims` | boolean | `true` | Run the decoy re-check on generic claimed sites. |\n| `enrichProfiles` | boolean | `true` | Add profile fields where available. |\n| `outputMode` | string | `perUsername` | `perUsername`, `perSite` or `perHit`. |\n| `maxUsernames` | integer | `100` | Cap after wildcard expansion (1–100). |\n| `maxSitesPerUsername` | integer | `0` | Check only the top N priority sites; `0` means all (0–500). |\n\n## Output\n\n### `perUsername` (default, backward compatible)\n\nOne row per username. `username` and `links[]` keep their original meaning; `links` now contains only verified claimed profiles. New summary fields and a `profiles[]` array sit beside them.\n\n```json\n{\n  \"username\": \"octocat\",\n  \"links\": [\"https://github.com/octocat\"],\n  \"sitesChecked\": 428,\n  \"profilesFound\": 1,\n  \"sitesAvailable\": 380,\n  \"sitesBlocked\": 12,\n  \"sitesUnknown\": 15,\n  \"sitesUnverified\": 0,\n  \"checkedAt\": \"2026-11-04T12:00:00Z\",\n  \"profiles\": [\n    {\n      \"username\": \"octocat\",\n      \"site\": \"GitHub\",\n      \"category\": \"dev\",\n      \"url\": \"https://github.com/octocat\",\n      \"status\": \"claimed\",\n      \"httpStatus\": 200,\n      \"detectionMethod\": \"api_json\",\n      \"verified\": true,\n      \"responseTimeMs\": 210,\n      \"checkedAt\": \"2026-11-04T12:00:00Z\",\n      \"profile\": {\n        \"userId\": \"583231\",\n        \"username\": \"octocat\",\n        \"displayName\": \"The Octocat\",\n        \"avatarUrl\": \"https://avatars.githubusercontent.com/u/583231\",\n        \"followers\": 18432,\n        \"following\": 9,\n        \"joinedAt\": \"2011-01-25T18:44:36Z\",\n        \"location\": \"San Francisco\",\n        \"website\": \"https://github.blog\",\n        \"stats\": { \"repositories\": 8, \"gists\": 8 }\n      }\n    }\n  ]\n}\n```\n\n### `perSite`\n\nOne row per username × site with `username`, `site`, `category`, `url`, `status`, `httpStatus`, `detectionMethod`, `responseTimeMs` and `checkedAt`, plus `verified` on hit rows, `isNsfw` on adult rows and `profile` when enrichment is on. By default only claimed and unverified rows are emitted; `includeAvailable` adds the rest.\n\n### `perHit`\n\nOne row per claimed and verified profile, with the same shape as `perSite`. With `verifyClaims=false`, claimed rows are emitted without the verification gate.\n\n### Status vocabulary\n\n| Status | Meaning |\n|---|---|\n| `claimed` | The site shows a profile for this handle. Native probes and verified generic checks are `verified: true`. |\n| `available` | The handle is free on this site. |\n| `unverified` | A generic site claimed the handle but could not prove it; kept out of `links`. |\n| `waf` | The site returned a bot challenge, 403, 429 or 451. |\n| `unknown` | Timeout, 5xx or an unparseable response. |\n| `illegal` | The handle does not satisfy the site's own username rule. |\n\nEmpty strings, arrays and objects are omitted at every depth.\n\n## Examples\n\nCheck a batch of handles across every non-NSFW site:\n\n```json\n{\n  \"usernames\": [\"johndoe\", \"janedoe\", \"octocat\"],\n  \"maxUsernames\": 3\n}\n```\n\nCheck only developer and gaming sites, one row per hit:\n\n```json\n{\n  \"usernames\": [\"octocat\"],\n  \"categories\": [\"dev\", \"gaming\"],\n  \"outputMode\": \"perHit\",\n  \"enrichProfiles\": true\n}\n```\n\nAvailability check for a new handle on selected sites:\n\n```json\n{\n  \"usernames\": [\"mynewbrand2026\"],\n  \"sites\": [\"GitHub\", \"Instagram\", \"X (Twitter)\", \"Twitch\", \"Reddit\"],\n  \"includeAvailable\": true,\n  \"outputMode\": \"perSite\",\n  \"verifyClaims\": true\n}\n```\n\nFast top-20 scan per handle:\n\n```json\n{\n  \"usernames\": [\"johndoe\"],\n  \"maxSitesPerUsername\": 20,\n  \"enrichProfiles\": false\n}\n```\n\n## Use cases\n\n- **Brand protection** — find impersonating or parked accounts across networks.\n- **OSINT and investigations** — build a verified footprint from one handle.\n- **Lead enrichment** — attach public profile URLs and display names to a handle list.\n- **Username availability** — see where a new brand handle is free before registering.\n- **Recruiting and sourcing** — locate developer profiles on GitHub, GitLab, Codeforces, LeetCode and Stack Exchange.\n- **Creator discovery** — compare presence across YouTube, Twitch, Instagram, Pinterest and X.\n\n## FAQ\n\n**How do I know a hit is real?** Native probes use exact API/XML/HTML signals. Generic sites are re-checked with a random decoy handle: if the site claims the decoy too, the original row becomes `unverified` and is excluded from `links`. The `detectionMethod` and `verified` fields tell you exactly which path proved each hit.\n\n**Why are there fewer links than the old version?** The old actor reported soft-404 and WAF pages as profiles. Ten such sites were removed from the catalog, and the remaining generic claims now pass the decoy check. Set `verifyClaims=false` to see the raw claimed rows.\n\n**What does `unverified` mean?** The site returned a claimed signal, but a random handle produced the same signal, so the site cannot distinguish real profiles. The row is kept for transparency (and in `perSite` output) but never enters `links`. `profilesFound` counts claimed plus unverified candidates; `sitesUnverified` and `links` show which are proven.\n\n**Why are NSFW sites missing?** They are excluded unless `includeNsfw=true`. The catalog marks 16 adult entries.\n\n**A site I need is missing. Can I add it?** The catalog is pinned and covers 428 sites. Use `sites` to confirm whether a site is supported; unknown values are logged and ignored. The catalog can be refreshed with `scripts/refresh_catalog.py` when upstream adds sites.\n\n**How does `{?}` work?** It expands to three handles using `_`, `-` and `.`. For example `john{?}doe` checks `john_doe`, `john-doe` and `john.doe`. Expansion happens before `maxUsernames` is applied.\n\n**Do I need cookies, an API key or a proxy?** No. The actor is cookieless and anonymous. Sites that hard-block datacenter IPs or serve a bot challenge are reported honestly as `waf` or `unknown` rather than guessed.\n\n**Why do some sites return `unknown` or `waf`?** Cloudflare, Akamai and similar edges sometimes challenge anonymous requests. Retries handle transient 429/5xx responses, but a persistent challenge stays `waf`, and a timeout or 5xx stays `unknown`.\n\n**Can I check 100 handles in one run?** Yes, `maxUsernames` accepts 1–100. Handles are processed four at a time, with up to 50 site checks in flight across the run. Large scans take longer; narrow them with `sites`, `categories` or `maxSitesPerUsername`. GitHub's anonymous API allows 60 requests/hour, so the tail of a 100-handle GitHub-only batch can fall back to HTML or report `waf`.\n\n**Which fields can be enriched?** Display name, bio, avatar, followers, following, posts, join date, location, website and verified badge, where the site's public response exposes them. Long-tail sites return URL and status only.\n\n## Limitations\n\n- **No login-only data.** Private profiles, follower lists, posts and activity feeds are out of scope.\n- **Some sites cannot be detected anonymously.** Reddit, TikTok and Spotify are not shipped as claimed paths; they are either excluded upstream or return `waf`/`unknown`. Sites behind a persistent bot challenge behave the same way.\n- **Instagram and X throttle HTML.** From datacenter IPs they can serve a login or generic page, so an existing profile may be reported `available` or `unknown`; no hit is fabricated.\n- **Native enrichment covers 22 sites.** The long tail provides URL, status, HTTP code and detection method only.\n- **GitHub's anonymous API is limited to 60 requests/hour.** Large GitHub-only batches fall back to HTML (fewer profile fields) or report `waf` for the tail.\n- **Catalog size is 428 sites.** This is a footprint tool, not a 3,000-site Maigret replacement.\n- **Decoy verification trades recall for precision.** A site that claims every handle is reported as `unverified`, even if a real profile exists there.\n",
    "actorDefinition": {
      "actorSpecification": 1,
      "name": "multi-site-username-lookup-and-profile-link-finder",
      "title": "Multi-Site Username Lookup & Profile Finder",
      "description": "Search 400+ sites for a username and return verified profiles with per-site status, HTTP code, detection method and profile fields. Filter by site or category, hide NSFW by default, and scan up to 100 handles per run. No login or API key.",
      "version": "2.0",
      "buildTag": "latest",
      "defaultRunOptions": {
        "build": "latest",
        "timeoutSecs": 3600,
        "memoryMbytes": 1024
      },
      "meta": {
        "templateId": "python-start"
      },
      "input": {
        "title": "Sherlock Username Search",
        "description": "Look up one or more usernames across 400+ sites and return verified profiles with per-site status.",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "usernames": {
            "title": "Usernames",
            "type": "array",
            "description": "Handles to look up. A leading @ is ignored. Use {?} to expand to _, - and . (e.g. john{?}doe).",
            "editor": "stringList",
            "default": [
              "octocat"
            ],
            "prefill": [
              "octocat"
            ],
            "items": {
              "type": "string"
            }
          },
          "username": {
            "title": "Single username",
            "type": "string",
            "description": "Optional single handle merged into `usernames`. The `usernames` array is still required.",
            "editor": "textfield"
          },
          "sites": {
            "title": "Sites",
            "type": "array",
            "description": "Only check these sites. Accepts names (GitHub), domains (github.com) or profile URLs. Leave empty for every supported site.",
            "editor": "stringList",
            "default": [],
            "prefill": [
              "GitHub"
            ],
            "items": {
              "type": "string"
            }
          },
          "categories": {
            "title": "Categories",
            "type": "array",
            "description": "Only check sites in these categories. Combined with `sites` as a union. Leave empty for all categories.",
            "editor": "select",
            "uniqueItems": true,
            "items": {
              "type": "string",
              "enum": [
                "social",
                "dev",
                "gaming",
                "forum",
                "media",
                "business",
                "education",
                "adult",
                "other"
              ]
            }
          },
          "includeNsfw": {
            "title": "Include NSFW sites",
            "type": "boolean",
            "description": "Also check adult sites. Off by default.",
            "default": false,
            "prefill": false
          },
          "includeAvailable": {
            "title": "Include available/blocked rows",
            "type": "boolean",
            "description": "Also emit rows for sites where the handle is free, blocked, unknown or illegal. Useful for availability checks.",
            "default": false,
            "prefill": false
          },
          "verifyClaims": {
            "title": "Verify claimed profiles",
            "type": "boolean",
            "description": "Re-check every generic claimed site with a random decoy handle. Sites that claim any handle are demoted to unverified and kept out of `links`.",
            "default": true,
            "prefill": true
          },
          "enrichProfiles": {
            "title": "Extract profile fields",
            "type": "boolean",
            "description": "Add display name, bio, avatar, follower counts, join date, location, website and verified flag where the site exposes them.",
            "default": true,
            "prefill": false
          },
          "outputMode": {
            "title": "Output mode",
            "type": "string",
            "description": "How to shape dataset rows.",
            "editor": "select",
            "enum": [
              "perUsername",
              "perSite",
              "perHit"
            ],
            "enumTitles": [
              "One row per username (legacy links + profiles)",
              "One row per username × site",
              "One row per claimed profile"
            ],
            "default": "perUsername",
            "prefill": "perUsername"
          },
          "maxUsernames": {
            "title": "Max usernames",
            "type": "integer",
            "description": "Cap the number of handles after wildcard expansion (1–100).",
            "minimum": 1,
            "maximum": 100,
            "default": 100,
            "prefill": 1
          },
          "maxSitesPerUsername": {
            "title": "Max sites per username",
            "type": "integer",
            "description": "Check only the top N priority sites per handle. 0 checks every selected site (0–500).",
            "minimum": 0,
            "maximum": 500,
            "default": 0,
            "prefill": 0
          }
        },
        "required": [
          "usernames"
        ]
      },
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "Sherlock Username Lookup Output",
        "description": "Verified profiles, per-site status rows, or one row per hit, depending on the output mode.",
        "type": "object",
        "properties": {
          "results": {
            "type": "string",
            "title": "Results",
            "description": "All records from the run, in the default dataset.",
            "template": "{{links.apiDefaultDatasetUrl}}/items"
          }
        }
      },
      "readme": "# Multi-Site Username Lookup & Profile Finder\n\nFind where a username exists across 400+ social networks, developer platforms, forums, gaming sites and marketplaces, and get a real profile URL instead of a guess. Every result carries a per-site status, HTTP code, detection method and verification flag, so a soft-404 page can never masquerade as a profile.\n\n## What this actor does\n\n- Checks up to **100 usernames per run** with concurrent site checks.\n- Uses **22 native probes** with exact API/XML/HTML detection for GitHub, GitLab, Steam, Chess.com, Lichess, Hacker News, Codeforces, Docker Hub, Roblox, YouTube, Mastodon, Dev.to, SoundCloud, Instagram, Pinterest, Twitch, X, LeetCode, Keybase, Stack Exchange, Dailymotion and Kick.\n- Runs **decoy verification** on the generic long tail: a site that claims a random handle is marked `unverified` and kept out of `links`.\n- Exposes site, category, status, HTTP status, detection method and response time for every check, plus an NSFW flag on adult-site rows.\n- Extracts profile fields where the site exposes them: display name, bio, avatar, followers, following, posts, join date, location, website and verified badge.\n- Hides **NSFW sites by default** and removes ten sites proved unable to distinguish real profiles from missing ones.\n- Supports one row per username (legacy-compatible), one row per site, or one row per claimed profile.\n- Needs **no login, cookie, API key or proxy**.\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `usernames` | array | `[\"octocat\"]` | Handles to look up (required). A leading `@` is ignored. `{?}` expands to `_`, `-` and `.`. |\n| `username` | string | – | Optional single handle merged into `usernames`; the array is still required. |\n| `sites` | array | `[]` | Names (`GitHub`), domains (`github.com`) or profile URLs. Empty means every site. |\n| `categories` | array | `[]` | `social`, `dev`, `gaming`, `forum`, `media`, `business`, `education`, `adult`, `other`. Combined with `sites` as a union. |\n| `includeNsfw` | boolean | `false` | Also check adult sites. |\n| `includeAvailable` | boolean | `false` | Also emit rows for free, blocked, unknown and illegal checks. |\n| `verifyClaims` | boolean | `true` | Run the decoy re-check on generic claimed sites. |\n| `enrichProfiles` | boolean | `true` | Add profile fields where available. |\n| `outputMode` | string | `perUsername` | `perUsername`, `perSite` or `perHit`. |\n| `maxUsernames` | integer | `100` | Cap after wildcard expansion (1–100). |\n| `maxSitesPerUsername` | integer | `0` | Check only the top N priority sites; `0` means all (0–500). |\n\n## Output\n\n### `perUsername` (default, backward compatible)\n\nOne row per username. `username` and `links[]` keep their original meaning; `links` now contains only verified claimed profiles. New summary fields and a `profiles[]` array sit beside them.\n\n```json\n{\n  \"username\": \"octocat\",\n  \"links\": [\"https://github.com/octocat\"],\n  \"sitesChecked\": 428,\n  \"profilesFound\": 1,\n  \"sitesAvailable\": 380,\n  \"sitesBlocked\": 12,\n  \"sitesUnknown\": 15,\n  \"sitesUnverified\": 0,\n  \"checkedAt\": \"2026-11-04T12:00:00Z\",\n  \"profiles\": [\n    {\n      \"username\": \"octocat\",\n      \"site\": \"GitHub\",\n      \"category\": \"dev\",\n      \"url\": \"https://github.com/octocat\",\n      \"status\": \"claimed\",\n      \"httpStatus\": 200,\n      \"detectionMethod\": \"api_json\",\n      \"verified\": true,\n      \"responseTimeMs\": 210,\n      \"checkedAt\": \"2026-11-04T12:00:00Z\",\n      \"profile\": {\n        \"userId\": \"583231\",\n        \"username\": \"octocat\",\n        \"displayName\": \"The Octocat\",\n        \"avatarUrl\": \"https://avatars.githubusercontent.com/u/583231\",\n        \"followers\": 18432,\n        \"following\": 9,\n        \"joinedAt\": \"2011-01-25T18:44:36Z\",\n        \"location\": \"San Francisco\",\n        \"website\": \"https://github.blog\",\n        \"stats\": { \"repositories\": 8, \"gists\": 8 }\n      }\n    }\n  ]\n}\n```\n\n### `perSite`\n\nOne row per username × site with `username`, `site`, `category`, `url`, `status`, `httpStatus`, `detectionMethod`, `responseTimeMs` and `checkedAt`, plus `verified` on hit rows, `isNsfw` on adult rows and `profile` when enrichment is on. By default only claimed and unverified rows are emitted; `includeAvailable` adds the rest.\n\n### `perHit`\n\nOne row per claimed and verified profile, with the same shape as `perSite`. With `verifyClaims=false`, claimed rows are emitted without the verification gate.\n\n### Status vocabulary\n\n| Status | Meaning |\n|---|---|\n| `claimed` | The site shows a profile for this handle. Native probes and verified generic checks are `verified: true`. |\n| `available` | The handle is free on this site. |\n| `unverified` | A generic site claimed the handle but could not prove it; kept out of `links`. |\n| `waf` | The site returned a bot challenge, 403, 429 or 451. |\n| `unknown` | Timeout, 5xx or an unparseable response. |\n| `illegal` | The handle does not satisfy the site's own username rule. |\n\nEmpty strings, arrays and objects are omitted at every depth.\n\n## Examples\n\nCheck a batch of handles across every non-NSFW site:\n\n```json\n{\n  \"usernames\": [\"johndoe\", \"janedoe\", \"octocat\"],\n  \"maxUsernames\": 3\n}\n```\n\nCheck only developer and gaming sites, one row per hit:\n\n```json\n{\n  \"usernames\": [\"octocat\"],\n  \"categories\": [\"dev\", \"gaming\"],\n  \"outputMode\": \"perHit\",\n  \"enrichProfiles\": true\n}\n```\n\nAvailability check for a new handle on selected sites:\n\n```json\n{\n  \"usernames\": [\"mynewbrand2026\"],\n  \"sites\": [\"GitHub\", \"Instagram\", \"X (Twitter)\", \"Twitch\", \"Reddit\"],\n  \"includeAvailable\": true,\n  \"outputMode\": \"perSite\",\n  \"verifyClaims\": true\n}\n```\n\nFast top-20 scan per handle:\n\n```json\n{\n  \"usernames\": [\"johndoe\"],\n  \"maxSitesPerUsername\": 20,\n  \"enrichProfiles\": false\n}\n```\n\n## Use cases\n\n- **Brand protection** — find impersonating or parked accounts across networks.\n- **OSINT and investigations** — build a verified footprint from one handle.\n- **Lead enrichment** — attach public profile URLs and display names to a handle list.\n- **Username availability** — see where a new brand handle is free before registering.\n- **Recruiting and sourcing** — locate developer profiles on GitHub, GitLab, Codeforces, LeetCode and Stack Exchange.\n- **Creator discovery** — compare presence across YouTube, Twitch, Instagram, Pinterest and X.\n\n## FAQ\n\n**How do I know a hit is real?** Native probes use exact API/XML/HTML signals. Generic sites are re-checked with a random decoy handle: if the site claims the decoy too, the original row becomes `unverified` and is excluded from `links`. The `detectionMethod` and `verified` fields tell you exactly which path proved each hit.\n\n**Why are there fewer links than the old version?** The old actor reported soft-404 and WAF pages as profiles. Ten such sites were removed from the catalog, and the remaining generic claims now pass the decoy check. Set `verifyClaims=false` to see the raw claimed rows.\n\n**What does `unverified` mean?** The site returned a claimed signal, but a random handle produced the same signal, so the site cannot distinguish real profiles. The row is kept for transparency (and in `perSite` output) but never enters `links`. `profilesFound` counts claimed plus unverified candidates; `sitesUnverified` and `links` show which are proven.\n\n**Why are NSFW sites missing?** They are excluded unless `includeNsfw=true`. The catalog marks 16 adult entries.\n\n**A site I need is missing. Can I add it?** The catalog is pinned and covers 428 sites. Use `sites` to confirm whether a site is supported; unknown values are logged and ignored. The catalog can be refreshed with `scripts/refresh_catalog.py` when upstream adds sites.\n\n**How does `{?}` work?** It expands to three handles using `_`, `-` and `.`. For example `john{?}doe` checks `john_doe`, `john-doe` and `john.doe`. Expansion happens before `maxUsernames` is applied.\n\n**Do I need cookies, an API key or a proxy?** No. The actor is cookieless and anonymous. Sites that hard-block datacenter IPs or serve a bot challenge are reported honestly as `waf` or `unknown` rather than guessed.\n\n**Why do some sites return `unknown` or `waf`?** Cloudflare, Akamai and similar edges sometimes challenge anonymous requests. Retries handle transient 429/5xx responses, but a persistent challenge stays `waf`, and a timeout or 5xx stays `unknown`.\n\n**Can I check 100 handles in one run?** Yes, `maxUsernames` accepts 1–100. Handles are processed four at a time, with up to 50 site checks in flight across the run. Large scans take longer; narrow them with `sites`, `categories` or `maxSitesPerUsername`. GitHub's anonymous API allows 60 requests/hour, so the tail of a 100-handle GitHub-only batch can fall back to HTML or report `waf`.\n\n**Which fields can be enriched?** Display name, bio, avatar, followers, following, posts, join date, location, website and verified badge, where the site's public response exposes them. Long-tail sites return URL and status only.\n\n## Limitations\n\n- **No login-only data.** Private profiles, follower lists, posts and activity feeds are out of scope.\n- **Some sites cannot be detected anonymously.** Reddit, TikTok and Spotify are not shipped as claimed paths; they are either excluded upstream or return `waf`/`unknown`. Sites behind a persistent bot challenge behave the same way.\n- **Instagram and X throttle HTML.** From datacenter IPs they can serve a login or generic page, so an existing profile may be reported `available` or `unknown`; no hit is fabricated.\n- **Native enrichment covers 22 sites.** The long tail provides URL, status, HTTP code and detection method only.\n- **GitHub's anonymous API is limited to 60 requests/hour.** Large GitHub-only batches fall back to HTML (fewer profile fields) or report `waf` for the tail.\n- **Catalog size is 428 sites.** This is a footprint tool, not a 3,000-site Maigret replacement.\n- **Decoy verification trades recall for precision.** A site that claims every handle is reported as `unverified`, even if a real profile exists there.\n",
      "dockerfile": "../Dockerfile",
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "title": "Sherlock Results",
          "views": {
            "hits": {
              "title": "Verified Profiles",
              "transformation": {
                "fields": [
                  "username",
                  "site",
                  "category",
                  "status",
                  "verified",
                  "httpStatus",
                  "url"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "username": {
                    "label": "Username",
                    "format": "text"
                  },
                  "site": {
                    "label": "Site",
                    "format": "text"
                  },
                  "category": {
                    "label": "Category",
                    "format": "text"
                  },
                  "status": {
                    "label": "Status",
                    "format": "text"
                  },
                  "verified": {
                    "label": "Verified",
                    "format": "boolean"
                  },
                  "httpStatus": {
                    "label": "HTTP",
                    "format": "number"
                  },
                  "url": {
                    "label": "Profile URL",
                    "format": "link"
                  }
                }
              }
            },
            "byUsername": {
              "title": "By Username",
              "transformation": {
                "fields": [
                  "username",
                  "links",
                  "profilesFound",
                  "sitesChecked",
                  "sitesAvailable",
                  "sitesBlocked",
                  "sitesUnknown"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "username": {
                    "label": "Username",
                    "format": "text"
                  },
                  "links": {
                    "label": "Verified Links",
                    "format": "text"
                  },
                  "profilesFound": {
                    "label": "Found",
                    "format": "number"
                  },
                  "sitesChecked": {
                    "label": "Checked",
                    "format": "number"
                  },
                  "sitesAvailable": {
                    "label": "Available",
                    "format": "number"
                  },
                  "sitesBlocked": {
                    "label": "Blocked",
                    "format": "number"
                  },
                  "sitesUnknown": {
                    "label": "Unknown",
                    "format": "number"
                  }
                }
              }
            }
          }
        }
      }
    },
    "buildNumber": "2.0.1",
    "imageDigest": "19976bed1c3bb21d7f8c28378934fc27d8d4ffba32200e005f5b0d22168feb48",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "2.0"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.01057888888888889
    }
  }
}