# Onion Sentinel (`olibai/onion-sentinel`) Actor

Advanced dark web discovery & monitoring. Find .onion links via Ahmia, scan hidden services for leaks or keywords, and verify link uptime with robust Tor error tracking. Features screenshots, session video, and circuit isolation. Optimized for speed and stealth via Owl Browser."

- **URL**: https://apify.com/olibai/onion-sentinel.md
- **Developed by:** [Olib AI](https://apify.com/olibai) (community)
- **Categories:** Automation, Developer tools, Integrations
- **Stats:** 10 total users, 0 monthly users, 45.5% runs succeeded, 2 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $0.00005 / actor start

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## OnionSentinel

Automated Dark Web Threat Intelligence & Monitoring through [Owl Browser](https://www.owlbrowser.net).

OnionSentinel is an [Apify](https://apify.com) actor designed for automated scanning, discovery, and status verification of the dark web (.onion sites). It leverages Owl Browser's secure Tor infrastructure with engine-level anti-detection.

---

### Operating Modes

1. **Monitoring (Default):** Scans specific target URLs for keywords and threats. Supports up to 10 targets per run.
2. **Discovery:** Finds new .onion sites based on a search query using a reliable two-step search process on Ahmia.
3. **Uptime Check:** Verifies if a list of .onion links are currently active and responsive. Supports up to 10 targets per run.

---

### Features

- **Reliable Discovery:** Uses Ahmia's internal search tokens to bypass protection and retrieve thousands of hidden service links.
- **Robust Uptime Verification:** Specifically checks for navigation success and captures exact Tor error codes (e.g., `ERR_SOCKS_CONNECTION_FAILED`) to distinguish between dead sites and temporary timeouts.
- **Performance Optimized:** Enforces a 10-URL limit per scan to ensure fast completion and high reliability.
- **Keyword Detection:** Scans raw HTML content for specific keywords (emails, brands, leaks) with high-fidelity extraction.
- **Evidence Capture:** Automatically saves full-page screenshots where threats are detected.
- **Video Recording:** Record the entire browsing session for compliance, auditing, and legal evidence.
- **Tor Circuit Isolation:** Every target can be processed in an isolated context with unique Tor exit IPs.

---

### Input

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `mode` | string | Yes | `"monitoring"` | `"monitoring"`, `"discovery"`, or `"uptime-check"` |
| `query` | string | Yes (discovery) | — | Search query for Discovery mode (e.g., 'marketplaces') |
| `targets` | array | Yes (monitoring/uptime) | — | List of .onion objects `{"url": "...", "label": "..."}`. **Max 10 per run.** |
| `keywords` | array | Yes (monitoring) | — | Keywords or phrases to detect in page content. |
| `region` | string | Yes | `"US"` | Browser region: `"US"` or `"EU"`. |
| `concurrency` | integer | No | `1` | Number of targets to process in parallel (Max 5). |
| `saveScreenshots` | boolean | No | `true` | Capture and store screenshots of findings. |
| `saveVideo` | boolean | No | `false` | Record session video (may increase run time). |
| `maxPagesPerTarget` | integer | No | `10` | Limit sub-pages crawled per root URL. |

---

### Example Inputs

#### Discovery Mode
```json
{
    "mode": "discovery",
    "query": "financial leaks 2026",
    "region": "US"
}
````

#### Monitoring Mode

```json
{
    "mode": "monitoring",
    "targets": [
        {"url": "http://vww6ybal4bd7szmgncyruucpgfkqahzddi37ktce53ab47mre5msosyd.onion", "label": "Dread Forum"}
    ],
    "keywords": ["database dump", "admin@mycompany.com"],
    "region": "EU",
    "saveScreenshots": true
}
```

#### Uptime Check Mode

```json
{
    "mode": "uptime-check",
    "targets": [
        {"url": "http://juhanurmihxlp77nkq76byazcldy2hlmovfu2epvl5ankdibsot4csyd.onion", "label": "Ahmia Search"},
        {"url": "http://deadlinkexample.onion", "label": "Old Market"}
    ],
    "region": "US"
}
```

***

### Charging & Events

This actor uses pay-per-event charging for specific actions:

- `darkweb-discovery`: Charged per discovery run.
- `darkweb-scan`: Charged per target monitored.
- `darkweb-uptime`: Charged per link checked.

***

### Technology

- **[Owl Browser](https://www.owlbrowser.net)** — Secure anti-detection browser with Tor and automation.
- **[Apify SDK](https://apify.com)** — Actor runtime and data storage.
- **[Python SDK](https://www.owlbrowser.net)** — Owl Browser async Python client.

***

### License

MIT

# Actor input Schema

## `mode` (type: `string`):

Choose between 'monitoring' (scan specific targets), 'discovery' (find new .onion sites) or 'uptime-check' (verify link availability).

## `query` (type: `string`):

Search query for Discovery mode (e.g., 'marketplaces', 'forums', 'leaks').

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

List of .onion URLs to monitor (Monitoring mode only). Max 10 URLs.

## `keywords` (type: `array`):

List of keywords to look for (Monitoring mode only).

## `region` (type: `string`):

Select the geographic region for the Owl Browser instance.

## `maxPagesPerTarget` (type: `integer`):

Limit the number of sub-pages crawled per root URL.

## `saveScreenshots` (type: `boolean`):

Capture screenshots where keywords are found.

## `saveVideo` (type: `boolean`):

Record the entire browsing session.

## `concurrency` (type: `integer`):

Number of targets to process in parallel.

## Actor input object example

```json
{
  "mode": "monitoring",
  "query": "marketplaces",
  "targets": [
    {
      "url": "http://2gzyxa5ihm7nsber64qvit6eraokhlmr6scarvb5xqi6hx4i7flrcbad.onion",
      "label": "Example Forum",
      "type": "forum"
    }
  ],
  "keywords": [
    "database dump",
    "leaked"
  ],
  "region": "US",
  "maxPagesPerTarget": 10,
  "saveScreenshots": true,
  "saveVideo": false,
  "concurrency": 1
}
```

# Actor output Schema

## `results` (type: `string`):

The monitoring results pushed to the dataset, including findings and metadata.

# 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 = {
    "query": "marketplaces",
    "targets": [
        {
            "url": "http://2gzyxa5ihm7nsber64qvit6eraokhlmr6scarvb5xqi6hx4i7flrcbad.onion",
            "label": "Example Forum",
            "type": "forum"
        }
    ],
    "keywords": [
        "database dump",
        "leaked"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("olibai/onion-sentinel").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 = {
    "query": "marketplaces",
    "targets": [{
            "url": "http://2gzyxa5ihm7nsber64qvit6eraokhlmr6scarvb5xqi6hx4i7flrcbad.onion",
            "label": "Example Forum",
            "type": "forum",
        }],
    "keywords": [
        "database dump",
        "leaked",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("olibai/onion-sentinel").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 '{
  "query": "marketplaces",
  "targets": [
    {
      "url": "http://2gzyxa5ihm7nsber64qvit6eraokhlmr6scarvb5xqi6hx4i7flrcbad.onion",
      "label": "Example Forum",
      "type": "forum"
    }
  ],
  "keywords": [
    "database dump",
    "leaked"
  ]
}' |
apify call olibai/onion-sentinel --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Onion Sentinel",
        "description": "Advanced dark web discovery & monitoring. Find .onion links via Ahmia, scan hidden services for leaks or keywords, and verify link uptime with robust Tor error tracking. Features screenshots, session video, and circuit isolation. Optimized for speed and stealth via Owl Browser.\"",
        "version": "1.0",
        "x-build-id": "m5hTLu9NfqZX6eHd0"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/olibai~onion-sentinel/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-olibai-onion-sentinel",
                "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/olibai~onion-sentinel/runs": {
            "post": {
                "operationId": "runs-sync-olibai-onion-sentinel",
                "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/olibai~onion-sentinel/run-sync": {
            "post": {
                "operationId": "run-sync-olibai-onion-sentinel",
                "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",
                "required": [
                    "mode",
                    "region"
                ],
                "properties": {
                    "mode": {
                        "title": "Mode",
                        "enum": [
                            "monitoring",
                            "discovery",
                            "uptime-check"
                        ],
                        "type": "string",
                        "description": "Choose between 'monitoring' (scan specific targets), 'discovery' (find new .onion sites) or 'uptime-check' (verify link availability).",
                        "default": "monitoring"
                    },
                    "query": {
                        "title": "Discovery Query",
                        "type": "string",
                        "description": "Search query for Discovery mode (e.g., 'marketplaces', 'forums', 'leaks')."
                    },
                    "targets": {
                        "title": "Monitoring Targets",
                        "maxItems": 10,
                        "type": "array",
                        "description": "List of .onion URLs to monitor (Monitoring mode only). Max 10 URLs."
                    },
                    "keywords": {
                        "title": "Keywords & Queries",
                        "type": "array",
                        "description": "List of keywords to look for (Monitoring mode only).",
                        "items": {
                            "type": "string"
                        }
                    },
                    "region": {
                        "title": "Browser Region",
                        "enum": [
                            "US",
                            "EU"
                        ],
                        "type": "string",
                        "description": "Select the geographic region for the Owl Browser instance.",
                        "default": "US"
                    },
                    "maxPagesPerTarget": {
                        "title": "Max Pages per Target",
                        "minimum": 1,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Limit the number of sub-pages crawled per root URL.",
                        "default": 10
                    },
                    "saveScreenshots": {
                        "title": "Save Evidence Screenshots",
                        "type": "boolean",
                        "description": "Capture screenshots where keywords are found.",
                        "default": true
                    },
                    "saveVideo": {
                        "title": "Save Evidence Video",
                        "type": "boolean",
                        "description": "Record the entire browsing session.",
                        "default": false
                    },
                    "concurrency": {
                        "title": "Concurrency",
                        "minimum": 1,
                        "maximum": 5,
                        "type": "integer",
                        "description": "Number of targets to process in parallel.",
                        "default": 1
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
