Nimbryxo Studio

Use Username Search & Cross-Platform Identity Resolution with Python

Search usernames across 400+ social networks with target-network filtering, then confirm which account on a specific platform truly belongs to a known profile using transparent, signal-based confidence scoring.

1. Choose the data you need

Review the published README for supported collection modes, examples, and limits. The recipe below uses the current published input definition.

2. Prepare a source-based input

This JSON contains published prefills and required-field defaults. Review every value for your task before running it; it is not a promise of successful collection.

{
  "candidateHandles": [],
  "candidateMode": "discover",
  "extractProfileFields": false,
  "includeNsfw": false,
  "includeUnreliable": false,
  "maxCandidatesToDiscover": 20,
  "maxConcurrency": 1,
  "maxUsernames": 1,
  "minConfidenceScore": 0.3,
  "mode": "broadSearch",
  "requestTimeoutSecs": 15,
  "sourceProfile": {
    "handle": "torvalds",
    "platform": "github"
  },
  "targetNetworks": [
    "GitHub"
  ],
  "usernames": [
    "torvalds"
  ],
  "verifyResults": true
}

Download input.example.json and save your reviewed copy as input.json.

FieldTypeRequiredDescription
modestringrequiredbroadSearch: check usernames across networks (optionally filtered) and return every found profile with its status. identityResolution: disambiguate which candidate account on a target network matches a source profile.
usernamesarrayoptionalUsernames to search for (mode=broadSearch). Accepts one to 500, but only maxUsernames (default 100) are processed per run; the status message and record warnings report any shortfall. Supports the {?} wildcard (e.g. 'john{?}doe' expands to 'john_doe', 'john-doe', 'john.doe'). A leading @ is ignored. The legacy single `username` field is still accepted.
targetNetworksarrayoptionalLimit the search/resolution to these networks. Omit to check the 410-site safe sweep (435 vendored sites minus 17 adult/NSFW and 8 known-false-positive sites; Reddit is only checked when explicitly targeted). In identityResolution this field is required; candidateMode 'verify' requires exactly one network. Discord, Diskusjon.no, and Kvinneguiden are skipped with a warning in identity mode because the site database has no username profile URL template for them. Reddit is checked through its public JSON endpoint.
includeNsfwbooleanoptionalWhen no targetNetworks are supplied, also check the 17 adult/NSFW sites in the site database. Off by default.
includeUnreliablebooleanoptionalWhen no targetNetworks are supplied, also check the 8 sites that reported random control handles as found in live testing. Their results are marked unreliable. Off by default.
verifyResultsbooleanoptionalRe-open each found profile page. broadSearch drops dead URLs and keeps gated pages flagged; identityResolution marks every candidate with profileExists/verificationStatus and only emits a bestMatch supported by independent evidence or a verified profile. Soft-404 and login pages are never marked verified. Adds one request per found profile. On by default.
extractProfileFieldsbooleanoptionalOpt in to public profile details (display name, bio, avatar, location, follower count where the source exposes them) in both modes. Identity resolution always fetches what it needs for scoring, but emits the optional detail fields only when this is on. Adds one request per found profile. Off by default; empty and unverifiable avatar URLs are omitted.
maxUsernamesintegeroptionalHow many usernames a broadSearch run will process. Defaults to 100; raise it to 500 for larger batches. When input is truncated, the status message and each record's warnings state how many usernames were skipped.
maxConcurrencyintegeroptionalHow many usernames are searched at the same time in broadSearch. Lower this on a small-memory run.
requestTimeoutSecsintegeroptionalPer-site timeout for existence checks and profile verification.
sourceProfileobjectoptionalThe known account to resolve against (mode=identityResolution). Example: {"platform": "github", "handle": "torvalds"}. The legacy `profile` key is still accepted.
sourceOverridesobjectoptionalOptional manual displayName/bio/avatarUrl for the source profile, used when the source platform cannot be read or to supplement missing data.
candidateModestringoptionaldiscover: auto-generate candidates via search + username-variation heuristics. verify: score only the candidateHandles you supply.
candidateHandlesarrayoptionalHandles to verify against the source profile on the single target network (required when candidateMode is 'verify'). Capped at 60 to keep existence checks bounded. The legacy `handles` key is still accepted.
maxCandidatesToDiscoverintegeroptionalUpper bound on generated/searched candidates per target network in discover mode.
minConfidenceScorenumberoptionalA candidate becomes bestMatch only when its confidence score reaches this value (0-1). Lower it to see weaker matches; raise it for stricter matching.

3. Start an Actor run

Set APIFY_TOKEN in your environment. Python 3.10 or newer is sufficient; this recipe uses no third-party packages.

Execution may incur charges. Review current pricing on Apify. The request asks for a 120-second timeout and a charge limit; these settings are subject to Apify’s pricing and do not guarantee an all-inclusive spending cap.

import json
import os
import urllib.request

# Save the schema-derived example as input.json; review and edit it first.
with open("input.json", encoding="utf-8") as stream:
    actor_input = json.load(stream)

token = os.environ["APIFY_TOKEN"]
request = urllib.request.Request(
    "https://api.apify.com/v2/acts/7YG0FwvsFroVAXASN/runs?timeout=120&maxTotalChargeUsd=0.50",
    data=json.dumps(actor_input).encode("utf-8"),
    headers={"Authorization": "Bearer " + token, "Content-Type": "application/json"},
    method="POST",
)
# This starts a potentially billable run. Do not automatically retry this POST.
with urllib.request.urlopen(request, timeout=40) as response:
    run = json.load(response)["data"]
print("Run ID:", run["id"])
print("Status:", run["status"])
# Inspect and download results in Apify Console once the run succeeds.

4. Inspect the actual results

Open the run in Apify Console and wait for a successful completion. Use the published output schema to locate results and the dataset schema to understand declared views. Missing or optional record fields must not be treated as guaranteed values.

One row per searched username with verified profile URLs, per-site statuses and optional public profile details, plus identity-resolution rows with source profile, ranked candidates and per-signal confidence scores.

Questions before you run

Which inputs are required?

The published required fields are mode

What does this guide verify?

The fields, prefills, and schema links are rendered from the published build. This is a usage recipe, not a paid live extraction test. Source availability and collection results can vary.

What if the run request times out?

Check Apify Console before retrying. The first request may already have created a run. Do not automatically repeat a run-creation POST.

Generated from source build rPvz7EtWwiYuE2ZpM and its README and schemas. Source changes regenerate this guide; no third-party editorial claims are inferred.