TLDR;
Automate screenshot capture for any URL with JavaScript rendering and anti-ban protection — straight from your AI assistant.
Taking a screenshot of a webpage sounds trivial, until you need to do it at scale. Modern websites throw every obstacle imaginable in your way: JavaScript-rendered content that only appears after a React bundle loads, bot-detection systems that serve blank pages to automated headless browsers, geo-blocked content, and CAPTCHAs that appear the moment traffic patterns look non-human. For a handful of URLs you can get away with Puppeteer or Playwright. For hundreds or thousands? You need infrastructure built for the job.
The Zyte API was designed specifically for this problem. It handles JavaScript rendering, anti-bot fingerprinting, rotating proxies, and headless browser management so you don't have to and what better way to do it straight from your LLM supplying the URLs? Hence I created this zyte-screenshots Claude Skill, which you can use to trigger the entire workflow- API call, base64 decode, PNG save on your filesystem, all just by chatting with Claude.
In this tutorial, we'll walk through exactly how the skill works, how to set it up, and how to use it to capture production-quality screenshots of any URL.
Why Use the Zyte API for Screenshots?
Before diving into the skill itself, it's worth understanding what makes the Zyte API uniquely suited to screenshot capture at scale.
1. Full JavaScript Rendering
Single-page applications built with React, Vue, Angular, or Next.js don't serve their content in the raw HTML response, they render it client-side after the page loads. Tools that capture the raw HTTP response will get a blank shell. Zyte's screenshot endpoint fires a real headless browser, waits for the DOM to fully settle, then captures the final rendered state.
2. Anti-Bot and Anti-Ban Protection
Enterprise-grade sites use fingerprinting libraries to detect automation. They check TLS fingerprints, browser headers, canvas rendering patterns, mouse movement entropy, and dozens of other signals. Zyte's infrastructure is battle-tested to pass these checks so your screenshots won't return a "Access Denied" page.
3. Scale Without Infrastructure
Managing a fleet of headless browser instances, proxy rotation, retries, and residential IP pools is a serious engineering investment. Zyte abstracts all of this into a single API call.
4. One API, Any URL
Whether the target is a static HTML page, a JS-heavy SPA, a behind-login dashboard (with session cookies), or a geo-restricted site, the same API call structure works. The skill you're about to install uses this endpoint.
What Is the zyte-screenshots Claude Skill?
Claude Skills are reusable instruction packages that extend Claude's capabilities with domain-specific workflows. The zyte-screenshots skill teaches Claude how to:
- Accept a URL from the user in natural language
- Read the ZYTE_API_KEY environment variable
- Construct and execute the correct curl command against https://api.zyte.com/v1/extract
- Pipe the JSON response through jq and base64 --decode to produce a PNG file
- Derive a clean filename from the URL (e.g. https://quotes.toscrape.com becomes quotes.toscrape.png)
- Report the exact file path and describe what's visible in the screenshot in one sentence
In practice, this means you can open Claude, say "screenshot https://example.com", and have a pixel-perfect PNG on your filesystem in seconds, no browser, no script, no Puppeteer config.
Prerequisites
Before installing the skill, make sure you have the following:
Tools
- curl: Pre-installed on macOS and most Linux distributions. On Windows, use WSL or Git Bash.
-
jq: A lightweight JSON processor. Install via
brew install jq(macOS) orsudo apt install jq(Ubuntu/Debian). - base64: Standard on all Unix-like systems.
- Claude desktop app with Skills support enabled.
A Zyte API Key
Sign up at zyte.com and navigate to your API credentials. The free tier includes enough credits to get started with testing. Copy your API key, you'll set it as an environment variable.
💡 Pro tip: Set your ZYTE_API_KEY in your shell profile (~/.zshrc or ~/.bashrc) so it's always available:
export ZYTE_API_KEY="your_key_here"or pass it along your prompt
Installing the Skill
Step 1: Download the Skill from GitHub
The skill is open source and available at github.com/apscrapes/claude-zyte-screenshots. Download the latest release ZIP from the repository's Releases page, or clone it directly:
git clone https://github.com/apscrapes/claude-zyte-screenshots.git
Step 2: Import into Claude
- Open the Claude desktop app or go to Claude.ai
- Navigate to Settings → Skills
- Click Import Skill
- Select the SKILL.md file from the downloaded ZIP
- Claude will confirm the skill has been installed
Step 3: Set Your API Key
In your terminal, export your Zyte API key or pass it along your prompt:
export ZYTE_API_KEY="your_zyte_api_key_here"
To make this permanent across terminal sessions, add the export line to your ~/.zshrc or ~/.bashrc file.
Using the Skill: Step-by-Step
Basic Screenshot
Once the skill is installed and your API key is set, using it is as simple as asking Claude:
Screenshot https://quotes.toscrape.com using zyte-screenshots skill
Claude will:
- Verify ZYTE_API_KEY is available in the environment
- Derive the output filename: quotes.toscrape.png
- Execute the following command:
curl -s https://api.zyte.com/v1/extract \
-u "$ZYTE_API_KEY": \
-H "Content-Type: application/json" \
-d '{
"url": "https://quotes.toscrape.com",
"screenshot": true
}' \
| jq -r '.screenshot' \
| base64 --decode > quotes.toscrape.png
- Verify the file is non-empty
- Open and inspect the image
- Return the file location and a one-line visual description
Example output from Claude:
✅ Screenshot captured!
📁 Location: /home/you/quotes.toscrape.png
🖼️ What's in it: A clean light-themed page listing inspirational quotes
with author attributions and tag filters in the sidebar.
Under the Hood: How the API Call Works
Let's break down the exact curl command the skill executes:
curl -s https://api.zyte.com/v1/extract \
-u "$ZYTE_API_KEY": \
-H "Content-Type: application/json" \
-d '{
"url": "https://target-site.com",
"screenshot": true
}' \
| jq -r '.screenshot' \
| base64 --decode > output.png
curl -s — Silent mode; suppresses progress output.
-u "$ZYTE_API_KEY": — HTTP Basic Auth. Zyte uses the API key as the username with an empty password.
-H "Content-Type: application/json" — Tells the API to expect a JSON body.
-d '{...}' — The JSON request body. Setting screenshot: true instructs Zyte to return a base64-encoded PNG of the fully rendered page.
| jq -r '.screenshot' — Extracts the raw base64 string from the JSON response.
| base64 --decode — Decodes the base64 string into binary PNG data.
> output.png — Writes the binary data to a PNG file.
The Zyte API handles everything in between — spinning up a headless Chromium instance, loading the page with real browser fingerprints, waiting for JavaScript execution to complete, and rendering the final DOM to a pixel buffer.
This was a fun weekend project I put together, let me know your thoughts on our Discord and feel free to play around with it. I'd also love to know if you create any useful claude skills or mcp server, so say hi on our discord.
Tags: web scraping • Zyte API • screenshots at scale • JavaScript rendering • anti-bot • Claude AI • Claude Skills • automation • headless browser • site APIs

Top comments (0)