Dark Web Scraper - Tor .onion Page Extractor avatar

Dark Web Scraper - Tor .onion Page Extractor

Pricing

from $6.00 / 1,000 page scrapeds

Go to Apify Store
Dark Web Scraper - Tor .onion Page Extractor

Dark Web Scraper - Tor .onion Page Extractor

Scrape supplied Tor.onion or HTTPS pages through bundled Tor. Extract readable text, links, keyword hits, content hashes, and diagnostics with redaction enabled by default. MCP-ready.

Pricing

from $6.00 / 1,000 page scrapeds

Rating

0.0

(0)

Developer

Khadin Akbar

Khadin Akbar

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

an hour ago

Last modified

Share

Dark Web Scraper fetches supplied .onion, HTTP, or HTTPS pages through a bundled Tor client, extracts readable text, titles, metadata, links, keyword matches, content hashes, and diagnostics, and returns structured dataset rows that work well for Apify API and MCP clients.

This actor is built for scoped, lawful OSINT and monitoring workflows. You provide the pages you are authorized to inspect. The actor does not search dark-web indexes, discover hidden services from keywords, log in to private systems, harvest secrets, or bypass access controls.

What You Get

Output fieldMeaning
url, finalUrl, routeInput URL, redirect target, and whether the request used Tor or direct routing
ok, statusCode, responseTimeMsFetch status and timing
title, metaDescription, textPreviewReadable page signals, redacted by default
text, markdownLonger extracted content when responseFormat is detailed
linksExtracted links with hostnames, .onion flags, and crawlability flags
keywordMatchesExact keyword or phrase counts for each page
contentHashSHA-256 hash of readable text before redaction, useful for change detection
redactionCounts of email-like, phone-like, crypto-wallet-like, and secret-like strings masked
errorDiagnostic kind, message, and suggestion for failures

The default key-value store also includes SUMMARY, OUTPUT, RUN_CONFIG, TOR_DIAGNOSTICS, and optional raw HTML_... snapshots.

Common Use Cases

  • Brand, domain, or leak monitoring when you already have candidate pages.
  • Researching public .onion pages with reproducible fetch diagnostics.
  • Checking whether a known hidden-service page is online and has changed.
  • Extracting links from supplied pages while staying inside the original host scope.
  • Feeding an AI agent or MCP workflow with concise page records and safety-oriented defaults.

What This Actor Does Not Do

  • It does not perform dark-web search by keyword.
  • It does not crawl arbitrary onion directories unless you provide those URLs and enable external-host crawling.
  • It does not log in, solve CAPTCHAs, or bypass access controls.
  • It does not provide a secret/API-key harvesting mode.
  • It does not guarantee that a Tor hidden service will be reachable; many are intermittent.

Quick Start

Run the actor with a supplied page:

{
"startUrls": [
{ "url": "https://check.torproject.org/" }
],
"routingMode": "tor",
"maxPages": 1,
"maxDepth": 0,
"responseFormat": "concise"
}

Use direct routing for normal public websites:

{
"startUrls": [
{ "url": "https://example.com/" }
],
"routingMode": "direct",
"maxPages": 1,
"maxDepth": 0,
"keywordMatches": ["Example Domain"]
}

Crawl same-host links from a supplied onion page:

{
"startUrls": [
{ "url": "http://exampleonionaddress.onion/" }
],
"routingMode": "tor",
"maxPages": 10,
"maxDepth": 1,
"crawlExternalHosts": false,
"requestTimeoutSecs": 75
}

Inputs

FieldDefaultNotes
startUrlsTor check pageRequired URL list. Accepts http and https URLs, including .onion.
routingModetortor sends all requests through Tor. auto sends only .onion through Tor. direct rejects .onion.
maxPages3Hard cap on attempted in-scope pages, 1 to 100.
maxDepth1Link-following depth, 0 to 3.
crawlExternalHostsfalseKeeps crawling inside supplied hosts by default.
maxConcurrency2Tor-friendly concurrency, 1 to 5.
requestTimeoutSecs45Per-page timeout. Increase for slow onion services.
torBootstrapTimeoutSecs75How long to wait for the bundled Tor client.
torProxyUrlemptyOptional external SOCKS endpoint, for example socks5h://127.0.0.1:9050.
keywordMatches[]Exact phrase counts, case-insensitive.
responseFormatconcisedetailed returns longer text and simple Markdown.
maxContentChars8000Caps returned text per page.
maxLinksPerPage75Caps stored link objects per page.
redactSensitivetrueMasks sensitive-looking strings before content is stored.
saveHtmlToKeyValueStorefalseSaves raw HTML under HTML_... keys. Raw HTML is not redacted.

Output Example

{
"url": "https://check.torproject.org/",
"finalUrl": "https://check.torproject.org/",
"route": "tor",
"depth": 0,
"ok": true,
"statusCode": 200,
"responseTimeMs": 1842,
"title": "Congratulations. This browser is configured to use Tor.",
"textPreview": "Congratulations. This browser is configured to use Tor...",
"contentChars": 743,
"wordCount": 108,
"contentHash": "b418...",
"linkCount": 8,
"onionLinkCount": 0,
"keywordMatches": [
{ "keyword": "Tor", "count": 4 }
],
"redaction": {
"enabled": true,
"emailLike": 0,
"phoneLike": 0,
"cryptoLike": 0,
"secretLike": 0
},
"error": null,
"fetchedAt": "2026-07-08T12:00:00.000Z"
}

Pricing

This actor uses Pay Per Event pricing.

EventPriceWhen charged
apify-actor-start$0.00005Once when a run starts, scaled by memory
page-scraped$0.006Each page that is successfully fetched, parsed, and returned

Failed pages, Tor bootstrap failures, invalid inputs, and diagnostic-only rows are not charged as page-scraped.

Example costs:

  • 1 successful page: about $0.00605
  • 10 successful pages: about $0.06005
  • 100 successful pages: about $0.60005

Use Apify's maxTotalChargeUsd run option if you want a hard spend cap.

API Example

curl -X POST "https://api.apify.com/v2/acts/khadinakbar~dark-web-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"startUrls": [{ "url": "https://check.torproject.org/" }],
"routingMode": "tor",
"maxPages": 1,
"maxDepth": 0
}'

JavaScript Example

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('khadinakbar/dark-web-scraper').call({
startUrls: [{ url: 'https://check.torproject.org/' }],
routingMode: 'tor',
maxPages: 1,
maxDepth: 0,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0]);

MCP Usage

When exposed through the Apify MCP server, the tool name is derived from the actor slug:

apify-actor-dark-web-scraper

For agent workflows, keep maxPages low, use responseFormat: "concise", and inspect OUTPUT or the first dataset rows before requesting larger crawls.

Only scrape pages you are legally allowed to access and analyze. Some dark-web content may be illegal, harmful, or sensitive. This actor is designed for bounded research and monitoring. It redacts sensitive-looking content by default, keeps crawling inside supplied hosts unless you opt out, and reports diagnostics instead of guessing.

FAQ

Can I use this as a dark-web search engine?

No. This actor fetches supplied URLs and optional in-scope links. It does not search hidden-service indexes by keyword.

Does it need Apify Proxy?

No. The actor starts a Tor client inside the container when Tor routing is needed. You can also provide your own torProxyUrl.

Can it scrape normal websites?

Yes. Use routingMode: "direct" for clearnet sites, or auto if your URL list contains a mix of clearnet and .onion URLs.

Why did my onion URL fail?

Hidden services can be offline, slow, blocked, or intermittently unreachable. Check error.kind, error.suggestion, and TOR_DIAGNOSTICS, then retry with a higher timeout and lower concurrency.

Can it save raw HTML?

Yes. Set saveHtmlToKeyValueStore to true. Raw HTML is saved under HTML_... keys and is not redacted, so use it only for authorized investigations.

Can I integrate it with another app?

Yes. Use the Apify API, Apify client libraries, webhooks, datasets, or MCP. The default output is structured JSON.

How much can I scrape?

The input schema caps maxPages at 100 per run. This keeps Tor runs predictable and prevents accidental broad crawls. Start small and increase gradually.

How can I share feedback?

Open an issue from the Apify actor page or contact the actor owner with a sample run ID and the URL pattern that failed.