Comparison · Published October 17, 2026 · 7 min read

thum.io Alternative: Comparing URL-Based Screenshot APIs

Quick answer

thum.io is a good choice for cheap, public website thumbnails you drop straight into an <img src>: it is URL-based, offers a free monthly allowance and supports referer checks or signed requests to protect keys. Look for a thum.io alternative when you need full-page captures on a low budget, waits for specific elements, PDF and WebP output, cookie-banner blocking, batch and diff endpoints, or self-hosting. SnapshotFlow covers those, used through a small proxy on your server.

See SnapshotFlow in action

If you are used to image.thum.io URLs, the request shape will feel familiar: one GET per image, options as parameters. These are real captures of our own homepage made with the request below, not retouched.

request
curl --get "https://api.snapshotflow.com/screenshot" \ -H "X-Api-Key: $SNAPSHOTFLOW_API_KEY" \ --data-urlencode "url=https://snapshotflow.com/" \ --data-urlencode "width=1280" --data-urlencode "height=800" \ --data-urlencode "format=webp" \ -o desktop.webp # mobile: add viewport_mobile=true, width=390, height=844, device_scale_factor=2 # full page: add full_page=true
SnapshotFlow homepage, desktop screenshot at 1280×800 made with the SnapshotFlow API
Desktop, 1280×800, WebP (43 KB)
Mobile screenshot of the SnapshotFlow homepage at 390 by 844 pixels with mobile emulation
Mobile emulation, 390×844 at 2x, resized to 390 px

Full page, including the parts that load on scroll

When we took these captures, our homepage revealed sections with an animation as you scrolled (we have since removed it). A plain full-page capture therefore came out with empty blocks: the content was there, just still invisible. Adding a styles parameter that switched the animation off for the capture fixed it:

Full-page capture of the SnapshotFlow homepage with blank sections caused by scroll animations
Before: full_page=true only
Full-page capture of the SnapshotFlow homepage with all sections visible after a CSS fix
After: plus styles below · open full image
the extra parameter
--data-urlencode "styles=.band > *{opacity:1 !important;transform:none !important}"

Scroll-triggered animations are one of the most common reasons full-page screenshots look broken, whichever tool you use. With an API that accepts CSS and JavaScript injection, the fix is a parameter, not a code change on the site.

People who search for thum.io alternatives usually like its model, one URL per image with no SDK, and hit a limit: a missing option, the price of the plan that unlocks it, or a need for more control. This comparison summarizes thum.io's public documentation in our own words as of October 2026. Options, plans and prices change, so check its site before deciding.

How thum.io works

You put options as path segments in front of the target URL:

https://image.thum.io/get/width/600/crop/800/https://example.com

Its documentation lists options for output size, height, caching and format, and marks some of them (such as full-page captures, waiting and device presets) as part of a higher plan. For the complete, current list of options and prices, see thum.io's own documentation and homepage linked below; we only reference the option names needed for the parameter map.

Side by side

thum.ioSnapshotFlow
Request styleOptions in the URL pathQuery parameters or JSON body; key in header or api_key
Key protection for public img tagsReferer checks or signed requestsNo signed URLs yet; use a server-side proxy
Full pageHigher planfull_page=true, including the free tier
WaitSeconds after load (higher plan)wait_until, wait_for_selector, delay
FormatsPNG, JPG; separate PDF modePNG, JPEG, WebP, PDF
Page cleanupNot documentedblock_cookie_banners, block_ads, hide_selectors, custom CSS/JS
Element captureNot documentedselector
Many URLs, diffsPrefetch queue/batch (10 URLs), /diff, async jobs with webhooks
AI agentsNot documentedRemote MCP server
Free useFree monthly allowance (see thum.io's site)300 screenshots per new account

Have a list of image.thum.io URLs? Try one of the target pages in the playground with full page and WebP switched on.

Try it in the playground

What thum.io users get by switching

Full page without an upgradefull_page=true is available from the free tier.
Wait for an element, not a timerwait_for_selector waits for the content you need instead of a fixed number of seconds.
WebP and PDFSmaller thumbnails with format=webp, and PDFs from the same endpoint.
Cleaner thumbnailsblock_cookie_banners, block_ads and hide_selectors remove overlays before capture.
Batch and diffUp to 10 URLs per /batch request and pixel diffs between two URLs.
Key stays privateServe images through your own route (code below) so the key never appears in HTML.

Every item maps to a documented parameter in the API reference.

When thum.io is the better fit

  • You only need viewport thumbnails and want to put the URL directly into HTML with no backend.
  • Volume is high and low per-hit pricing is the main criterion.
  • Referer-protected keys are enough security for your use.

When to switch

  • You need full-page captures or waits without moving to a higher plan.
  • Pages are JavaScript apps and you need to wait for a specific element, not a fixed number of seconds.
  • Cookie banners and chat widgets ruin your thumbnails.
  • You want WebP for smaller files, PDF from the same API, or element-only captures.
  • You need batch jobs, visual diffs, webhooks, an MCP tool for agents, or to self-host inside your network.

Parameter map

thum.ioSnapshotFlowNote
width/600image_width=600Resizes the output image
viewportWidth/1200width=1200Browser viewport width
crop/800height=800 or clip_*Viewport height, or an exact region
fullpagefull_page=true
wait/3delay=3000Milliseconds; prefer wait_for_selector
png / allowJPGformat=png / format=jpegAlso webp and pdf
maxAge/12cache=false to refreshCache TTL is set server-side
iphoneXviewport_mobile=true + width/height + device_scale_factor

Using it in an img src

A plain GET URL with api_key in the query works in an <img> tag, but anyone can copy the key from the page source. For public pages, add a small route on your server that attaches the key and caches the result, then point your images at it:

node (express)
const ALLOWED = ["example.com", "docs.example.com"]; // only sites you need app.get("/shot", async (req, res) => { let target; try { target = new URL(String(req.query.url)); } catch { return res.status(400).end(); } if (!ALLOWED.includes(target.hostname)) return res.status(403).end(); const api = new URL("https://api.snapshotflow.com/screenshot"); api.search = new URLSearchParams({ url: target.href, width: "1280", format: "webp" }); const r = await fetch(api, { headers: { "X-Api-Key": process.env.SNAPSHOTFLOW_API_KEY } }); if (!r.ok) return res.status(502).end(); res.set("Content-Type", r.headers.get("content-type") ?? "image/webp"); res.set("Cache-Control", "public, max-age=86400"); // let your CDN cache it res.send(Buffer.from(await r.arrayBuffer())); });
html
<img src="/shot?url=https%3A%2F%2Fexample.com%2Fpricing" alt="Example pricing page" loading="lazy">
Keep the allowlist. Without it, anyone could use your route to capture any site on your quota.

Takeaways

  • thum.io is simple and cheap for public viewport thumbnails in img tags.
  • Switch when you need full page, element waits, cleanup, WebP/PDF, batch or diffs.
  • With SnapshotFlow, serve images through your own proxy route instead of exposing the key.

thum.io is a trademark of its owner. SnapshotFlow is not affiliated with, endorsed by or sponsored by thum.io. Details about thum.io are summarized from its public documentation and homepage as of October 2026 and may have changed; if you spot an inaccuracy, tell us and we will correct it.

Sources

FAQ

Is thum.io free?

thum.io advertises a free monthly allowance and paid plans billed by usage, with some options such as full-page captures reserved for a higher plan. Limits and prices change, so check thum.io's own site for the current terms.

Can I use SnapshotFlow directly in an img src like thum.io?

The API accepts the key as an api_key query parameter, so a GET URL works in an img tag, but that exposes the key to anyone who views the page. Use a small proxy route on your server that adds the key and caches the image.

Does SnapshotFlow support signed URLs or referer-restricted keys?

Not at the moment. You can create several API keys with labels and revoke one if it leaks, but for public pages the recommended pattern is a server-side proxy.

How do I convert image.thum.io/get/fullpage/ URLs?

Point the img at your proxy route and pass full_page=true to the API. The parameter map in this article lists the equivalents for width, crop, wait, png and device options.

Try the same URLs on SnapshotFlow

Paste one of your image.thum.io targets into the playground, set full page, wait and format, and compare the output. The free tier gives you 300 screenshots, no credit card required.