<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: alekseykazandaev</title>
    <description>The latest articles on DEV Community by alekseykazandaev (@alekseykazandaev).</description>
    <link>https://dev.to/alekseykazandaev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3864351%2Fc6242ca4-93a0-4fd4-8622-1b4ff3b7b930.png</url>
      <title>DEV Community: alekseykazandaev</title>
      <link>https://dev.to/alekseykazandaev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/alekseykazandaev"/>
    <language>en</language>
    <item>
      <title>Site-Shot in August: an MCP server, Node + Python SDKs, and scheduled captures</title>
      <dc:creator>alekseykazandaev</dc:creator>
      <pubDate>Tue, 01 Sep 2026 18:17:12 +0000</pubDate>
      <link>https://dev.to/alekseykazandaev/site-shot-in-august-an-mcp-server-node-python-sdks-and-scheduled-captures-409h</link>
      <guid>https://dev.to/alekseykazandaev/site-shot-in-august-an-mcp-server-node-python-sdks-and-scheduled-captures-409h</guid>
      <description>&lt;p&gt;Three things shipped on &lt;a href="https://www.site-shot.com/" rel="noopener noreferrer"&gt;Site-Shot&lt;/a&gt; in August that change how you wire website screenshots into an agent or a backend. Here is each one, with the code.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. An official MCP server
&lt;/h2&gt;

&lt;p&gt;If your agent runs in an MCP-capable client — Claude Desktop, Cursor, Cline, VS Code — it can take screenshots now without you writing an HTTP layer at all.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"site-shot"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"site-shot-mcp"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"SITESHOT_API_KEY"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"YOUR_API_KEY"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Restart the client, then ask it to &lt;em&gt;"take a full-page screenshot of &lt;a href="https://news.ycombinator.com" rel="noopener noreferrer"&gt;https://news.ycombinator.com&lt;/a&gt;"&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Two tools ship: &lt;code&gt;capture_screenshot&lt;/code&gt; and &lt;code&gt;capture_full_page&lt;/code&gt;. &lt;code&gt;block_ads&lt;/code&gt; and &lt;code&gt;block_cookie_banners&lt;/code&gt; both default to &lt;code&gt;true&lt;/code&gt;, which matters more than it sounds — a cookie wall covering the fold is simultaneously a useless image and a bill for vision tokens.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Node and Python SDKs
&lt;/h2&gt;

&lt;p&gt;Both are zero-dependency and fully typed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;site-shot-sdk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;SiteShot&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;site-shot-sdk&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;node:fs/promises&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;SiteShot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SITESHOT_API_KEY&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;png&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;capture&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;example.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;full_size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writeFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;shot.png&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;png&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// png is a Buffer&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;site-shot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;site_shot&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;SiteShot&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;SiteShot&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="c1"&gt;# reads SITESHOT_API_KEY from the env
&lt;/span&gt;
&lt;span class="n"&gt;png&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;capture&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;example.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;full_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# png is bytes
&lt;/span&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;shot.png&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;wb&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;png&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One capture concept, four return modes — you pick the method rather than a flag: &lt;code&gt;capture()&lt;/code&gt; for bytes, &lt;code&gt;captureToFile()&lt;/code&gt; / &lt;code&gt;capture_to_file()&lt;/code&gt;, &lt;code&gt;captureBase64()&lt;/code&gt; / &lt;code&gt;capture_base64()&lt;/code&gt; for data URLs and LLM vision payloads, and &lt;code&gt;captureJson()&lt;/code&gt; / &lt;code&gt;capture_json()&lt;/code&gt; for the image plus metadata (add &lt;code&gt;source_code&lt;/code&gt; and you get the rendered HTML alongside the pixels).&lt;/p&gt;

&lt;p&gt;There is also &lt;code&gt;buildUrl()&lt;/code&gt; / &lt;code&gt;build_url()&lt;/code&gt;, which returns the request URL without executing it. &lt;strong&gt;It embeds your API key&lt;/strong&gt;, and there is no signed-URL scheme — so it is for debugging and server-side proxying, never for an &lt;code&gt;&amp;lt;img src&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Scheduled captures
&lt;/h2&gt;

&lt;p&gt;Point a schedule at a URL and it re-captures on a cadence, filing every shot in your library as a dated series. Finest cadence hourly, coarsest weekly. Every plan carries a weekly allowance — from 35 captures a week on the smallest plan to 12,000 a week on the largest — and each scheduled capture counts as one screenshot, like any other.&lt;/p&gt;

&lt;p&gt;A schedule also compares each capture with the previous one and can email you when the changed share of the page crosses a threshold you set. Worth being precise about the boundaries, because "change detection" gets oversold:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;it measures &lt;strong&gt;how much&lt;/strong&gt; of the page moved, not &lt;strong&gt;what&lt;/strong&gt; changed — there is no text or element diff;&lt;/li&gt;
&lt;li&gt;email is the only destination, and alerts are deduped to at most one per schedule per day;&lt;/li&gt;
&lt;li&gt;the soonest anything can reach you is the schedule's own cadence;&lt;/li&gt;
&lt;li&gt;alerts stay off until you switch them on per schedule.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you need element-level diffs or a ping within minutes, a dedicated change-detection service is the right tool. What this gives you instead is the comparable, timestamped series — what the page actually looked like before and after.&lt;/p&gt;

&lt;h2&gt;
  
  
  Geotargeting: 49 countries
&lt;/h2&gt;

&lt;p&gt;Add &lt;code&gt;country=DE&lt;/code&gt; and the render goes through a real IP in that country, with the language, time zone and geolocation defaults that belong to it. It takes an ISO 3166-1 alpha-2 code; full country names are not valid values.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;png&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;capture&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://example.com/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;country&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;DE&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;strict_country&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;strict_country&lt;/code&gt; is the part worth knowing about. Without it, an exhausted country pool quietly falls back to a US render and you get a screenshot that looks plausible and is wrong. With it, you get an in-band &lt;code&gt;country_unavailable&lt;/code&gt; error instead — which is the failure you actually want, because a silently-wrong geo screenshot is undetectable downstream.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where to start
&lt;/h2&gt;

&lt;p&gt;The free browser tool at &lt;a href="https://www.site-shot.com/" rel="noopener noreferrer"&gt;site-shot.com&lt;/a&gt; needs no signup. The API needs a key; plans start at $5/month for 2,000 screenshots. Agent-facing docs live at &lt;a href="https://www.site-shot.com/ai-agents/" rel="noopener noreferrer"&gt;site-shot.com/ai-agents/&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Numbers here are current as of 2026-09-01 — the country count moves with verified proxy capacity, so check &lt;a href="https://www.site-shot.com/countries/" rel="noopener noreferrer"&gt;/countries/&lt;/a&gt; for today's list.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>ai</category>
      <category>api</category>
      <category>webdev</category>
    </item>
    <item>
      <title>AI Agent vs. Screenshot API: Who Should Capture the Page (2026)</title>
      <dc:creator>alekseykazandaev</dc:creator>
      <pubDate>Sun, 16 Aug 2026 15:50:44 +0000</pubDate>
      <link>https://dev.to/alekseykazandaev/ai-agent-vs-screenshot-api-who-should-capture-the-page-2026-6nd</link>
      <guid>https://dev.to/alekseykazandaev/ai-agent-vs-screenshot-api-who-should-capture-the-page-2026-6nd</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://www.site-shot.com/blog/ai-agent-vs-screenshot-api/" rel="noopener noreferrer"&gt;Site-Shot blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Your agent already has a browser. It can navigate, wait, and call a screenshot function, and in the demo it&lt;br&gt;
works: you ask for a picture of a landing page and a PNG comes back. So the natural next thought is that a&lt;br&gt;
screenshot API is a box you no longer need — the agent is general-purpose, and a screenshot is a special case&lt;br&gt;
of "use a browser".&lt;/p&gt;

&lt;p&gt;Then the job grows. Five hundred URLs instead of one. The same page every morning for a quarter. The German&lt;br&gt;
version of a pricing page, not the German-language version served to a US datacenter IP. A run nobody is&lt;br&gt;
watching, where the thing you file turns out to be a cookie wall.&lt;/p&gt;

&lt;p&gt;The useful question is not whether a general-purpose agent &lt;em&gt;can&lt;/em&gt; take a screenshot — it can — but whether it&lt;br&gt;
should be the component that takes it. &lt;strong&gt;Does the job need a browser driven, or a URL turned into an image?&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Disclosure:&lt;/strong&gt; this comparison is published by Site-Shot, a screenshot API. We've tried to keep the&lt;br&gt;
numbers accurate and the trade-offs honest — including a section on the jobs where a general-purpose agent&lt;br&gt;
is the right tool and we are not. Our prices and country count were checked in August 2026; confirm on the&lt;br&gt;
&lt;a href="https://www.site-shot.com/pricing/" rel="noopener noreferrer"&gt;pricing page&lt;/a&gt; before you buy.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  The short answer
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Should an AI agent take its own screenshots?&lt;/strong&gt; Only when the page has to be &lt;em&gt;driven&lt;/em&gt; to reach the state you&lt;br&gt;
want — signed into, stepped through a flow, interacted with. When the job is "this URL, these options, give&lt;br&gt;
me the image", a screenshot API is the better component: it runs the same pipeline on every request, renders&lt;br&gt;
from another country, scores the result before returning it, captures in parallel, and costs a fraction of a&lt;br&gt;
cent instead of a few thousand image tokens per glance. The strongest setup is not one or the other — it is an&lt;br&gt;
agent that decides &lt;em&gt;what&lt;/em&gt; to capture and delegates the capturing.&lt;/p&gt;
&lt;h2&gt;
  
  
  The two architectures, side by side
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;General-purpose agent driving a browser&lt;/th&gt;
&lt;th&gt;Dedicated screenshot API&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;What you ask for&lt;/td&gt;
&lt;td&gt;A goal, in a prompt&lt;/td&gt;
&lt;td&gt;A URL plus explicit parameters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Same request twice&lt;/td&gt;
&lt;td&gt;A new plan each run&lt;/td&gt;
&lt;td&gt;The same pipeline each run&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Is the page ready?"&lt;/td&gt;
&lt;td&gt;The model judges&lt;/td&gt;
&lt;td&gt;Explicit waits (&lt;code&gt;delay_time&lt;/code&gt;), fixed timeouts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Country of the exit IP&lt;/td&gt;
&lt;td&gt;Wherever the sandbox runs&lt;/td&gt;
&lt;td&gt;48 countries, &lt;code&gt;country=DE&amp;amp;strict_country=1&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Locale, time zone, geolocation&lt;/td&gt;
&lt;td&gt;Yours to set, per country&lt;/td&gt;
&lt;td&gt;Move with the country automatically&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Failure handling&lt;/td&gt;
&lt;td&gt;Whatever the model tries next&lt;/td&gt;
&lt;td&gt;A fixed retry ladder, then an error&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Result checked before you get it&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Scored by an image classifier&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Concurrency&lt;/td&gt;
&lt;td&gt;Serial by construction&lt;/td&gt;
&lt;td&gt;10–100 dedicated workers by plan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost per capture&lt;/td&gt;
&lt;td&gt;Image tokens on every step it looks&lt;/td&gt;
&lt;td&gt;From $2.50 per 1,000, down to $0.80&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Can log in / click through a flow&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Cost per 1,000 comes from Site-Shot's cheapest and largest paid plans ($5/mo for 2,000 and $500/mo for&lt;br&gt;
625,000, checked August 2026).&lt;/p&gt;
&lt;h2&gt;
  
  
  Predictability: the same request, twice
&lt;/h2&gt;

&lt;p&gt;An agent's plan is a sample, not a contract. Ask the same agent for the same screenshot on Monday and Friday&lt;br&gt;
and you may get a different viewport, a different moment in the page's load, a different decision about the&lt;br&gt;
cookie banner. That variance is what makes an agent useful on messy one-off work — and what you do not want&lt;br&gt;
in the thing that produces your archive. A capture call goes through the same pipeline every time, so when&lt;br&gt;
today's frame differs from yesterday's, the page changed, not the plan.&lt;/p&gt;

&lt;p&gt;That compounds as captures pile up: a daily series is only comparable if every frame was taken the same way.&lt;br&gt;
With an agent, "same settings" is something you hope the model repeats. With parameters, it is something you&lt;br&gt;
typed.&lt;/p&gt;
&lt;h2&gt;
  
  
  Capturing from a specific country
&lt;/h2&gt;

&lt;p&gt;This is where the two architectures stop being interchangeable.&lt;/p&gt;

&lt;p&gt;A general-purpose agent renders from wherever it happens to run: your laptop, a CI container, or a cloud&lt;br&gt;
sandbox with a datacenter IP in the provider's region. For plenty of pages that is fine. For anything&lt;br&gt;
geo-targeted — offers, prices, ad creatives, region-limited content, localized landing pages — it is the&lt;br&gt;
wrong vantage point, and the failure is silent: the page renders, the screenshot looks plausible, and it is&lt;br&gt;
simply not what a user in that country sees.&lt;/p&gt;

&lt;p&gt;Closing that gap yourself means running proxy infrastructure — exits per country, kept alive as they get&lt;br&gt;
blocked — plus the rest of the vantage point, because an IP alone is not a country. A real German browser&lt;br&gt;
also sends German language preferences, sits in a Central European time zone, and reports plausible&lt;br&gt;
geolocation coordinates; get one of those wrong and sophisticated sites serve you the "something is off"&lt;br&gt;
version of the page.&lt;/p&gt;

&lt;p&gt;Site-Shot ships that as one parameter. Add &lt;code&gt;country=DE&lt;/code&gt; and the capture is rendered through an exit in that&lt;br&gt;
country with the locale, time zone and geolocation defaults that belong to it — &lt;a href="https://www.site-shot.com/countries/" rel="noopener noreferrer"&gt;48 countries as of August&lt;br&gt;
2026&lt;/a&gt;, on any paid plan. Add &lt;code&gt;strict_country=1&lt;/code&gt; and you also get the&lt;br&gt;
guarantee that matters more than the feature: if no exit is available for that country at that moment, the&lt;br&gt;
API returns an in-band &lt;code&gt;"error": "country_unavailable"&lt;/code&gt; instead of quietly falling back to a US render. A&lt;br&gt;
wrong-country screenshot you &lt;em&gt;know&lt;/em&gt; about is a retry. One you don't is a bad decision with a picture&lt;br&gt;
attached. The step-by-step version — including the free browser tool, where the default is a direct&lt;br&gt;
connection and you have to select United States explicitly — is in the&lt;br&gt;
&lt;a href="https://www.site-shot.com/blog/screenshot-website-from-another-country/" rel="noopener noreferrer"&gt;guide to screenshots from another country&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Knowing the screenshot is actually a screenshot
&lt;/h2&gt;

&lt;p&gt;An agent's browser returns whatever rendered: the page, or a bot-check interstitial, a consent wall, a 404&lt;br&gt;
skinned like a homepage, a blank frame because the exit never reached the host. The agent may notice — vision&lt;br&gt;
models are decent at spotting a Cloudflare page — but only if looking is in its plan, and in an unattended&lt;br&gt;
run "the browser returned an image" is usually treated as success.&lt;/p&gt;

&lt;p&gt;Site-Shot treats a returned image as a hypothesis. Every capture is scored by an image classifier trained on&lt;br&gt;
our own corpus of renders, which sorts a frame three ways: a valid page, an invalid render, or a page whose&lt;br&gt;
content is the target site's own error. A capture that fails that check is not what you get back — it&lt;br&gt;
triggers the next rung of a retry ladder instead. Up to three attempts escalate strategy rather than repeat&lt;br&gt;
it: a plain fast render first, then a render that handles interstitial challenges, then a render through a&lt;br&gt;
country exit, with the starting rung chosen from what has worked for that host before.&lt;/p&gt;

&lt;p&gt;Two honest limits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;If the whole ladder fails, you still get the best image it produced, unvalidated.&lt;/strong&gt; We would rather hand
you a questionable frame you can check than fail a job a human eye could have salvaged.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One case is not salvageable and comes back as an error instead:&lt;/strong&gt; a capture where no page was fetched at
all. That guard exists because of a real incident — captures through exits that could not reach the host
returned a 3 KB white PNG with a &lt;code&gt;200&lt;/code&gt; status, and a caller storing what it was given would have filed a
blank rectangle as that day's evidence.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of that makes a capture legally special. It is ordinary specialization: a service that does one thing a&lt;br&gt;
few million times learns what its own failures look like, and can afford a model whose only job is to&lt;br&gt;
recognize them.&lt;/p&gt;
&lt;h2&gt;
  
  
  Cost per look
&lt;/h2&gt;

&lt;p&gt;A general-purpose agent pays for pixels twice: once to render the page, and again — every step it looks — to&lt;br&gt;
feed the image to the model. That second cost is easy to underestimate because it is invisible in the code,&lt;br&gt;
and the arithmetic is public. Claude reads an image in 28×28-pixel patches, so an image costs&lt;br&gt;
&lt;code&gt;⌈width / 28⌉ × ⌈height / 28⌉&lt;/code&gt; visual tokens: a 1920×1080 screenshot is 2,691 visual tokens on the&lt;br&gt;
high-resolution tier, and a 4K frame is capped at 4,784 (Anthropic's vision documentation, checked August&lt;br&gt;
2026). A ten-step agent run that looks after each action spends on the order of 27,000 tokens on pixels&lt;br&gt;
before reasoning about any of them. Other vision models price differently, but all of them charge by image&lt;br&gt;
size, and every step of a browsing loop re-sends one.&lt;/p&gt;

&lt;p&gt;Against that, a capture on Site-Shot's entry plan costs $0.0025 — $5/mo for 2,000 screenshots, falling to&lt;br&gt;
$0.80 per 1,000 on the largest plan. An agent glance and a capture are simply different purchases: image&lt;br&gt;
tokens are worth paying so a model can &lt;em&gt;see&lt;/em&gt; a page and act on it, and are waste when the deliverable is a&lt;br&gt;
file no model needs to look at. When the agent &lt;em&gt;does&lt;/em&gt; look, &lt;code&gt;no_ads=1&lt;/code&gt; and &lt;code&gt;no_cookie_popup=1&lt;/code&gt; mean it&lt;br&gt;
encodes less junk.&lt;/p&gt;
&lt;h2&gt;
  
  
  Throughput and recovery
&lt;/h2&gt;

&lt;p&gt;An agent loop is serial by construction: think, act, look, think. Five hundred URLs is five hundred round&lt;br&gt;
trips through a model, and the wall-clock cost is the sum. You &lt;em&gt;can&lt;/em&gt; fan out several agents — but every&lt;br&gt;
parallel lane is another model running, so agent parallelism scales the bill, not just the throughput.&lt;br&gt;
Capture workers are the cheap kind of parallel: 10 dedicated workers on the two entry tiers, 25 on Optimal,&lt;br&gt;
100 on Professional, so a batch is bounded by your plan's parallelism rather than by one conversation's&lt;br&gt;
pace. Recovery differs the same way: a failed render inside an agent is&lt;br&gt;
handled by whatever the model improvises, while a failed capture walks a fixed ladder and then reports a&lt;br&gt;
specific failure you can branch on.&lt;/p&gt;
&lt;h2&gt;
  
  
  Where a general-purpose agent is genuinely the right tool
&lt;/h2&gt;

&lt;p&gt;One case, and it is a real one: &lt;strong&gt;pages that must be driven to reach the state you want.&lt;/strong&gt; Signing in and&lt;br&gt;
passing a second factor, walking a checkout to step three, opening the account screen of a dashboard,&lt;br&gt;
applying filters until the view you need exists — a URL-in, image-out API cannot do any of those steps by&lt;br&gt;
design. When the screenshot's subject only exists after authorization and a chain of interactions, you need&lt;br&gt;
something that drives a browser: an agent, or your own Playwright script. That is the boundary, and it is not&lt;br&gt;
a small territory — it covers most captures of &lt;em&gt;your own&lt;/em&gt; logged-in product.&lt;/p&gt;

&lt;p&gt;Everything on the public side of that boundary is delegable, which is the hybrid: the agent decides what to&lt;br&gt;
capture and hands off the capture. Over MCP that is a tool call — our official server (&lt;code&gt;npx -y site-shot-mcp&lt;/code&gt;)&lt;br&gt;
exposes &lt;code&gt;capture_screenshot&lt;/code&gt; and &lt;code&gt;capture_full_page&lt;/code&gt;, so the model asks for a picture and never touches HTTP&lt;br&gt;
plumbing. See the &lt;a href="https://www.site-shot.com/blog/screenshot-api-for-ai-agents-mcp/" rel="noopener noreferrer"&gt;MCP setup guide&lt;/a&gt; and the&lt;br&gt;
&lt;a href="https://www.site-shot.com/ai-agents/" rel="noopener noreferrer"&gt;AI agents page&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Handing the job over
&lt;/h2&gt;

&lt;p&gt;It is one GET — no SDK required, though Node.js and Python have official ones (&lt;code&gt;npm install site-shot-sdk&lt;/code&gt;&lt;br&gt;
and &lt;code&gt;pip install site-shot&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-o&lt;/span&gt; de.png &lt;span class="s2"&gt;"https://api.site-shot.com/?url=whatismycountry.com&amp;amp;country=DE&amp;amp;strict_country=1&amp;amp;no_ads=1&amp;amp;no_cookie_popup=1&amp;amp;width=1280&amp;amp;height=800&amp;amp;user_key=YOUR_KEY"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add &lt;code&gt;full_size=1&lt;/code&gt; for the whole scrollable page (up to 20,000 pixels tall with &lt;code&gt;max_height&lt;/code&gt;), or&lt;br&gt;
&lt;code&gt;response_type=json&lt;/code&gt; to get the image as base64 alongside the target's response headers. To hand the same&lt;br&gt;
capabilities to the agent instead, drop the MCP server into your client config with a &lt;code&gt;SITESHOT_API_KEY&lt;/code&gt; and&lt;br&gt;
the model calls them as tool arguments.&lt;/p&gt;

&lt;p&gt;API keys come from the &lt;a href="https://www.site-shot.com/pricing/" rel="noopener noreferrer"&gt;pricing page&lt;/a&gt;, from $5/mo for 2,000 screenshots.&lt;br&gt;
For where a capture API sits among the alternatives, see the&lt;br&gt;
&lt;a href="https://www.site-shot.com/blog/best-website-screenshot-api-2026/" rel="noopener noreferrer"&gt;8-tool screenshot API comparison&lt;/a&gt; and the&lt;br&gt;
&lt;a href="https://www.site-shot.com/blog/best-screenshot-mcp-servers-2026/" rel="noopener noreferrer"&gt;screenshot MCP server roundup&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Can an AI agent take website screenshots on its own?&lt;/strong&gt;&lt;br&gt;
Yes. Any agent with browser access can navigate to a URL and capture the viewport. The limits are not&lt;br&gt;
capability but consistency, geography, and cost: an agent re-plans on every run, renders from whatever IP its&lt;br&gt;
sandbox has, and pays image tokens each time it looks at the page.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When should an AI agent call a screenshot API instead of screenshotting the page itself?&lt;/strong&gt;&lt;br&gt;
When the job is "this URL, these options, give me the image" rather than "drive this browser". A screenshot&lt;br&gt;
API runs the same capture pipeline with the same parameters on every request, can render from a specific&lt;br&gt;
country, validates the result before returning it, and runs captures in parallel. Keep the agent in charge only when the page must be driven to reach the&lt;br&gt;
state you want — signed into, stepped through a multi-step flow, interacted with.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I screenshot a page as it appears in another country?&lt;/strong&gt;&lt;br&gt;
Render it through an exit in that country with matching locale, time zone and geolocation. On Site-Shot that&lt;br&gt;
is one parameter — &lt;code&gt;country=DE&lt;/code&gt; — across 48 countries as of August 2026, on any paid plan; adding&lt;br&gt;
&lt;code&gt;strict_country=1&lt;/code&gt; makes an exhausted country pool return an in-band &lt;code&gt;"error": "country_unavailable"&lt;/code&gt; instead&lt;br&gt;
of silently falling back to a US render. A general-purpose agent renders from wherever it runs, so a&lt;br&gt;
geo-targeted page comes back plausible and wrong.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I know a screenshot is the real page and not a bot check?&lt;/strong&gt;&lt;br&gt;
Site-Shot scores every capture with an image classifier that sorts a frame as a valid page, an invalid&lt;br&gt;
render, or the target site's own error page. A frame that fails triggers the next rung of a retry ladder — up&lt;br&gt;
to three attempts escalating from a plain render to challenge handling to a country exit — rather than being&lt;br&gt;
returned. If every attempt fails you still receive the best image, unvalidated, with one exception: a capture&lt;br&gt;
that fetched no page at all is returned as an error, never as a blank rectangle.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is a screenshot API cheaper than having the agent do it?&lt;/strong&gt;&lt;br&gt;
For producing image files, usually by a wide margin. A vision model bills by image size — Claude reads images&lt;br&gt;
in 28×28-pixel patches, so a 1920×1080 screenshot is 2,691 visual tokens (Anthropic's vision documentation,&lt;br&gt;
checked August 2026) — and a browsing loop re-sends one on every step. A Site-Shot capture costs $0.0025 on&lt;br&gt;
the entry plan ($5/mo for 2,000) and $0.80 per 1,000 at the largest tier. Image tokens are worth paying when&lt;br&gt;
the model needs to see the page; they are waste when the deliverable is a file.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What can a screenshot API not do that a browsing agent can?&lt;/strong&gt;&lt;br&gt;
It cannot drive the page: signing in, passing a second factor, filling forms, and clicking through a&lt;br&gt;
multi-step flow are all out of scope for a URL-in, image-out service. A page state that only exists after&lt;br&gt;
authorization and a chain of interactions has to be captured by whatever performs those interactions — a&lt;br&gt;
browsing agent or your own browser automation.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Capture your first screenshot free in your browser — no signup — at&lt;br&gt;
&lt;a href="https://www.site-shot.com/" rel="noopener noreferrer"&gt;site-shot.com&lt;/a&gt;. Building an agent? See the&lt;br&gt;
&lt;a href="https://www.site-shot.com/ai-agents/" rel="noopener noreferrer"&gt;AI agents page&lt;/a&gt;, grab an API key on the&lt;br&gt;
&lt;a href="https://www.site-shot.com/pricing/" rel="noopener noreferrer"&gt;pricing page&lt;/a&gt; from $5/mo, and read the&lt;br&gt;
&lt;a href="https://www.site-shot.com/#documentation" rel="noopener noreferrer"&gt;API docs&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>screenshot</category>
      <category>api</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How to Take Website Screenshots from Another Country</title>
      <dc:creator>alekseykazandaev</dc:creator>
      <pubDate>Mon, 27 Jul 2026 08:08:59 +0000</pubDate>
      <link>https://dev.to/alekseykazandaev/how-to-take-website-screenshots-from-another-country-3f7n</link>
      <guid>https://dev.to/alekseykazandaev/how-to-take-website-screenshots-from-another-country-3f7n</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on the Site-Shot blog.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The web you see is not the web everyone sees. The same URL serves different ads in Berlin and Boston, different prices in São Paulo and Stockholm, a cookie-consent wall in Paris and none in Singapore — and sometimes a "not available in your region" page instead of any content at all. If you need proof of what a page really shows in a given market, you need a screenshot taken &lt;em&gt;from&lt;/em&gt; that market.&lt;/p&gt;

&lt;p&gt;Site-Shot renders screenshots through real country-specific IP addresses in 49 countries. Geotargeting is included with any paid plan, and the free no-signup browser tool captures from the United States. Since July 2026 you can pick the country right in the browser tool — no code required — or automate it with one API parameter.&lt;/p&gt;

&lt;p&gt;This guide covers both paths, plus the four jobs people actually need this for.&lt;/p&gt;

&lt;h2&gt;
  
  
  The quick way: your browser, no signup
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Open &lt;a href="https://www.site-shot.com/" rel="noopener noreferrer"&gt;site-shot.com&lt;/a&gt; and paste the URL you want to capture.&lt;/li&gt;
&lt;li&gt;In the &lt;strong&gt;Country&lt;/strong&gt; dropdown, select &lt;strong&gt;United States&lt;/strong&gt;. (The default is &lt;em&gt;Direct connection&lt;/em&gt;, which renders from our data center without geo routing — pick a country explicitly to get a geo-targeted view.)&lt;/li&gt;
&lt;li&gt;Capture. The page is rendered in a real Chromium browser behind a US IP address, with US language, time zone, and geolocation defaults applied automatically.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;US captures are free and require no account. Every other country in the dropdown unlocks with any paid plan — the selector shows exactly what's available right now, and every plan on the &lt;a href="https://www.site-shot.com/pricing/" rel="noopener noreferrer"&gt;pricing page&lt;/a&gt; includes geotargeting for all supported countries.&lt;/p&gt;

&lt;p&gt;A good first test: capture &lt;code&gt;whatismycountry.com&lt;/code&gt;. It prints the detected country and city above the fold, so you can see the geo routing working with your own eyes.&lt;/p&gt;

&lt;h2&gt;
  
  
  What country-based screenshots are for
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Verifying geo-targeted ad campaigns
&lt;/h3&gt;

&lt;p&gt;If you run country-targeted campaigns — or sell ad placements — you need evidence that the right creative actually appears in the right market. A screenshot captured through a German IP shows the ads a German visitor is served, not what your office network gets.&lt;/p&gt;

&lt;p&gt;One practical note: Site-Shot can block ads with &lt;code&gt;no_ads=1&lt;/code&gt; for clean captures, but for ad verification you want the opposite — leave ad blocking off so the creatives render.&lt;/p&gt;

&lt;h3&gt;
  
  
  Checking localized prices and content
&lt;/h3&gt;

&lt;p&gt;Stores and SaaS products localize prices, currencies, promotions, and sometimes whole product catalogs by visitor location. Screenshots from each target market let you audit what's actually being shown: the currency symbol, the regional promo banner, the shipping notice. Capture the same product page from a few countries and compare them side by side.&lt;/p&gt;

&lt;h3&gt;
  
  
  Testing geo-blocking and region availability
&lt;/h3&gt;

&lt;p&gt;When content is supposed to be restricted (or supposed to be available) in specific regions, a screenshot from inside the region is the test. This is the one use case where you should always set strict mode (&lt;code&gt;strict_country=1&lt;/code&gt;, covered below): a silent fallback to a US IP would show you the US view and quietly invalidate the conclusion.&lt;/p&gt;

&lt;h3&gt;
  
  
  Auditing cookie and consent banners by region
&lt;/h3&gt;

&lt;p&gt;A page loaded from an EU IP address typically greets you with a GDPR consent dialog that US visitors never see; other regions have their own variants. Capturing your pages from an EU country shows exactly which banner fires and what it covers. (For the opposite need — clean captures without consent walls — add &lt;code&gt;no_cookie_popup=1&lt;/code&gt;.)&lt;/p&gt;

&lt;h3&gt;
  
  
  Localization QA
&lt;/h3&gt;

&lt;p&gt;Beyond prices and banners, a country-routed capture exercises the whole localized experience: the &lt;code&gt;country&lt;/code&gt; parameter automatically sets the matching browser language, time zone, and geolocation coordinates, so date formats, translated UI, and locale-dependent layout render as a local would see them. Screenshots from each market make translation gaps and text-overflow bugs visible at a glance — including right-to-left rendering (for example &lt;code&gt;country=EG&lt;/code&gt; with Arabic).&lt;/p&gt;

&lt;h2&gt;
  
  
  Automating it: the API
&lt;/h2&gt;

&lt;p&gt;The browser tool is the fastest way to check one page. To monitor pages on a schedule or capture in bulk, use the API — plans start at $5/month for 2,000 screenshots (&lt;a href="https://www.site-shot.com/pricing/" rel="noopener noreferrer"&gt;pricing&lt;/a&gt;), and every plan includes geotargeting.&lt;/p&gt;

&lt;p&gt;One parameter does the work — use two-letter ISO country codes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-o&lt;/span&gt; berlin.png &lt;span class="s2"&gt;"https://api.site-shot.com/?url=https://example.com&amp;amp;userkey=YOUR_API_KEY&amp;amp;country=DE&amp;amp;strict_country=1&amp;amp;format=png"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The same request in Python:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.site-shot.com/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://example.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;userkey&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;country&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;DE&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;           &lt;span class="c1"&gt;# two-letter ISO code
&lt;/span&gt;    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;strict_country&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;format&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;png&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="sh"&gt;'"&lt;/span&gt;&lt;span class="s"&gt;error&lt;/span&gt;&lt;span class="sh"&gt;"'&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="c1"&gt;# e.g. {"error": "country_unavailable"} — no capacity in that country right now
&lt;/span&gt;    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;RuntimeError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;berlin.png&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;wb&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And in Node.js:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;URLSearchParams&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://example.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;userkey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;YOUR_API_KEY&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;country&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;DE&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;strict_country&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;png&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`https://api.site-shot.com/?&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;buf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Buffer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;arrayBuffer&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;buf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;subarray&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;"error"&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;buf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt; &lt;span class="c1"&gt;// e.g. {"error": "country_unavailable"}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;node:fs/promises&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;writeFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;berlin.png&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;buf&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Why &lt;code&gt;strict_country&lt;/code&gt; matters
&lt;/h3&gt;

&lt;p&gt;By default, if no proxy is available for the requested country at that moment, the request silently falls back to a US IP — you always get a screenshot, but not necessarily from where you asked. With &lt;code&gt;strict_country=1&lt;/code&gt; the request fails fast instead: you get an error response with &lt;code&gt;"error": "country_unavailable"&lt;/code&gt; rather than a screenshot from the wrong country.&lt;/p&gt;

&lt;p&gt;Rule of thumb: for casual previews, leave strict mode off. For anything where the country &lt;strong&gt;is&lt;/strong&gt; the point — geo-blocking tests, ad verification, compliance evidence — always set &lt;code&gt;strict_country=1&lt;/code&gt;, so a capture that couldn't be routed correctly fails loudly instead of lying quietly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fine-tuning the locale
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;country&lt;/code&gt; sets sensible defaults; three companion parameters override them independently:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parameter&lt;/th&gt;
&lt;th&gt;What it controls&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;country&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Proxy IP location + default language, time zone, geolocation&lt;/td&gt;
&lt;td&gt;&lt;code&gt;country=DE&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;strict_country&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Fail fast instead of falling back to a US IP&lt;/td&gt;
&lt;td&gt;&lt;code&gt;strict_country=1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;language&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Browser language / &lt;code&gt;Accept-Language&lt;/code&gt; header&lt;/td&gt;
&lt;td&gt;&lt;code&gt;language=ja&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;time_zone&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Browser time zone&lt;/td&gt;
&lt;td&gt;&lt;code&gt;time_zone=Asia/Tokyo&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;geolocation&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;GPS coordinates reported by the browser&lt;/td&gt;
&lt;td&gt;&lt;code&gt;geolocation=48.8566,2.3522&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;So &lt;code&gt;country=BR&amp;amp;language=en&lt;/code&gt; renders through a Brazilian IP with English browser language — useful for checking what an English-speaking traveler in Brazil would see. The full country list with each country's default settings lives on the &lt;a href="https://www.site-shot.com/countries" rel="noopener noreferrer"&gt;countries reference page&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Any ISO 3166-1 alpha-2 code with live proxy capacity can be requested — 49 countries as of August 2026.&lt;br&gt;
The offered list is not a static table: Site-Shot verifies each proxy pool's real exit country against a&lt;br&gt;
majority vote of independent GeoIP sources and only offers countries with verified capacity, so the&lt;br&gt;
country selector on the homepage and the &lt;a href="https://www.site-shot.com/countries" rel="noopener noreferrer"&gt;countries page&lt;/a&gt; always&lt;br&gt;
show the current list.&lt;/p&gt;

&lt;p&gt;For more Python patterns — full-page captures, batching, mobile emulation — see &lt;a href="https://www.site-shot.com/blog/take-website-screenshot-with-python/" rel="noopener noreferrer"&gt;How to Take a Website Screenshot with Python&lt;/a&gt;. To see how other screenshot APIs handle geotargeting (most require bringing your own proxies or gate it behind premium tiers), see our &lt;a href="https://www.site-shot.com/blog/best-website-screenshot-api-2026/" rel="noopener noreferrer"&gt;screenshot API comparison&lt;/a&gt;. AI agents can do all of the above through the official MCP server — see &lt;a href="https://www.site-shot.com/ai-agents/" rel="noopener noreferrer"&gt;Site-Shot for AI agents&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Can I take a screenshot of a website from another country for free?&lt;/strong&gt;&lt;br&gt;
You can capture from the United States free in your browser with no signup at &lt;a href="https://www.site-shot.com/" rel="noopener noreferrer"&gt;site-shot.com&lt;/a&gt;. All other supported countries are available on any paid plan — both in the browser tool and via the API.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I make sure the screenshot really comes from the right country?&lt;/strong&gt;&lt;br&gt;
Site-Shot verifies each proxy pool's real exit country against a majority vote of independent GeoIP sources before offering it, and quarantines ambiguous exits. On top of that: set &lt;code&gt;strict_country=1&lt;/code&gt; so the request fails with &lt;code&gt;"error": "country_unavailable"&lt;/code&gt; instead of silently falling back to a US IP, and spot-check your setup by capturing a geo-echo page like &lt;code&gt;whatismycountry.com&lt;/code&gt;, which prints the detected country in the screenshot itself.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which countries does Site-Shot support?&lt;/strong&gt;&lt;br&gt;
49 countries as of August 2026, across North and South America, Europe, Asia, Africa, and Oceania — including the US, UK, Germany, France, Japan, Brazil, and Singapore. The offering is derived from live verified proxy capacity, so the current list with per-country defaults is always on the &lt;a href="https://www.site-shot.com/countries" rel="noopener noreferrer"&gt;countries page&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's the difference between &lt;code&gt;country&lt;/code&gt; and &lt;code&gt;geolocation&lt;/code&gt;?&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;country&lt;/code&gt; routes the request through an IP address in that country — it changes what servers &lt;em&gt;detect&lt;/em&gt; about the visitor's network location. &lt;code&gt;geolocation&lt;/code&gt; sets the GPS coordinates the browser reports to sites that ask for them. They can be combined to simulate both network and physical presence.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do language and time zone follow the country automatically?&lt;/strong&gt;&lt;br&gt;
Yes. Setting &lt;code&gt;country&lt;/code&gt; applies that country's default browser language, time zone, and geolocation. Any of them can be overridden by passing &lt;code&gt;language&lt;/code&gt;, &lt;code&gt;time_zone&lt;/code&gt;, or &lt;code&gt;geolocation&lt;/code&gt; explicitly.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Capture your first screenshot free in your browser — no signup — at&lt;br&gt;
&lt;a href="https://www.site-shot.com/" rel="noopener noreferrer"&gt;site-shot.com&lt;/a&gt;. Ready to capture from all supported countries? Get an API key on the&lt;br&gt;
&lt;a href="https://www.site-shot.com/pricing/" rel="noopener noreferrer"&gt;pricing page&lt;/a&gt;, or read the&lt;br&gt;
&lt;a href="https://www.site-shot.com/#documentation" rel="noopener noreferrer"&gt;API docs&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>screenshot</category>
      <category>api</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Cheapest Screenshot API in 2026 (Free Tiers Compared)</title>
      <dc:creator>alekseykazandaev</dc:creator>
      <pubDate>Wed, 15 Jul 2026 08:12:12 +0000</pubDate>
      <link>https://dev.to/alekseykazandaev/cheapest-screenshot-api-in-2026-free-tiers-compared-n93</link>
      <guid>https://dev.to/alekseykazandaev/cheapest-screenshot-api-in-2026-free-tiers-compared-n93</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on the Site-Shot blog.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If you're shopping purely on price, "cheapest screenshot API" has two different answers, and conflating&lt;br&gt;
them will cost you. The cheapest &lt;em&gt;raw&lt;/em&gt; price is Thum.io at $0.20 per 1,000 — but that price buys you&lt;br&gt;
viewport thumbnails with no full-page, no ad/cookie removal, and no geo proxy. The cheapest &lt;em&gt;full-featured&lt;/em&gt;&lt;br&gt;
Chromium API is a different question entirely. This guide ranks every option by cost per 1,000 &lt;strong&gt;and&lt;/strong&gt; by&lt;br&gt;
how generous the free tier is, so you can tell which "cheap" you're actually buying.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Disclosure:&lt;/strong&gt; this comparison is published by Site-Shot. We have kept the numbers accurate and the&lt;br&gt;
trade-offs honest — including where competitors beat us. Prices checked August 2026; confirm on each&lt;br&gt;
vendor pricing page before buying.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Ranked by price per 1,000 (cheapest first)
&lt;/h2&gt;

&lt;p&gt;Cost per 1,000 is taken from each provider's &lt;em&gt;entry&lt;/em&gt; paid plan, then we note how low it goes at scale.&lt;br&gt;
The free-tier column is what you get without paying. Read the two right-hand columns together: a low price&lt;br&gt;
with no full-page or proxy support is only cheap if you never need those things. One pricing-basis note:&lt;br&gt;
Urlbox's cheapest plan (Lo-Fi, $19/mo) renders third-party sites as thumbnails only — it's scoped to sites&lt;br&gt;
you own — so its row uses the first plan that fully captures other people's sites, Hi-Fi at $49/mo for&lt;br&gt;
5,000 (checked August 2026).&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;API&lt;/th&gt;
&lt;th&gt;~Cost / 1,000 (entry)&lt;/th&gt;
&lt;th&gt;Lowest at scale&lt;/th&gt;
&lt;th&gt;Free tier&lt;/th&gt;
&lt;th&gt;Full-page&lt;/th&gt;
&lt;th&gt;Ad + cookie removal&lt;/th&gt;
&lt;th&gt;Geo proxy&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Thum.io&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$0.20&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$0.10&lt;/td&gt;
&lt;td&gt;1,000/mo, &lt;strong&gt;no signup&lt;/strong&gt; (branded)&lt;/td&gt;
&lt;td&gt;Paid tier only&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Microlink&lt;/td&gt;
&lt;td&gt;$1.07 (at 46k)&lt;/td&gt;
&lt;td&gt;$1.07&lt;/td&gt;
&lt;td&gt;25/day&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Pro (verify for screenshots)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Site-Shot&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$2.50&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$0.80&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Free online tool, &lt;strong&gt;no signup&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;✅ (to 20,000px)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅ (all plans)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ApiFlash&lt;/td&gt;
&lt;td&gt;$7.00&lt;/td&gt;
&lt;td&gt;$1.80&lt;/td&gt;
&lt;td&gt;100/mo&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Enterprise only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CaptureKit&lt;/td&gt;
&lt;td&gt;$7.00&lt;/td&gt;
&lt;td&gt;$1.78&lt;/td&gt;
&lt;td&gt;100/mo&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Stealth, no country pick&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ScreenshotOne&lt;/td&gt;
&lt;td&gt;$8.50&lt;/td&gt;
&lt;td&gt;$5.18&lt;/td&gt;
&lt;td&gt;100/mo&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Growth+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ScreenshotAPI.net&lt;/td&gt;
&lt;td&gt;$9.00&lt;/td&gt;
&lt;td&gt;$1.75&lt;/td&gt;
&lt;td&gt;100 (7-day trial)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Paid tiers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Urlbox&lt;/td&gt;
&lt;td&gt;$9.80 (Hi-Fi)&lt;/td&gt;
&lt;td&gt;~$3.00&lt;/td&gt;
&lt;td&gt;No free tier (7-day trial)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Proxy + geo emulation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;The short version:&lt;/strong&gt; Thum.io wins on raw price but it's a thumbnail service, not a full-featured renderer.&lt;br&gt;
Microlink is the cheapest &lt;em&gt;full-featured&lt;/em&gt; option once you're at volume ($1.07/1,000 at 46k/mo). Site-Shot&lt;br&gt;
is the cheapest full-featured Chromium API to &lt;em&gt;start&lt;/em&gt; with ($2.50/1,000 on a $5/mo plan) and the lowest at&lt;br&gt;
scale ($0.80/1,000) — plus it's the only one here with a genuinely free, no-signup browser tool and country&lt;br&gt;
proxies on every plan. Everyone from ApiFlash up is $7/1,000 or more at the entry tier.&lt;/p&gt;

&lt;h2&gt;
  
  
  The tools, cheapest first
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Thum.io — cheapest raw price, but thumbnails only
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.thum.io/" rel="noopener noreferrer"&gt;Thum.io&lt;/a&gt; is the rock-bottom price leader at &lt;strong&gt;$0.20 per 1,000&lt;/strong&gt; ($2 per 10,000 hits,&lt;br&gt;
$1/mo minimum), dropping to $0.10/1,000 on the Better plan ($20/mo minimum). Its free tier is unusually&lt;br&gt;
generous — &lt;strong&gt;1,000 images/month with no signup&lt;/strong&gt; — but those free images are branded with a Thum.io loader&lt;br&gt;
and an animated initial render. The catch for "cheapest" shoppers: &lt;strong&gt;full-page is a paid feature&lt;/strong&gt;, and there&lt;br&gt;
is &lt;strong&gt;no ad/cookie removal, no geo proxy, and no MCP server&lt;/strong&gt;. &lt;em&gt;Best for:&lt;/em&gt; simple, high-volume thumbnails on a&lt;br&gt;
tight budget where viewport captures are all you need.&lt;/p&gt;

&lt;h3&gt;
  
  
  Microlink — cheapest &lt;em&gt;full-featured&lt;/em&gt; option at volume
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://microlink.io/" rel="noopener noreferrer"&gt;Microlink&lt;/a&gt; is a "browser as API" with full Puppeteer/Playwright control, full-page,&lt;br&gt;
ad/cookie blocking (even on the free tier), automatic proxy resolution on Pro (its docs don't scope it for&lt;br&gt;
screenshots — verify against your workload), an official MCP server, and a global edge cache. Its Pro plan&lt;br&gt;
is $49/mo for 46,000 requests ≈ &lt;strong&gt;$1.07/1,000&lt;/strong&gt; — the cheapest full-featured&lt;br&gt;
rate at volume on this list. The free tier is 25 requests/day. &lt;em&gt;Best for:&lt;/em&gt; high-volume workloads that need real&lt;br&gt;
rendering at the lowest per-shot price. &lt;em&gt;The honest call:&lt;/em&gt; if you're already doing tens of thousands of&lt;br&gt;
full-featured shots a month, Microlink beats Site-Shot's $1.50 Lite overage on price — though not Site-Shot's&lt;br&gt;
$0.80 Professional rate.&lt;/p&gt;

&lt;h3&gt;
  
  
  Site-Shot — cheapest full-featured Chromium API to start, with a free no-signup tool
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.site-shot.com/" rel="noopener noreferrer"&gt;Site-Shot&lt;/a&gt; renders in a real Chromium browser and returns a PNG/JPEG (or JSON&lt;br&gt;
with base64 + the target's response headers) from a single GET — no SDK. It includes full-page to 20,000px,&lt;br&gt;
device emulation, automatic ad + cookie-banner removal (&lt;code&gt;no_ads&lt;/code&gt;, &lt;code&gt;no_cookie_popup&lt;/code&gt;), and country-specific&lt;br&gt;
proxies (IP, language, time zone, geolocation) &lt;strong&gt;on every plan&lt;/strong&gt; — not gated behind a higher tier like most&lt;br&gt;
rivals. The &lt;a href="https://www.site-shot.com/pricing/" rel="noopener noreferrer"&gt;API&lt;/a&gt; starts at &lt;strong&gt;$5/mo for 2,000 shots ($2.50/1,000)&lt;/strong&gt;, the&lt;br&gt;
$15 Lite plan includes 10,000, and the Professional plan drops to &lt;strong&gt;$0.0008/shot — $0.80 per 1,000&lt;/strong&gt;, the&lt;br&gt;
lowest full-featured rate in this comparison at scale. There's also an official MCP server&lt;br&gt;
(&lt;code&gt;npx -y site-shot-mcp&lt;/code&gt;) for AI agents, and scheduled captures are built in on every paid plan&lt;br&gt;
(&lt;a href="https://www.site-shot.com/blog/automatically-screenshot-website-every-day/" rel="noopener noreferrer"&gt;how it works&lt;/a&gt;). The catch some readers care about: only the&lt;br&gt;
&lt;a href="https://www.site-shot.com/" rel="noopener noreferrer"&gt;browser tool&lt;/a&gt; is free with no signup — the paid API needs an account and key,&lt;br&gt;
same as everyone else. &lt;em&gt;Gaps:&lt;/em&gt; the official client SDKs cover Node.js (&lt;code&gt;npm install site-shot-sdk&lt;/code&gt;) and&lt;br&gt;
Python (&lt;code&gt;pip install site-shot&lt;/code&gt;); in other languages you call plain HTTP. &lt;em&gt;Best for:&lt;/em&gt; developers who&lt;br&gt;
want full-featured, real-browser screenshots at the lowest entry price and the lowest at-scale price, with&lt;br&gt;
free prototyping in the browser. (Not to be confused with the unrelated "Siteshot Pro".)&lt;/p&gt;

&lt;h3&gt;
  
  
  ApiFlash — cheap, fast, but geo costs extra
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://apiflash.com/" rel="noopener noreferrer"&gt;ApiFlash&lt;/a&gt; runs Chrome on AWS Lambda for fast, simple captures: $7/mo for 1,000&lt;br&gt;
($7.00/1,000), down to $1.80/1,000 on the Large plan, with a 100/mo free tier. Full-page and ad/cookie removal&lt;br&gt;
are on all paid plans — but &lt;strong&gt;managed proxies and IP geolocation are Enterprise-only&lt;/strong&gt;, and there's no&lt;br&gt;
official MCP server. &lt;em&gt;Best for:&lt;/em&gt; simple, fast, budget captures where you don't need geo-targeting.&lt;/p&gt;

&lt;h3&gt;
  
  
  CaptureKit — cheap, with content extraction for LLMs
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://capturekit.dev/" rel="noopener noreferrer"&gt;CaptureKit&lt;/a&gt; bundles screenshots with a Page Content API (HTML/Markdown/AI summaries)&lt;br&gt;
from $7/mo for 1,000 credits ($7.00/1,000), dropping to $1.78/1,000 on Ultimate; the free tier is 100&lt;br&gt;
credits/mo. Stealth mode (residential proxies with fingerprint rotation — no country selection) is included&lt;br&gt;
on all plans. &lt;em&gt;Best for:&lt;/em&gt; indie devs who also need clean web content to feed&lt;br&gt;
an LLM alongside the screenshot.&lt;/p&gt;

&lt;h3&gt;
  
  
  ScreenshotOne — premium, deepest features, priced accordingly
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://screenshotone.com/" rel="noopener noreferrer"&gt;ScreenshotOne&lt;/a&gt; is the most-recommended premium option, with SDKs in 7 languages,&lt;br&gt;
PDF, video, JS/CSS injection, S3, webhooks, an official MCP server, and a dedicated AI-agents page. It's also&lt;br&gt;
one of the priciest at entry: $17/mo for 2,000 ($8.50/1,000), $0.009 overage, falling to $5.18/1,000 on Scale.&lt;br&gt;
Geo proxy is gated to the Growth ($79) and Scale ($259) plans — not the Basic plan. &lt;em&gt;Best for:&lt;/em&gt; teams that want&lt;br&gt;
the deepest, most polished feature set and don't mind paying for it.&lt;/p&gt;

&lt;h3&gt;
  
  
  ScreenshotAPI.net — broad parameter set, mid free-tier
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://screenshotapi.net/" rel="noopener noreferrer"&gt;ScreenshotAPI.net&lt;/a&gt; offers a wide parameter set — element capture, video, PDF, data&lt;br&gt;
extraction, scrolling and 4K/5K captures — from $9/mo for 1,000 ($9.00/1,000), dropping to $1.75/1,000 on&lt;br&gt;
Business. The free tier is a 7-day, 100-shot trial, and there's no MCP. Proxy support is on the higher tiers only.&lt;br&gt;
&lt;em&gt;Best for:&lt;/em&gt; developers who want a broad feature set and don't need MCP.&lt;/p&gt;

&lt;h3&gt;
  
  
  Urlbox — no free tier, priced for compliance work
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://urlbox.com/" rel="noopener noreferrer"&gt;Urlbox&lt;/a&gt; is the most expensive at entry and the only option here with &lt;strong&gt;no free&lt;br&gt;
tier&lt;/strong&gt; — just a 7-day trial and a $100/10K refund guarantee. Mind which plan you price against: the&lt;br&gt;
cheapest tier (Lo-Fi, $19/mo for 2,000) is scoped to sites you own and renders third-party pages as&lt;br&gt;
thumbnails only, so the practical entry for screenshotting arbitrary sites is Hi-Fi at $49/mo for 5,000&lt;br&gt;
renders ($9.80/1,000, checked August 2026). What you pay for is compliance-grade context: tamper-evident&lt;br&gt;
timestamps/hashes (their claim), change detection, an official MCP server, and many output formats.&lt;br&gt;
&lt;em&gt;Best for:&lt;/em&gt; legal, compliance, and archival use cases where defensibility matters more than price.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to choose the cheapest option for &lt;em&gt;your&lt;/em&gt; needs
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cheapest possible, thumbnails are fine?&lt;/strong&gt; Thum.io at $0.20/1,000. Accept branded free images and no
full-page/proxy/ad-removal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cheapest full-featured at high volume (tens of thousands/mo)?&lt;/strong&gt; Microlink at $1.07/1,000 — unless you reach
Site-Shot's Professional tier, which is lower at $0.80/1,000.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cheapest full-featured to &lt;em&gt;start&lt;/em&gt; (low commitment)?&lt;/strong&gt; &lt;a href="https://www.site-shot.com/pricing/" rel="noopener noreferrer"&gt;Site-Shot&lt;/a&gt; at
$5/mo for 2,000 ($2.50/1,000), with full-page, ad/cookie removal, and country proxies included on every plan.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Most generous free tier with no signup?&lt;/strong&gt; Thum.io (1,000/mo, branded) for the API; Site-Shot for a
free browser tool with no registration at all.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cheapest that also works with &lt;a href="https://www.site-shot.com/ai-agents/" rel="noopener noreferrer"&gt;AI agents&lt;/a&gt; via MCP?&lt;/strong&gt; Microlink and
Site-Shot both ship official MCP servers and sit at the low end on price — Site-Shot's is &lt;code&gt;npx -y site-shot-mcp&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What is the cheapest screenshot API with a free tier in 2026?&lt;/strong&gt;&lt;br&gt;
On raw price, Thum.io is cheapest at $0.20 per 1,000, and it has a 1,000/month no-signup free tier (branded). But&lt;br&gt;
Thum.io is viewport-only — full-page is paid, and there's no ad/cookie removal or geo proxy. If you need a&lt;br&gt;
full-featured renderer, Site-Shot is the cheapest to start ($2.50/1,000 on a $5/mo plan, down to $0.80/1,000 at&lt;br&gt;
scale) and Microlink is cheapest at high volume ($1.07/1,000 at 46,000/mo).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is there a free screenshot API with no signup?&lt;/strong&gt;&lt;br&gt;
Two options. Thum.io offers a no-signup free API tier (1,000/month, with Thum.io branding on the images).&lt;br&gt;
Site-Shot offers a free online screenshot tool with no registration, no API key, and no credit card — but note&lt;br&gt;
that's the browser tool; Site-Shot's paid API, like every other API here, still needs an account and key.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why isn't the cheapest raw price the best value?&lt;/strong&gt;&lt;br&gt;
Because the $0.20/1,000 headline (Thum.io) only covers basic viewport thumbnails. The moment you need full-page&lt;br&gt;
capture, country/geo proxies, or ad and cookie-banner removal, you either can't get them or you pay extra. A&lt;br&gt;
full-featured Chromium API that includes those out of the box (Site-Shot from $2.50/1,000, Microlink from&lt;br&gt;
$1.07/1,000 at volume) is usually cheaper overall than bolting features onto a thumbnail service.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's the cheapest full-featured screenshot API?&lt;/strong&gt;&lt;br&gt;
At volume, Microlink at roughly $1.07 per 1,000 (its $49/mo plan covers 46,000 requests). At the lowest entry&lt;br&gt;
commitment, Site-Shot at $5/mo for 2,000 ($2.50/1,000), which also drops to $0.80/1,000 on its Professional plan —&lt;br&gt;
the lowest full-featured rate in this comparison. Both include full-page, ad/cookie removal, and geo/proxy support.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which cheap screenshot APIs include geo proxies on the entry plan?&lt;/strong&gt;&lt;br&gt;
Site-Shot includes country proxies (IP, language, time zone, geolocation) on every plan, including the $5 entry&lt;br&gt;
plan. Most rivals tier-gate proxies: ScreenshotOne (Growth+), ScreenshotAPI.net (higher tiers), and ApiFlash&lt;br&gt;
(Enterprise only); CaptureKit's stealth mode offers no country selection. Thum.io has no geo proxy at all.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which cheap screenshot API works with AI agents (MCP)?&lt;/strong&gt;&lt;br&gt;
Among the lower-priced options, Site-Shot and Microlink both ship official MCP servers — Site-Shot's installs with&lt;br&gt;
&lt;code&gt;npx -y site-shot-mcp&lt;/code&gt; (registry id &lt;code&gt;io.github.site-shot/site-shot-mcp&lt;/code&gt;). ScreenshotOne and Urlbox (github.com/urlbox/urlbox-mcp-server) have official servers too. For CaptureKit,&lt;br&gt;
ApiFlash, ScreenshotAPI.net, and Thum.io we could not find an official MCP server in the MCP registry or&lt;br&gt;
on npm as of August 2026.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Capture your first screenshot free in your browser — no signup, no key — at&lt;br&gt;
&lt;a href="https://www.site-shot.com/" rel="noopener noreferrer"&gt;site-shot.com&lt;/a&gt;. When you're ready to automate, the cheapest full-featured plan&lt;br&gt;
starts at $5/mo on the &lt;a href="https://www.site-shot.com/pricing/" rel="noopener noreferrer"&gt;pricing page&lt;/a&gt;; see the&lt;br&gt;
&lt;a href="https://www.site-shot.com/#documentation" rel="noopener noreferrer"&gt;API docs&lt;/a&gt; or the &lt;a href="https://www.site-shot.com/ai-agents/" rel="noopener noreferrer"&gt;AI-agents guide&lt;/a&gt;.&lt;br&gt;
For more, compare the &lt;a href="https://www.site-shot.com/blog/best-website-screenshot-api-2026/" rel="noopener noreferrer"&gt;8 best screenshot APIs&lt;/a&gt;,&lt;br&gt;
read about &lt;a href="https://www.site-shot.com/blog/screenshot-api-for-ai-agents-mcp/" rel="noopener noreferrer"&gt;AI agents and MCP&lt;/a&gt;, or see the&lt;br&gt;
head-to-head &lt;a href="https://www.site-shot.com/blog/site-shot-vs-apiflash-2026/" rel="noopener noreferrer"&gt;Site-Shot vs ApiFlash&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>screenshot</category>
      <category>api</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How to Give AI Agents Website Screenshots with MCP (2026)</title>
      <dc:creator>alekseykazandaev</dc:creator>
      <pubDate>Wed, 15 Jul 2026 08:09:57 +0000</pubDate>
      <link>https://dev.to/alekseykazandaev/how-to-give-ai-agents-website-screenshots-with-mcp-2026-2bma</link>
      <guid>https://dev.to/alekseykazandaev/how-to-give-ai-agents-website-screenshots-with-mcp-2026-2bma</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on the Site-Shot blog.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If you're building an AI agent that needs to &lt;em&gt;see&lt;/em&gt; a web page — to drive a browser, run visual QA, or&lt;br&gt;
feed a screenshot into a vision model — you need a screenshot API that the agent can call on its own.&lt;br&gt;
In 2026 the clean way to wire that up is the Model Context Protocol (MCP): you point your agent at an&lt;br&gt;
MCP server and it gets a screenshot tool it can invoke directly. This guide explains what MCP is, why&lt;br&gt;
agents need screenshots, shows a copy-paste Claude Desktop config for Site-Shot's official MCP server,&lt;br&gt;
and lists which screenshot APIs actually ship an official MCP server versus those that don't.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Disclosure:&lt;/strong&gt; this comparison is published by Site-Shot. We have kept the numbers accurate and the&lt;br&gt;
trade-offs honest — including where competitors beat us. Prices checked August 2026; confirm on each&lt;br&gt;
vendor pricing page before buying.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  What is MCP, and why would an agent need screenshots?
&lt;/h2&gt;

&lt;p&gt;The Model Context Protocol (MCP) is an open standard for connecting AI assistants to external tools and&lt;br&gt;
data. An MCP &lt;em&gt;server&lt;/em&gt; exposes one or more &lt;strong&gt;tools&lt;/strong&gt; (each with a name, a description, and a JSON input&lt;br&gt;
schema); an MCP &lt;em&gt;client&lt;/em&gt; — Claude Desktop, Cursor, Claude Code, and a growing list of agent frameworks —&lt;br&gt;
discovers those tools and lets the model call them. The agent never sees your API key or HTTP plumbing;&lt;br&gt;
it just sees a tool like "capture a screenshot of this URL" and decides when to use it.&lt;/p&gt;

&lt;p&gt;Agents reach for screenshots in three recurring patterns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Vision pipelines.&lt;/strong&gt; A multimodal model can't reliably reason about a page from raw HTML. Hand it a
rendered PNG and it can read layout, find a button, check a chart, or verify that a deploy looks right.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Web automation.&lt;/strong&gt; An agent driving a flow (login, checkout, form fill) needs to &lt;em&gt;look&lt;/em&gt; between steps
to confirm what happened before it clicks again.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Visual QA and monitoring.&lt;/strong&gt; Capture a page on a schedule or after a change, then diff or describe it
to catch broken layouts, missing images, or unexpected content.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Why ad and cookie-banner removal cuts vision-model cost
&lt;/h3&gt;

&lt;p&gt;There's a money angle specific to AI agents. Vision models bill by image tokens, and token count scales&lt;br&gt;
with the image. A full-page capture cluttered with ad iframes, sticky cookie-consent overlays, and&lt;br&gt;
newsletter modals is &lt;em&gt;more pixels and more visual noise&lt;/em&gt; for the model to encode — you pay for tokens&lt;br&gt;
spent encoding junk, and the noise can degrade the answer. Removing ads and cookie banners at capture&lt;br&gt;
time (Site-Shot's &lt;code&gt;no_ads&lt;/code&gt; and &lt;code&gt;no_cookie_popup&lt;/code&gt; parameters, and equivalents on most competitors) gives&lt;br&gt;
the model a cleaner, often smaller image: lower token cost per call and fewer wrong answers from a popup&lt;br&gt;
covering the content. For an agent that captures thousands of pages, that adds up.&lt;/p&gt;
&lt;h2&gt;
  
  
  Setting up Site-Shot's MCP server (copy-paste config)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.site-shot.com/" rel="noopener noreferrer"&gt;Site-Shot&lt;/a&gt; ships an official MCP server published as &lt;code&gt;site-shot-mcp&lt;/code&gt;&lt;br&gt;
(registry id &lt;code&gt;io.github.site-shot/site-shot-mcp&lt;/code&gt;). It runs over &lt;code&gt;npx&lt;/code&gt;, so there's nothing to install&lt;br&gt;
globally. Drop this into your Claude Desktop config file (&lt;code&gt;claude_desktop_config.json&lt;/code&gt; —&lt;br&gt;
&lt;em&gt;Settings → Developer → Edit Config&lt;/em&gt;), restart Claude Desktop, and the tools appear:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"site-shot"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"site-shot-mcp"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"SITESHOT_API_KEY"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"YOUR_API_KEY"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The server exposes two tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;capture_screenshot&lt;/code&gt;&lt;/strong&gt; — a viewport screenshot of a URL, with the usual options (dimensions, device
emulation, format, ad/cookie removal, country proxy).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;capture_full_page&lt;/code&gt;&lt;/strong&gt; — a full-length capture that scrolls and stitches the entire page (up to
20,000px tall on Site-Shot), ideal for handing a whole article or dashboard to a vision model.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The same config shape works in other MCP clients (Cursor, Claude Code, etc.) — they all read a&lt;br&gt;
&lt;code&gt;command&lt;/code&gt; / &lt;code&gt;args&lt;/code&gt; / &lt;code&gt;env&lt;/code&gt; block. Under the hood each tool is a single GET request to Site-Shot's real&lt;br&gt;
Chromium renderer, returning a PNG/JPEG or JSON (base64 image plus the target's response headers).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Honest scoping:&lt;/strong&gt; the MCP server requires an API key. Site-Shot's &lt;em&gt;free, no-signup&lt;/em&gt; offering is the&lt;br&gt;
&lt;a href="https://www.site-shot.com/" rel="noopener noreferrer"&gt;browser-based online tool&lt;/a&gt; — great for one-off captures, but it does not&lt;br&gt;
issue an API key. To use the MCP server (or the HTTP API at all) you need an account and a key from the&lt;br&gt;
&lt;a href="https://www.site-shot.com/pricing/" rel="noopener noreferrer"&gt;pricing page&lt;/a&gt;, starting at $5/mo for 2,000 screenshots. See the&lt;br&gt;
&lt;a href="https://www.site-shot.com/ai-agents/" rel="noopener noreferrer"&gt;AI agents page&lt;/a&gt; for the full agent setup.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Which screenshot APIs ship an official MCP server?
&lt;/h2&gt;

&lt;p&gt;Plenty of screenshot APIs exist; far fewer maintain an &lt;em&gt;official, first-party&lt;/em&gt; MCP server you can trust&lt;br&gt;
to track their feature set. This table sorts by that distinction.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;API&lt;/th&gt;
&lt;th&gt;Official MCP server?&lt;/th&gt;
&lt;th&gt;Entry plan&lt;/th&gt;
&lt;th&gt;~Cost / 1,000&lt;/th&gt;
&lt;th&gt;Ad + cookie removal&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Site-Shot&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Official (&lt;code&gt;site-shot-mcp&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;$5/mo · 2,000&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;$2.50&lt;/strong&gt; → $0.80 at scale&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ScreenshotOne&lt;/td&gt;
&lt;td&gt;✅ Official&lt;/td&gt;
&lt;td&gt;$17/mo · 2,000&lt;/td&gt;
&lt;td&gt;$8.50&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Urlbox&lt;/td&gt;
&lt;td&gt;✅ Official&lt;/td&gt;
&lt;td&gt;$49/mo · 5,000 (Hi-Fi)&lt;/td&gt;
&lt;td&gt;$9.80&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Microlink&lt;/td&gt;
&lt;td&gt;✅ Official&lt;/td&gt;
&lt;td&gt;$49/mo · 46,000&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$1.07&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CaptureKit&lt;/td&gt;
&lt;td&gt;❌ None found (registry/npm, Aug 2026)&lt;/td&gt;
&lt;td&gt;$7/mo · 1,000&lt;/td&gt;
&lt;td&gt;$7.00&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ApiFlash&lt;/td&gt;
&lt;td&gt;❌ None&lt;/td&gt;
&lt;td&gt;$7/mo · 1,000&lt;/td&gt;
&lt;td&gt;$7.00&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ScreenshotAPI.net&lt;/td&gt;
&lt;td&gt;❌ None&lt;/td&gt;
&lt;td&gt;$9/mo · 1,000&lt;/td&gt;
&lt;td&gt;$9.00&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Thum.io&lt;/td&gt;
&lt;td&gt;❌ None&lt;/td&gt;
&lt;td&gt;$2 / 10,000 hits&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$0.20&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Cost per 1,000 is from each provider's cheapest paid plan — except Urlbox, whose $19/mo Lo-Fi tier is&lt;br&gt;
scoped to sites you own and returns third-party pages as thumbnails only, so its row uses Hi-Fi, the&lt;br&gt;
first plan an agent can point at arbitrary URLs ($49/mo for 5,000, checked August 2026). For an agent,&lt;br&gt;
"official MCP" matters: a first-party server stays in sync with the API and is maintained by the vendor;&lt;br&gt;
a third-party wrapper can lag or vanish.&lt;/p&gt;

&lt;h2&gt;
  
  
  The MCP-ready options, one by one
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Site-Shot
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.site-shot.com/" rel="noopener noreferrer"&gt;Site-Shot&lt;/a&gt;'s official server (&lt;code&gt;npx -y site-shot-mcp&lt;/code&gt;) exposes&lt;br&gt;
&lt;code&gt;capture_screenshot&lt;/code&gt; and &lt;code&gt;capture_full_page&lt;/code&gt;, backed by real Chromium with device emulation, country&lt;br&gt;
proxies (IP, language, time zone, geolocation on every plan), full-page to 20,000px, and ad/cookie&lt;br&gt;
removal that keeps vision-model images clean. It's the lowest entry commitment with an official MCP —&lt;br&gt;
$5/mo for 2,000 shots, dropping to $0.80/1,000 at scale — and the only one here with a genuinely free,&lt;br&gt;
no-signup browser tool to prototype against. &lt;em&gt;Best for:&lt;/em&gt; agents that want full-featured real-browser&lt;br&gt;
captures without premium per-shot pricing. &lt;em&gt;Gap:&lt;/em&gt; the official client SDKs cover Node.js&lt;br&gt;
(&lt;code&gt;npm install site-shot-sdk&lt;/code&gt;) and Python (&lt;code&gt;pip install site-shot&lt;/code&gt;) — elsewhere the HTTP API is a plain&lt;br&gt;
GET you call directly from non-MCP code.&lt;/p&gt;

&lt;h3&gt;
  
  
  ScreenshotOne
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://screenshotone.com/" rel="noopener noreferrer"&gt;ScreenshotOne&lt;/a&gt; ships an official MCP server (the &lt;code&gt;render-website-screenshot&lt;/code&gt;&lt;br&gt;
tool, env &lt;code&gt;SCREENSHOTONE_API_KEY&lt;/code&gt;) alongside the deepest feature set in this list: SDKs in seven&lt;br&gt;
languages, PDF and video rendering, JS/CSS injection, S3 upload, webhooks, and a dedicated AI-agents&lt;br&gt;
page. It is genuinely the most polished, integration-rich option — and the priciest per shot at&lt;br&gt;
$8.50/1,000 ($17/mo for 2,000; geo proxy is gated to its Growth and Scale tiers). &lt;em&gt;Best for:&lt;/em&gt; teams that&lt;br&gt;
want the richest agent tooling and don't mind paying for it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Urlbox
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://urlbox.com/" rel="noopener noreferrer"&gt;Urlbox&lt;/a&gt; maintains an official MCP server (&lt;code&gt;@urlbox/screenshot-mcp&lt;/code&gt;, a &lt;code&gt;render&lt;/code&gt;&lt;br&gt;
tool that returns PNG/PDF/MP4 plus HTML/metadata, env &lt;code&gt;SECRET_KEY&lt;/code&gt;). Its differentiator is&lt;br&gt;
compliance-grade output: tamper-evident timestamps and hashes (their claim), change detection, and many&lt;br&gt;
formats. There's no free tier — a 7-day trial and a $100/10K refund guarantee instead — and an agent&lt;br&gt;
pointing at arbitrary URLs needs Hi-Fi at $49/mo for 5,000 renders ($9.80/1,000, checked August 2026);&lt;br&gt;
the cheaper $19 Lo-Fi tier is scoped to sites you own and returns third-party pages as thumbnails.&lt;br&gt;
&lt;em&gt;Best for:&lt;/em&gt; agents in legal, compliance, or archival workflows where a defensible capture matters more&lt;br&gt;
than price.&lt;/p&gt;

&lt;h3&gt;
  
  
  Microlink
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://microlink.io/" rel="noopener noreferrer"&gt;Microlink&lt;/a&gt; offers an official MCP integration over a "browser as API" with full&lt;br&gt;
Puppeteer/Playwright control and global edge caching. Its volume pricing is the cheapest full-featured&lt;br&gt;
option here — $49/mo for 46,000 requests (~$1.07/1,000) — with adblock and cookie-banner handling&lt;br&gt;
available even on the free 25-req/day tier. &lt;em&gt;Best for:&lt;/em&gt; high-volume agents that want headless-browser&lt;br&gt;
control and the lowest full-featured price at scale.&lt;/p&gt;

&lt;h3&gt;
  
  
  CaptureKit
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://capturekit.dev/" rel="noopener noreferrer"&gt;CaptureKit&lt;/a&gt; pairs screenshots with a Page&lt;br&gt;
Content API (HTML/Markdown/AI summaries) and stealth mode, from $7/mo for 1,000 credits — though we&lt;br&gt;
could not find a CaptureKit MCP server in the MCP registry or on npm as of August 2026, so agent&lt;br&gt;
integration there is DIY today. That content&lt;br&gt;
side is handy when your agent needs both a screenshot &lt;em&gt;and&lt;/em&gt; clean page text to reason over. &lt;em&gt;Best for:&lt;/em&gt;&lt;br&gt;
indie developers building agents that need clean web content for an LLM alongside captures.&lt;/p&gt;

&lt;h3&gt;
  
  
  ApiFlash, ScreenshotAPI.net, Thum.io — no official MCP
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://apiflash.com/" rel="noopener noreferrer"&gt;ApiFlash&lt;/a&gt; is fast and cheap (Chrome on AWS Lambda, $7/mo for 1,000), but we&lt;br&gt;
could not find an official ApiFlash MCP server in the MCP registry or on npm as of August 2026. &lt;a href="https://screenshotapi.net/" rel="noopener noreferrer"&gt;ScreenshotAPI.net&lt;/a&gt;&lt;br&gt;
has a broad parameter set (element capture, video, PDF, data extraction) from $9/mo but no MCP server at&lt;br&gt;
all. &lt;a href="https://www.thum.io/" rel="noopener noreferrer"&gt;Thum.io&lt;/a&gt; is the cheapest raw price ($0.20/1,000) with a no-signup branded free&lt;br&gt;
tier, but full-page is a paid feature, there's no ad/cookie removal or geo proxy, and no MCP. With these&lt;br&gt;
three you'd hand-roll your own tool wrapper around the HTTP API for an agent.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to choose for an AI agent
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Want the lowest-commitment official MCP with real-browser quality?&lt;/strong&gt; Site-Shot — $5/mo, official
&lt;code&gt;site-shot-mcp&lt;/code&gt;, ad/cookie removal to keep vision tokens down, and a free browser tool to test first.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Want the richest, most integration-heavy agent tooling regardless of price?&lt;/strong&gt; ScreenshotOne.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Need defensible, compliance-grade captures for legal or archival agents?&lt;/strong&gt; Urlbox.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;High volume and want the cheapest full-featured option?&lt;/strong&gt; Microlink at scale.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Need clean page content plus screenshots for your LLM?&lt;/strong&gt; CaptureKit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No official MCP, but cheap or simple is the priority?&lt;/strong&gt; ApiFlash (fast/budget), ScreenshotAPI.net
(broad params), or Thum.io (cheapest thumbnails) — expect to write the tool wrapper yourself.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For more detail, see our &lt;a href="https://www.site-shot.com/blog/best-screenshot-mcp-servers-2026/" rel="noopener noreferrer"&gt;screenshot MCP server roundup&lt;/a&gt;,&lt;br&gt;
the &lt;a href="https://www.site-shot.com/blog/best-website-screenshot-api-2026/" rel="noopener noreferrer"&gt;8-tool screenshot API comparison&lt;/a&gt;,&lt;br&gt;
the &lt;a href="https://www.site-shot.com/blog/cheapest-screenshot-api-2026/" rel="noopener noreferrer"&gt;cheapest screenshot API guide&lt;/a&gt;, and&lt;br&gt;
&lt;a href="https://www.site-shot.com/blog/full-page-vs-viewport-screenshot/" rel="noopener noreferrer"&gt;full-page vs. viewport screenshots&lt;/a&gt;&lt;br&gt;
when deciding which tool your agent should call.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What is a screenshot API for AI agents?&lt;/strong&gt;&lt;br&gt;
A screenshot API for AI agents is a hosted service that renders a web page in a real browser and returns&lt;br&gt;
an image (PNG/JPEG), which an AI agent calls to "see" a page — for vision-model reasoning, web&lt;br&gt;
automation, or visual QA. The agent-friendly way to expose it is an MCP server, so the model can invoke&lt;br&gt;
a screenshot tool directly instead of you writing custom HTTP glue.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is a screenshot MCP server?&lt;/strong&gt;&lt;br&gt;
An MCP server that exposes screenshot capture as one or more tools an AI agent can call. Site-Shot's&lt;br&gt;
official server (&lt;code&gt;npx -y site-shot-mcp&lt;/code&gt;, registry id &lt;code&gt;io.github.site-shot/site-shot-mcp&lt;/code&gt;) exposes&lt;br&gt;
&lt;code&gt;capture_screenshot&lt;/code&gt; and &lt;code&gt;capture_full_page&lt;/code&gt;; ScreenshotOne, Urlbox, and Microlink ship&lt;br&gt;
official servers too. For CaptureKit, ApiFlash, ScreenshotAPI.net, and Thum.io we could not find one in&lt;br&gt;
the MCP registry or on npm as of August 2026.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I take a website screenshot programmatically for an agent?&lt;/strong&gt;&lt;br&gt;
Two ways. Over MCP: add the vendor's MCP server to your client config (for Site-Shot, the&lt;br&gt;
&lt;code&gt;npx&lt;/code&gt;/&lt;code&gt;args&lt;/code&gt;/&lt;code&gt;env&lt;/code&gt; block above with your &lt;code&gt;SITESHOT_API_KEY&lt;/code&gt;) and let the agent call the tool. Or directly: send a&lt;br&gt;
single HTTP GET to the screenshot API with the target URL and options, and read back the PNG/JPEG or a&lt;br&gt;
JSON payload. Site-Shot supports both; the HTTP API is a plain GET with no SDK required, and Node.js and&lt;br&gt;
Python projects can install the official &lt;code&gt;site-shot-sdk&lt;/code&gt; or &lt;code&gt;site-shot&lt;/code&gt; package instead.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do I need an API key to use a screenshot MCP server?&lt;/strong&gt;&lt;br&gt;
Yes. The MCP server authenticates with an API key (&lt;code&gt;SITESHOT_API_KEY&lt;/code&gt; for Site-Shot), which requires an&lt;br&gt;
account. Site-Shot's &lt;em&gt;free, no-signup&lt;/em&gt; option is its browser-based online tool only — that tool does not&lt;br&gt;
issue an API key. The paid API, which the MCP server uses, starts at $5/mo for 2,000 screenshots.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why remove ads and cookie banners before sending a screenshot to a vision model?&lt;/strong&gt;&lt;br&gt;
Vision models bill by image tokens, and ads, cookie overlays, and modals add pixels and visual noise you&lt;br&gt;
pay to encode — and they can hide the content you actually want analyzed. Removing them at capture time&lt;br&gt;
(Site-Shot's &lt;code&gt;no_ads&lt;/code&gt; and &lt;code&gt;no_cookie_popup&lt;/code&gt;) yields a cleaner, often smaller image: lower token cost per&lt;br&gt;
call and more accurate answers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which screenshot API is best for building an AI agent in 2026?&lt;/strong&gt;&lt;br&gt;
If you want the lowest-commitment official MCP with real-browser quality and ad/cookie removal, Site-Shot&lt;br&gt;
($5/mo, &lt;code&gt;site-shot-mcp&lt;/code&gt;). For the richest agent tooling and SDKs, ScreenshotOne. For compliance and&lt;br&gt;
archival captures, Urlbox. For cheapest at volume, Microlink. For screenshots plus clean page content,&lt;br&gt;
CaptureKit (no MCP found as of August 2026 — the agent wiring is DIY there).&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Capture your first screenshot free in your browser — no signup — at&lt;br&gt;
&lt;a href="https://www.site-shot.com/" rel="noopener noreferrer"&gt;site-shot.com&lt;/a&gt;. Building an agent? See the&lt;br&gt;
&lt;a href="https://www.site-shot.com/ai-agents/" rel="noopener noreferrer"&gt;AI agents page&lt;/a&gt;, grab an API key on the&lt;br&gt;
&lt;a href="https://www.site-shot.com/pricing/" rel="noopener noreferrer"&gt;pricing page&lt;/a&gt;, and read the&lt;br&gt;
&lt;a href="https://www.site-shot.com/#documentation" rel="noopener noreferrer"&gt;API docs&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>screenshot</category>
      <category>api</category>
    </item>
    <item>
      <title>Best Website Screenshot API in 2026 — 8 Tools Compared</title>
      <dc:creator>alekseykazandaev</dc:creator>
      <pubDate>Wed, 15 Jul 2026 08:07:27 +0000</pubDate>
      <link>https://dev.to/alekseykazandaev/best-website-screenshot-api-in-2026-8-tools-compared-mgo</link>
      <guid>https://dev.to/alekseykazandaev/best-website-screenshot-api-in-2026-8-tools-compared-mgo</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on the Site-Shot blog.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Picking a website screenshot API in 2026 comes down to a few things: price per screenshot at your&lt;br&gt;
volume, whether there's a usable free tier, the quality of full-page rendering, geo/proxy support, and —&lt;br&gt;
increasingly — whether it works with AI agents (MCP). This guide compares eight of the most-recommended&lt;br&gt;
screenshot APIs with current pricing and features, so you can pick the right one fast.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Disclosure:&lt;/strong&gt; this comparison is published by Site-Shot. We've tried to keep the numbers accurate&lt;br&gt;
and the trade-offs honest — including where competitors beat us. All prices were checked in August 2026;&lt;br&gt;
always confirm on each vendor's pricing page before you buy.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Quick comparison table
&lt;/h2&gt;

&lt;p&gt;Cost per 1,000 is calculated from each provider's cheapest paid plan (lower is cheaper). "Full-page",&lt;br&gt;
"Ad/cookie removal", and "Geo proxy" reflect availability on entry-level plans where noted. One&lt;br&gt;
pricing-basis note: Urlbox's cheapest plan (Lo-Fi, $19/mo) is scoped to sites you own and renders&lt;br&gt;
third-party pages as thumbnails only, so its row uses the first plan that properly captures other&lt;br&gt;
people's sites — Hi-Fi at $49/mo for 5,000 (checked August 2026).&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;API&lt;/th&gt;
&lt;th&gt;Free tier&lt;/th&gt;
&lt;th&gt;Entry plan&lt;/th&gt;
&lt;th&gt;~Cost / 1,000&lt;/th&gt;
&lt;th&gt;Full-page&lt;/th&gt;
&lt;th&gt;Ad + cookie removal&lt;/th&gt;
&lt;th&gt;Geo proxy&lt;/th&gt;
&lt;th&gt;MCP server&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Site-Shot&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Free online tool, &lt;strong&gt;no signup&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;$5/mo · 2,000&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;$2.50&lt;/strong&gt; → $0.80 at scale&lt;/td&gt;
&lt;td&gt;✅ (to 20,000px)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅ all plans&lt;/td&gt;
&lt;td&gt;✅ (official)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ScreenshotOne&lt;/td&gt;
&lt;td&gt;100/mo&lt;/td&gt;
&lt;td&gt;$17/mo · 2,000&lt;/td&gt;
&lt;td&gt;$8.50&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Growth+ only&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Urlbox&lt;/td&gt;
&lt;td&gt;7-day trial (no free tier)&lt;/td&gt;
&lt;td&gt;$49/mo · 5,000 (Hi-Fi)&lt;/td&gt;
&lt;td&gt;$9.80&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;BYO proxy (Ultra+)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ApiFlash&lt;/td&gt;
&lt;td&gt;100/mo&lt;/td&gt;
&lt;td&gt;$7/mo · 1,000&lt;/td&gt;
&lt;td&gt;$7.00&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Enterprise only&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ScreenshotAPI.net&lt;/td&gt;
&lt;td&gt;100 (trial)&lt;/td&gt;
&lt;td&gt;$9/mo · 1,000&lt;/td&gt;
&lt;td&gt;$9.00&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;BYO ($29+ tiers)&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CaptureKit&lt;/td&gt;
&lt;td&gt;100/mo&lt;/td&gt;
&lt;td&gt;$7/mo · 1,000&lt;/td&gt;
&lt;td&gt;$7.00&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Stealth, no country pick&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Microlink&lt;/td&gt;
&lt;td&gt;25/day&lt;/td&gt;
&lt;td&gt;$49/mo · 46,000&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$1.07&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Pro (verify for screenshots)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Thum.io&lt;/td&gt;
&lt;td&gt;1,000/mo, no signup (branded)&lt;/td&gt;
&lt;td&gt;$2 / 10,000 hits&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$0.20&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Paid tier&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;The short version:&lt;/strong&gt; ScreenshotOne and Urlbox are the premium, feature-dense options (and the priciest&lt;br&gt;
per shot). Thum.io and Microlink are the cheapest on raw price. Site-Shot sits in the sweet spot — a&lt;br&gt;
full-featured Chromium API (full-page, country proxies, ad/cookie removal, and an official MCP server) at&lt;br&gt;
under a third of ScreenshotOne's or Urlbox's entry price, plus the only genuinely free, no-signup browser&lt;br&gt;
tool in the list.&lt;/p&gt;

&lt;h2&gt;
  
  
  The tools, one by one
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Site-Shot — best value full-featured API, free no-signup tool + MCP
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.site-shot.com/" rel="noopener noreferrer"&gt;Site-Shot&lt;/a&gt; renders pages in a real Chromium browser and returns a PNG/JPEG&lt;br&gt;
(or JSON with base64 + the target's response headers) from a single GET request — no SDK required.&lt;br&gt;
Full-page capture up to 20,000px, device emulation, and automatic ad + cookie-banner removal (&lt;code&gt;no_ads&lt;/code&gt;,&lt;br&gt;
&lt;code&gt;no_cookie_popup&lt;/code&gt;) that also keeps images clean for AI vision pipelines. Geotargeting is built in on&lt;br&gt;
every paid plan: the &lt;code&gt;country&lt;/code&gt; parameter routes the render through a real country-specific IP address&lt;br&gt;
in 49 countries as of August 2026 (with matching language, time zone, and geolocation — each pool's exit country is&lt;br&gt;
verified against a majority vote of independent GeoIP sources), a &lt;code&gt;strict_country=1&lt;/code&gt; mode fails&lt;br&gt;
fast with &lt;code&gt;"error": "country_unavailable"&lt;/code&gt; instead of silently falling back, and since July 2026 the&lt;br&gt;
free browser tool has a country selector too (US captures free) — see the&lt;br&gt;
&lt;a href="https://www.site-shot.com/blog/screenshot-website-from-another-country/" rel="noopener noreferrer"&gt;geo screenshots guide&lt;/a&gt;. An official MCP server (&lt;code&gt;npx -y site-shot-mcp&lt;/code&gt;) exposes the same&lt;br&gt;
capture tools to Claude, Cursor, and other AI agents. Scheduled captures are built in on every paid&lt;br&gt;
plan too — set a cadence in the browser and every shot files into your library&lt;br&gt;
(&lt;a href="https://www.site-shot.com/blog/automatically-screenshot-website-every-day/" rel="noopener noreferrer"&gt;how it works&lt;/a&gt;). The browser tool is &lt;strong&gt;free with no registration&lt;/strong&gt;;&lt;br&gt;
the &lt;a href="https://www.site-shot.com/pricing/" rel="noopener noreferrer"&gt;API&lt;/a&gt; starts at &lt;strong&gt;$5/mo for 2,000 screenshots&lt;/strong&gt; (the $15 Lite&lt;br&gt;
plan includes 10,000) and drops to &lt;strong&gt;$0.0008/shot — $0.80 per 1,000&lt;/strong&gt; on the Professional plan.&lt;br&gt;
&lt;em&gt;Best for:&lt;/em&gt; developers who want full-featured, real-browser screenshots without paying premium per-shot&lt;br&gt;
rates. &lt;em&gt;Gaps:&lt;/em&gt; the official SDKs cover Node.js (&lt;code&gt;npm install site-shot-sdk&lt;/code&gt;) and Python&lt;br&gt;
(&lt;code&gt;pip install site-shot&lt;/code&gt;) — in every other language you call the plain HTTP API directly.&lt;/p&gt;

&lt;h3&gt;
  
  
  ScreenshotOne — the developer-favorite premium API
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://screenshotone.com/" rel="noopener noreferrer"&gt;ScreenshotOne&lt;/a&gt; is the most-recommended option, with a deep feature set&lt;br&gt;
(PDF, video, JS/CSS injection, dark mode, S3, webhooks), native SDKs in 7 languages, an official MCP&lt;br&gt;
server, and a dedicated AI-agents page. You pay for it: $17/mo for 2,000 shots ($8.50/1,000), $0.009&lt;br&gt;
overage. &lt;em&gt;Best for:&lt;/em&gt; teams that want the most polished, integration-rich option and don't mind the price.&lt;/p&gt;

&lt;h3&gt;
  
  
  Urlbox — premium, compliance-grade
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://urlbox.com/" rel="noopener noreferrer"&gt;Urlbox&lt;/a&gt; targets "revenue-generating businesses" with compliance-grade context —&lt;br&gt;
tamper-evident timestamps/hashes (their claim), change detection — plus bring-your-own proxy support&lt;br&gt;
(route through your own provider; gated to Ultra, $99/mo, and above) with built-in geolocation emulation,&lt;br&gt;
and many output formats. No free tier — a 7-day trial and a $100/10K guarantee instead. Mind which plan&lt;br&gt;
you price against: the cheapest tier (Lo-Fi, $19/mo for 2,000) is scoped to sites you own and renders&lt;br&gt;
third-party pages as thumbnails only, so capturing other people's sites starts at Hi-Fi — $49/mo for&lt;br&gt;
5,000 renders ($9.80/1,000, checked August 2026).&lt;br&gt;
&lt;em&gt;Best for:&lt;/em&gt; legal, compliance, and archival use cases where defensibility matters more than price.&lt;/p&gt;

&lt;h3&gt;
  
  
  ApiFlash — cheap and fast
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://apiflash.com/" rel="noopener noreferrer"&gt;ApiFlash&lt;/a&gt; runs Chrome on AWS Lambda for fast captures, with a simple feature set&lt;br&gt;
and a low $7/mo entry (1,000 shots). IP geolocation and managed proxies are Enterprise-only (a&lt;br&gt;
bring-your-own proxy parameter is self-serve). &lt;em&gt;Best for:&lt;/em&gt; simple, fast, budget screenshots where you&lt;br&gt;
don't need geo-targeting.&lt;/p&gt;

&lt;h3&gt;
  
  
  ScreenshotAPI.net — broad feature set, developer-focused
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://screenshotapi.net/" rel="noopener noreferrer"&gt;ScreenshotAPI.net&lt;/a&gt; offers a wide parameter set, element capture, video output,&lt;br&gt;
PDF, data extraction, and scheduled screenshots; plans start at $9/mo (1,000), and bring-your-own proxy&lt;br&gt;
support arrives on its higher tiers ($29/mo Startup and up — no country selection). No MCP. &lt;em&gt;Best for:&lt;/em&gt; developers who want a broad parameter set at a low entry price.&lt;/p&gt;

&lt;h3&gt;
  
  
  CaptureKit — cheap, with content extraction
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://capturekit.dev/" rel="noopener noreferrer"&gt;CaptureKit&lt;/a&gt; bundles screenshots with a Page Content API (HTML/Markdown/AI&lt;br&gt;
summaries) and stealth mode (residential proxies with fingerprint rotation — no country selection) from&lt;br&gt;
$7/mo (1,000 credits). &lt;em&gt;Best for:&lt;/em&gt; indie devs who also need clean web content to feed an LLM.&lt;/p&gt;

&lt;h3&gt;
  
  
  Microlink — cheapest at volume, full headless control
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://microlink.io/" rel="noopener noreferrer"&gt;Microlink&lt;/a&gt; is a "browser as API" with full Puppeteer/Playwright control, an&lt;br&gt;
official MCP server, global edge caching, and excellent volume pricing ($49/mo for 46,000 ≈ $1.07/1,000).&lt;br&gt;
Free tier is 25 req/day. Geo caveat: Microlink's docs used to scope Pro's automatic proxy resolution&lt;br&gt;
away from screenshots and PDFs (their FAQ, June 2026); as of August 2026 that note is gone and the docs&lt;br&gt;
don't state the scope — test geo screenshots on your own workload before relying on them. &lt;em&gt;Best for:&lt;/em&gt;&lt;br&gt;
high-volume workloads and AI agents that want the cheapest full-featured option at scale.&lt;/p&gt;

&lt;h3&gt;
  
  
  Thum.io — cheapest raw price, real-time streaming
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.thum.io/" rel="noopener noreferrer"&gt;Thum.io&lt;/a&gt; streams an animated render while capturing, with a generous 1,000/mo&lt;br&gt;
no-signup free tier and $0.20/1,000 pricing. But the free tier is branded, full-page is a paid feature,&lt;br&gt;
and there's no ad/cookie removal or geo proxy. &lt;em&gt;Best for:&lt;/em&gt; simple, high-volume thumbnails on a tight budget.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to choose
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Want a free screenshot with no signup?&lt;/strong&gt; Use Site-Shot's online tool (or Thum.io's branded free tier).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cheapest full-featured API?&lt;/strong&gt; Microlink at volume; Site-Shot for the lowest entry commitment ($5/mo)
— and an even lower $0.80/1,000 at scale — with a free browser tool to prototype against.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Most features / integrations regardless of price?&lt;/strong&gt; ScreenshotOne or Urlbox.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Building an &lt;a href="https://www.site-shot.com/ai-agents/" rel="noopener noreferrer"&gt;AI agent&lt;/a&gt; today?&lt;/strong&gt; Site-Shot, ScreenshotOne,
Urlbox, and Microlink ship official MCP servers right now — Site-Shot's is &lt;code&gt;npx -y site-shot-mcp&lt;/code&gt;
(API key from the &lt;a href="https://www.site-shot.com/pricing/" rel="noopener noreferrer"&gt;pricing page&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Need the same page captured on a schedule, without code?&lt;/strong&gt; Site-Shot's
&lt;a href="https://www.site-shot.com/blog/automatically-screenshot-website-every-day/" rel="noopener noreferrer"&gt;scheduled captures&lt;/a&gt; are
built into every paid plan; ScreenshotAPI.net advertises scheduled screenshots too. Elsewhere you
drive the API from your own cron.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best value for real-browser quality on a budget?&lt;/strong&gt; Site-Shot — under a third of the premium APIs'
per-shot price, with full-page, proxies, ad/cookie removal, and an official MCP server included.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What is the best website screenshot API in 2026?&lt;/strong&gt;&lt;br&gt;
For most developers it's a trade-off between ScreenshotOne/Urlbox (most features, premium price),&lt;br&gt;
Microlink/Thum.io (cheapest), and Site-Shot (best value for full-featured, real-Chromium screenshots with&lt;br&gt;
a free no-signup tool and an official MCP server). Pick by your volume and whether you need MCP today.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's the cheapest screenshot API?&lt;/strong&gt;&lt;br&gt;
On raw per-shot price, Thum.io ($0.20/1,000) is cheapest. Among full-featured Chromium APIs, Site-Shot&lt;br&gt;
starts at $2.50/1,000 on its $5/mo plan and drops to $0.80/1,000 at scale — undercutting Microlink's&lt;br&gt;
$1.07/1,000 — while keeping a free no-signup browser tool.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is there a free screenshot API with no signup?&lt;/strong&gt;&lt;br&gt;
Site-Shot offers a free online screenshot tool with no registration; Thum.io offers a no-signup free API&lt;br&gt;
tier (with branding). Most other APIs require a free account to get an API key. Site-Shot's paid API,&lt;br&gt;
like the others, still requires an account and API key. Get one on the&lt;br&gt;
&lt;a href="https://www.site-shot.com/pricing/" rel="noopener noreferrer"&gt;pricing page&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which screenshot APIs work with AI agents / MCP?&lt;/strong&gt;&lt;br&gt;
Site-Shot, ScreenshotOne, Urlbox (github.com/urlbox/urlbox-mcp-server), and Microlink ship official&lt;br&gt;
MCP servers today — Site-Shot's is &lt;code&gt;npx -y site-shot-mcp&lt;/code&gt; (registry id &lt;code&gt;io.github.site-shot/site-shot-mcp&lt;/code&gt;).&lt;br&gt;
For ApiFlash, CaptureKit, ScreenshotAPI.net, and Thum.io we could not find an official MCP server in the&lt;br&gt;
MCP registry or on npm as of August 2026.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can a screenshot API remove ads and cookie banners?&lt;/strong&gt;&lt;br&gt;
Yes — Site-Shot (&lt;code&gt;no_ads&lt;/code&gt;, &lt;code&gt;no_cookie_popup&lt;/code&gt;), ScreenshotOne, Urlbox, ApiFlash, ScreenshotAPI.net,&lt;br&gt;
CaptureKit, and Microlink all support removing ads and cookie-consent banners for cleaner captures.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which screenshot API can capture a website from another country?&lt;/strong&gt;&lt;br&gt;
Site-Shot includes country-IP routing on every paid plan — a &lt;code&gt;country&lt;/code&gt; parameter (two-letter ISO code)&lt;br&gt;
plus &lt;code&gt;strict_country=1&lt;/code&gt; to fail fast rather than silently fall back to a US IP; its free browser tool&lt;br&gt;
captures from the US with no signup. ScreenshotOne offers built-in IP location (18 countries, datacenter&lt;br&gt;
proxies) on its Growth and Scale tiers; Urlbox routes through a proxy you bring yourself; ApiFlash gates&lt;br&gt;
geo behind Enterprise. See the&lt;br&gt;
&lt;a href="https://www.site-shot.com/blog/screenshot-website-from-another-country/" rel="noopener noreferrer"&gt;step-by-step geo guide&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which screenshot APIs can capture on a schedule?&lt;/strong&gt;&lt;br&gt;
Site-Shot has scheduled captures built into every paid plan — set a cadence in the browser, every shot&lt;br&gt;
files into your library, no cron or code needed. ScreenshotAPI.net advertises scheduled screenshots as&lt;br&gt;
a product too. ScreenshotOne has no built-in scheduler — recurring captures there run through Zapier,&lt;br&gt;
Make, n8n, or your own cron. For the other tools, check their docs; where nothing is built in, driving&lt;br&gt;
the API from cron works with any of them.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Capture your first screenshot free in your browser — no signup — at&lt;br&gt;
&lt;a href="https://www.site-shot.com/" rel="noopener noreferrer"&gt;site-shot.com&lt;/a&gt;. Ready to automate? Get an API key on the&lt;br&gt;
&lt;a href="https://www.site-shot.com/pricing/" rel="noopener noreferrer"&gt;pricing page&lt;/a&gt;, or read the&lt;br&gt;
&lt;a href="https://www.site-shot.com/#documentation" rel="noopener noreferrer"&gt;API docs&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>screenshot</category>
      <category>api</category>
      <category>webdev</category>
      <category>ai</category>
    </item>
    <item>
      <title>How to Take a Website Screenshot with PHP</title>
      <dc:creator>alekseykazandaev</dc:creator>
      <pubDate>Mon, 06 Apr 2026 18:09:26 +0000</pubDate>
      <link>https://dev.to/alekseykazandaev/how-to-take-a-website-screenshot-with-php-454f</link>
      <guid>https://dev.to/alekseykazandaev/how-to-take-a-website-screenshot-with-php-454f</guid>
      <description>&lt;p&gt;PHP still powers a lot of real-world web applications, so screenshot generation fits naturally into CMS plugins, monitoring tools, and link preview workflows. This Dev.to version keeps the original examples intact while tightening the framing for developers who want a straightforward API-based approach.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;PHP 7.4+ with the cURL extension enabled&lt;/li&gt;
&lt;li&gt;A Site-Shot API key (&lt;a href="https://www.site-shot.com/pricing/" rel="noopener noreferrer"&gt;sign up here&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Basic Screenshot Capture
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="nv"&gt;$params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;http_build_query&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
    &lt;span class="s1"&gt;'url'&lt;/span&gt;     &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'https://example.com'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'userkey'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'YOUR_API_KEY'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'width'&lt;/span&gt;   &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1280&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'height'&lt;/span&gt;  &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'format'&lt;/span&gt;  &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'png'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;]);&lt;/span&gt;

&lt;span class="nv"&gt;$ch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;curl_init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"https://api.site-shot.com/?&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$params&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nb"&gt;curl_setopt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$ch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;CURLOPT_RETURNTRANSFER&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nb"&gt;curl_setopt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$ch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;CURLOPT_TIMEOUT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nv"&gt;$image&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;curl_exec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$ch&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$httpCode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;curl_getinfo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$ch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;CURLINFO_HTTP_CODE&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nb"&gt;curl_close&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$ch&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$httpCode&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;$image&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;file_put_contents&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'screenshot.png'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$image&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Screenshot saved.&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Error: HTTP &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$httpCode&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The API returns the raw image bytes. Just save them to a file or serve them to the browser.&lt;/p&gt;

&lt;h2&gt;
  
  
  Full Page Screenshot
&lt;/h2&gt;

&lt;p&gt;To capture the entire scrollable page:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;http_build_query&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
    &lt;span class="s1"&gt;'url'&lt;/span&gt;        &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'https://example.com'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'userkey'&lt;/span&gt;    &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'YOUR_API_KEY'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'full_size'&lt;/span&gt;  &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'max_height'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;15000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'format'&lt;/span&gt;     &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'png'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  JSON Response with Base64
&lt;/h2&gt;

&lt;p&gt;If you need the image as base64 along with HTTP metadata:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="nv"&gt;$params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;http_build_query&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
    &lt;span class="s1"&gt;'url'&lt;/span&gt;           &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'https://example.com'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'userkey'&lt;/span&gt;       &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'YOUR_API_KEY'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'width'&lt;/span&gt;         &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1280&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'height'&lt;/span&gt;        &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'format'&lt;/span&gt;        &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'png'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'response_type'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'json'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;]);&lt;/span&gt;

&lt;span class="nv"&gt;$ch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;curl_init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"https://api.site-shot.com/?&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$params&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nb"&gt;curl_setopt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$ch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;CURLOPT_RETURNTRANSFER&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nb"&gt;curl_setopt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$ch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;CURLOPT_TIMEOUT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nv"&gt;$response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;curl_exec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$ch&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nb"&gt;curl_close&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$ch&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nv"&gt;$data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;json_decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="k"&gt;empty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'error'&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;die&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"API error: "&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'error'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nv"&gt;$base64&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'image'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;strpos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$base64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;','&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$base64&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;explode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;','&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$base64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nb"&gt;file_put_contents&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'screenshot.png'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;base64_decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$base64&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Screenshot saved.&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Serving Screenshots in a Web Application
&lt;/h2&gt;

&lt;p&gt;Generate and serve a thumbnail screenshot directly to the browser:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="nv"&gt;$targetUrl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$_GET&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'url'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;empty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$targetUrl&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;http_response_code&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;die&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Missing url parameter'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nv"&gt;$params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;http_build_query&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
    &lt;span class="s1"&gt;'url'&lt;/span&gt;          &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$targetUrl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'userkey'&lt;/span&gt;      &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'YOUR_API_KEY'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'width'&lt;/span&gt;        &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1280&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'height'&lt;/span&gt;       &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;800&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'format'&lt;/span&gt;       &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'jpeg'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'scaled_width'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;]);&lt;/span&gt;

&lt;span class="nv"&gt;$ch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;curl_init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"https://api.site-shot.com/?&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$params&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nb"&gt;curl_setopt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$ch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;CURLOPT_RETURNTRANSFER&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nb"&gt;curl_setopt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$ch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;CURLOPT_TIMEOUT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nv"&gt;$image&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;curl_exec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$ch&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$httpCode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;curl_getinfo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$ch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;CURLINFO_HTTP_CODE&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nb"&gt;curl_close&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$ch&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$httpCode&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;$image&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;header&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Content-Type: image/jpeg'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nb"&gt;header&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Cache-Control: public, max-age=3600'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$image&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;http_response_code&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;502&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;die&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Screenshot failed'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  WordPress Integration
&lt;/h2&gt;

&lt;p&gt;You can integrate the screenshot API into a WordPress plugin or theme:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;site_shot_capture&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$defaults&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="s1"&gt;'url'&lt;/span&gt;     &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'userkey'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;defined&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'SITE_SHOT_API_KEY'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="no"&gt;SITE_SHOT_API_KEY&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'width'&lt;/span&gt;   &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1280&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'height'&lt;/span&gt;  &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'format'&lt;/span&gt;  &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'png'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;];&lt;/span&gt;

    &lt;span class="nv"&gt;$params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;http_build_query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;array_merge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$defaults&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$options&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

    &lt;span class="nv"&gt;$response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;wp_remote_get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s2"&gt;"https://api.site-shot.com/?&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$params&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'timeout'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;is_wp_error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;wp_remote_retrieve_body&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Usage:&lt;/span&gt;
&lt;span class="nv"&gt;$image&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;site_shot_capture&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'https://example.com'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'full_size'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$image&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;file_put_contents&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/tmp/screenshot.png'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$image&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parameter&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;url&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Target web page&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://example.com&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;userkey&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Your API key&lt;/td&gt;
&lt;td&gt;&lt;code&gt;abc123&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;width&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Viewport width (100–8000)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1280&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;height&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Viewport height (100–20000)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1024&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;full_size&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Capture full page&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;format&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Output format&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;png&lt;/code&gt; or &lt;code&gt;jpeg&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;response_type&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Response format&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;image&lt;/code&gt; or &lt;code&gt;json&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;scaled_width&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Resize output&lt;/td&gt;
&lt;td&gt;&lt;code&gt;400&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;See the &lt;a href="https://www.site-shot.com/#documentation" rel="noopener noreferrer"&gt;full API documentation&lt;/a&gt; for all available parameters.&lt;/p&gt;




&lt;p&gt;Try Site-Shot free — no registration needed: &lt;a href="https://www.site-shot.com/" rel="noopener noreferrer"&gt;https://www.site-shot.com/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>php</category>
      <category>webdev</category>
      <category>api</category>
    </item>
    <item>
      <title>How to Take a Website Screenshot with Node.js</title>
      <dc:creator>alekseykazandaev</dc:creator>
      <pubDate>Mon, 06 Apr 2026 18:07:11 +0000</pubDate>
      <link>https://dev.to/alekseykazandaev/how-to-take-a-website-screenshot-with-nodejs-1071</link>
      <guid>https://dev.to/alekseykazandaev/how-to-take-a-website-screenshot-with-nodejs-1071</guid>
      <description>&lt;p&gt;If you are building link previews, monitoring dashboards, or visual testing tools in Node.js, a screenshot API gives you a clean HTTP-based workflow without browser orchestration. This version is tuned for the Dev.to audience and keeps the examples focused on the most common production use cases.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Node.js 18+ (for built-in &lt;code&gt;fetch&lt;/code&gt;) or any version with &lt;code&gt;axios&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;A Site-Shot API key (&lt;a href="https://www.site-shot.com/pricing/" rel="noopener noreferrer"&gt;sign up here&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Using Built-in Fetch (Node.js 18+)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;fs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;captureScreenshot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;outputPath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;screenshot.png&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;URLSearchParams&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;userkey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;YOUR_API_KEY&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1280&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1024&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;png&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s2"&gt;`https://api.site-shot.com/?&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`API returned &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;buffer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Buffer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;arrayBuffer&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
  &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writeFileSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;outputPath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Screenshot saved to &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;outputPath&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;captureScreenshot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://example.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Using Axios
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;axios&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;fs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;captureScreenshot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;outputPath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;screenshot.png&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.site-shot.com/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;userkey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;YOUR_API_KEY&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1280&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;png&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;responseType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;arraybuffer&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;70000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writeFileSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;outputPath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Screenshot saved to &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;outputPath&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;captureScreenshot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://example.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Full Page Scrolling Screenshot
&lt;/h2&gt;

&lt;p&gt;Capture the entire page, not just the viewport:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;URLSearchParams&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://example.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;userkey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;YOUR_API_KEY&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;full_size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;max_height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;15000&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;png&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="s2"&gt;`https://api.site-shot.com/?&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  JSON Response with Base64
&lt;/h2&gt;

&lt;p&gt;Get the screenshot as base64-encoded data along with HTTP metadata:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;URLSearchParams&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://example.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;userkey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;YOUR_API_KEY&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1280&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1024&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;png&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;response_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="s2"&gt;`https://api.site-shot.com/?&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Remove data URL prefix if present&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;base64&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;image&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;base64&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;base64&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;base64&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;buffer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Buffer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;base64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;base64&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writeFileSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;screenshot.png&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Express.js Integration
&lt;/h2&gt;

&lt;p&gt;Serve screenshots dynamically in an Express app:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;express&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/preview&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;targetUrl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;targetUrl&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Missing url parameter&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;URLSearchParams&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;targetUrl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;userkey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;YOUR_API_KEY&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1280&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;800&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;jpeg&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;scaled_width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;400&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s2"&gt;`https://api.site-shot.com/?&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;502&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Screenshot failed&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;buffer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Buffer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;arrayBuffer&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;image/jpeg&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Cache-Control&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;public, max-age=3600&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This creates a &lt;code&gt;/preview?url=https://example.com&lt;/code&gt; endpoint that returns a thumbnail screenshot — useful for link preview cards.&lt;/p&gt;

&lt;h2&gt;
  
  
  Capturing Multiple URLs
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;urls&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://example.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://wikipedia.org&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://github.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;urls&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;URLSearchParams&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;userkey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;YOUR_API_KEY&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1280&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1024&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;png&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="s2"&gt;`https://api.site-shot.com/?&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;buffer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Buffer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;arrayBuffer&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;filename&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/https&lt;/span&gt;&lt;span class="se"&gt;?&lt;/span&gt;&lt;span class="sr"&gt;:&lt;/span&gt;&lt;span class="se"&gt;\/\/&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\/&lt;/span&gt;&lt;span class="sr"&gt;/g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;_&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.png&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writeFileSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Saved:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;results&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The number of concurrent requests depends on your plan's dedicated worker count.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parameter&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;url&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Target web page&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://example.com&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;userkey&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Your API key&lt;/td&gt;
&lt;td&gt;&lt;code&gt;abc123&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;width&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Viewport width (100–8000)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1280&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;height&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Viewport height (100–20000)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1024&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;full_size&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Capture full page&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;format&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Output format&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;png&lt;/code&gt; or &lt;code&gt;jpeg&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;response_type&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Response format&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;image&lt;/code&gt; or &lt;code&gt;json&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;scaled_width&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Resize output image&lt;/td&gt;
&lt;td&gt;&lt;code&gt;400&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;See the &lt;a href="https://www.site-shot.com/#documentation" rel="noopener noreferrer"&gt;full API documentation&lt;/a&gt; and &lt;a href="https://www.site-shot.com/#samples" rel="noopener noreferrer"&gt;all code samples&lt;/a&gt; for more details.&lt;/p&gt;




&lt;p&gt;Try Site-Shot free — no registration needed: &lt;a href="https://www.site-shot.com/" rel="noopener noreferrer"&gt;https://www.site-shot.com/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>node</category>
      <category>webdev</category>
      <category>api</category>
    </item>
    <item>
      <title>How to Take a Website Screenshot with Python</title>
      <dc:creator>alekseykazandaev</dc:creator>
      <pubDate>Mon, 06 Apr 2026 18:01:28 +0000</pubDate>
      <link>https://dev.to/alekseykazandaev/how-to-take-a-website-screenshot-with-python-56a0</link>
      <guid>https://dev.to/alekseykazandaev/how-to-take-a-website-screenshot-with-python-56a0</guid>
      <description>&lt;p&gt;If you are building monitoring dashboards, link previews, or visual QA tooling in Python, a screenshot API is a practical way to avoid browser automation overhead. This post walks through the common capture patterns Dev.to readers usually care about: basic screenshots, full-page capture, JSON output, mobile emulation, geolocation, and batch jobs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Python 3.7+&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;requests&lt;/code&gt; library (&lt;code&gt;pip install requests&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;A Site-Shot API key (&lt;a href="https://www.site-shot.com/pricing/" rel="noopener noreferrer"&gt;sign up here&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Basic Screenshot Capture
&lt;/h2&gt;

&lt;p&gt;The simplest approach — send a GET request to the API and save the image:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.site-shot.com/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://example.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;userkey&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;width&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1280&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;height&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;format&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;png&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;screenshot.png&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;wb&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. The API renders the page in a real Chromium browser and returns the screenshot image directly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Full Page Screenshot
&lt;/h2&gt;

&lt;p&gt;To capture the entire scrollable page, not just the viewport:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.site-shot.com/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://example.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;userkey&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;full_size&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;max_height&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;15000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;format&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;png&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;full_size=1&lt;/code&gt; parameter tells the API to scroll through the entire document. &lt;code&gt;max_height&lt;/code&gt; caps the capture at 15,000 pixels (max 20,000).&lt;/p&gt;

&lt;h2&gt;
  
  
  JSON Response with Base64 Image
&lt;/h2&gt;

&lt;p&gt;If you need the image as base64 along with HTTP response metadata:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;base64&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.site-shot.com/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://example.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;userkey&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;width&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1280&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;height&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;format&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;png&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;response_type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;error&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;RuntimeError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;error&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="n"&gt;image_b64&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;image&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;,&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;image_b64&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;image_b64&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;image_b64&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;,&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;screenshot.png&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;wb&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;base64&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;b64decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;image_b64&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The JSON response includes the &lt;code&gt;image&lt;/code&gt; field (base64-encoded), HTTP &lt;code&gt;status_code&lt;/code&gt;, and &lt;code&gt;response_headers&lt;/code&gt; from the target URL.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mobile Device Screenshot
&lt;/h2&gt;

&lt;p&gt;Emulate a mobile viewport by setting width, height, and user agent:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.site-shot.com/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://example.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;userkey&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;width&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;375&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;height&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;812&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;zoom&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;format&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;png&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user_agent&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X) &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
                  &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AppleWebKit/605.1.15 (KHTML, like Gecko) &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
                  &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Version/16.0 Mobile/15E148 Safari/604.1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Screenshot from a Specific Country
&lt;/h2&gt;

&lt;p&gt;Route the request through a country-specific proxy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.site-shot.com/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://example.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;userkey&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;country&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Germany&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;language&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;de&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;format&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;png&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;country&lt;/code&gt; parameter automatically sets a proxy IP, default language, time zone, and geolocation for that country.&lt;/p&gt;

&lt;h2&gt;
  
  
  Batch Screenshots
&lt;/h2&gt;

&lt;p&gt;To capture multiple URLs, loop through them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="n"&gt;API_KEY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;urls&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://example.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://wikipedia.org&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://github.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;urls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.site-shot.com/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;userkey&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;API_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;width&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1280&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;height&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;format&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;png&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;filename&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;_&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;.png&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;wb&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Saved &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For higher throughput, use &lt;code&gt;concurrent.futures.ThreadPoolExecutor&lt;/code&gt; to capture multiple URLs in parallel — the API supports concurrent requests based on your plan's dedicated worker count.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;The Site-Shot API makes it straightforward to capture website screenshots with Python. Key parameters:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parameter&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;url&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Target web page&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://example.com&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;userkey&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Your API key&lt;/td&gt;
&lt;td&gt;&lt;code&gt;abc123&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;width&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Viewport width (100–8000)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1280&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;height&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Viewport height (100–20000)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1024&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;full_size&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Capture full page&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;format&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Output format&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;png&lt;/code&gt; or &lt;code&gt;jpeg&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;response_type&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Response format&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;image&lt;/code&gt; or &lt;code&gt;json&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;country&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Proxy country&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Germany&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;delay_time&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Wait before capture (ms)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;2000&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Check the &lt;a href="https://www.site-shot.com/#documentation" rel="noopener noreferrer"&gt;full API documentation&lt;/a&gt; for all available parameters.&lt;/p&gt;




&lt;p&gt;Try Site-Shot free — no registration needed: &lt;a href="https://www.site-shot.com/" rel="noopener noreferrer"&gt;https://www.site-shot.com/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>webdev</category>
      <category>api</category>
    </item>
  </channel>
</rss>
