By Rajesh Kannan, Co-Founder & CTO, Gramosoft · Last updated: · Every price, free tier and billing rule below was checked on the vendor's own pricing page or docs on November 2, 2026

Taking a screenshot of a web page sounds trivial until you do it at scale. Single-page apps come back blank, lazy images leave gaps, cookie banners cover the hero, and a page loaded from the wrong country shows the wrong prices. This guide compares 15 website screenshot APIs for developers on what decides clean captures and what they really cost, starting with GcrawlAI, with code you can run today.

TL;DR

  • Protected, JavaScript-heavy or country-specific pages: GcrawlAI captures through residential IPs with full-page, mobile, dark mode and banner blocking, at one request per screenshot.
  • Deepest screenshot-only options: ScreenshotOne and Urlbox, with PDF, video and many output formats.
  • Cheapest simple endpoint: ApiFlash at $7 for 1,000 or $180 for 100,000 a month.
  • Screenshots inside scraping: Firecrawl, ScrapingBee and Scrapfly, priced in credits per screenshot.
  • Check the billing rules: some APIs never bill failed captures; others bill browser time or error pages.

What is the best website screenshot API? For protected or country-specific pages, and for teams that also scrape, GcrawlAI: residential IPs, full-page and mobile capture, cookie-banner and ad blocking, and failed captures never billed. ScreenshotOne and Urlbox have the most screenshot-only options, and ApiFlash is the cheapest simple endpoint. Test any of them on five hard pages before you commit.

15 screenshot APIs at a glance (checked November 2, 2026)

API Best for Free tier Entry paid plan
GcrawlAI Protected and geo-specific pages, scraping plus screenshots 50 requests/month $29 for 20,000
ScreenshotOne Screenshot-only depth 100/month $17 for 2,000
Urlbox Video, PDF, archiving 7-day trial $19 for 2,000
ApiFlash Cheap, simple endpoint 100/month $7 for 1,000
Browserless Your own Puppeteer/Playwright code 1,000 units/month $35 for 20,000 units
Firecrawl Screenshot plus Markdown 1,000 credits/month $19 for 5,000 credits
ScrapingBee Screenshots in a scraping API 1,000 credits once $19 for 75,000 credits
Scrapfly Anti-bot scraping with screenshots 1,000 credits once $30 for 200,000 credits
Microlink Link previews and metadata 25/day $49 for 46,000
HTMLCSStoImage HTML/CSS to image 50/month $14 for 1,000
Doppio Screenshots and PDFs together 400/month $16 for 4,000
Screenshot Machine Low-cost euro plans 100/month €9 for 2,500
Screenshotlayer Basic captures, legacy apps 100/month, non-commercial $19.99 for 10,000
CaptureKit Cached captures, storage upload 100 credits Not listed on its pricing page
Bannerbear Templated social images 30 credits once $49 for 1,000 credits

The 15 best website screenshot APIs in 2026

These 15 APIs cover the main ways teams capture web pages: dedicated screenshot services, scraping APIs that return screenshots, browser platforms, and image generators. They're ordered by how well each handles real pages for a general developer workload, with GcrawlAI first. Prices come from each vendor's own site.

1. GcrawlAI: clean captures through residential IPs, one request each

Best for: protected, JavaScript-heavy or country-specific pages, monitoring, and teams that scrape and capture the same sites · Type: scraping, crawling, Search and screenshot API · Access: REST, Python SDK (gcrawl-sdk), MCP, MIT core

GcrawlAI captures pages in a real browser through residential IPs, so it sees what a visitor in that country sees, not a block page. One call sets the viewport, full page or one element, mobile emulation, light or dark mode, cookie-banner and ad blocking, auto-scroll for lazy images, the output format, and the proxy country. Each screenshot is one request, and failed captures are never billed.

GcrawlAI homepage with the logo and menu (Products, Playground, Extractors, Docs, Pricing, Blog, Use Cases, Custom Request): Transform any website into structured LLM-ready data, the open-source web scraping API for AI agents, RAG pipelines and data teams, with JavaScript rendering, anti-bot stealth and proxies included in every request and no credit system; General, Extractors and Offline Bundle modes, tabs for Scrape, Map, Crawl, Batch, Screenshot, Search and Smart Answer, and the Batch tab open with a URL list, Markdown format, country picker and a Start batch scraping button
The GcrawlAI homepage doubles as a playground: here the Batch tab queues a list of URLs as one job, with rendering, anti-bot stealth and proxies included in every request (desktop screenshot taken October 31, 2026; the phone view, from October 28, shows on small screens).

The homepage puts it plainly: JavaScript rendering, anti-bot stealth and proxies are included in every request, with no credit system. For screenshots that matters most on the pages other APIs struggle with: sites behind bot checks and pages that change by country, where a datacenter IP gets a challenge page instead of the content.

Architecture diagram of a GcrawlAI screenshot request: your code sends a URL and options; GcrawlAI loads the page in a real browser through a residential IP in your chosen country, at your viewport, device and colour scheme; it auto-scrolls to load lazy images and blocks cookie banners, ads and listed selectors; it captures the viewport, the full page up to a height limit or one element; it stores a PNG, JPEG, WebP or PDF and returns the screenshot URL; failed or timed-out captures return one error and are not billed
One request, one clean image: what GcrawlAI does with a screenshot call.

The GcrawlAI Screenshot API page sets out what the capture engine does: headless Chromium with hardware acceleration, automatic scrolling to trigger lazy-loaded content, a wait for web fonts, and cookie-banner rejection before the shot. It lists full-page and viewport capture on desktop, tablet and mobile profiles, retina output at 2x and 3x pixel ratios, dark mode and custom CSS overrides, and PNG, JPEG, WebP or vector PDF output. Viewports go up to 3840×2160 (4K) and full pages up to 20,000 pixels tall, with sync or async processing and webhooks for large jobs.

A screenshot request with every option shown. Turn on full_page, block_cookie_banners or block_ads as you need them, set proxy.geo to the country you want to see the page from, and list CSS selectors in hide_selectors to remove chat widgets or sticky bars:

curl -X POST "https://gcrawlai.com/gc/api/v1/screenshot" \
  -H "accept: application/json" \
  -H "X-API-Key: gc-YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "url": "https://gramosoft.tech",
  "proxy": {
    "geo": "IN"
  },
  "screenshot": {
    "enabled": true,
    "full_page": false,
    "format": "png",
    "quality": 90,
    "viewport_width": 1920,
    "viewport_height": 1080,
    "is_mobile": false,
    "color_scheme": "auto",
    "block_cookie_banners": false,
    "block_ads": false,
    "auto_scroll": true,
    "scroll_delay": 500,
    "selector": null,
    "hide_selectors": [],
    "full_page_max_height": null,
    "timeout": 30000
  }
}'

The same request with the Python SDK, first with the defaults, then with ScreenshotOptions. With wait=True the SDK polls until the capture is ready:

# pip install gcrawl-sdk
from gcrawl_sdk import GcrawlClient, ScreenshotOptions

client = GcrawlClient(api_key="gc-YOUR_API_KEY")

# 1. Simple call: viewport capture with the defaults
result = client.screenshot(url="https://gramosoft.tech", geo="default", wait=True)

# 2. Advanced call with ScreenshotOptions
options = ScreenshotOptions(
    enabled=True,
    full_page=False,
    format="png",
    quality=90,
    viewport_width=1920,
    viewport_height=1080,
    is_mobile=False,
    color_scheme="auto",
    block_cookie_banners=False,
    block_ads=False,
    auto_scroll=True,
    scroll_delay=500,
    selector="",
    hide_selectors=[],
    full_page_max_height=0,
    timeout=30000,
    proxy_geo="IN"
)

result = client.screenshot(
    url="https://gramosoft.tech",
    options=options,
    wait=True,
    poll_interval=2
)

if result.is_completed:
    print("Captured Screenshot URL:", result.screenshot_url)

The response gives you the status, the capture settings and a stored image URL:

{
  "status_code": 200,
  "crawl_id": "sc_9b0a1c2d3e4f5a6b",
  "status": "completed",
  "is_completed": true,
  "screenshot_url": "https://gcrawlai-storage.s3.amazonaws.com/screenshots/sc_gramosoft_desktop.png",
  "format": "png",
  "viewport_width": 1920,
  "viewport_height": 1080,
  "full_page": false
}
  • Capture modes (Screenshot API): viewport, full page with a full_page_max_height cap for endless feeds, or a single element by CSS selector.
  • Clean output: cookie-banner and ad blocking, hide_selectors for anything left over, and auto_scroll with a scroll_delay so lazy images load before the shot.
  • Devices and themes: any viewport size, mobile emulation with is_mobile, and color_scheme for light, dark or the site's default.
  • Country targeting: proxy.geo loads the page through a residential IP in that country, so prices, language and consent banners match local visitors.
  • More than screenshots: scrape the same page to Markdown, HTML or JSON, crawl a whole site, or use the Search API, all on one key and one request price. Try a URL in the Playground or read the docs.
  • For AI agents: an MCP server connects Claude, Cursor and other agents to GcrawlAI as a tool.

For monitoring or audits you'll usually capture a list of pages on desktop and mobile. This script does that with full-page capture and banners blocked, saves each image locally, and logs failures instead of stopping:

"""Capture desktop and mobile screenshots for a list of URLs with GcrawlAI and save them locally.

Full-page, cookie banners and ads blocked, chat widgets hidden. Failed captures are logged and skipped
(GcrawlAI doesn't bill failed requests), and a manifest records what was captured and when.
pip install gcrawl-sdk requests
"""
import csv
import os
import time
from pathlib import Path
from urllib.parse import urlsplit

import requests
from gcrawl_sdk import GcrawlClient, ScreenshotOptions
from gcrawl_sdk.exceptions import GcrawlAPIError, GcrawlTimeoutError

client = GcrawlClient(api_key=os.getenv("GCRAWL_API_KEY", "gc-YOUR_API_KEY"))
OUT = Path("shots")

DEVICES = {
    "desktop": dict(viewport_width=1440, viewport_height=900, is_mobile=False),
    "mobile": dict(viewport_width=390, viewport_height=844, is_mobile=True),
}


def options_for(device, geo="US"):
    return ScreenshotOptions(
        full_page=True, format="png", quality=90, color_scheme="auto",
        block_cookie_banners=True, block_ads=True, auto_scroll=True, scroll_delay=500,
        hide_selectors=["#intercom-container", ".chat-widget"],
        full_page_max_height=10000, timeout=30000, proxy_geo=geo, **DEVICES[device])


def capture(url, device, geo="US"):
    """Return the saved file path, or None if the capture failed."""
    try:
        result = client.screenshot(url=url, options=options_for(device, geo), wait=True, poll_interval=2)
    except (GcrawlAPIError, GcrawlTimeoutError) as err:
        print(f"failed {url} [{device}]: {err}")
        return None
    if not getattr(result, "is_completed", False) or not result.screenshot_url:
        print(f"no image {url} [{device}]: {getattr(result, 'status', 'unknown')}")
        return None
    name = urlsplit(url).netloc.replace(".", "-") + f"-{device}.png"
    path = OUT / name
    path.write_bytes(requests.get(result.screenshot_url, timeout=60).content)  # save it: keep your own copy
    return path


def run(urls, geo="US"):
    OUT.mkdir(exist_ok=True)
    with open(OUT / "manifest.csv", "a", newline="") as f:
        log = csv.writer(f)
        for url in urls:
            for device in DEVICES:
                path = capture(url, device, geo)
                log.writerow([time.strftime("%Y-%m-%dT%H:%M:%S"), url, device, geo, path or "FAILED"])


if __name__ == "__main__":
    run(["https://gramosoft.tech", "https://example.com"])

Screenshot URLs point to stored files, but keep your own copy of anything you need as a record. The MIT-licensed core runs on your own servers too:

git clone https://github.com/GramosoftAI/GcrawlAI.git && cd GcrawlAI
python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt && playwright install
cp .env.example .env                      # add your database, Redis and proxy settings
python -m api.core.db_setup
redis-server &
celery -A web_crawler.crawler.celery_config worker -l info &
uvicorn api.api:app --port 8000

Pricing: a free plan of 50 requests a month with no card, and paid plans from $0.67 to $1.45 per 1,000 requests. A screenshot is one request, whatever the options, and rendering, residential IPs and retries never multiply it. The plan table is in the cost section.

Where it falls short: there's no video or scrolling-video capture, and no scripted clicks or wait-for-selector before the shot, so very slow apps rely on auto-scroll and a longer timeout. Every request runs a full browser through residential IPs, which makes simple pages cost the same as hard ones, and the ecosystem is younger than ScreenshotOne's or Urlbox's.

"Most bad screenshots aren't rendering bugs. They're the page reacting to the visitor: a consent wall for an EU IP, a challenge page for a datacenter IP, a half-loaded app for an impatient browser. Fix the visitor and the screenshot fixes itself."

Rajesh Kannan, Co-Founder & CTO at Gramosoft

2. ScreenshotOne: the most screenshot options

Best for: products where the screenshot is the whole job and you want fine control · Type: dedicated screenshot API

ScreenshotOne is a screenshot-first API with the widest option set here. It outputs PNG, JPG, WebP, GIF, AVIF, TIFF, PDF, HTML and Markdown, captures full pages or one element, blocks ads and cookie banners, and supports async jobs, webhooks and S3 upload. SDKs cover Go, Java, Ruby, Python, C#, PHP and JavaScript. Failed requests and cached responses don't count toward your quota.

Pricing (ScreenshotOne pricing, checked November 2, 2026):

Plan Price/month Screenshots Overage per screenshot
Free $0 100 –
Basic $17 2,000 $0.009
Growth $79 10,000 $0.006
Scale $259 50,000 $0.004

Where it falls short: choosing the IP country starts on the $79 Growth plan, it's screenshot-only, so page content needs a second tool, and at 100,000 a month it costs $459 on list prices.

3. Urlbox: renders, video and archiving

Best for: archiving, compliance evidence, video captures and teams that need many output formats · Type: rendering API

Urlbox renders pages to PNG, JPEG, WebP, AVIF, SVG, PDF, HTML, MP4, WebM and Markdown. It captures full pages or elements, blocks ads, hides cookie banners or clicks "accept", and delivers through webhooks to S3, R2, Azure or Google Cloud Storage. Urlbox says it doesn't charge for requests that fail for any reason.

Pricing (Urlbox pricing, checked November 2, 2026):

Plan Price/month Renders
Trial $0 for 7 days, no card –
Lo-Fi $19 2,000
Hi-Fi $49 5,000
Ultra $99 15,000
Business $495 base + $3 per 1,000 Usage-based

Where it falls short: there's no free tier, plans below Business upgrade automatically when you exceed them, and high volume costs the most in this list.

4. ApiFlash: the cheapest simple endpoint

Best for: thumbnails, previews and simple captures on a budget · Type: dedicated screenshot API

ApiFlash is a Chrome-based screenshot API on AWS Lambda with a single endpoint. It returns PNG, JPEG or WebP, captures full pages, blocks ads, hides cookie banners and exports to S3. Its plans are the cheapest per screenshot among the dedicated services here, and code examples cover C#, Go, Java, Node, PHP, Python and Ruby.

Pricing (ApiFlash plans, checked November 2, 2026):

Plan Price/month Screenshots
Free $0 100
Lite $7 1,000
Medium $35 10,000
Large $180 100,000

Where it falls short: IP geolocation and managed proxies are Enterprise-only, there's no PDF output, and the site doesn't say whether failed captures count.

5. Browserless: hosted browsers for your own code

Best for: teams that already write Puppeteer or Playwright and want someone else to run the browsers · Type: browser platform with REST APIs

Browserless runs headless browsers you drive with Puppeteer, Playwright or its BrowserQL language, and it also has a REST /screenshot endpoint. You get full-page and element captures, a /pdf endpoint, consent-modal blocking, residential and datacenter proxies, and a self-hosted option under its Enterprise licence. It bills in units of browser time, not per screenshot.

Pricing (Browserless pricing, checked November 2, 2026; a unit is up to 30 seconds of browser time):

Plan Monthly Annual (per month) Units Overage per unit
Free $0 $0 1,000 –
Prototyping $35 $25 20,000 $0.0020
Starter $200 $140 180,000 $0.0017
Scale $500 $350 500,000 $0.0015

Where it falls short: a request that fails mid-run still uses the browser time it consumed, residential proxy traffic costs 6 units per MB, and you write more of the capture logic yourself.

6. Firecrawl: a screenshot alongside Markdown

Best for: AI pipelines that want the page's Markdown and an image from one call · Type: scraping API for LLMs

Firecrawl treats a screenshot as one of its scrape output formats, with options for full page, quality and viewport, and a country setting. A scrape costs one credit whether you ask for Markdown, a screenshot or both. More on how it compares as a scraping API in our Firecrawl alternatives guide.

Pricing (Firecrawl pricing, checked November 2, 2026):

Plan Monthly Annual (per month) Credits
Free $0 $0 1,000
Hobby $19 $16 5,000
Standard $99 $83 100,000

Where it falls short: screenshot URLs expire after 24 hours, pages that return 403 or 404 still cost a credit, and screenshots aren't in the default self-hosted stack.

7. ScrapingBee: screenshots inside a scraping API

Best for: teams already scraping with ScrapingBee who want visual checks too · Type: scraping API with JavaScript rendering

ScrapingBee takes screenshots with screenshot, screenshot_full_page or screenshot_selector, blocks ads, and lets you choose a country on every plan. A screenshot needs JavaScript rendering, so it costs 5 credits, or 25 with premium proxies. It charges only for 200, 404 and 410 responses. More in our ScrapingBee alternatives guide.

Pricing (ScrapingBee pricing, checked November 2, 2026):

Plan Price/month Credits Standard screenshots (5 credits)
Free trial $0 1,000 (once) 200
Hobby $19 75,000 15,000
Freelance $49 250,000 50,000
Startup $99 1,000,000 200,000

Where it falls short: cookie-banner blocking isn't documented, there's no PDF, and protected pages that need premium proxies cost five times as much.

8. Scrapfly: a screenshot API built on anti-bot scraping

Best for: hard targets where the screenshot comes from a scraping stack · Type: scraping platform with a dedicated Screenshot API

Scrapfly's Screenshot API captures JPG, PNG, WebP or GIF, full pages or elements by CSS or XPath, removes cookie banners, ads and pop-ups with one option, and lets you pick a country. Async jobs report through webhooks, and captures can be cached. Each screenshot costs 60 credits.

Pricing (Scrapfly pricing and screenshot billing, checked November 2, 2026):

Plan Price/month Credits Screenshots (60 credits)
Free $0 1,000 (once) 16
Discovery $30 200,000 3,333
Pro $100 1,000,000 16,666
Startup $250 2,500,000 41,666
Enterprise $500 5,500,000 91,666

Where it falls short: at 60 credits a screenshot the per-image cost is high, and the screenshot billing page doesn't say whether failed captures are free.

Best for: link previews, CMS tools and apps that need metadata and an image · Type: browser API for previews and metadata

Microlink returns a page's metadata and a screenshot from one URL-style API. It captures full pages or elements, blocks ads, trackers and cookie consent, and can route through a residential proxy in a chosen country. Cached responses don't count against your quota, and requests pause at the limit rather than running up overage.

Pricing (Microlink pricing, checked November 2, 2026): free is 25 requests a day with no card; Pro is $49 a month for 46,000 requests; higher Pro tiers and Business are priced on request.

Where it falls short: prices above 46,000 requests aren't published, and it's built for previews rather than long scripted captures.

10. HTMLCSStoImage: images from HTML or a URL

Best for: social cards, email previews and generated images, plus public-page screenshots · Type: HTML/CSS-to-image API

HTMLCSStoImage turns your own HTML and CSS into an image, and also screenshots a public URL. It outputs PNG, JPG, WebP or PDF, supports full-screen capture, CSS selectors and consent-banner blocking, and offers webhooks on every plan. Official SDKs cover TypeScript, C#, Python, Ruby, PHP and Go.

Pricing (HTMLCSStoImage pricing, checked November 2, 2026):

Plan Price/month Images
Free $0 50
Basic $14 / $29 / $69 1,000 / 3,000 / 10,000
Pro $149 / $249 / $375 30,000 / 65,000 / 100,000
Overage (optional) $10 per 1,000 –

Where it falls short: website screenshots need a public URL, there's no ad blocking or country setting, and the site doesn't say whether failed images count.

11. Doppio: screenshots and PDFs on one platform

Best for: apps that generate both PDFs and screenshots, CI captures and reports · Type: HTML-to-PDF and screenshot rendering API

Doppio renders URLs or HTML into PDFs and screenshots, with full-page capture, clipped regions, async jobs with webhooks, and presigned uploads to S3, Google Cloud Storage, Spaces or MinIO. It says you pay only for successful renders, its servers are in Europe, and no document content is retained. Its free tier is the largest of the dedicated APIs here.

Pricing (Doppio pricing, checked November 2, 2026):

Plan Price/month Documents
Basic $0 400
Premium $16 4,000
Premium+ $48 12,000
Pro $129 (overage $0.0037 each) 36,000

Where it falls short: no ad or cookie-banner blocking and no country targeting are listed, and element capture means clipping a region rather than naming a selector.

12. Screenshot Machine: long-running and low-cost

Best for: simple, steady capture jobs priced in euros · Type: dedicated screenshot API

Screenshot Machine captures JPG, PNG or GIF, full pages or a selector, on desktop, phone and tablet devices, and can click elements or hide them by CSS selector, which is how you remove cookie banners. Cached screenshots aren't billed, and PDF capture is a separate API. Code examples cover nine languages.

Pricing (Screenshot Machine pricing, checked November 2, 2026):

Plan Price/month Screenshots Overage each
Free €0 100 –
Basic €9 2,500 €0.004
Pro €59 20,000 €0.003
Enterprise €99 50,000 €0.002

Where it falls short: no built-in ad blocking or country targeting is listed, and banner removal means writing selectors per site.

13. Screenshotlayer: basic captures from APILayer

Best for: existing integrations and simple captures at low cost · Type: dedicated screenshot API

Screenshotlayer is one of the older screenshot APIs, run by APILayer. It returns PNG, JPEG or GIF, with WebP, HTTPS and retina output on paid plans, captures full pages, caches results for 30 days by default, and exports to FTP or S3 on the Professional plan and above. Its Basic plan is one of the cheapest ways to buy 10,000 screenshots a month.

Pricing (Screenshotlayer pricing, checked November 2, 2026):

Plan Monthly Annual Snapshots/month
Free $0 – 100 (non-commercial)
Basic $19.99 $215.99 10,000
Professional $59.99 $629.99 30,000
Enterprise $149.99 $1,529.99 75,000

Where it falls short: no element capture, ad or banner blocking, country targeting or PDF is listed, and the free plan is for non-commercial use only.

14. CaptureKit: cached captures and storage upload

Best for: repeat captures of the same URLs where caching saves money · Type: screenshot and page-content API

CaptureKit captures PNG, JPEG, WebP or PDF, full pages with scrolling for lazy content or one selector, removes ads and cookie banners, and caches results from one hour to 30 days. It accepts your own HTTP, HTTPS or SOCKS5 proxy, uploads to S3 or R2, and emulates devices. Each call costs one credit.

Pricing (CaptureKit pricing, checked November 2, 2026): 100 free credits with no card; Pro includes 10,000 credits a month and Ultimate 50,000. The pricing page didn't show dollar prices when we checked, so confirm them before you budget.

Where it falls short: no official SDK, no published country setting, and paid prices and overage weren't visible on its pricing page.

15. Bannerbear: templated images with a screenshot endpoint

Best for: marketing teams generating social cards and previews from templates · Type: image and video generation API

Bannerbear generates images and videos from design templates and also has a screenshot endpoint for public pages. You set the URL, width, height (leave it out for a full page), mobile mode and language. Requests are async with webhooks by default, and a synchronous call times out after 10 seconds. Client libraries cover Node, PHP and Ruby.

Pricing (from Bannerbear's own comparison post, which it dates October 25, 2026; its pricing page didn't load for us): a free trial of 30 API credits, Automate at $49 a month for 1,000 credits, and Scale from $149 for 10,000 credits.

Where it falls short: it's an image generator first; there's no selector capture, ad blocking or proxy option for screenshots, and it doesn't say how many credits a screenshot uses.

What a screenshot API does, and what to test

A screenshot API loads a URL in a real browser, waits for it to render, and returns an image. Most of them use the same Chromium engine, so the differences are in what happens around the capture: scrolling, overlays, country, timeouts, and whether you pay when it fails. Test those before you choose.

Infographic of six reasons screenshots come out wrong and the GcrawlAI option that fixes each: blank pages (auto_scroll and timeout), missing lazy images (auto_scroll and scroll_delay), cookie banners and ads (block_cookie_banners, block_ads, hide_selectors), wrong country (proxy geo), endless pages (full_page_max_height) and wrong device (is_mobile, viewport, color_scheme)
Six reasons screenshots come out wrong, and the option that fixes each.

Build a small test set before you commit: one static page, one single-page app, one long page with lazy images, one page with a cookie banner, and one that changes by country. Run the same five through two or three APIs and compare the images, not the marketing pages. Count how many captures you had to retry, because that's what drives your real cost.

What 10,000 and 100,000 screenshots a month cost

At 10,000 screenshots a month most APIs cost $19 to $100. At 100,000 the spread is wide: about $99 to $101 for ScrapingBee, Firecrawl and GcrawlAI, $180 for ApiFlash, and $459 to around $795 for ScreenshotOne and Urlbox. Billing rules for failures matter as much as the list price.

API 10,000/month 100,000/month Failed captures billed?
GcrawlAI $29 (Starter) $101 (Growth $79 + 20,000 at $1.10/1,000) No, never
ScreenshotOne $79 (Growth) $459 (Scale $259 + 50,000 at $0.004) No; cached also free
Urlbox $99 (Ultra) About $795 (Business $495 + $3/1,000) No
ApiFlash $35 (Medium) $180 (Large) Not stated
Browserless $35 (Prototyping, ~1 unit each) About $195 monthly, or $140 on annual Starter Browser time used before a failure is billed
Firecrawl $44 (Hobby + $25 of credits) $99 (Standard) No result is free; 403/404 pages cost 1 credit
ScrapingBee $19 (Hobby, 5 credits each) $99 (Startup); premium proxies need 25 credits each Bills 200, 404 and 410 only
Scrapfly $100 (Pro, 60 credits each) About $560 (Enterprise + overage) Not stated for screenshots
Microlink $49 (Pro, 46,000) Not published Not stated; cached free
HTMLCSStoImage $69 $375 Not stated
Doppio $48 (12,000) About $366 (Pro + overage) No ("successful renders")
Screenshot Machine €37 (Basic + overage) €199 (Enterprise + overage) Not stated; cached free
Screenshotlayer $19.99 (Basic) About $350 (Enterprise + overage) Not stated
CaptureKit Not listed Not listed Not stated
Bannerbear Credits per screenshot not stated Custom Not stated

List-price arithmetic from each vendor's pricing page, checked November 2, 2026; figures marked "about" are our calculation from published overage rates. The honest read: at 10,000 a month, ScrapingBee ($19) and Screenshotlayer ($19.99) cost less than GcrawlAI ($29), and at 100,000, ScrapingBee and Firecrawl ($99) are $2 cheaper. GcrawlAI's price already includes residential IPs and stealth on every capture; on ScrapingBee that's the 25-credit premium proxy, which pushes 100,000 protected screenshots to its $249 Business plan.

GcrawlAI plans (GcrawlAI pricing, checked October 28, 2026):

Plan Price Requests/month Concurrent Per 1,000 Overage per 1,000
Free $0 forever, no card 50 2 – –
Starter $29/month 20,000 10 $1.45 $1.60
Growth (most popular) $79/month 80,000 35 $0.99 $1.10
Pro $199/month 250,000 50 $0.80 $0.90
Scale $499/month 750,000 100 $0.67 $0.75
Enterprise Volume pricing 2M+ Custom – –
Self-hosted $0 (MIT) Your servers Your servers Infrastructure only –

Every plan, Free included, has screenshots, scrape, crawl, the Search API, JavaScript rendering, residential IP rotation and stealth escalation in each request. Failed requests are never charged. Annual billing charges 10 months for 12, unused requests on paid plans roll over once, and Indian customers are billed in INR with a GST invoice.

Screenshot features compared

Every API here captures full pages, so the features that separate them are element capture, banner and ad blocking, country targeting and extra outputs like PDF. This table shows what each vendor documents. "Not listed" means we didn't find it in their docs, not that it can't be done another way.

API Element capture Ad / cookie blocking Country Formats PDF
GcrawlAI Yes Both, plus hide selectors Yes, residential PNG, JPEG, WebP, PDF Yes
ScreenshotOne Yes Both Growth plan and up 11 formats Yes
Urlbox Yes Both Not verified 10 formats incl. video Yes
ApiFlash Not listed Both Enterprise only PNG, JPEG, WebP No
Browserless Yes Both (via options) Proxies, country not verified PNG, JPEG, WebP Yes
Firecrawl Not listed Not listed Yes Image URL Via action
ScrapingBee Yes Ads only Yes Not stated No
Scrapfly Yes, CSS or XPath Both Yes JPG, PNG, WebP, GIF Not listed
Microlink Yes Both Yes, residential PNG, JPEG Separate product
HTMLCSStoImage Yes Cookie banners No PNG, JPG, WebP Yes
Doppio Clip region Not listed No PNG, JPG, WebP Yes
Screenshot Machine Yes Hide by selector No JPG, PNG, GIF Separate API
Screenshotlayer No No No PNG, JPEG, GIF, WebP No
CaptureKit Yes Both Your own proxy PNG, JPEG, WebP Yes
Bannerbear No No No Not stated For templates

Which screenshot API should you choose?

Start from the pages you need to capture, not the feature list. Protected and country-specific pages need residential IPs; long pages need scrolling and a height cap; previews need caching; archives need PDFs. GcrawlAI covers all four with one request per screenshot, and the table shows where it fits each job.

Decision flow for choosing a screenshot API: protected or country-specific pages need residential IPs and stealth (GcrawlAI); if you also need page text or data, use one key for both (GcrawlAI); video or templated images point to a specialist renderer; millions a month on your own servers point to the self-hosted GcrawlAI core; otherwise any hosted API works after testing five hard pages
Which screenshot API fits: answer in order, stop at the first yes.
Your job What matters Where GcrawlAI fits
Competitor or price monitoring Country, banners, failures not billed GcrawlAI captures through residential IPs in the right country
Pages behind bot checks Stealth and real IPs GcrawlAI includes stealth escalation in every request
Link previews and thumbnails Speed, cache, low price GcrawlAI viewport captures at one request each
Visual QA on desktop and mobile Fixed viewport, mobile, dark mode GcrawlAI sets viewport, is_mobile and color_scheme per call
AI agents that need to see pages MCP, image plus content GcrawlAI's MCP server and SDK, one key for images and content
Archives and PDFs PDF output, full-page height GcrawlAI outputs vector PDF and full pages up to 20,000 px; no video yet
Millions a month on your own servers Control and cost Self-host the MIT GcrawlAI core

When doing it yourself is enough

If you capture a handful of your own pages, Playwright or Puppeteer on one server is enough: page.screenshot(full_page=True) and a scroll before it. The work starts with other people's sites, where you need proxies, banner handling, retries and monitoring. That's where GcrawlAI takes over without changing how you work.

You can stay on your own servers: the MIT-licensed GcrawlAI core self-hosts for free with the same browser engine, and the free Cloud plan's 50 requests a month are enough to test your five hardest pages. Paste one into the Playground to compare. For the build-or-buy trade-off in general, read web scraping with Python vs a scraping API.

"Teams self-host screenshots to save money, then spend it on the proxies, the font packages and the engineer who debugs blank captures at 2 a.m. Count the retries before you count the servers."

Rajesh Kannan, Co-Founder & CTO at Gramosoft

Capture pages responsibly

A screenshot is still automated access, so the same rules apply as for scraping. Capture public pages or pages you're authorised to see, respect robots.txt and terms of service, keep request rates gentle, and don't store personal data you have no reason to hold. Never send real login credentials to a third-party capture service.

If a screenshot will be used as evidence, store the image yourself with the URL, time, country and settings used, because hosted image links can expire. For the legal background, read what web scraping is and where it's legal.

Frequently asked questions

What is the best website screenshot API?

For protected or country-specific pages, and teams that also scrape, GcrawlAI: residential IPs, full-page and mobile capture, banner blocking, one request per screenshot. ScreenshotOne and Urlbox have the most screenshot-only options; ApiFlash is the cheapest simple endpoint.

Is there a free screenshot API?

Yes. ScreenshotOne, ApiFlash and Screenshot Machine give 100 screenshots a month, Doppio 400, Microlink 25 a day, HTMLCSStoImage 50, and GcrawlAI 50 requests a month. Screenshotlayer's 100 a month are for non-commercial use only.

How much does a screenshot API cost?

Entry plans run from $7 (ApiFlash, 1,000) to $49. At 100,000 a month, list prices range from about $99 (ScrapingBee, Firecrawl) and $101 (GcrawlAI) to $459 (ScreenshotOne) and around $795 (Urlbox), checked November 2, 2026.

Why do my screenshots come back blank or half-loaded?

The capture fired before JavaScript finished, or lazy images never loaded. Use an API that renders in a real browser, scrolls the page before capturing, and allows a longer timeout. Cookie banners and challenge pages are the other common cause.

How do I take a full-page screenshot with an API?

Turn on full-page mode, let the API scroll so lazy images load, and cap the height for infinite feeds. In GcrawlAI that's full_page, auto_scroll with scroll_delay, and full_page_max_height.

Can I take a screenshot from a specific country?

Yes, with APIs that offer country targeting. GcrawlAI and Microlink use residential IPs; ScrapingBee and Scrapfly take a country code; ScreenshotOne offers it from its Growth plan and ApiFlash on Enterprise only.

Is GcrawlAI open source, and can I use it commercially?

Yes. The GcrawlAI core is MIT licensed on GitHub, so you can self-host it and use it commercially. The managed Cloud API adds residential IPs and stealth escalation, with a Python SDK and MCP for AI agents, a free plan of 50 requests a month and paid plans from $0.67 to $1.45 per 1,000 requests.

Capture any page, clean

Start with 50 free requests a month, no card. Capture full-page, mobile or country-specific screenshots through GcrawlAI, with banners and ads blocked, and pay only for captures that succeed.

CTA Illustration