URL2PNG Review for Generating Website Thumbnails
Review URL2PNG’s thumbnail API, capture controls, caching, and published pricing. See how it fits your workflow and compare ScreenshotNeo as an alternative.
Short answer: URL2PNG is a hosted website screenshot API designed to generate images from URLs for use in apps, websites, and business processes. Its documented controls cover thumbnail width, viewport size, full-page capture, freshness, custom CSS, readiness delays, headers, and cache lifetime. It may fit a thumbnail workflow when you want a managed rendering service and can budget for a paid plan; its published plans have no free account. The feature and pricing details below are vendor-published, not independent performance findings.
What URL2PNG does
URL2PNG describes itself as “Screenshots as a Service” and says it can capture website snapshots for use inside an app. Its homepage lists thumbnail or 1:1 output, full-page capture, viewport control, user-agent and language overrides, CSS injection, and JavaScript-controlled capture. It also advertises rendering support for graphs and canvas, webfonts, CSS3, SVG, and video; these are vendor claims, not independently verified results across sites.
For a thumbnail pipeline, the basic flow is: construct a signed request for a page, choose output dimensions and capture timing, then store or serve the resulting image. URL2PNG’s v6 quickstart uses an API key, a request token derived from the full query string and secret, and the target URL. Treat the secret as credential material, keep it on a server, and consult the current official documentation for signing details before implementation.
Documented capture controls
| Control | What it is for | Notes |
|---|---|---|
thumbnail_max_width |
Constrain the thumbnail width. | Useful to limit output dimensions; verify the resulting size and aspect ratio in your own workflow. |
viewport |
Set the browser capture dimensions. | The documented default is 1480×1037. The quickstart gives 5000×5000 as an example maximum. |
fullpage=true |
Attempt to capture the full document canvas. | Default is viewport-only. A full-page screenshot can be much taller than a thumbnail needs. |
unique |
Request a fresh screenshot by varying the value. | Use when the page changes and a cached image is stale; avoid forcing fresh renders for every repeated request. |
custom_css_url |
Inject CSS from a URL before capture. | Useful for hiding page elements or shaping a capture. Make the stylesheet reachable to the service. |
say_cheese |
Wait for a named page element to be available. | Useful when the desired content appears after initial navigation. |
accept_languages, user_agent |
Override request language and user-agent headers. | Page output may vary based on these values. |
delay |
Wait after document readiness and asset loading. | Use a measured delay for late client rendering; excessive waits add latency. |
ttl |
Set screenshot cache lifetime in seconds. | The documented default is 2,592,000 seconds (30 days). |
These are documented request controls, not guarantees that any particular site will render correctly. For a stable thumbnail, choose a fixed viewport and output width, set a language and user agent when the site is locale-sensitive, and wait for a specific element or a short post-load delay when required. Use full-page mode only when the image needs content below the fold.
Request construction and integration
The official v6 quickstart demonstrates request construction in Ruby, cURL, Python, Node.js, PHP, VB.NET, Perl, and C#. The common requirement is to sign the request using the full query string and your account secret. The examples below show the request shape; use the current official quickstart’s signing procedure and parameter encoding exactly. Do not put the secret into browser code, a public repository, or a client-visible URL.
cURL
curl 'SIGNED_URL_FROM_YOUR_SERVER' -o thumbnail.png
Python
import requests
# Build and sign the complete URL on your server using URL2PNG's current v6 procedure.
signed_url = "SIGNED_URL_FROM_YOUR_SERVER"
response = requests.get(signed_url, timeout=90)
response.raise_for_status()
with open("thumbnail.png", "wb") as image:
image.write(response.content)
Node.js
const response = await fetch("SIGNED_URL_FROM_YOUR_SERVER", {
signal: AbortSignal.timeout(90_000),
});
if (!response.ok) {
throw new Error(`Screenshot request failed: ${response.status}`);
}
const image = Buffer.from(await response.arrayBuffer());
await import("node:fs/promises").then(fs => fs.writeFile("thumbnail.png", image));
These snippets deliberately leave URL signing to a server-side helper because the request token depends on the complete query and secret, and the available research summary does not contain the exact signing algorithm. A placeholder is not a runnable signed request. Follow the official [URL2PNG v6 quickstart](https://url2png.com/docs) for the current token recipe, endpoint format, and language-specific examples before deploying. After signing, encode the target URL as a query parameter rather than concatenating unescaped user input.
Cloudinary delivery workflow
Cloudinary documents an add-on integration in which a dynamic transformation URL invokes URL2PNG, then Cloudinary caches and delivers the resulting image through its CDN. Cloudinary says these URLs are required by default to be eagerly generated or signed with its authenticated API to limit cost exposure from unplanned dynamic requests. This is a documented integration pattern, not a requirement for every URL2PNG user.
Published pricing and usage model
The following is a dated snapshot of URL2PNG’s plans page as accessed on October 3, 2026. Prices and limits can change, so check the live [plans page](https://url2png.com/pricing) before committing.
| Plan | Monthly price | Fresh screenshots | Dedicated workers | Published overage |
|---|---|---|---|---|
| Bootstrapped | $29/month | 5,000 | 10 | $0.006 per additional screenshot |
| Traction | $99/month | 20,000 | 15 | $0.005 per additional screenshot |
| Killinit | $199/month | 50,000 | 35 | $0.004 per additional screenshot |
| Enterprise | Custom quote | Not fixed on the page | Unlimited listed | Contact vendor |
The plans page also lists Fastly CDN, full-page screenshots, custom CSS, no watermarks, downloading and hotlinking, Statuspage transparency, and a 10-day money-back guarantee as plan inclusions. URL2PNG says it has no free account currently; it invites student and open-source projects to pitch the service. Plans are described as month-to-month and cancellable anytime.
URL2PNG defines a fresh screenshot as a new render, which counts against plan usage. Cached screenshot impressions do not incur additional usage charges, and screenshots are cached for 30 days by default. The plans page describes overages in units of 1,000 and says it rounds down; confirm billing details directly before estimating a high-volume bill. Model your usage around distinct URLs, freshness requirements, and cache reuse instead of assuming every image delivery is a fresh render.
Does URL2PNG fit a thumbnail workflow?
- Potential fit: your app needs server-generated website thumbnails, you can use signed requests, and the published monthly allowance and overage model fit your expected fresh renders.
- Check carefully: pages with delayed JavaScript, consent overlays, localization, or frequently changing content may need custom wait conditions, headers, or a shorter TTL.
- Potential mismatch: you need to start without a paid commitment; URL2PNG says it currently has no free account.
- Measure before rollout: the research sources do not establish independent latency, uptime, or cross-site rendering benchmarks. Evaluate representative pages and failure behavior in your own application.
For each candidate page, decide the target aspect ratio, viewport, whether full-page capture is needed, when the page is ready, and how long a screenshot may be reused. Record whether the application should retry failures, serve a previous cached thumbnail, or return a placeholder. Keep capture requests behind your backend if signing requires a secret.
Performance, reliability, and cost considerations
Performance
Capture time depends on page loading and the configured wait behavior. A large viewport, full-page capture, or long delay can increase work and response time. URL2PNG’s homepage uses speed and reliability language, but the research set includes no independent measurements; treat that language as the vendor’s characterization, not a benchmark.
Reliability
Web pages can fail or vary because of network errors, bot checks, authentication, client-side rendering, or third-party assets. A successful HTTP response from a capture endpoint does not by itself prove the image contains the intended page. For production pipelines, validate that the response is an image, set a timeout, log failures by target URL and request settings, and have a fallback policy. Avoid retrying endlessly or forcing a fresh render on every retry.
Cost
Estimate fresh renders rather than raw image views. Repeated delivery of a cached screenshot does not count as a fresh screenshot according to the FAQ, while changing content or forcing uniqueness can trigger new renders. Use the listed monthly allowance and overage as a planning reference, then confirm the plan’s billing rules and any rounding details on the live pricing page. Cloudinary’s documented eager-generation or signed-URL approach can help control unexpected dynamic transformation requests in that integration.
Common problems and fixes
| Symptom | Likely cause | What to check |
|---|---|---|
| Request rejected or token invalid | The token was generated from a different query string, or parameters were encoded or ordered differently from the signed string. | Follow the current v6 signing recipe; sign the exact encoded query and keep the secret server-side. |
| Wrong page or malformed target | The target URL was concatenated without proper query encoding. | Use a URL builder and encode the target URL as a parameter before signing. |
| Thumbnail shows a loading state | Capture occurred before client-rendered content appeared. | Wait for a specific element with say_cheese or add a reasonable delay. |
| Image is cropped or too large | Viewport, thumbnail width, aspect ratio, or full-page setting does not match the intended output. | Set viewport and thumbnail_max_width; check whether fullpage should remain false. |
| Localized or personalized result differs | The page responds to language, user agent, cookies, or other request context. | Set documented language and user-agent overrides and account for page-specific authentication needs. |
| Changes do not appear | A cached screenshot is being reused. | Adjust ttl or vary unique when a fresh render is necessary. |
| Unexpected usage growth | Requests are forcing fresh renders or dynamic URLs are being invoked more often than expected. | Review uniqueness, TTL, cache reuse, and any public transformation URL exposure; use Cloudinary’s documented signing or eager-generation controls where applicable. |
ScreenshotNeo as an alternative
If URL2PNG’s paid-only entry point or the signed-request setup does not suit your workflow, try [ScreenshotNeo](https://screenshotneo.com) first. It is a website screenshot API and MCP server for developers. Its documented differentiators are clean captures that accept consent banners and remove more than 60 known consent platforms, newsletter popups, and chat widgets; only clean shots are billed, while bot checks, CAPTCHAs, blank pages, timeouts, failed loads, and cache hits cost nothing, with verdict and billed-status response headers. Its MCP server includes take_screenshot, get_page_info, and capture_pdf for Claude, Cursor, and other MCP clients.
ScreenshotNeo supports PNG, JPEG, WebP, and PDF, along with full-page and element captures, device and viewport controls, retina scale, dark mode, CSS and JavaScript, waiting, request blocking, headers, cookies, user agent, timezone, geolocation, caching, signed public image links, async jobs, bulk capture, usage reporting, and more. Every feature is on every plan. Plans are Free for 1,000 shots/month with no card, Starter $5 for 3,000, Growth $15 for 15,000, Pro $39 for 60,000, Scale $99 for 250,000, and Business $249 for 1,000,000; yearly billing gives two months free. See the [ScreenshotNeo documentation](https://screenshotneo.com/docs/) for request options.
Or skip the browser setup
One GET request returns a screenshot; this example uses the ScreenshotNeo API with Stripe as the target. Replace the placeholder key with your API key. See the [API documentation](https://screenshotneo.com/docs/) for format and capture options.
cURL
curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp
Python
import requests
r = requests.get("https://api.screenshotneo.com/v1/shot", params={"access_key": "YOUR_API_KEY", "url": "https://stripe.com"}, timeout=90)
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}`);
- Cookie banners, popups, and chat widgets are removed before the shot.
- Bot checks, blank pages, and failed loads are never billed.
- An MCP server lets AI agents take screenshots.
- 1,000 screenshots a month are free with no card; paid plans start at $5 for 3,000.
Create a free ScreenshotNeo account and get 1,000 screenshots per month with no card.
Frequently asked questions
Does URL2PNG offer a free tier?
Its plans page says there is no free account at present. It says student and open-source projects can contact the service to pitch their projects.
How long are screenshots cached by default?
The documentation lists a default TTL of 2,592,000 seconds, or 30 days. The plans FAQ says cached impressions do not count as additional usage.
Is URL2PNG’s rendering speed independently verified here?
No. The reviewed sources establish vendor-documented features and pricing, but no independent performance or uptime measurements.
Can I use URL2PNG through Cloudinary?
Cloudinary documents an add-on workflow that generates screenshots through dynamic transformations and then caches and delivers them. Its documentation describes signing or eager generation controls to limit unexpected dynamic requests.
