ProLevelMax
A single CLI for scraping Reddit, TikTok, Instagram, X/Twitter, YouTube — and 200+ other platforms through the catalog.
Install
curl -fsSL https://prolevelmax.com/install.sh | bash
Or directly via npm:
npm install -g smcli
Requires Node 18 or newer. After install, run smcli --help.
Authenticate
- Sign up at prolevelmax.com/signup — you'll get a starter credit so you can try a few runs without paying
- Create an API key on the dashboard (shown once, save it)
- Authenticate the CLI:
smcli keys add --label main --key sk_smcli_xxxxxxxx
For CI or one-off scripts, you can also use an env var:
SMCLI_KEY=sk_smcli_xxxxxxxx smcli reddit search "topic"
Quick start
# Search Reddit posts about a topic smcli reddit search "sneakers" --max 20 # Pull recent posts from a subreddit smcli reddit subreddit sneakers -o output.json # Tweets from one user, English only, since Jan 1 smcli twitter user @nike --lang en -F since:2025-01-01 # TikTok hashtag → CSV smcli tiktok hashtag sneakers -f csv -o tt.csv # Inspect a scraper's input without spending any credit smcli reddit search "test" --dry-run
Discover & inspect
Don't know which scraper handles what you need? Search.
smcli discover "twitter posts about AI" smcli inspect <scraper> # input schema + smcli price
Useful for agents that need to pick a tool at runtime — same calls back the MCP server below.
Run history (runs)
Every run is persisted, so an agent or script that crashes can resume.
smcli twitter user @nike --async # submit, returns runId # → ✓ Submitted. Run id: run_xxxxxxxxxxxxxxx smcli runs list # show recent runs smcli runs get run_xxx --wait -o out.json # poll, then save items smcli runs get run_xxx --json | jq . # full record for scripts
Output is kept for 30 days. Larger than 5MB is dropped to save space.
Multiple keys (keys)
Separate keys for laptop / CI / projects without rotating constantly.
smcli keys add --label laptop --key sk_smcli_xxxxxxxx smcli keys add --label ci --key sk_smcli_yyyyyyyy --no-activate smcli keys list smcli keys activate ci # switch which one is used smcli --key-label laptop reddit search "test" # one-off override smcli keys remove ci
Connect an AI agent (MCP)
smcli exposes a Model Context Protocol server so Claude Desktop, ChatGPT, Cursor, or any MCP client can use it directly.
URL: https://prolevelmax.com/mcp Auth: Authorization: Bearer sk_smcli_xxxxxxxx
Tools your agent gets:
smcli_discover— search the scraper catalogsmcli_inspect— input schema + price for one scrapersmcli_run— execute a scraper (charges wallet)smcli_runs_get— fetch a previous run
Or paste this one-liner into Claude Code / Cursor:
set up https://prolevelmax.com/SKILL.md
Billing
smcli is pay-as-you-go from a wallet balance. Each scraper has its own price — set independently of any upstream provider's pricing, so your bills are stable and predictable.
Two pricing models
Per call — a flat fee per execution, regardless of result count. Used when the work is bounded and predictable (search queries, single-URL fetches).
{
"type": "PER_CALL",
"amount": 0.003,
"currency": "USD",
"display": "$0.0030/call"
}
Per result — a fee per result item returned, plus an optional flat base fee. Used when output is variable (paginated lists, scraping all posts in a subreddit).
{
"type": "PER_RESULT",
"amount": 0.0005,
"flatFee": 0.001,
"currency": "USD",
"display": "$0.0005/result + $0.0010/call"
}
Where prices are shown
- Discover — every result includes its
pricingfield - Inspect — full pricing detail for one scraper
- Run response — exact charge after a successful run, with breakdown
Failed runs are free. Successful runs deduct the calculated amount the moment they complete.
Funding your wallet
Two methods:
- USDC on Base (recommended) — get a unique deposit address from the dashboard, send any amount. Auto-credited in 1-2 seconds after confirmation. ~$0.001 gas.
- Card via Stripe — top up $5 / $10 / $25 / $50 / $100. (Demo uses a mock endpoint; production routes to Stripe.)
x402 — per-call payments for agents
smcli speaks the x402 protocol on /v1/run. Agents can pay each call with an EIP-3009 USDC signature instead of prefunding a wallet.
Flow
- Agent POSTs
/v1/runwith noX-PAYMENTheader - Server returns HTTP 402 with payment requirements in the body
- Agent signs an EIP-3009
transferWithAuthorizationfor the required amount on USDC/Base - Agent retries the request with
X-PAYMENT: <base64-encoded-payload> - Server verifies the signature, runs the scraper, settles on-chain
402 response shape
{
"error": "Payment Required",
"x402Version": 1,
"accepts": [
{
"scheme": "exact",
"network": "base",
"maxAmountRequired": "3000",
"resource": "/v1/run",
"payTo": "0x...",
"asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"extra": { "name": "USDC", "decimals": 6 }
}
]
}
This is the same shape any x402-compatible wallet (CDP Wallet API, viem, etc.) knows how to handle.
Platforms & actions
These are the curated platform shortcuts — under the hood they map to the catalog.
| platform | actions |
|---|---|
search · subreddit · post · user | |
| tiktok | search · hashtag · user · video |
search · hashtag · user · post | |
search · user · tweet | |
| youtube | search · channel · video |
Filters
Apply with -F <filter>. Chain multiple times.
| filter | effect |
|---|---|
no-automod | Remove AutoModerator posts/comments |
no-deleted | Remove [deleted]/[removed] content |
posts-only | Reddit posts only |
comments-only | Reddit comments only |
has-media | Items with image or video attachments |
min-score:N | Score ≥ N |
lang:en | Filter by language code |
since:YYYY-MM-DD | Only newer than the given date |
Output formats
Set with -f <format>. Default is json.
| format | shape |
|---|---|
json | Pretty JSON array |
jsonl | One JSON object per line — great for streaming pipes |
csv | Flattened nested keys, properly escaped |
table | Compact monospace table |
summary | Human-readable with body excerpts |
Config & security
- Config is stored at
~/.smcli/config.json(or$XDG_CONFIG_HOME/smcli/) with0600permissions. - API keys travel in
Authorization: Bearer, never in URL query strings. - Server side: passwords use bcrypt (12 rounds), API keys are stored as SHA-256 hashes — we can't see them.
smcli config show # masked smcli config path # print config location
Troubleshooting
"No authentication configured": run smcli keys add --label main --key sk_smcli_….
"insufficient balance": top up your wallet on the dashboard.
"scraper engine error": the upstream scraper failed. Retry, or try a different one via smcli discover.
Sync timeout: long runs fall back to async polling automatically. Or use --async + smcli runs get --wait.