SnapRender

v1.5.0

Give your agent eyes on the web — screenshot any URL as an image file. Supports device emulation (iPhone, iPad, Pixel, MacBook), dark mode, full-page scroll,...

0· 995· 10 versions· 1 current· 1 all-time· Updated 6h ago· MIT-0

Install

openclaw skills install snaprender

SnapRender — Give Your Agent Eyes

Your agent can read the web but can't see it. One command and it captures pixel-perfect screenshots — any site, any device, in seconds.

"Screenshot stripe.com on iPhone", "Compare desktop vs mobile", "Full-page dark mode capture" — just ask.

Free tier: 500 screenshots/month, no credit card. Get a key ->


IMPORTANT: Use the exec tool with curl. NEVER use the browser tool for screenshots.

How to Capture

Run this command via the exec tool. Replace TARGET_URL with the target URL:

jq -n --arg url 'TARGET_URL' \
  '{url: $url, response_type: "json", format: "jpeg", quality: 60, block_ads: true, block_cookie_banners: true}' \
| curl -s -X POST "https://app.snap-render.com/v1/screenshot" \
  -H "X-API-Key: $SNAPRENDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d @- \
| tee /tmp/snap_response.json \
| jq -r '.image' | sed 's|data:image/[^;]*;base64,||' | base64 -d > /tmp/screenshot.jpg \
&& jq '{url, format, size, cache, responseTime, remainingCredits}' /tmp/snap_response.json

This saves the screenshot to /tmp/screenshot.jpg and prints metadata.

Rules

  1. Use exec tool only — NEVER the browser tool
  2. $SNAPRENDER_API_KEY is already set — use it literally in the command, do NOT replace it
  3. Always build JSON with jq --arg — never interpolate user input directly into shell strings or JSON. Pass values via jq -n --arg to prevent injection
  4. Always use format=jpeg&quality=60 — keeps response small enough for the agent context
  5. Always pipe to save the image to a file — the base64 response is too large to display inline
  6. Report metadata to the user — file size, response time, cache status, remaining credits

Render HTML or Markdown

Use POST with a JSON body to render raw HTML or Markdown content (no URL needed). Always use jq --arg to safely pass content:

# HTML
jq -n --arg html '<html><body><h1>Hello</h1><p>World</p></body></html>' \
  '{html: $html, format: "jpeg", quality: 60, response_type: "json"}' \
| curl -s -X POST "https://app.snap-render.com/v1/screenshot" \
  -H "X-API-Key: $SNAPRENDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d @- \
| tee /tmp/snap_response.json \
| jq -r '.image' | sed 's|data:image/[^;]*;base64,||' | base64 -d > /tmp/screenshot.jpg \
&& jq '{source, format, size, cache, responseTime, remainingCredits}' /tmp/snap_response.json
# Markdown
jq -n --arg md '# Hello World\n\nThis is **bold** text.' \
  '{markdown: $md, format: "jpeg", quality: 60, response_type: "json"}' \
| curl -s -X POST "https://app.snap-render.com/v1/screenshot" \
  -H "X-API-Key: $SNAPRENDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d @- \
| tee /tmp/snap_response.json \
| jq -r '.image' | sed 's|data:image/[^;]*;base64,||' | base64 -d > /tmp/screenshot.jpg \
&& jq '{source, format, size, cache, responseTime, remainingCredits}' /tmp/snap_response.json

Provide exactly one of url, html, or markdown in the JSON body. HTML max 2MB, Markdown max 500KB.

Signed URLs

Generate a pre-signed URL that anyone can use to view the screenshot without an API key. Signing is free; rendering the URL costs one credit.

jq -n --arg url 'TARGET_URL' \
  '{url: $url, expires_in: 86400}' \
| curl -s -X POST "https://app.snap-render.com/v1/screenshot/sign" \
  -H "X-API-Key: $SNAPRENDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d @- \
| jq '.'

The response contains signed_url, expires_at, and expires_in. Use the signed_url in <img> tags, share it, or open it in a browser. No API key needed to render it.

Parameters

Pass as fields in the JSON body:

ParameterValuesDefault
urltarget URLrequired
response_typejsonjson (always use this)
formatjpeg, png, webp, pdfjpeg
quality1-10060
deviceiphone_14, iphone_15_pro, pixel_7, ipad_pro, macbook_prodesktop
dark_modetrue, falsefalse
full_pagetrue, falsefalse
block_adstrue, falsetrue
block_cookie_bannerstrue, falsetrue
width320-38401280
height200-10000800
delay0-100000 (ms wait after page load)
cachetrue, falsefalse (set true to enable caching)
cache_ttl0-259200086400 (seconds, clamped to plan max)
hide_selectorsCSS selectorsnone (comma-separated, hides elements before capture)
click_selectorCSS selectornone (clicks element before capture)
user_agentstringdefault Chrome UA

To add extra options, include them as fields in the jq JSON object. Example for dark mode on iPhone:

jq -n --arg url 'TARGET_URL' \
  '{url: $url, response_type: "json", format: "jpeg", quality: 60, block_ads: true, block_cookie_banners: true, device: "iphone_15_pro", dark_mode: true}' \
| curl -s -X POST ...

Examples

Desktop screenshot of stripe.com:

jq -n --arg url 'https://stripe.com' '{url: $url, response_type: "json", format: "jpeg", quality: 60, block_ads: true, block_cookie_banners: true}' | curl -s -X POST "https://app.snap-render.com/v1/screenshot" -H "X-API-Key: $SNAPRENDER_API_KEY" -H "Content-Type: application/json" -d @- | tee /tmp/snap_response.json | jq -r '.image' | sed 's|data:image/[^;]*;base64,||' | base64 -d > /tmp/screenshot.jpg && jq '{url, format, size, cache, responseTime, remainingCredits}' /tmp/snap_response.json

Mobile screenshot: add device: "iphone_15_pro" to the jq object

Full scrollable page: add full_page: true to the jq object

Dark mode: add dark_mode: true to the jq object

Compare desktop vs mobile: make two calls, save to /tmp/screenshot_desktop.jpg and /tmp/screenshot_mobile.jpg

After Capturing

  1. Tell the user the screenshot was saved to /tmp/screenshot.jpg (or the filename you used)
  2. Report metadata: file size, response time, cache status, remaining credits
  3. For comparisons, save each screenshot to a different filename

Errors

  • 401: Invalid API key — check SNAPRENDER_API_KEY
  • 429: Rate limit or quota exceeded — wait or upgrade plan
  • Timeout: Target site is slow — add delay: 3000 to the jq object to wait longer
  • Empty response: URL unreachable or blocked

Get an API Key

Free at https://snap-render.com/auth/signup — 500 screenshots/month, no credit card.

Version tags

latestvk97ds5j0zyckw82p9bf7kvy9x184kg63

Runtime requirements

Binscurl, jq
EnvSNAPRENDER_API_KEY