# Pieter Levels cancelled ScrapingBee — here’s the prompt he left for builders

> Source: https://physicianforge.com/building/levelsio-diy-scraper-prompt/
> Author: Drew Albert
> Published: 2026-09-09
> Reading time: 6 min
> Tags: saas, scraping, playwright, side-projects, cost, agents
> Type: Ship log
> Site: Physician Forge — Where physician-builders find each other

What @levelsio’s $249→~$1/mo scraper thread actually says, the OpenSERP dead ends, and the full prompt you can hand Cursor if you’re replacing a scraping SaaS on a VPS.

Pieter Levels ([@levelsio](https://x.com/levelsio)) posted this on September 9, 2026. He cancelled a **$249/mo** [ScrapingBee](https://www.scrapingbee.com/) plan, vibe-coded a replacement on his VPS with help from [@javilopen](https://x.com/javilopen), and landed around **~$1/mo** in proxy bandwidth with roughly **90%** success — numbers that are *his*, from [the tweet](https://x.com/levelsio/status/2097638309384036705), not mine.

I’m writing this up for Physician Forge because the thread is a clean map of a pattern I keep seeing in medicine side-projects: you buy a SaaS that “just works,” the bill becomes a quiet tax, then someone shows you the boring DIY path and your brain does the math.

I’m not claiming I built his scraper. I’m not inventing his block rates. Below is what he said, what those tools actually are, and the **prompt** you can paste into Cursor if *you* want to attempt something similar for a use case you’re allowed to automate.

![levelsio’s clip from the tweet — cancel subscription, reason “It’s too expensive”](/images/journal/levelsio-scraper-tweet.gif)

*(GIF extracted from the video attached to [his post](https://x.com/levelsio/status/2097638309384036705).)*

## What he was actually replacing

ScrapingBee is a managed scraping API: you send URLs (or search queries), they handle browsers, proxies, and retries, you pay in credits. Their public pricing page still lists a **Business** tier at **$249/mo** (3M credits, 200 concurrent) — the plan he named.

![ScrapingBee pricing page — Business plan at $249/mo](/images/journal/scrapingbee-pricing.png)

That’s the screenshot as of this writing. Hobby starts at $19. The $249 line is real, not a rhetorical number.

## Attempt 1 — OpenSERP

He tried [OpenSERP](https://github.com/karust/openserp) first — open source, actively starred, self-hosted SERP API (Google / Bing / Yandex / etc.). Repo README pitches “no API keys, no per-search billing.”

![GitHub — karust/openserp, self-hosted SERP API](/images/journal/openserp-github.png)

On his VPS IP and laptop IP it got blocked fast. Then he noticed the architecture problem: default path is **vanilla headless Chrome**. Google’s bot detection eats that. His AI’s comparison, quoted in the tweet: plain `curl` ~**7%** blocked, OpenSERP’s headless browser ~**100%** blocked. His takeaway was blunt — if headless is dead on arrival, the repo doesn’t help you *in practice* for Google, and the docs don’t lead with that failure mode.

OpenSERP’s own architecture docs do describe browser mode (headless Chromium) as the primary path, with a raw HTTP mode for some engines. I’m not arguing with Pieter’s results. I’m noting: open source “SERP API” ≠ “works from a Hetzner box on day one.”

## Attempt 2 — IPRoyal residential proxies

Next he tried [IPRoyal](https://iproyal.com/residential-proxies/) residential IPs. Still not great: he says Google already treated a large share as scrapers — about **60%** blocked in his run. Tainted pool + same detection surface.

![IPRoyal residential proxies marketing page](/images/journal/iproyal-residential.png)

He later found better residential providers. He deliberately **did not name them** (“then they stop working”). I’m not going to invent a list either.

## What worked for him

He built his own stack:

- [Playwright](https://playwright.dev/)
- **Real Google Chrome** on the VPS (not a stripped headless binary pretending to be a user)
- **Headful** (visible browser), **persistent context** (cookies / profile stick around — same idea Playwright documents for logged-in sessions)
- Slow pacing — on the order of **every ~30 seconds**
- Cleaner residential IPs (unnamed)
- Result: ~**90%** success, “similar or better than ScrapingBee,” cost ~**$1/mo** measured in **GB** of proxy traffic because text scraping barely moves the meter

![Playwright docs — storage state / persistent auth patterns](/images/journal/playwright-auth-docs.png)

Playwright’s auth docs are about saving storage state so you don’t re-login every run. Same muscle: treat the browser like a person with a history, not a fresh headless ghost every request.

## The SaaS list he kept

After the ScrapingBee cancel, he says his remaining SaaS stack is:

| Keep | Role |
|------|------|
| Cloudflare Domains | Registrar / DNS |
| Cloudflare Email Sending | Transactional mail |
| Cloudflare R2 | Object storage |
| Backblaze B2 | Backups |
| Hetzner | All VPS / sites |
| xAI | All LLMs (moderation, email drafts, etc.) |

That’s the interesting part for Forge readers. It’s not “never buy software.” It’s **narrow the paid list to boring infrastructure + one model provider**, and rebuild the middle when the middle is a $249 line item you understand well enough to replace.

Physician Forge already lives in that neighborhood — Cloudflare-ish DNS/API work, a VPS, first-party analytics, [Forge Grok on xAI](/building/forge-grok-discord-bot/). Different products. Same instinct.

## The prompt (copy this into Cursor)

This is the body of his thread, lightly cleaned for pasting as an **agent brief**. Attribution stays with him. Use it only for targets and data you’re allowed to collect — search-engine ToS and local law are your problem, not a vibe-coding footnote.

```text
Build me a self-hosted scraping setup on my VPS to replace a paid ScrapingBee-style API.

Context / constraints from a real builder who already tried the obvious paths:

1. OpenSERP (open source, freshly maintained) failed from both VPS IP and laptop IP — blocked quickly.
2. Residential proxies from IPRoyal were heavily tainted — Google already treated ~60% as scrapers; not good enough.
3. OpenSERP’s default path is vanilla headless Chrome. Google detects that immediately. In one AI comparison: plain curl ~7% blocked vs OpenSERP headless ~100% blocked. Do NOT ship a “headless Chromium and hope” design as the primary path.
4. What worked instead:
   - Playwright
   - Real Google Chrome on the VPS
   - Headful browser (not headless)
   - Persistent browser context / profile
   - Slow pacing (~every 30 seconds)
   - Higher-quality residential proxies (I will supply host/user/pass via env — do not hardcode; do not invent a vendor)
5. Success target: ~90% successful fetches, comparable to ScrapingBee Business-class reliability.
6. Cost target: proxy bandwidth on the order of ~$1/mo for text-heavy jobs (measure GB used). I already pay for the VPS.

Implementation requirements:
- Node or Python Playwright project with a clear README
- Env-based config: PROXY_SERVER, PROXY_USERNAME, PROXY_PASSWORD, REQUEST_INTERVAL_MS, CHROME_EXECUTABLE_PATH, USER_DATA_DIR
- Persistent context directory on disk
- Headful launch of real Chrome (channel/chrome path), not only bundled Chromium
- Queue + polite rate limit (default ~30s between jobs)
- Structured JSON output per job (url, status, http-ish outcome, extracted text/html path, error)
- Simple CLI: enqueue URL or query, run worker, print stats (success rate, GB estimate if possible)
- Logging that never prints full proxy passwords
- Health check / dry-run mode that loads a harmless page through the proxy

Out of scope:
- Do not scrape login-walled personal data
- Do not commit secrets
- Do not recommend a specific “secret” residential vendor in the README
- Do not claim ToS compliance for Google SERP — document that the operator must decide legality/permission for each target

Also document why headless-only OpenSERP-style setups fail against modern bot detection, and why persistent headful Chrome + slow pacing changes the fingerprint.
```

That’s it. No magic vendor list. No pretend “we hit 90% on Physician Forge.” The tweet is the source; the prompt is the reusable artifact.

## Why this belongs on a physician-builder site

Side projects in medicine accrue SaaS the same way clinics accrue vendors: each one is “only $49” until you’re at $249 for a pipe you could own.

Levels’ thread is useful because he published the **failed** attempts in order. Open source first. Cheap residentials second. Then the ugly truth about headless Chrome. Then the boring working version. That’s how you brief an agent without lying to it.

If you run something like this, keep the same discipline he ended on: Cloudflare / storage / VPS / one LLM bill — and cancel the middleman when you’ve actually replaced it.

Source: [x.com/levelsio/status/2097638309384036705](https://x.com/levelsio/status/2097638309384036705) (Sep 9, 2026).

---

Canonical HTML: https://physicianforge.com/building/levelsio-diy-scraper-prompt/
Journal: https://physicianforge.com/journal/
Membership: https://physicianforge.com/physician-forge-community/
