Activepieces Screenshot Flows with the HTTP Piece

Capture website screenshots in Activepieces with the Send HTTP request action. Field-by-field setup, a retry branch that works, and a sync webhook flow.

By Simon Chiu · Updated

Activepieces has no screenshot piece, and it does not need one. The core HTTP piece can send a JSON request with a bearer token and hand the parsed response to the next step. This page sets up that step field by field, shows what each On Failure setting does with this API, and builds two flows on it. It is part of the screenshot API integrations.

What you can build

  • A daily capture log. Every morning, capture a pricing page or a partner's landing page and add a row with the date, the page title and an image link.
  • A screenshot endpoint for no-code tools. A form tool or an internal app calls one Activepieces webhook URL with a page address and gets back JSON with an image link.

Prerequisites

  • Activepieces Cloud, or a self-hosted instance recent enough to run the HTTP piece 0.13 (its manifest asks for release 0.88.2 or later).
  • A RenderScreenshot API key that starts with rs_live_. Get a free key.

Test the key in a terminal first:

curl -s -X POST https://api.renderscreenshot.com/v1/screenshot \
  -H "Authorization: Bearer $RS_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '{"url":"https://example.com","viewport":{"width":1280,"height":800},"block":{"ads":true,"cookie_banners":true},"cache":{"available":true,"ttl":2592000}}'

The core step: Send HTTP request

Add the HTTP piece and pick Send HTTP request. The field names below are the ones in the piece's code (version 0.13.0):

Section Field Value
Request Method POST
Request URL https://api.renderscreenshot.com/v1/screenshot
Request Headers Accept = application/json
Credentials Authentication Bearer Token
Credentials Token your rs_live_ key
Data to send Body Type JSON
Data to send JSON Body the object below
Advanced Timeout 90 (seconds)
Advanced On Failure Continue flow on all errors

The JSON body; map the address from the data selector:

{
  "url": "https://example.com",
  "viewport": { "width": 1280, "height": 800 },
  "output": { "format": "png" },
  "block": { "ads": true, "cookie_banners": true },
  "cache": { "available": true, "ttl": 2592000 }
}

Why these choices:

  • Accept: application/json instead of Response is Binary. Without the header, the API returns image bytes, and the piece would turn them into a base64 string in the run log. With it, the step output is small JSON, and image.url is a public CDN link that needs no key (response formats).
  • A 30-day cache. The link lives as long as the cache TTL, and 30 days is the maximum. cache.available also means the same page asked twice in that window returns the stored render for 0 credits. For captures that must last longer, copy them to your own bucket with custom storage.
  • A timeout. An empty Timeout waits up to the flow's own limit (the piece describes it as 10 minutes).

A successful step returns three keys: status, headers and body. In the data selector the link is at body → image → url, and the page title is at body → metadata → title.

What On Failure does with this API

We ran the piece's own action code against a local stand-in that answers like the API, for each On Failure option. The results matter because the API reports page problems (timeout, navigation_failed) as HTTP 422, not 5xx:

On Failure option 422 timeout 429 too_many_requests What the flow sees
Do not continue (stop the flow), the default 1 attempt, run fails 1 attempt, run fails A failed run
Retry on internal errors (5xx) 1 attempt, flow continues 1 attempt, flow continues An error object, not a screenshot
Retry on all errors (4xx, 5xx) 3 attempts, then the run fails 3 attempts within milliseconds A failed run
Continue flow on all errors 1 attempt, flow continues 1 attempt, flow continues An error object you can branch on

So the 5xx option does not stop on a 4xx: it hands an error object to the next step. Retry-all sends its three attempts back to back, so a rate-limited request fails three times in the same minute. On failure the step output is response.status, response.body.error (with code, retryable and a docs link) and the request body that was sent.

A retry branch that works

Set On Failure to Continue flow on all errors, then add a Router after the step:

  1. Branch "Rendered": condition body → image → url exists. Continue with the rest of the flow.
  2. Branch "Retry": condition response → body → error → retryable is true. Add Delay → Delay For with Unit Minutes and Amount 1, then a copy of the HTTP step. A minute covers the rate-limit window.
  3. Otherwise: the error is permanent, for example invalid_url or insufficient_credits. Send yourself the code and its docs link.

Failed renders cost no credits, so the retry costs only flow time. The retry guide explains which codes are worth a retry.

Flow 1: daily capture log in Google Sheets

  1. Trigger: Schedule → Every Day. Set Hour of the day and Timezone.
  2. Send HTTP request as above, with the page address typed into the JSON body.
  3. The Router from the previous section.
  4. In the Rendered branch: Google Sheets → Add Row. Map the run date, the address, body → metadata → title and body → image → url.

To capture several pages, keep a list of addresses in a sheet and add Loop on Items around steps 2 to 4. The loop runs one item at a time, which keeps a long list below the rate limit.

Flow 2: a screenshot endpoint for other tools

  1. Trigger: Webhook → Catch Webhook. Set Authentication to Header Auth and pick a long random header value, so only your tools can start runs that spend credits.
  2. Send HTTP request, with the trigger's body field url in the JSON body.
  3. Webhook → Return Response: Response Type JSON, body {"image": "<body → image → url>", "title": "<body → metadata → title>"}.

Callers must use the webhook URL with /sync appended, or they get an answer before the screenshot exists. Do not point RenderScreenshot's own webhooks at this trigger with the HMAC Signature option. Our sender signs the timestamp, a dot and the body (webhook verification), and the piece signs only the body, so every valid delivery would fail.

Limits and costs

  • One credit per fresh render, none for a cache hit or a failed render. See pricing.
  • The rate limit is per account, shared by every key, so a flow and your production app draw on the same counter. Details are in rate limits.
  • The Token field is saved in the flow and appears in flow exports. Use a key made only for Activepieces, and remove it before you share an export.
  • Each run also counts against your Activepieces plan's task limits. Check its pricing page for your plan.

Troubleshooting

Symptom Cause Fix
Next step says the image field is empty On Failure passed an error object on Add the Router and read response.body.error.code
Run log shows a long base64 string Response is Binary is on, or Accept is missing Turn it off and add the Accept header
missing_credentials (401) Token empty, or Authentication left at None Set Bearer Token with the rs_live_ key
invalid_url (400) The mapped address is empty or lacks https:// Check the trigger output; only http and https pages work
Webhook caller gets no image link It called the URL without /sync Append /sync and keep Return Response

Last checked 2026-10-18. Field names come from the published packages @activepieces/piece-http 0.13.0, piece-webhook 0.1.42, piece-schedule 0.1.22, piece-delay 0.4.0 and piece-google-sheets. The On Failure table comes from running the HTTP piece's action code in Node 22.18 against a local stand-in for the API that returned 200, 400, 401, 422 and 429. The flows have not yet been built and run in an Activepieces workspace, and there is no tested flow export yet.

Frequently asked questions

Is there an Activepieces piece for website screenshots?
You do not need one. The built-in HTTP piece, action Send HTTP request, calls the screenshot API with a JSON body and returns the response as step data, so later steps can use the image link, width, height and page title.
Which On Failure option should I pick for a screenshot request?
Continue flow on all errors, followed by a Router. The API reports page failures such as timeout with HTTP 422, so the 5xx retry option never retries them, and the retry-all option sends three attempts back to back with no pause.
Can the Catch Webhook HMAC option verify RenderScreenshot webhooks?
No. Our webhooks sign the timestamp, a dot and the body, while the Catch Webhook HMAC check signs the body alone, so valid deliveries fail. Call the API synchronously from the flow instead, or verify webhooks in your own code.

Related in this topic

Try RenderScreenshot free

150 free credits every month, no credit card required.