Dark Web Scraper - Tor .onion Page Extractor
Pricing
from $6.00 / 1,000 page scrapeds
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
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
an hour ago
Last modified
Categories
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 field | Meaning |
|---|---|
url, finalUrl, route | Input URL, redirect target, and whether the request used Tor or direct routing |
ok, statusCode, responseTimeMs | Fetch status and timing |
title, metaDescription, textPreview | Readable page signals, redacted by default |
text, markdown | Longer extracted content when responseFormat is detailed |
links | Extracted links with hostnames, .onion flags, and crawlability flags |
keywordMatches | Exact keyword or phrase counts for each page |
contentHash | SHA-256 hash of readable text before redaction, useful for change detection |
redaction | Counts of email-like, phone-like, crypto-wallet-like, and secret-like strings masked |
error | Diagnostic 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
.onionpages 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
| Field | Default | Notes |
|---|---|---|
startUrls | Tor check page | Required URL list. Accepts http and https URLs, including .onion. |
routingMode | tor | tor sends all requests through Tor. auto sends only .onion through Tor. direct rejects .onion. |
maxPages | 3 | Hard cap on attempted in-scope pages, 1 to 100. |
maxDepth | 1 | Link-following depth, 0 to 3. |
crawlExternalHosts | false | Keeps crawling inside supplied hosts by default. |
maxConcurrency | 2 | Tor-friendly concurrency, 1 to 5. |
requestTimeoutSecs | 45 | Per-page timeout. Increase for slow onion services. |
torBootstrapTimeoutSecs | 75 | How long to wait for the bundled Tor client. |
torProxyUrl | empty | Optional external SOCKS endpoint, for example socks5h://127.0.0.1:9050. |
keywordMatches | [] | Exact phrase counts, case-insensitive. |
responseFormat | concise | detailed returns longer text and simple Markdown. |
maxContentChars | 8000 | Caps returned text per page. |
maxLinksPerPage | 75 | Caps stored link objects per page. |
redactSensitive | true | Masks sensitive-looking strings before content is stored. |
saveHtmlToKeyValueStore | false | Saves 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.
| Event | Price | When charged |
|---|---|---|
apify-actor-start | $0.00005 | Once when a run starts, scaled by memory |
page-scraped | $0.006 | Each 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.
Legal And Safety Notes
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.
Related Actors
- Website Uptime Monitor
- Web Unlocker
- Username OSINT Scraper
- Google SERP All-in-One Scraper
- Broken Link Checker
- SEO Domain Keyword Scraper
- Bulk Website Contact Extractor
- Contact Details Scraper
- Reddit Posts Search Scraper
- AI Brand Monitor MCP
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.