PryScraper — multi-source crypto intelligence crawler. FastAPI + Docker. CLI + MCP server + SDK (munchcrawl_sdk.py). Scraper, extractor, parser, automator, job queue. Referral proxy rotation. Closed-source.
Find a file
cryptorugmunch 7e0b93dd84 feat(pry): wire captcha_solver.CaptchaSolver into /v1/auth/captcha endpoint
The big captcha_solver.py (6 providers: capsolver/2captcha/anti-captcha/
capmonster/deathbycaptcha/nextcaptcha, supports reCAPTCHA v2/v3, hCaptcha,
Turnstile, image) was an orphan module — never imported. The /v1/auth/captcha
endpoint was using the smaller auth_connector.solve_captcha (2 providers,
2captcha stubbed out).

This commit:
- Replaces the /v1/auth/captcha handler to delegate to CaptchaSolver
- Adds support for captcha_type: recaptcha_v2, recaptcha_v3, hcaptcha, image
- Adds per-provider api_keys dict for the 6-provider chain
- Adds tests/test_captcha_solver_wiring.py
- Annotates account_manager.py and signup_automator.py (BSL-licensed) with
  notes about their unwired status and where they belong in the architecture

The two remaining orphan modules are kept (not deleted) because they are
BSL 1.1 stealth code that may be wired in the future as anti-fingerprint
or identity-evasion routes. See FEATURES.md and ARCHITECTURE.md.

Audit item 10. Tests: 623 passed, 1 skipped (test_ready_returns_200 fails
pre-existing because Ollama is unreachable from test env).
2026-07-06 10:37:55 +02:00
.actor feat(pry): production readiness pass — apify actor, async db, retry wiring, tests, observability, mypy 2026-07-03 14:41:41 +02:00
.forgejo ci(forgejo): install Node.js before actions/checkout@v4 (#2) 2026-07-03 00:42:15 +02:00
.github feat(pry): production readiness pass — apify actor, async db, retry wiring, tests, observability, mypy 2026-07-03 14:41:41 +02:00
alembic fix(deploy): ensure /root/.pry dir and volume exist for SQLite migrations (#7) 2026-07-03 02:46:17 +02:00
browser-extension chore(license): re-license to dual MIT (core) + BSL 1.1 (stealth) 2026-07-02 19:59:18 +02:00
docs/adr chore(license): re-license to dual MIT (core) + BSL 1.1 (stealth) 2026-07-02 19:59:18 +02:00
llm_providers feat(pry): phase 0 — split routers, add tests, apify schema, pry api key (#5) 2026-07-03 03:43:02 +02:00
pry_mcp refactor(mcp): split mcp_production.py into pry_mcp/ sub-package 2026-07-03 14:52:59 +02:00
routers feat(pry): wire captcha_solver.CaptchaSolver into /v1/auth/captcha endpoint 2026-07-06 10:37:55 +02:00
shopify-app chore(license): re-license to dual MIT (core) + BSL 1.1 (stealth) 2026-07-02 19:59:18 +02:00
stealth_scripts chore(license): re-license to dual MIT (core) + BSL 1.1 (stealth) 2026-07-02 19:59:18 +02:00
templates chore(lint): auto-fix 253 of 283 ruff issues (F401, I001, E402, RUF100, UP037, SIM105) 2026-07-02 21:51:25 +02:00
tests feat(pry): wire captcha_solver.CaptchaSolver into /v1/auth/captcha endpoint 2026-07-06 10:37:55 +02:00
wordpress-plugin chore(license): re-license to dual MIT (core) + BSL 1.1 (stealth) 2026-07-02 19:59:18 +02:00
workers chore(license): re-license to dual MIT (core) + BSL 1.1 (stealth) 2026-07-02 19:59:18 +02:00
.commitlintrc.yml feat(pry): production readiness pass — apify actor, async db, retry wiring, tests, observability, mypy 2026-07-03 14:41:41 +02:00
.dockerignore docs: apply fleet-template (16-artifact scaffold) 2026-07-02 02:07:13 +07:00
.env.example refactor(settings): unify config.py, mconfig.py, and settings.py into single PrySettings 2026-07-03 05:04:29 +02:00
.gitignore docs: apply fleet-template (16-artifact scaffold) 2026-07-02 02:07:13 +07:00
.pre-commit-config.yaml chore(license): re-license to dual MIT (core) + BSL 1.1 (stealth) 2026-07-02 19:59:18 +02:00
.secretsallow docs: apply fleet-template (16-artifact scaffold) 2026-07-02 02:07:13 +07:00
account_manager.py feat(pry): wire captcha_solver.CaptchaSolver into /v1/auth/captcha endpoint 2026-07-06 10:37:55 +02:00
actor_marketplace.py chore(lint): auto-fix 253 of 283 ruff issues (F401, I001, E402, RUF100, UP037, SIM105) 2026-07-02 21:51:25 +02:00
adaptive.py chore(license): re-license to dual MIT (core) + BSL 1.1 (stealth) 2026-07-02 19:59:18 +02:00
advanced.py feat(pry): production readiness pass — apify actor, async db, retry wiring, tests, observability, mypy 2026-07-03 14:41:41 +02:00
agency.py chore(lint): auto-fix 253 of 283 ruff issues (F401, I001, E402, RUF100, UP037, SIM105) 2026-07-02 21:51:25 +02:00
AGENTS.md chore(license): re-license to dual MIT (core) + BSL 1.1 (stealth) 2026-07-02 19:59:18 +02:00
ai_plugin.py chore(license): re-license to dual MIT (core) + BSL 1.1 (stealth) 2026-07-02 19:59:18 +02:00
alembic.ini feat(db): add Alembic migrations (#6) 2026-07-03 02:22:33 +02:00
alerter.py ci(forgejo): install Node.js before actions/checkout@v4 (#2) 2026-07-03 00:42:15 +02:00
anomaly.py chore(lint): auto-fix 253 of 283 ruff issues (F401, I001, E402, RUF100, UP037, SIM105) 2026-07-02 21:51:25 +02:00
api.py refactor(mcp): modernize imports to use pry_mcp sub-package directly 2026-07-03 15:18:11 +02:00
apify_actor.py feat(pry): production readiness pass — apify actor, async db, retry wiring, tests, observability, mypy 2026-07-03 14:41:41 +02:00
apify_schema.py feat(db): add Alembic migrations (#6) 2026-07-03 02:22:33 +02:00
ARCHITECTURE.md chore(license): re-license to dual MIT (core) + BSL 1.1 (stealth) 2026-07-02 19:59:18 +02:00
AUDIT.md chore(license): re-license to dual MIT (core) + BSL 1.1 (stealth) 2026-07-02 19:59:18 +02:00
auth.py chore(lint): auto-fix 253 of 283 ruff issues (F401, I001, E402, RUF100, UP037, SIM105) 2026-07-02 21:51:25 +02:00
auth_connector.py ci(forgejo): install Node.js before actions/checkout@v4 (#2) 2026-07-03 00:42:15 +02:00
automator.py fix(lint): resolve remaining ruff errors and unblock MCP SSE test (#1) 2026-07-02 23:18:40 +02:00
behavioral_biometrics.py chore(lint): auto-fix 253 of 283 ruff issues (F401, I001, E402, RUF100, UP037, SIM105) 2026-07-02 21:51:25 +02:00
browser_pool.py refactor(exceptions): add ruff BLE001; convert 103 broad except Exception 2026-07-02 21:04:53 +02:00
cache.py feat(observability): structured logging, metrics wiring, graceful degradation 2026-07-03 12:13:03 +02:00
camoufox_integration.py fix(lint): resolve remaining ruff errors and unblock MCP SSE test (#1) 2026-07-02 23:18:40 +02:00
captcha_solver.py chore(lint): auto-fix 253 of 283 ruff issues (F401, I001, E402, RUF100, UP037, SIM105) 2026-07-02 21:51:25 +02:00
cli.py refactor(mcp): modernize imports to use pry_mcp sub-package directly 2026-07-03 15:18:11 +02:00
client.py chore(license): re-license to dual MIT (core) + BSL 1.1 (stealth) 2026-07-02 19:59:18 +02:00
commerce_sync.py ci(forgejo): install Node.js before actions/checkout@v4 (#2) 2026-07-03 00:42:15 +02:00
compliance.py chore(lint): auto-fix 253 of 283 ruff issues (F401, I001, E402, RUF100, UP037, SIM105) 2026-07-02 21:51:25 +02:00
cookie_warmer.py chore(lint): auto-fix 253 of 283 ruff issues (F401, I001, E402, RUF100, UP037, SIM105) 2026-07-02 21:51:25 +02:00
costing.py chore(lint): auto-fix 253 of 283 ruff issues (F401, I001, E402, RUF100, UP037, SIM105) 2026-07-02 21:51:25 +02:00
crm_sync.py ci(forgejo): install Node.js before actions/checkout@v4 (#2) 2026-07-03 00:42:15 +02:00
db.py feat(pry): production readiness pass — apify actor, async db, retry wiring, tests, observability, mypy 2026-07-03 14:41:41 +02:00
DECISIONS.md chore(license): re-license to dual MIT (core) + BSL 1.1 (stealth) 2026-07-02 19:59:18 +02:00
dedup.py ci(forgejo): install Node.js before actions/checkout@v4 (#2) 2026-07-03 00:42:15 +02:00
DEPLOYMENT.md chore(license): re-license to dual MIT (core) + BSL 1.1 (stealth) 2026-07-02 19:59:18 +02:00
deps.py refactor(settings): unify config.py, mconfig.py, and settings.py into single PrySettings 2026-07-03 05:04:29 +02:00
destinations.py fix(lint): resolve remaining ruff errors and unblock MCP SSE test (#1) 2026-07-02 23:18:40 +02:00
DEVELOPMENT.md feat(logging): add structlog + JSON logging (CONVENTIONS.md Part 5) 2026-07-02 20:55:41 +02:00
docker-compose.yml fix(deploy): merge duplicate volumes sections in docker-compose.yml (#10) 2026-07-03 03:56:08 +02:00
docker-entrypoint.sh feat(db): add Alembic migrations (#6) 2026-07-03 02:22:33 +02:00
Dockerfile feat(pry): production readiness pass — apify actor, async db, retry wiring, tests, observability, mypy 2026-07-03 14:41:41 +02:00
Dockerfile.apify feat(pry): production readiness pass — apify actor, async db, retry wiring, tests, observability, mypy 2026-07-03 14:41:41 +02:00
email_scraper.py ci(forgejo): install Node.js before actions/checkout@v4 (#2) 2026-07-03 00:42:15 +02:00
enrichment.py ci(forgejo): install Node.js before actions/checkout@v4 (#2) 2026-07-03 00:42:15 +02:00
errors.py chore(license): re-license to dual MIT (core) + BSL 1.1 (stealth) 2026-07-02 19:59:18 +02:00
extraction.py ci(forgejo): install Node.js before actions/checkout@v4 (#2) 2026-07-03 00:42:15 +02:00
extractor.py feat(observability): structured logging, metrics wiring, graceful degradation 2026-07-03 12:13:03 +02:00
FEATURES.md chore(license): re-license to dual MIT (core) + BSL 1.1 (stealth) 2026-07-02 19:59:18 +02:00
freshness.py ci(forgejo): install Node.js before actions/checkout@v4 (#2) 2026-07-03 00:42:15 +02:00
gdpr.py chore(lint): auto-fix 253 of 283 ruff issues (F401, I001, E402, RUF100, UP037, SIM105) 2026-07-02 21:51:25 +02:00
gdpr_real.py chore(lint): auto-fix 253 of 283 ruff issues (F401, I001, E402, RUF100, UP037, SIM105) 2026-07-02 21:51:25 +02:00
glama.json chore(license): re-license to dual MIT (core) + BSL 1.1 (stealth) 2026-07-02 19:59:18 +02:00
graphql_discovery.py ci(forgejo): install Node.js before actions/checkout@v4 (#2) 2026-07-03 00:42:15 +02:00
intelligence.py feat(sql): migrate intelligence, monitor, and referrals to SQLAlchemy (#4) 2026-07-03 01:29:59 +02:00
jobqueue.py fix(lint): resolve remaining ruff errors and unblock MCP SSE test (#1) 2026-07-02 23:18:40 +02:00
lazy_load.py chore(license): re-license to dual MIT (core) + BSL 1.1 (stealth) 2026-07-02 19:59:18 +02:00
LICENSE chore(license): re-license to dual MIT (core) + BSL 1.1 (stealth) 2026-07-02 19:59:18 +02:00
LICENSE-BSL-STEALTH chore(license): re-license to dual MIT (core) + BSL 1.1 (stealth) 2026-07-02 19:59:18 +02:00
LICENSING_PRICING_STRATEGY.md chore(license): re-license to dual MIT (core) + BSL 1.1 (stealth) 2026-07-02 19:59:18 +02:00
llm_features.py chore(lint): auto-fix 253 of 283 ruff issues (F401, I001, E402, RUF100, UP037, SIM105) 2026-07-02 21:51:25 +02:00
logging_config.py fix(lint): resolve remaining ruff errors and unblock MCP SSE test (#1) 2026-07-02 23:18:40 +02:00
Makefile docs: apply fleet-template (16-artifact scaffold) 2026-07-02 02:07:13 +07:00
markdown_gen.py chore(license): re-license to dual MIT (core) + BSL 1.1 (stealth) 2026-07-02 19:59:18 +02:00
mcp_production.py refactor(mcp): split mcp_production.py into pry_mcp/ sub-package 2026-07-03 14:52:59 +02:00
mcp_server.py chore(lint): auto-fix 253 of 283 ruff issues (F401, I001, E402, RUF100, UP037, SIM105) 2026-07-02 21:51:25 +02:00
mcp_sse.py refactor(mcp): modernize imports to use pry_mcp sub-package directly 2026-07-03 15:18:11 +02:00
MCP_X402_AUDIT.md chore(license): re-license to dual MIT (core) + BSL 1.1 (stealth) 2026-07-02 19:59:18 +02:00
monitor.py feat(sql): migrate intelligence, monitor, and referrals to SQLAlchemy (#4) 2026-07-03 01:29:59 +02:00
network.py chore(license): re-license to dual MIT (core) + BSL 1.1 (stealth) 2026-07-02 19:59:18 +02:00
observability.py feat(pry): production readiness pass — apify actor, async db, retry wiring, tests, observability, mypy 2026-07-03 14:41:41 +02:00
ocr_extractor.py ci(forgejo): install Node.js before actions/checkout@v4 (#2) 2026-07-03 00:42:15 +02:00
openapi.json feat(pry): phase 0 — split routers, add tests, apify schema, pry api key (#5) 2026-07-03 03:43:02 +02:00
parser.py chore(lint): auto-fix 253 of 283 ruff issues (F401, I001, E402, RUF100, UP037, SIM105) 2026-07-02 21:51:25 +02:00
paths.py chore(lint): auto-fix 253 of 283 ruff issues (F401, I001, E402, RUF100, UP037, SIM105) 2026-07-02 21:51:25 +02:00
pdf_extractor.py ci(forgejo): install Node.js before actions/checkout@v4 (#2) 2026-07-03 00:42:15 +02:00
pipeline.py chore(lint): auto-fix 253 of 283 ruff issues (F401, I001, E402, RUF100, UP037, SIM105) 2026-07-02 21:51:25 +02:00
pipelines.py chore(lint): auto-fix 253 of 283 ruff issues (F401, I001, E402, RUF100, UP037, SIM105) 2026-07-02 21:51:25 +02:00
PLAN.md chore(license): re-license to dual MIT (core) + BSL 1.1 (stealth) 2026-07-02 19:59:18 +02:00
proxy_manager.py chore(lint): auto-fix 253 of 283 ruff issues (F401, I001, E402, RUF100, UP037, SIM105) 2026-07-02 21:51:25 +02:00
proxy_referrals.py chore(lint): auto-fix 253 of 283 ruff issues (F401, I001, E402, RUF100, UP037, SIM105) 2026-07-02 21:51:25 +02:00
pry_sdk.py chore(license): re-license to dual MIT (core) + BSL 1.1 (stealth) 2026-07-02 19:59:18 +02:00
pryextras.py ci(forgejo): install Node.js before actions/checkout@v4 (#2) 2026-07-03 00:42:15 +02:00
pryfile.py feat(pry): production readiness pass — apify actor, async db, retry wiring, tests, observability, mypy 2026-07-03 14:41:41 +02:00
pulsemcp.json chore(license): re-license to dual MIT (core) + BSL 1.1 (stealth) 2026-07-02 19:59:18 +02:00
pyproject.toml feat(pry): production readiness pass — apify actor, async db, retry wiring, tests, observability, mypy 2026-07-03 14:41:41 +02:00
quality.py chore(lint): auto-fix 253 of 283 ruff issues (F401, I001, E402, RUF100, UP037, SIM105) 2026-07-02 21:51:25 +02:00
ratelimit.py chore(license): re-license to dual MIT (core) + BSL 1.1 (stealth) 2026-07-02 19:59:18 +02:00
README.md chore(license): re-license to dual MIT (core) + BSL 1.1 (stealth) 2026-07-02 19:59:18 +02:00
reconciliation.py fix(lint): resolve remaining ruff errors and unblock MCP SSE test (#1) 2026-07-02 23:18:40 +02:00
referrals.py feat(sql): migrate intelligence, monitor, and referrals to SQLAlchemy (#4) 2026-07-03 01:29:59 +02:00
reports.py chore(lint): auto-fix 253 of 283 ruff issues (F401, I001, E402, RUF100, UP037, SIM105) 2026-07-02 21:51:25 +02:00
reports_real.py chore(lint): auto-fix 253 of 283 ruff issues (F401, I001, E402, RUF100, UP037, SIM105) 2026-07-02 21:51:25 +02:00
requirements.lock feat(pry): phase 0 — split routers, add tests, apify schema, pry api key (#5) 2026-07-03 03:43:02 +02:00
requirements.txt feat(pry): phase 0 — split routers, add tests, apify schema, pry api key (#5) 2026-07-03 03:43:02 +02:00
resilience.py feat(resilience): circuit breakers and per-domain tier memory 2026-07-03 11:49:33 +02:00
retry.py feat(pry): production readiness pass — apify actor, async db, retry wiring, tests, observability, mypy 2026-07-03 14:41:41 +02:00
review.py chore(lint): auto-fix 253 of 283 ruff issues (F401, I001, E402, RUF100, UP037, SIM105) 2026-07-02 21:51:25 +02:00
ROADMAP.md chore(license): re-license to dual MIT (core) + BSL 1.1 (stealth) 2026-07-02 19:59:18 +02:00
schema_extraction.py chore(lint): auto-fix 253 of 283 ruff issues (F401, I001, E402, RUF100, UP037, SIM105) 2026-07-02 21:51:25 +02:00
scraper.py feat(pry): production readiness pass — apify actor, async db, retry wiring, tests, observability, mypy 2026-07-03 14:41:41 +02:00
secrets_backend.py chore(lint): auto-fix 253 of 283 ruff issues (F401, I001, E402, RUF100, UP037, SIM105) 2026-07-02 21:51:25 +02:00
SECURITY.md chore(license): re-license to dual MIT (core) + BSL 1.1 (stealth) 2026-07-02 19:59:18 +02:00
seo_monitor.py ci(forgejo): install Node.js before actions/checkout@v4 (#2) 2026-07-03 00:42:15 +02:00
sessions.py chore(lint): auto-fix 253 of 283 ruff issues (F401, I001, E402, RUF100, UP037, SIM105) 2026-07-02 21:51:25 +02:00
settings.py refactor(settings): unify config.py, mconfig.py, and settings.py into single PrySettings 2026-07-03 05:04:29 +02:00
shadow_dom.py chore(license): re-license to dual MIT (core) + BSL 1.1 (stealth) 2026-07-02 19:59:18 +02:00
signup_automator.py feat(pry): wire captcha_solver.CaptchaSolver into /v1/auth/captcha endpoint 2026-07-06 10:37:55 +02:00
smithery.yaml chore(license): re-license to dual MIT (core) + BSL 1.1 (stealth) 2026-07-02 19:59:18 +02:00
STATUS.md feat(pry): phase 0 — split routers, add tests, apify schema, pry api key (#5) 2026-07-03 03:43:02 +02:00
stealth_engine.py chore(lint): auto-fix 253 of 283 ruff issues (F401, I001, E402, RUF100, UP037, SIM105) 2026-07-02 21:51:25 +02:00
structure_monitor.py feat(pry): production readiness pass — apify actor, async db, retry wiring, tests, observability, mypy 2026-07-03 14:41:41 +02:00
tasks.py fix(lint): resolve remaining ruff errors and unblock MCP SSE test (#1) 2026-07-02 23:18:40 +02:00
template_engine.py chore(license): re-license to dual MIT (core) + BSL 1.1 (stealth) 2026-07-02 19:59:18 +02:00
test.sh chore(license): re-license to dual MIT (core) + BSL 1.1 (stealth) 2026-07-02 19:59:18 +02:00
TESTING.md chore(license): re-license to dual MIT (core) + BSL 1.1 (stealth) 2026-07-02 19:59:18 +02:00
tls_fingerprint.py chore(lint): auto-fix 253 of 283 ruff issues (F401, I001, E402, RUF100, UP037, SIM105) 2026-07-02 21:51:25 +02:00
training_data.py chore(lint): auto-fix 253 of 283 ruff issues (F401, I001, E402, RUF100, UP037, SIM105) 2026-07-02 21:51:25 +02:00
ultimate_scraper.py feat(pry): production readiness pass — apify actor, async db, retry wiring, tests, observability, mypy 2026-07-03 14:41:41 +02:00
url_guard.py feat(url_guard): SSRF and path traversal guard for scraper inputs 2026-07-03 12:00:40 +02:00
USAGE.md chore(license): re-license to dual MIT (core) + BSL 1.1 (stealth) 2026-07-02 19:59:18 +02:00
webhook_delivery.py ci(forgejo): install Node.js before actions/checkout@v4 (#2) 2026-07-03 00:42:15 +02:00
websocket_scraper.py chore(lint): auto-fix 253 of 283 ruff issues (F401, I001, E402, RUF100, UP037, SIM105) 2026-07-02 21:51:25 +02:00
wrangler.toml chore(license): re-license to dual MIT (core) + BSL 1.1 (stealth) 2026-07-02 19:59:18 +02:00
x402.py feat(db): add Alembic migrations (#6) 2026-07-03 02:22:33 +02:00
x402_middleware.py feat(observability): structured logging, metrics wiring, graceful degradation 2026-07-03 12:13:03 +02:00

//: # (Copyright (c) 2026 Rug Munch Media LLC)

Pry — Open any website

Self-hosted web scraping + browser automation API. Cloudflare bypass, document parsing, AI summarization. No API keys needed.

Quickstart

# Install
pip install pry

# Start the server
pry serve

# Scrape a URL
pry open https://example.com

# With JSON extraction
pry open https://store.com/product --json --schema product.json

# Crawl a site
pry crawl https://docs.com --max-pages 20 -o data.json

Docker

docker compose up -d
# Pry on :8002, FlareSolverr on :8191

CLI Reference

Command Description
pry open <url> Scrape URL to clean markdown
pry watch <url> Monitor page for changes
pry crawl <url> Crawl multiple pages
pry batch <file> Batch scrape URLs from file
pry parse <url> Parse PDF/DOCX/image
pry ss <url> Take screenshot
pry run [pry.yml] Execute job file
pry serve Start API server

API

POST /v1/scrape

{"url": "https://example.com", "bypassCloudflare": true, "formats": ["markdown"]}

POST /v1/crawl

{"url": "https://docs.com", "maxPages": 10, "maxDepth": 2}

POST /v1/automate

{"steps": [{"action": "navigate", "url": "https://...", {"action": "click", "selector": "#btn"}]]}

POST /v1/vision

Analyze images with free OpenRouter vision models. Auto-fallback across 5 models.

{"url": "https://...", "question": "What is shown?"}

POST /v1/extract

Extract structured data with JSON schema + optional AI fallback.

POST /v1/batch

Scrape up to 50 URLs in parallel.

POST /v1/compare

Diff two URLs.

POST /v1/summarize

AI summarization via local Ollama (free, private).

GET /health

Service health + cache stats + active sessions.

Python SDK

    from pry_sdk import PryCrawl

mc = PryCrawl("http://localhost:8002")
result = await mc.scrape("https://example.com")
print(result["data"]["markdown"])
    from pry_sdk import PryCrawlSync

mc = PryCrawlSync("http://localhost:8002")
result = mc.scrape("https://example.com")

SDK Methods

Method Description
scrape(url, **opts) Scrape to markdown
scrape_json(url, schema, **opts) Scrape with JSON extraction
crawl(url, max_pages, **opts) Crawl site
map(url, limit) Discover URLs
parse(url) Parse document
automate(steps, **opts) Browser automation
screenshot(url) Screenshot page
health() Service health

MCP (AI Agent Integration)

POST /mcp/call
{"name": "pry_scrape", "arguments": {"url": "https://..."}}

Compatible with Claude, Hermes, Cursor, and any MCP client.

Features

  • 4-tier anti-detection: Direct → FlareSolverr → Playwright → Googlebot
  • Cloudflare bypass: Automatic via FlareSolverr
  • Document parsing: PDF, DOCX, images (OCR), CSV, JSON
  • Browser automation: Login flows, form filling, sessions
  • Vision AI: Free OpenRouter vision models with auto-fallback
  • Diff tracking: Page change monitoring with webhooks
  • Batch processing: Parallel scrape with templates
  • SEO analysis: Title, meta, headings, keywords, readability
  • Schema extraction: JSON-LD, Open Graph, microdata
  • Export formats: JSON, CSV, RSS, TXT, SQL
  • Rate limiting: Per-IP token bucket (default 120 RPM)
  • Caching: LRU + Redis with TTL-based invalidation
  • WebSocket streaming: Real-time job progress
  • Circuit breaker: Per-domain backoff on failures

Architecture

┌─────────────┐  ┌──────────────┐  ┌──────────┐
│   Client    │→ │  Pry API     │→ │ Scraper  │
│ (CLI/SDK)   │  │  (FastAPI)   │  │  Engine  │
└─────────────┘  └──────┬───────┘  └────┬─────┘
                        │               ├─ Direct HTTP
                        │               ├─ FlareSolverr
                        │               ├─ Playwright
                        │               └─ Googlebot
                        │
                   ┌────┴────┐
                   │ Cache   │
                   │ Redis   │
                   │ Rate    │
                   └─────────┘

Deployment

docker compose up -d

Bare metal

pip install pry
playwright install chromium
# Optional: docker run -d -p 8191:8191 ghcr.io/flaresolverr/flaresolverr
pry serve

Environment

Variable Default Description
PRY_URL http://localhost:8005 API endpoint for CLI
TOR_ENABLED false Enable Tor routing
PROXY_URL HTTP/SOCKS proxy URL
RATE_LIMIT_RPM 120 Requests per minute
OPENROUTER_API_KEY For vision endpoint

Development

make install      # Install with dev deps
make dev          # Start hot-reload server
make lint         # ruff check
make format       # ruff format
make typecheck    # mypy
make test         # pytest
make check        # Full audit

License

Pry is dual-licensed to balance community openness with the protection of its advanced anti-detection and stealth capabilities.

  • Most code (core functionality, utilities, and standard modules) is licensed under the MIT License. This permissive license encourages community contributions and wide adoption. See LICENSE.

  • The anti-detection / stealth module is licensed under the BSL 1.1 (Business Source License). This module is free to use for non-production purposes; a commercial license is required for any production use. See LICENSE-BSL-STEALTH.

Additional Use Grant

Under the BSL 1.1, an Additional Use Grant permits free use of the stealth module for:

  • Personal, non-commercial projects
  • Non-production testing and evaluation
  • Academic research
  • Non-commercial open source software development
  • A 90-day evaluation period for any other purpose

For commercial licensing (production use, enterprise deployment, or embedding in proprietary products), please contact: enterprise@rugmunch.io