Zapier has no screenshot action of its own, but it does not need one. A single Webhooks by Zapier → GET step calls the RenderScreenshot API, and the response gives you a public image link that Gmail, Slack, Google Drive or Notion steps accept as a file. This page shows the exact field mapping, a tested Code by Zapier alternative, and how to keep retries from spending credits twice. It is part of our integrations hub.
Last tested: 2026-10-15. The Code by Zapier step ran with Node 22.18 inside a wrapper that runs it the way Zapier does (an async function with
inputDataandoutput), against a local stub of our API that returns the documented JSON shape and error envelope. The Webhooks GET mapping matches the GET endpoint reference. We did not run a live Zap for this page, so it has no Zapier UI screenshots yet.
What you can build
- Lead enrichment. A new row in a CRM or Google Sheet carries a company website. Zapier captures the homepage and attaches the image to the deal.
- Change log for competitors. A Schedule by Zapier trigger fires every Monday. A Looping step captures each pricing page and posts the images to a Slack channel.
- Proof of publication. When an RSS feed shows a new article, Zapier captures it with ads and cookie banners blocked and saves the file to a Google Drive folder.
Prerequisites
- A Zapier plan that includes Webhooks by Zapier (it is a premium app on Zapier).
- A RenderScreenshot API key that starts with
rs_live_. Create a free account; no credit card is needed.
Step by step: the Webhooks GET action
- Add an action step. Choose Webhooks by Zapier, then the GET event.
- Set URL to
https://api.renderscreenshot.com/v1/screenshot. - Add Query String Params, one row each (see the mapping table below). Map
urlto the field from your trigger. - Add two Headers:
Authorization=Bearer rs_live_...andAccept=application/json. - Leave Send As JSON off and Unflatten on, then click Test step.
The test returns fields such as Image Url, Image Width, Image Height, Cache Hit and Usage Credits. Map Image Url into any later step that takes a file. Zapier downloads the file from that link.
Use the Authorization header, not the api_key query parameter. Zapier shows query strings in the task history, and anyone who can see the Zap history would see your key.
Parameter mapping
| Zapier field | Key | Example value | What it does |
|---|---|---|---|
| Query String Params | url |
(map from trigger) | The page to capture. Must start with http:// or https://. |
| Query String Params | preset |
desktop_hd |
Size and format in one word. See presets. |
| Query String Params | format |
jpeg |
png, jpeg, webp or pdf. JPEG keeps Gmail attachments small. |
| Query String Params | full_page |
true |
Captures the whole scrollable page. |
| Query String Params | block_ads, block_cookies |
true |
Removes ads and cookie banners before capture. |
| Query String Params | delay |
1500 |
Extra wait in milliseconds after load, up to 10000. |
| Query String Params | cache_available |
true |
Returns an identical earlier render for 0 credits. |
| Headers | Authorization |
Bearer rs_live_... |
Your API key. |
| Headers | Accept |
application/json |
Returns a JSON body with a CDN link instead of image bytes. |
The response, and how long the link lives
{ "id": "req_8f3a1c2e9b7d4e60", "status": "completed", "image": { "url": "https://cdn.renderscreenshot.com/...png", "width": 1920, "height": 1080, "format": "png" }, "cache": { "hit": false, "key": "...", "url": "https://cdn.renderscreenshot.com/...png", "expires_at": "2026-10-16T09:00:00Z" }, "usage": { "credits": 1, "remaining": 149 } }
The image link needs no key, so it is safe to post in Slack or email. It stops working when the cache entry expires: after 24 hours by default, or after cache_ttl seconds (3600 to 2592000). If you need the image for longer, add a step that saves it, for example Google Drive → Upload File with the File field mapped to Image Url. The caching docs explain the TTL in detail.
Alternative: a Code by Zapier step
Use this when you want to send options that GET cannot carry, or when you want clean output field names. Add Code by Zapier → Run Javascript, create three Input Data fields (url, preset, apiKey), and paste this code:
// Code by Zapier (JavaScript). Input Data fields: url, preset, apiKey. // Returns a public image link plus size and credit fields for later steps. const res = await fetch('https://api.renderscreenshot.com/v1/screenshot', { method: 'POST', headers: { Authorization: `Bearer ${inputData.apiKey}`, 'Content-Type': 'application/json', Accept: 'application/json', }, body: JSON.stringify({ url: inputData.url, preset: inputData.preset || 'desktop_hd', output: { format: 'jpeg', quality: 80 }, block: { ads: true, cookie_banners: true }, cache: { available: true }, // a replayed step reuses the render for 0 credits }), }); const data = await res.json(); if (!res.ok) { // Throwing marks the step as errored, so Zapier can hold or replay the run. throw new Error(`${res.status} ${data.error.code} (retryable: ${data.error.retryable}): ${data.error.message}`); } output = { image_url: data.image.url, width: data.image.width, height: data.image.height, reused: data.cache.hit, credits_used: data.usage.credits, credits_remaining: data.usage.remaining, };
In our test the step returned the six output fields on success. It threw 401 invalid_api_key (retryable: false) for a wrong key and 422 screenshot_failed (retryable: true) for a page that timed out. Code steps have a runtime limit that depends on your Zapier plan, and a slow page can take longer than that. Keep the Webhooks GET step as the default and use code only when you need the extra options.
Errors and retries in Zapier
Zapier marks a step as errored on any non-2xx response, and the task history shows the API's JSON error. Read two fields: error.code tells you what happened and error.retryable tells you whether to try again. The error handling guide has the full table.
| Response | Typical cause | What to do in Zapier |
|---|---|---|
400 invalid_url |
The trigger sent a bare domain such as acme.com |
Add a Formatter → Text step that prefixes https:// |
401 invalid_api_key |
Wrong key or a typo in Bearer |
Fix the header. Do not replay. |
403 insufficient_credits |
Monthly credits used | Turn the Zap off until the reset, or change plan |
422 screenshot_failed |
The page did not finish loading | Replay once. If it fails again, add delay or block cookies. |
429 too_many_requests |
A Looping step sent too many requests in one minute | Add a Delay by Zapier step inside the loop |
If your plan includes Zapier's Autoreplay, it replays errored steps for you. Send cache_available=true in every screenshot step anyway. A replay of a run whose screenshot already succeeded then gets the same image back for 0 credits, instead of a new render.
Limits and costs
- Credits. Each fresh render uses one credit. Failed renders and reused cache hits use none. See pricing for the monthly credits on each plan.
- Zapier tasks. Each screenshot step counts as one Zapier task, on top of the credit.
- Rate limits. Requests per minute depend on your RenderScreenshot plan. A Looping step over a long list reaches the limit fast on the free plan; see rate limits.
- Long pages. Full-page captures of very long pages can be large. Gmail and Slack have their own attachment limits, so use
format=jpegor save to Drive and share the link.
Troubleshooting
- The test step returns binary text. The
Accept: application/jsonheader is missing. - Later steps say the file is invalid. You mapped
Cache Urlfrom an old test. Re-test the step so that Zapier gets a fresh link, or save the file earlier in the Zap. - Every run uses a credit, even for the same page. Add
cache_available=true. Without it, each request is a new render. - The capture shows a cookie wall. Add
block_cookies=true, and see the cookie banner guide for pages that need a click.
The same request works in other automation tools. If you build in Make or n8n, see the Make scenario and the n8n workflow.