To turn a web page into a WebP screenshot, request WebP from an endpoint that supports it, then save the response as binary bytes. If the provider only captures PNG or JPEG, use its documented export/conversion operation—or convert the downloaded image locally. The correct method depends on that provider’s request parameters, authentication, and response contract.
What “screenshot to WebP” means
The phrase describes two different workflows:
- Direct WebP capture: the screenshot request includes a format such as
webp, and the endpoint returns WebP bytes (or a URL to a WebP file). - Capture, then export: the screenshot endpoint first produces PNG or another format; a separate export endpoint receives that image and is asked for WebP.
Do not assume that one provider’s parameter names or response shape apply to another. Read the same provider’s capture and export documentation together. WebP supports lossy and lossless compression, alpha transparency, and animation. RFC 9649, published in November 2024, defines the format and registers its media type; it is an Informational RFC rather than an Internet Standards Track specification.
Direct WebP capture: the safe request sequence
- Choose the provider’s screenshot endpoint and authentication method.
- Pass the target URL and the provider’s WebP output value.
- Add only the capture controls you need: viewport, full-page mode, selector, wait condition, delay, and (when supported) quality.
- Check the HTTP status and
Content-Type. - Write an
image/webpresponse directly to a file. If the response is JSON, parse the documented image-URL field and download that URL separately.
A successful image response is not JSON merely because the request used an API. Treat the body according to its content type.
Binary response handling
HTTP/1.1 200 OK
Content-Type: image/webp
(binary WebP data)
Save the body unchanged. Do not decode it as UTF-8, print it to a terminal, or run a JSON parser. A JSON response can instead look conceptually like {"url":"https://..."}; use the exact field documented by that service and then fetch the returned URL.
Free tools Windows power users keep installed
One-click scans. No signup required.
#1 Best Overall
Provider options that affect the image
Names and accepted values vary, but documented screenshot APIs commonly expose these controls:
| Control | What it changes | Questions to verify |
|---|---|---|
| Viewport | Browser width and height used for layout | Are dimensions query parameters or JSON fields? Are mobile presets available? |
| Full page | Captures the page beyond the initial viewport | Are lazy-loaded images scrolled into view? How are very tall pages handled? |
| Selector | Captures one element instead of the whole page | Is the selector CSS, XPath, or another syntax? What happens if it is missing? |
| Wait or delay | Allows client-side rendering and fonts to finish | Can you wait for a selector, network idle, or a fixed number of milliseconds? |
| Quality | Controls lossy WebP compression where supported | Is the scale documented, and does it apply only to WebP/JPEG? |
Capture controls run before encoding. A larger viewport can change responsive navigation; a wait condition can determine whether charts or authenticated content appear; and full-page mode can trigger additional lazy-loading requests. Keep these choices in configuration so a later format change does not silently alter the rendering.
Do not mix provider contracts
One documented service, ScreenshotEngine, describes GET query parameters and POST JSON, with case-sensitive names and some options available only in POST requests. Another Screenshot API documents API-key authentication, GET and POST operations, JSON responses containing hosted image URLs, and batch operations. Screenshot Studio documents a different pattern: capture PNG first, then call an export operation with WebP selected; its portal describes an unauthenticated public API subject to per-IP limits. These are examples of distinct contracts, not interchangeable snippets.
Before coding, record four facts from the chosen documentation: endpoint and method, authentication, exact format parameter, and success response shape. Also check quotas, retention, rate limits, and error fields because these policies can change.
Do these 3 things before closing this tab:
1Clear out junk files and repair common Windows errors2Fix the driver behind crashes, sound loss and screen glitches3Repair Windows errors before they cause bigger problemsRank #2
- HTML CSS Design and Build Web Sites
- Comes with secure packaging
- It can be a gift option
Runnable implementation patterns
cURL for a direct binary endpoint
Replace the URL, key option, and format parameter with the names from one provider’s documentation. The following pattern is intentionally generic rather than a claim about a particular service.
curl -G 'https://api.example.com/screenshot'
-H 'Authorization: Bearer YOUR_API_KEY'
--data-urlencode 'url=https://example.com'
--data-urlencode 'format=webp'
--data-urlencode 'full_page=true'
-o page.webp
file page.webp
Use the provider’s documented header or query-key authentication; do not send a bearer header if that service requires a query parameter.
Python: inspect content type before saving
import requests
endpoint = "https://api.example.com/screenshot"
params = {
"url": "https://example.com",
"format": "webp",
"full_page": "true",
}
headers = {"Authorization": "Bearer YOUR_API_KEY"}
r = requests.get(endpoint, params=params, headers=headers, timeout=90)
r.raise_for_status()
content_type = r.headers.get("content-type", "").split(";", 1)[0].lower()
if content_type == "image/webp":
with open("page.webp", "wb") as f:
f.write(r.content)
elif content_type == "application/json":
data = r.json()
image_url = data["url"] # use the field documented by your provider
image = requests.get(image_url, timeout=90)
image.raise_for_status()
with open("page.webp", "wb") as f:
f.write(image.content)
else:
raise RuntimeError(f"Unexpected content type: {content_type}")
Node.js: binary versus JSON
const q = new URLSearchParams({
url: 'https://example.com',
format: 'webp',
full_page: 'true'
});
const res = await fetch(`https://api.example.com/screenshot?${q}`, {
headers: { Authorization: 'Bearer YOUR_API_KEY' }
});
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
const type = (res.headers.get('content-type') || '').split(';')[0];
if (type === 'image/webp') {
const bytes = Buffer.from(await res.arrayBuffer());
await import('node:fs/promises').then(fs => fs.writeFile('page.webp', bytes));
} else if (type === 'application/json') {
const data = await res.json();
const image = await fetch(data.url);
if (!image.ok) throw new Error(`Image download failed: ${image.status}`);
const bytes = Buffer.from(await image.arrayBuffer());
await import('node:fs/promises').then(fs => fs.writeFile('page.webp', bytes));
} else {
throw new Error(`Unexpected content type: ${type}`);
}
When a separate conversion call is required
If the capture endpoint has no WebP option, follow its documented two-step flow. Screenshot Studio’s portal demonstrates capturing PNG and then submitting that image to an export operation with WebP selected. Preserve the original PNG until the export succeeds, because it is useful for diagnosing rendering problems. Do not invent an export URL or field names: providers differ on multipart uploads, base64 fields, object IDs, and returned URLs.
Alternatively, download the PNG and convert it with an image library you control. This separates browser rendering from encoding, but adds storage, CPU work, and another failure point. Confirm that your converter preserves transparency when required and that your chosen quality setting has the semantics you expect.
Rank #3
ScreenshotNeo: direct WebP without browser setup
ScreenshotNeo is a website screenshot API and MCP server. Its endpoint returns PNG, JPEG, WebP, or PDF from one GET request. A direct WebP call is:
curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp
See the ScreenshotNeo documentation for all request options and response headers. Equivalent clients are:
Python
import requests
r = requests.get("https://api.screenshotneo.com/v1/shot", params={"access_key": "YOUR_API_KEY", "url": "https://stripe.com"}, timeout=90)
r.raise_for_status()
open("shot.webp", "wb").write(r.content)
Node.js
const q = new URLSearchParams({ access_key: 'YOUR_API_KEY', url: 'https://stripe.com' });
const res = await fetch(`https://api.screenshotneo.com/v1/shot?${q}`);
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
const fs = await import('node:fs/promises');
await fs.writeFile('shot.webp', Buffer.from(await res.arrayBuffer()));
Before capture, ScreenshotNeo can accept cookie/consent banners and remove more than 60 known consent platforms, newsletter popups, and chat widgets; each step can be disabled. Bot checks or CAPTCHAs, blank pages, timeouts, failed loads, and cache hits are not billed, and the response identifies the page verdict and billing status with X-Page-Verdict and X-Billed headers. It also offers an MCP server with take_screenshot, get_page_info, and capture_pdf for AI clients such as Claude and Cursor.
Options include full-page capture with lazy images loaded, CSS-selector elements, dark mode, device presets or custom viewports, retina scale, quality and resizing controls, custom CSS/JavaScript, clicks, waits, request blocking, headers, cookies, user agent, Authorization, timezone, geolocation, transparent backgrounds, caching with a chosen TTL, signed image links, asynchronous jobs with signed webhooks, bulk capture for up to 100 URLs per call, a usage API, and an OpenAPI specification. Existing parameter names used by other screenshot APIs are supported to ease migration.
The Free plan includes 1,000 shots per month without a card. Paid plans start at $5 for 3,000 shots; yearly billing provides two months free, and every feature is available on every plan. Create a free ScreenshotNeo account.
Rank #4
- Brand: Wiley
- Set of 2 Volumes
- A handy two-book set that uniquely combines related technologies Highly visual format and accessible language makes these books highly effective learning tools Perfect for beginning web designers and front-end developers
Troubleshooting checklist
The file is unreadable
Check that you saved bytes, not decoded text, and verify Content-Type: image/webp. A JSON error body may have been written to a file after a non-2xx response; call raise_for_status() or check res.ok first.
You received JSON instead of an image
Parse only when the content type is JSON, then fetch the documented URL field. Hosted URLs can expire, so download them promptly if the contract says they are temporary.
The page is blank or incomplete
Increase the documented delay, wait for a specific selector, or use network-idle waiting. Confirm that the target does not require credentials, a browser challenge, or a blocked resource. Full-page capture may need lazy-loading support.
The request is rejected
Check API-key placement, case-sensitive parameter names, URL encoding, allowed methods, and plan or per-IP limits. A 401/403 usually concerns authentication or access; a 429 indicates rate limiting; 4xx validation errors usually identify an unsupported option.
Best Value
The output is unexpectedly large or soft
WebP quality, viewport dimensions, device scale, and full-page height all affect bytes and pixels. Change one variable at a time and retain the original capture when using a separate export step.
Operational notes
- Set a client timeout long enough for browser rendering, but bound retries so a stuck page does not exhaust workers.
- Retry transient network and 5xx failures with backoff; do not blindly retry validation errors or authentication failures.
- Log status, content type, request ID, and provider verdict headers without recording API keys or sensitive page data.
- Pin your integration to documented parameter names and recheck quotas, retention, pricing, and legal terms when the provider changes its API.
Frequently Asked Questions
Can a WebP screenshot contain transparency?
Yes. WebP supports alpha transparency, but the screenshot service must capture a transparent background and the page itself must allow it.
Is WebP always smaller than PNG?
Not necessarily. File size depends on page content, dimensions, and encoder settings; the available evidence does not establish a universal savings percentage.
Recommended Free Tools
Should I use GET or POST for screenshot requests?
Use the method documented by your provider. Some services expose both, while advanced capture settings may be POST-only.
How can I verify that a downloaded file is really WebP?
Check the response Content-Type and inspect the file with an image tool such as your operating system’s file inspector; do not rely only on the .webp extension.
Quick Recap
Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.




