Urlbox is one of the most established screenshot APIs on the market. It has an impressive feature list, a proven track record, and a mature platform. But it also has a pricing model that can be painful at scale and a complexity that many developers don’t need.
If you’ve been using Urlbox and wondering if there’s a simpler, more cost-effective option — or if you’re evaluating both for a new project — this post breaks down the real differences.
The Core Difference: Philosophy
Urlbox is a power tool. It supports an enormous number of parameters, webhook callbacks, S3 integration, retina rendering, dark mode simulation, and more. If you need every possible rendering option, Urlbox probably has it.
len.sh is built on a different philosophy: cover 95% of real-world use cases with a simpler API, transparent pricing, and zero feature gating. Instead of one endpoint that does everything, we have purpose-built endpoints for the three most common tasks: screenshots, OG images, and PDFs.
The question is whether you need the other 5% that Urlbox offers — and whether it’s worth paying significantly more for it.
Pricing: The Elephant in the Room
Urlbox doesn’t offer a free tier. The cheapest plan starts at $19/month for 2,000 screenshots. That’s fine for production use, but it means you can’t evaluate the API without spending money.
Here’s how the pricing compares at different scales:
| Monthly Volume | len.sh | Urlbox | Difference |
|---|---|---|---|
| 100 (testing) | Free | $19 (min) | $19/mo saved |
| 2,000 | €19 | $19 | Even |
| 5,000 | €19 | $49 | $30/mo saved |
| 25,000 | €19 | $149 | $130/mo saved |
| 100,000 | €99 | $349 | $250/mo saved |
| 500,000 | €99 | Custom | Significant |
At 25,000 screenshots per month, the difference is $130/month — $1,560 per year. At 100,000 screenshots, you’re saving $3,000 per year. That’s real money, especially for a startup or small team.
Why the Price Difference?
len.sh is built entirely on Cloudflare’s infrastructure — Workers, Browser Rendering API, R2 for caching, D1 for the database. This gives us a fundamentally lower cost structure than providers running their own server fleet. We pass those savings to customers.
No Feature Gating
This is the other pricing difference that matters. With len.sh, every feature is available on every plan:
- Free tier: full API access, all parameters, all output formats, OG images, PDFs, signed URLs
- €19/mo Pro: same features, higher volume (25,000/mo)
- €99/mo Scale: same features, much higher volume (500,000/mo)
Urlbox gates certain features by plan tier. Higher concurrency, priority rendering, and some advanced options require more expensive plans. This means you might build your integration on the free trial, then discover you need a higher tier for a feature your production workflow requires.
Feature Comparison
| Feature | len.sh | Urlbox |
|---|---|---|
| Screenshot capture | Yes | Yes |
| Full-page capture | Yes | Yes |
| Custom viewport | Yes (1-3840px) | Yes |
| Output formats | PNG, JPEG, WebP | PNG, JPEG, WebP |
| PDF generation | Dedicated /v1/pdf endpoint | Yes |
| OG image generation | Dedicated /v1/og endpoint | No |
| Custom JS injection | Yes | Yes |
| Custom CSS injection | Yes | Yes |
| Ad blocking | Yes | Yes |
| Cookie banner blocking | Yes | Yes |
| Element selector capture | Yes | Yes |
| Signed URLs | Yes (HMAC-SHA256) | Yes |
| Device scale (retina) | Yes (1-3x) | Yes |
| Wait strategies | load, domcontentloaded, networkidle0, networkidle2 | Multiple options |
| Webhook callbacks | No | Yes |
| S3 integration | No | Yes |
| Dark mode simulation | No | Yes |
| Geo-targeted rendering | No | Yes |
| Proxy support | No | Yes |
| Auth: Bearer header | Yes | No |
| Free tier | 100/mo | None |
Where Urlbox Wins
- Webhooks and async processing — if you need to queue screenshots and receive results via callback, Urlbox supports this natively.
- S3 integration — direct upload to your S3 bucket without an intermediate step.
- Dark mode — simulate dark mode preferences on the target page.
- Geo-targeting — render pages from specific geographic locations.
- Proxy support — route requests through custom proxies.
These are real features that matter for specific use cases. If your workflow depends on any of them, Urlbox might be worth the premium.
Where len.sh Wins
- Dedicated OG image endpoint — generate branded social cards without building HTML templates.
- Dedicated PDF endpoint — purpose-built parameters for paper size, margins, page ranges, headers, and footers.
- Price — 50-80% cheaper at comparable volumes.
- Free tier — evaluate the API without spending anything.
- Simpler API — fewer parameters, clearer endpoint separation, faster onboarding.
- Bearer auth — header-based authentication keeps keys out of URLs and server logs.
API Comparison
Taking a Screenshot
Urlbox:
curl "https://api.urlbox.io/v1/YOUR_API_KEY/png?url=https://example.com&width=1280&height=720&full_page=true"
len.sh:
curl "https://api.len.sh/v1/screenshot?url=https://example.com&width=1280&height=720&full_page=true&access_key=YOUR_API_KEY"
Both are one-liner curl commands. The main structural difference is that Urlbox embeds the API key and format in the URL path, while len.sh uses query parameters.
Generating a PDF
Urlbox:
curl "https://api.urlbox.io/v1/YOUR_API_KEY/pdf?url=https://example.com/invoice"
len.sh:
curl "https://api.len.sh/v1/pdf?url=https://example.com/invoice&paper_size=A4&margin_top=1in&margin_bottom=1in&print_background=true&access_key=YOUR_API_KEY"
len.sh’s dedicated PDF endpoint exposes all the parameters you typically need for document generation: paper size, margins, landscape orientation, page ranges, and header/footer templates.
Generating an OG Image
Urlbox: No equivalent. You’d need to build an HTML template, host it, and screenshot it at 1200x630.
len.sh:
curl "https://api.len.sh/v1/og?title=My+Blog+Post&subtitle=A+deep+dive+into+APIs&badge=Tutorial&brand_name=Acme&brand_color=%234F46E5&theme=dark&access_key=YOUR_API_KEY" \
--output og.png
One request. No template to build or host.
Code Examples: Migrating from Urlbox
JavaScript
Urlbox:
async function screenshot(url) {
const apiKey = process.env.URLBOX_API_KEY;
const response = await fetch(
`https://api.urlbox.io/v1/${apiKey}/png?url=${encodeURIComponent(url)}&width=1280&height=720`
);
return response.arrayBuffer();
}
len.sh:
async function screenshot(url) {
const params = new URLSearchParams({
url,
width: "1280",
height: "720",
format: "png",
access_key: process.env.LENSH_API_KEY,
});
const response = await fetch(
`https://api.len.sh/v1/screenshot?${params}`
);
return response.arrayBuffer();
}
Python
Urlbox:
import requests
import os
def screenshot(url: str) -> bytes:
api_key = os.environ["URLBOX_API_KEY"]
response = requests.get(
f"https://api.urlbox.io/v1/{api_key}/png",
params={"url": url, "width": 1280, "height": 720},
)
response.raise_for_status()
return response.content
len.sh:
import requests
import os
def screenshot(url: str) -> bytes:
response = requests.get(
"https://api.len.sh/v1/screenshot",
params={
"url": url,
"width": 1280,
"height": 720,
"format": "png",
"access_key": os.environ["LENSH_API_KEY"],
},
)
response.raise_for_status()
return response.content
Using Signed URLs (Both Support This)
len.sh:
import { signUrl } from "@lensh/sdk";
const publicUrl = signUrl(
"https://api.len.sh/v1/screenshot?url=https://example.com&width=1280",
{ keyId: "your-key-id", signingSecret: "your-signing-secret" }
);
// Safe to use in <img> tags, emails, etc.
When to Choose Urlbox
Be honest with yourself about what you need. Choose Urlbox if:
- You depend on webhook callbacks for async processing workflows.
- You need direct S3 uploads as part of your pipeline.
- You need to render pages from specific geographic regions.
- You need dark mode simulation.
- You need proxy routing for accessing geo-restricted or authenticated content.
These are legitimate requirements that len.sh doesn’t currently cover.
When to Choose len.sh
Choose len.sh if:
- You want predictable, lower pricing without feature gating.
- You need OG image generation without building HTML templates.
- You want dedicated PDF generation with paper size, margins, and page ranges.
- You need a free tier to prototype and evaluate.
- You value a simpler API that covers the common use cases without complexity overhead.
- You want official SDKs in JavaScript, Python, Ruby, PHP, and Go.
The Math at Scale
Let’s do the math for a real-world scenario. Say you’re building a SaaS that generates link preview thumbnails. You’re currently at 50,000 screenshots per month and growing.
With Urlbox: You’re on a plan around $199/month. As you grow to 100,000, you’ll need a higher tier at $349/month. Annual cost: $2,400-$4,200.
With len.sh: You’re on the €99/month Scale plan, which covers up to 500,000 screenshots. You won’t need to upgrade until you 10x your current volume. Annual cost: €1,188.
Annual savings: $1,200-$3,000. That’s a junior developer’s tools budget, a year of your monitoring stack, or a meaningful contribution to your runway.
Conclusion
Urlbox is a capable, mature screenshot API with features that len.sh doesn’t have. If you need webhooks, S3 integration, geo-targeting, or dark mode simulation, it’s a solid choice despite the higher price.
But for most screenshot, PDF, and OG image use cases, len.sh delivers the same core functionality at a significantly lower cost, with a simpler API and no feature gating. The migration is straightforward, and the free tier lets you validate everything before committing.
Sign up for a free len.sh account and run your first screenshot in under a minute. Compare the results side-by-side with your current Urlbox output and decide for yourself.