Zapier Website Screenshots with RenderScreenshot

Take website screenshots in Zapier with one Webhooks by Zapier GET step: field mapping, a tested Code by Zapier step, retries and credit-safe replays.

By Simon Chiu · Updated

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 inputData and output), 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

  1. Add an action step. Choose Webhooks by Zapier, then the GET event.
  2. Set URL to https://api.renderscreenshot.com/v1/screenshot.
  3. Add Query String Params, one row each (see the mapping table below). Map url to the field from your trigger.
  4. Add two Headers: Authorization = Bearer rs_live_... and Accept = application/json.
  5. 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.
{
  "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=jpeg or save to Drive and share the link.

Troubleshooting

  • The test step returns binary text. The Accept: application/json header is missing.
  • Later steps say the file is invalid. You mapped Cache Url from 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.

Frequently asked questions

Does Zapier have a built-in screenshot action?
No. Zapier can call any HTTP API with the Webhooks by Zapier GET action, so you send the page URL to the RenderScreenshot API and get back a public image link that later steps can use as a file.
Why do I get a JSON response instead of an image?
Because the step sends Accept: application/json. Zapier handles JSON fields well and binary bodies poorly, so the API returns a CDN link to the image plus its width, height and credit use.
Does replaying a failed Zap use more credits?
A failed render uses no credit. A replayed step that already succeeded would render again, unless you send cache_available=true, which returns the earlier identical render for 0 credits.

Related in this topic

Try RenderScreenshot free

150 free credits every month, no credit card required.