documentation

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

  1. Sign up at prolevelmax.com/signup — you'll get a starter credit so you can try a few runs without paying
  2. Create an API key on the dashboard (shown once, save it)
  3. 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:

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

Failed runs are free. Successful runs deduct the calculated amount the moment they complete.

Funding your wallet

Two methods:

  1. 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.
  2. 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

  1. Agent POSTs /v1/run with no X-PAYMENT header
  2. Server returns HTTP 402 with payment requirements in the body
  3. Agent signs an EIP-3009 transferWithAuthorization for the required amount on USDC/Base
  4. Agent retries the request with X-PAYMENT: <base64-encoded-payload>
  5. 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.

platformactions
redditsearch · subreddit · post · user
tiktoksearch · hashtag · user · video
instagramsearch · hashtag · user · post
twittersearch · user · tweet
youtubesearch · channel · video

Filters

Apply with -F <filter>. Chain multiple times.

filtereffect
no-automodRemove AutoModerator posts/comments
no-deletedRemove [deleted]/[removed] content
posts-onlyReddit posts only
comments-onlyReddit comments only
has-mediaItems with image or video attachments
min-score:NScore ≥ N
lang:enFilter by language code
since:YYYY-MM-DDOnly newer than the given date

Output formats

Set with -f <format>. Default is json.

formatshape
jsonPretty JSON array
jsonlOne JSON object per line — great for streaming pipes
csvFlattened nested keys, properly escaped
tableCompact monospace table
summaryHuman-readable with body excerpts

Config & security

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.