# Identity Risk Analyzer (`rexreus/identity-risk-analyzer`) Actor

Map anyone's digital footprint across 15+ platforms in seconds. Collects public profiles from social media, forums & dev platforms — runs identity clustering, risk scoring, breach detection, and generates an interactive graph. For security research, HR & fraud prevention.

- **URL**: https://apify.com/rexreus/identity-risk-analyzer.md
- **Developed by:** [REXREUS](https://apify.com/rexreus) (community)
- **Categories:** Automation, Jobs, Social media
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $200.00 / 1,000 identity analysis results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Identity Risk Analyzer

> Map anyone's digital footprint across 15+ platforms in seconds.

Give it a name, username, email, or phone number — and this Actor will hunt down public profiles across social media, forums, and developer platforms, cluster them into a unified identity, score the risk level, check for data breaches, and generate an interactive graph of connections.

Built for security researchers, HR teams, fraud analysts, and investigative journalists who need fast, structured OSINT without the manual work.

**What it does in one run:**
- Searches 15 platforms simultaneously (Twitter/X, Reddit, GitHub, Instagram, LinkedIn, TikTok, and more)
- Clusters accounts that likely belong to the same person using username similarity, bio matching, and shared links
- Scores digital risk 0–100 based on breach exposure, anonymity patterns, and cross-platform reuse
- Checks HaveIBeenPwned for data breach history
- Scans Pastebin and GitHub Gists for credential leaks
- Infers geolocation from timezone signals and post timestamps
- Generates a D3.js force-directed identity graph
- Returns structured JSON — ready for downstream automation

---

### ⚠️ Legal Disclaimer

**This Actor is intended for lawful OSINT purposes only.** Authorized use cases include security research, HR due diligence, and fraud prevention. Users are solely responsible for compliance with all applicable laws, including GDPR, CCPA, and local privacy regulations.

**This Actor must NOT be used for stalking, harassment, unauthorized surveillance, or any activity that violates applicable laws or platform Terms of Service.**

The Actor only collects data from publicly accessible pages and does not bypass authentication, CAPTCHAs, or paywalls.

---

### Use Cases

- **Security Research** — Map the digital footprint of a threat actor or investigate suspicious identities across platforms.
- **HR Due Diligence** — Verify candidate identity consistency and detect undisclosed online presence.
- **Fraud Prevention** — Cross-reference identities across platforms to detect fake or synthetic accounts.
- **Journalism / Investigations** — Aggregate public information about a person of public interest.

---

### Input Parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `name` | string | one of name/username/email | — | Target's full name |
| `username` | string | one of name/username/email | — | Target's username (10+ permutations auto-generated) |
| `email` | string | one of name/username/email | — | Target's email address |
| `phone` | string | no | — | Target's phone number (normalized to E.164) |
| `targets` | array | no | — | Batch mode: array of target objects (max 20) |
| `runMode` | string | no | `"quick"` | `quick` / `deep` / `custom` |
| `platforms` | array | no | all | Platforms to scan (custom mode only) |
| `features` | array | no | mode default | Features to enable (custom mode only) |
| `outputFormat` | string | no | `"full"` | `full` or `summary` |
| `forceRefresh` | boolean | no | `false` | Bypass 24-hour result cache |
| `clusteringThreshold` | number | no | `0.75` | Identity clustering sensitivity (0.50–0.95) |
| `hibpApiKey` | string | no | — | HaveIBeenPwned API key for breach check |
| `enableImageSearch` | boolean | no | `false` | Enable reverse image search API |
| `platformDelays` | object | no | see defaults | Per-platform request delay overrides (ms) |
| `platformTimeouts` | object | no | 120000ms | Per-platform sub-Actor timeout overrides (ms) |
| `delayBetweenTargets` | integer | no | `5000` | Delay between batch targets (ms) |
| `proxyConfig` | object | no | auto | Apify Proxy configuration override |

#### API Key Requirements

| Key | Field | Required | Purpose | Get it at |
|-----|-------|----------|---------|-----------|
| HaveIBeenPwned | `hibpApiKey` | For breach check | Data breach lookup | [haveibeenpwned.com/API/Key](https://haveibeenpwned.com/API/Key) |
| WhoisFreaks | `whoisApiKey` | Optional | WHOIS lookup (higher rate limit) | [whoisfreaks.com](https://whoisfreaks.com) |
| GitHub Token | `githubToken` | Optional | GitHub profile lookup (60→5000 req/hr) | [github.com/settings/tokens](https://github.com/settings/tokens) |

All keys are marked `isSecret` in the input schema — they will not appear in logs or UI.

---

### Run Modes

| Mode | Platforms | Features | Est. Time | Est. Cost |
|------|-----------|----------|-----------|-----------|
| `quick` | 8 free platforms (no paid actors) | None | ~60s | **Free** |
| `deep` | All 15 platforms (includes paid actors) | breach, paste, domain, geolocation | ~300s | $1.50–$3.00 |
| `custom` | User-selected | User-selected | Varies | Varies |

> **Cost tip:** `quick` mode uses only internal/free collectors (Reddit JSON API, Nitter for Twitter, GitHub API, HackerNews Algolia, StackExchange API, Medium RSS, Telegram public, Kaskus scraper) — no `Actor.call()` to paid third-party actors.

#### Supported Platforms (15 total)

| Platform | Collector type | Cost |
|----------|---------------|------|
| `twitter` | Internal (Nitter) | Free |
| `reddit` | Internal (Reddit JSON API) | Free |
| `github` | Internal (GitHub API) | Free |
| `stackoverflow` | Internal (StackExchange API) | Free |
| `hackernews` | Internal (Algolia HN API) | Free |
| `medium` | Internal (RSS feed) | Free |
| `telegram` | Internal (public scraper) | Free |
| `kaskus` | Internal (custom scraper) | Free |
| `instagram` | Paid actor | ~$0.40/run |
| `tiktok` | Paid actor | ~$0.40/run |
| `linkedin` | Paid actor | ~$0.50/run |
| `facebook` | Paid actor | ~$0.40/run |
| `youtube` | Paid actor | ~$0.30/run |
| `pinterest` | Paid actor | ~$0.30/run |
| `quora` | Paid actor | ~$0.30/run |

#### Optional Features

| Feature | Description | Est. Additional Cost |
|---------|-------------|----------------------|
| `breachCheck` | HIBP data breach lookup (requires `hibpApiKey`) | +$0.10 |
| `pasteCheck` | Pastebin + GitHub Gists search | Free |
| `domainAnalysis` | WHOIS + DNS + reverse IP lookup | Free |
| `geolocation` | Timezone/location inference from public metadata | Free |
| `imageSearch` | Reverse image search API (opt-in only) | +$1.00 |

> **Note:** `imageSearch` is excluded from all modes by default. Enable it explicitly by setting `enableImageSearch: true` in input.

---

### Output Format

The Actor writes records to the **Apify Dataset**. Each record conforms to [`OUTPUT_SCHEMA.json`](./OUTPUT_SCHEMA.json).

#### Record Status Types

| Status | Description | Triggers Billing |
|--------|-------------|-----------------|
| `FINAL` | Complete analysis result | Yes |
| `CACHED` | Result served from 24-hour cache | Yes |
| `PARTIAL` | Intermediate result per sub-Actor completion | No |
| `ABORTED` | Partial result when Actor was aborted by user | No |
| `FAILED` | Unrecoverable error record | No |

#### Key-Value Store Artifacts

| Key | Contents |
|-----|----------|
| `IDENTITY_GRAPH` | D3.js force-directed graph JSON |
| `RAW_SOURCES` | Full unprocessed scraped data |
| `CACHE_{sha256}` | Cached result (24-hour TTL) |
| `PROXY_STATS` | Proxy usage statistics |
| `PIPELINE_TIMING` | Per-stage start/end timestamps |
| `OUTPUT_ERROR` | Error details if Actor fails at startup |
| `METAMORPH_STATE` | Intermediate state for large runs |

#### Output Schema

The complete output schema is defined in [`OUTPUT_SCHEMA.json`](./OUTPUT_SCHEMA.json). The `outputSchemaVersion` field in every record allows downstream consumers to detect schema version and handle migrations.

Key output fields:

| Field | Type | Description |
|-------|------|-------------|
| `sourcesCollected` | string[] | Platforms that returned data |
| `skippedPlatforms` | string[] | Paid actors not invoked (cost control or no permission) |
| `notFoundPlatforms` | string[] | Platforms searched but target not found |
| `sourcesFailedCount` | number | Platforms that errored or timed out |
| `rateLimitedSources` | string[] | Platforms that returned rate-limit responses |

---

### Example Output

```json
{
  "queryId": "run_abc123",
  "status": "FINAL",
  "outputSchemaVersion": "1.0.0",
  "inputSummary": {
    "username": "johndoe",
    "email": "john.doe@example.com"
  },
  "identityClusters": [
    {
      "clusterId": "cluster_001",
      "members": [
        { "platform": "twitter", "profileUrl": "https://twitter.com/johndoe" },
        { "platform": "github", "profileUrl": "https://github.com/johndoe" }
      ],
      "confidenceLevel": 87,
      "sharedAttributes": ["username", "bio_link"],
      "possibleMatches": []
    }
  ],
  "riskScore": 42,
  "riskLabel": "MEDIUM",
  "riskExplanation": [
    { "factor": "Email/username reuse across 4 platforms", "contribution": 18 },
    { "factor": "1 data breach found (LinkedIn 2021)", "contribution": 14 },
    { "factor": "2 paste site mentions", "contribution": 6 }
  ],
  "breachData": [
    {
      "breachName": "LinkedIn",
      "breachDate": "2021-06-22",
      "dataClasses": ["Email addresses", "Passwords"],
      "exposureLevel": 65
    }
  ],
  "geolocation": {
    "consensusCountry": "Indonesia",
    "consensusRegion": "West Java",
    "confidencePercent": 78,
    "inferredUtcOffset": "UTC+7 ±1h",
    "locationInconsistent": false
  },
  "graphUrl": "https://api.apify.com/v2/key-value-stores/store_id/records/IDENTITY_GRAPH",
  "sourcesCollected": ["twitter", "github", "reddit"],
  "sourcesFailedCount": 0,
  "skippedPlatforms": ["instagram", "tiktok", "linkedin", "facebook", "youtube", "pinterest", "quora"],
  "notFoundPlatforms": ["telegram", "kaskus", "medium", "hackernews", "stackoverflow"],
  "rateLimitedSources": [],
  "runDurationSeconds": 74,
  "runMode": "quick",
  "clusteringThreshold": 0.75,
  "timestamp": "2024-01-15T10:30:00.000Z",
  "cacheHit": false,
  "cachedAt": null,
  "cacheExpiresAt": null,
  "dataSourceAttribution": [
    { "platform": "twitter", "collectedAt": "2024-01-15T10:29:10.000Z", "recordCount": 1 },
    { "platform": "github", "collectedAt": "2024-01-15T10:29:22.000Z", "recordCount": 1 }
  ],
  "pipelineErrors": [],
  "outputSchemaVersion": "1.0.0"
}
````

***

### Pricing Model

This Actor uses Apify's **Pay per result** model — billing is triggered per completed Dataset record with `status: "FINAL"` or `"CACHED"`. Partial and aborted records do not trigger billing.

| Mode | Est. Cost per Run |
|------|-------------------|
| Quick (8 free platforms) | **Free** |
| Deep (15 platforms, paid actors included) | $1.50–$3.00 |
| Deep + Image Search | $2.50–$4.00 |
| Batch (per target, deep) | $1.00–$2.00 / target |

Volume discounts for batch mode: 10 targets = -10%, 20 targets = -20%.

> Paid actors (Instagram, TikTok, LinkedIn, Facebook, YouTube, Pinterest, Quora) are only invoked in `deep` or `custom` mode. In `quick` mode, all data is collected via free public APIs — no third-party actor calls are made.

***

#### v1.2.0 (2026-04-21)

- Added `whoisApiKey` and `githubToken` input fields — optional keys for higher rate limits
- Internal collectors now try all username permutations (10+) per platform
- `pasteCheck` now falls back to email local-part as username when no explicit username provided
- `buildAccountNodes` injects `normalizedEmail` and `normalizedPhone` into every account node for better clustering
- Added `notFoundPlatforms` field to output
- GitHub collector now passes `location`, `bio`, `email` for geolocation inference
- Fixed timeout bug in orchestrator polling loop for internal collectors
- Fixed StackOverflow false positive — now requires exact username match
- Fixed `fetchRunOutput` using run ID instead of dataset ID
- Fixed Pastebin URL constant corrupted by IDE autofix
- Added `AbortSignal.timeout` to Reddit and domain collectors
- Added more Nitter instances and better error page detection
- WHOIS collector now tries multiple free APIs with fallback
- Reverse image search now handles Google consent page redirect gracefully

#### v1.1.0 (2026-04-20)

- **Cost optimization:** Twitter/X and Reddit migrated to free internal collectors (Nitter + Reddit JSON API) — no paid actor calls
- `quick` mode now covers 8 platforms (was 3) at zero Actor.call cost
- Added `isPaid` flag per platform in actor registry for transparent cost tracking
- Paid actors (Instagram, TikTok, LinkedIn, Facebook, YouTube, Pinterest, Quora) now only invoked in `deep`/`custom` mode
- Memory allocation reduced from 256MB → 128MB for all internal actors
- `imageSearch` feature removed from `deep` mode defaults (opt-in only via `enableImageSearch: true`)
- Added `SKIPPED` status for paid actors bypassed in non-deep modes
- `pasteCheck` and `domainAnalysis` reclassified as free (direct HTTP, no actor cost)

#### v1.0.0 (2024-01-15)

- Initial release
- 15 platform collectors: Instagram, Twitter/X, TikTok, LinkedIn, Facebook, YouTube, Pinterest, Telegram, Reddit, Kaskus, GitHub, Stack Overflow, Quora, Medium, HackerNews
- Identity clustering engine with Jaro-Winkler + TF-IDF bio similarity
- Risk scoring engine (0–100) with top-3 explanation
- D3.js digital footprint graph output
- Data breach check via HaveIBeenPwned v3 API
- Paste site cross-reference (Pastebin + GitHub Gists)
- WHOIS + DNS domain analysis
- Perceptual hash (pHash) image fingerprinting
- Geolocation inference from public metadata
- 24-hour result caching
- Batch mode (up to 20 targets)
- Quick / Deep / Custom run modes
- Apify Proxy auto-configuration with residential fallback
- Anti-detection: stealth plugin, UA rotation, human-like delays

# Actor input Schema

## `name` (type: `string`):

Target's full name (optional). At least one of name, username, or email is required.

## `username` (type: `string`):

Target's username. The Actor will automatically generate 10+ permutations (e.g. john\_doe, johndoe, john.doe, johndoe1). At least one of name, username, or email is required.

## `email` (type: `string`):

Target's email address. Used for breach check (requires hibpApiKey) and paste site search. At least one of name, username, or email is required.

## `phone` (type: `string`):

Target's phone number. Will be normalized to E.164 format automatically (e.g. +628123456789).

## `targets` (type: `array`):

Array of target objects for batch mode (max 20 targets). Each object may contain: name, username, email, phone. Cannot be used together with single-target fields.

## `runMode` (type: `string`):

Scan depth and cost tier:
• quick — 8 free platforms (Twitter/X via Nitter, Reddit, GitHub, StackOverflow, HackerNews, Medium, Telegram, Kaskus). No paid actor calls. ~60s runtime. Est. cost: Free.
• deep — All 15 platforms including paid actors (Instagram, TikTok, LinkedIn, Facebook, YouTube, Pinterest, Quora) + breach + paste + domain + geolocation. ~300s runtime. Est. cost: $1.50–$3.00.
• custom — Use the platforms and features parameters to select sources manually.

## `platforms` (type: `array`):

List of platforms to scan. Only used when runMode is 'custom' — ignored for quick/deep modes.

Free (internal collectors, no Actor.call cost):
• twitter — Nitter public instance (~free, ~15s)
• reddit — Reddit JSON API (~free, ~10s)
• github — GitHub public API (~free, ~10s)
• stackoverflow — StackExchange API (~free, ~10s)
• hackernews — Algolia HN API (~free, ~10s)
• medium — RSS feed (~free, ~10s)
• telegram — public scraper (~free, ~15s)
• kaskus — custom scraper (~free, ~25s)

Paid (third-party actors, incur Apify compute cost):
• instagram (~$0.40, ~30s)
• tiktok (~$0.40, ~30s)
• linkedin (~$0.50, ~40s)
• facebook (~$0.40, ~30s)
• youtube (~$0.30, ~25s)
• pinterest (~$0.30, ~25s)
• quora (~$0.30, ~25s)

## `features` (type: `array`):

Optional analysis features to enable. Only used when runMode is 'custom'. Cost per feature:
• breachCheck — HIBP data breach lookup (requires hibpApiKey, +~$0.10)
• pasteCheck — Pastebin + GitHub Gists search (free, direct HTTP)
• domainAnalysis — WHOIS + DNS + reverse IP lookup (free, direct HTTP)
• geolocation — Timezone/location inference from public metadata (free)
• imageSearch — Reverse image search API (+$1.00, requires enableImageSearch: true)

## `outputFormat` (type: `string`):

Controls the verbosity of the Dataset output record:
• full — Includes all raw source data, profiles, and analysis results.
• summary — Includes only clusters, risk score, and graphUrl (smaller output, faster downstream processing).

## `forceRefresh` (type: `boolean`):

Set to true to bypass the 24-hour result cache and run a full fresh analysis. The new result will overwrite the existing cache entry.

## `clusteringThreshold` (type: `number`):

Minimum composite similarity score (0.50–0.95) required to auto-assign two accounts to the same identity cluster. Default: 0.75. Values below 0.60 may produce false-positive cluster assignments (a warning will be included in the output).

## `hibpApiKey` (type: `string`):

Required for data breach checking (breachCheck feature). Obtain your key at https://haveibeenpwned.com/API/Key. Without this key, breach check will be skipped.

## `whoisApiKey` (type: `string`):

Optional API key for WhoisFreaks WHOIS lookup (domainAnalysis feature). Without this key, the free tier is used which may have rate limits. Get your key at https://whoisfreaks.com.

## `githubToken` (type: `string`):

Optional GitHub token to increase API rate limit from 60 to 5000 requests/hour for GitHub profile lookups. Create one at https://github.com/settings/tokens (no scopes needed for public data).

## `enableImageSearch` (type: `boolean`):

Submit collected profile images to a reverse image search API (+$1.00 per run). Note: perceptual hash (pHash) comparison between collected profiles is always performed for free regardless of this setting.

## `platformDelays` (type: `object`):

Override default inter-request delays per platform (in milliseconds). Defaults: instagram=2000, twitter=1000, tiktok=2000, linkedin=3000, facebook=2000, youtube=1000, pinterest=2000, telegram=1000, reddit=1000, github=1000, stackoverflow=1000, quora=2000, medium=1000, hackernews=1000, kaskus=2000.

## `platformTimeouts` (type: `object`):

Override default sub-Actor execution timeouts per platform (in milliseconds, custom mode only). Default: 120000ms for all platforms. Example: set github to 90000 for faster failure on slow API responses.

## `delayBetweenTargets` (type: `integer`):

Delay in milliseconds between processing each target in batch mode. Increase this value to reduce the risk of rate limiting across consecutive target runs. Default: 5000ms.

## `proxyConfig` (type: `object`):

Apify Proxy configuration override. Defaults: RESIDENTIAL proxy for social media platforms, DATACENTER proxy for API-based sources (WHOIS, HIBP, DNS). Residential proxy improves scraping reliability but increases cost.

## Actor input object example

```json
{
  "name": "John Doe",
  "username": "johndoe",
  "email": "john.doe@example.com",
  "phone": "+628123456789",
  "targets": [
    {
      "username": "johndoe",
      "email": "john@example.com"
    },
    {
      "username": "janedoe"
    }
  ],
  "runMode": "quick",
  "platforms": [
    "twitter",
    "github",
    "reddit"
  ],
  "features": [
    "breachCheck",
    "pasteCheck",
    "domainAnalysis",
    "geolocation"
  ],
  "outputFormat": "full",
  "forceRefresh": false,
  "clusteringThreshold": 0.75,
  "hibpApiKey": "your-hibp-api-key-here",
  "whoisApiKey": "your-whoisfreaks-api-key",
  "githubToken": "ghp_xxxxxxxxxxxx",
  "enableImageSearch": false,
  "platformDelays": {
    "instagram": 3000,
    "linkedin": 5000
  },
  "platformTimeouts": {
    "github": 90000,
    "stackoverflow": 60000
  },
  "delayBetweenTargets": 5000,
  "proxyConfig": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {};

// Run the Actor and wait for it to finish
const run = await client.actor("rexreus/identity-risk-analyzer").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {}

# Run the Actor and wait for it to finish
run = client.actor("rexreus/identity-risk-analyzer").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{}' |
apify call rexreus/identity-risk-analyzer --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=rexreus/identity-risk-analyzer",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Identity Risk Analyzer",
        "description": "Map anyone's digital footprint across 15+ platforms in seconds. Collects public profiles from social media, forums & dev platforms — runs identity clustering, risk scoring, breach detection, and generates an interactive graph. For security research, HR & fraud prevention.",
        "version": "0.0",
        "x-build-id": "FZlPQVEnGO3wH2cgU"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/rexreus~identity-risk-analyzer/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-rexreus-identity-risk-analyzer",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/rexreus~identity-risk-analyzer/runs": {
            "post": {
                "operationId": "runs-sync-rexreus-identity-risk-analyzer",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/rexreus~identity-risk-analyzer/run-sync": {
            "post": {
                "operationId": "run-sync-rexreus-identity-risk-analyzer",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "name": {
                        "title": "Full Name",
                        "type": "string",
                        "description": "Target's full name (optional). At least one of name, username, or email is required."
                    },
                    "username": {
                        "title": "Username",
                        "type": "string",
                        "description": "Target's username. The Actor will automatically generate 10+ permutations (e.g. john_doe, johndoe, john.doe, johndoe1). At least one of name, username, or email is required."
                    },
                    "email": {
                        "title": "Email Address",
                        "type": "string",
                        "description": "Target's email address. Used for breach check (requires hibpApiKey) and paste site search. At least one of name, username, or email is required."
                    },
                    "phone": {
                        "title": "Phone Number",
                        "type": "string",
                        "description": "Target's phone number. Will be normalized to E.164 format automatically (e.g. +628123456789)."
                    },
                    "targets": {
                        "title": "Batch Targets",
                        "type": "array",
                        "description": "Array of target objects for batch mode (max 20 targets). Each object may contain: name, username, email, phone. Cannot be used together with single-target fields."
                    },
                    "runMode": {
                        "title": "Run Mode",
                        "enum": [
                            "quick",
                            "deep",
                            "custom"
                        ],
                        "type": "string",
                        "description": "Scan depth and cost tier:\n• quick — 8 free platforms (Twitter/X via Nitter, Reddit, GitHub, StackOverflow, HackerNews, Medium, Telegram, Kaskus). No paid actor calls. ~60s runtime. Est. cost: Free.\n• deep — All 15 platforms including paid actors (Instagram, TikTok, LinkedIn, Facebook, YouTube, Pinterest, Quora) + breach + paste + domain + geolocation. ~300s runtime. Est. cost: $1.50–$3.00.\n• custom — Use the platforms and features parameters to select sources manually.",
                        "default": "quick"
                    },
                    "platforms": {
                        "title": "Platforms (custom mode only)",
                        "type": "array",
                        "description": "List of platforms to scan. Only used when runMode is 'custom' — ignored for quick/deep modes.\n\nFree (internal collectors, no Actor.call cost):\n• twitter — Nitter public instance (~free, ~15s)\n• reddit — Reddit JSON API (~free, ~10s)\n• github — GitHub public API (~free, ~10s)\n• stackoverflow — StackExchange API (~free, ~10s)\n• hackernews — Algolia HN API (~free, ~10s)\n• medium — RSS feed (~free, ~10s)\n• telegram — public scraper (~free, ~15s)\n• kaskus — custom scraper (~free, ~25s)\n\nPaid (third-party actors, incur Apify compute cost):\n• instagram (~$0.40, ~30s)\n• tiktok (~$0.40, ~30s)\n• linkedin (~$0.50, ~40s)\n• facebook (~$0.40, ~30s)\n• youtube (~$0.30, ~25s)\n• pinterest (~$0.30, ~25s)\n• quora (~$0.30, ~25s)"
                    },
                    "features": {
                        "title": "Features (custom mode only)",
                        "type": "array",
                        "description": "Optional analysis features to enable. Only used when runMode is 'custom'. Cost per feature:\n• breachCheck — HIBP data breach lookup (requires hibpApiKey, +~$0.10)\n• pasteCheck — Pastebin + GitHub Gists search (free, direct HTTP)\n• domainAnalysis — WHOIS + DNS + reverse IP lookup (free, direct HTTP)\n• geolocation — Timezone/location inference from public metadata (free)\n• imageSearch — Reverse image search API (+$1.00, requires enableImageSearch: true)"
                    },
                    "outputFormat": {
                        "title": "Output Format",
                        "enum": [
                            "full",
                            "summary"
                        ],
                        "type": "string",
                        "description": "Controls the verbosity of the Dataset output record:\n• full — Includes all raw source data, profiles, and analysis results.\n• summary — Includes only clusters, risk score, and graphUrl (smaller output, faster downstream processing).",
                        "default": "full"
                    },
                    "forceRefresh": {
                        "title": "Force Refresh (bypass cache)",
                        "type": "boolean",
                        "description": "Set to true to bypass the 24-hour result cache and run a full fresh analysis. The new result will overwrite the existing cache entry.",
                        "default": false
                    },
                    "clusteringThreshold": {
                        "title": "Clustering Confidence Threshold",
                        "minimum": 0.5,
                        "maximum": 0.95,
                        "type": "number",
                        "description": "Minimum composite similarity score (0.50–0.95) required to auto-assign two accounts to the same identity cluster. Default: 0.75. Values below 0.60 may produce false-positive cluster assignments (a warning will be included in the output).",
                        "default": 0.75
                    },
                    "hibpApiKey": {
                        "title": "HaveIBeenPwned API Key",
                        "type": "string",
                        "description": "Required for data breach checking (breachCheck feature). Obtain your key at https://haveibeenpwned.com/API/Key. Without this key, breach check will be skipped."
                    },
                    "whoisApiKey": {
                        "title": "WhoisFreaks API Key (optional)",
                        "type": "string",
                        "description": "Optional API key for WhoisFreaks WHOIS lookup (domainAnalysis feature). Without this key, the free tier is used which may have rate limits. Get your key at https://whoisfreaks.com."
                    },
                    "githubToken": {
                        "title": "GitHub Personal Access Token (optional)",
                        "type": "string",
                        "description": "Optional GitHub token to increase API rate limit from 60 to 5000 requests/hour for GitHub profile lookups. Create one at https://github.com/settings/tokens (no scopes needed for public data)."
                    },
                    "enableImageSearch": {
                        "title": "Enable Reverse Image Search",
                        "type": "boolean",
                        "description": "Submit collected profile images to a reverse image search API (+$1.00 per run). Note: perceptual hash (pHash) comparison between collected profiles is always performed for free regardless of this setting.",
                        "default": false
                    },
                    "platformDelays": {
                        "title": "Per-Platform Request Delays (ms)",
                        "type": "object",
                        "description": "Override default inter-request delays per platform (in milliseconds). Defaults: instagram=2000, twitter=1000, tiktok=2000, linkedin=3000, facebook=2000, youtube=1000, pinterest=2000, telegram=1000, reddit=1000, github=1000, stackoverflow=1000, quora=2000, medium=1000, hackernews=1000, kaskus=2000."
                    },
                    "platformTimeouts": {
                        "title": "Per-Platform Sub-Actor Timeouts (ms)",
                        "type": "object",
                        "description": "Override default sub-Actor execution timeouts per platform (in milliseconds, custom mode only). Default: 120000ms for all platforms. Example: set github to 90000 for faster failure on slow API responses."
                    },
                    "delayBetweenTargets": {
                        "title": "Delay Between Batch Targets (ms)",
                        "type": "integer",
                        "description": "Delay in milliseconds between processing each target in batch mode. Increase this value to reduce the risk of rate limiting across consecutive target runs. Default: 5000ms.",
                        "default": 5000
                    },
                    "proxyConfig": {
                        "title": "Proxy Configuration",
                        "type": "object",
                        "description": "Apify Proxy configuration override. Defaults: RESIDENTIAL proxy for social media platforms, DATACENTER proxy for API-based sources (WHOIS, HIBP, DNS). Residential proxy improves scraping reliability but increases cost."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
