snaprender — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited snaprender (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Your agent can read the web but can't see it. One command and it captures pixel-perfect screenshots or extracts page content as clean markdown, plain text, or structured data.
"Screenshot stripe.com on iPhone", "Extract the article from this blog post", "Compare desktop vs mobile", "Get all links from this page" — just ask.
Free tier: 200 requests/month, no credit card. Get a key ->
IMPORTANT: Use the `exec` tool with `curl`. NEVER use the `browser` tool for screenshots or extraction.
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.jsonThis saves the screenshot to /tmp/screenshot.jpg and prints metadata.
browser tooljq -n --arg to prevent injectionUse 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.jsonProvide exactly one of url, html, or markdown in the JSON body. HTML max 2MB, Markdown max 500KB.
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.
Pass as fields in the JSON body:
| Parameter | Values | Default |
|---|---|---|
| url | target URL | required |
| response_type | json | json (always use this) |
| format | jpeg, png, webp, pdf | jpeg |
| quality | 1-100 | 60 |
| device | iphone_14, iphone_15_pro, pixel_7, ipad_pro, macbook_pro | desktop |
| dark_mode | true, false | false |
| full_page | true, false | false |
| block_ads | true, false | true |
| block_cookie_banners | true, false | true |
| width | 320-3840 | 1280 |
| height | 200-10000 | 800 |
| delay | 0-10000 | 0 (ms wait after page load) |
| cache | true, false | false (set true to enable caching) |
| cache_ttl | 0-2592000 | 86400 (seconds, clamped to plan max) |
| hide_selectors | CSS selectors | none (comma-separated, hides elements before capture) |
| click_selector | CSS selector | none (clicks element before capture) |
| user_agent | string | default 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 ...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.jsonMobile 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
/tmp/screenshot.jpg (or the filename you used)Run this command via the exec tool. Replace TARGET_URL with the target URL and TYPE with the extraction type. Always use jq --arg to safely pass the URL:
jq -n --arg url 'TARGET_URL' --arg type 'TYPE' \
'{url: $url, type: $type}' \
| curl -s -X POST "https://app.snap-render.com/v1/extract" \
-H "X-API-Key: $SNAPRENDER_API_KEY" \
-H "Content-Type: application/json" \
-d @- \
| tee /tmp/extract_response.json \
| jq '{url, type, wordCount, processingTimeMs}'To see the full extracted content:
jq -r '.content' /tmp/extract_response.jsonFor large pages, save the content to a file instead of printing it:
jq -r '.content' /tmp/extract_response.json > /tmp/extracted_content.mdbrowser tooljq -n --arg to prevent injection| Type | Returns | Best for |
|---|---|---|
| markdown | Page content as clean Markdown | Reading articles, docs, blog posts |
| text | Plain text, no formatting | Quick text analysis, word counts |
| html | Raw HTML of the page or selector | When you need the markup |
| article | Structured article data (title, author, excerpt, content as Markdown, wordCount) | News articles, blog posts with metadata |
| links | Array of {href, text} objects | Link auditing, sitemap discovery |
| metadata | OpenGraph, Twitter Card, meta tags (title, description, canonical, og:, twitter:) | SEO checks, social preview analysis |
Pass as fields in the JSON body:
| Parameter | Type | Default | Description |
|---|---|---|---|
| url | string | required | Target URL to extract from |
| type | string | "markdown" | One of: markdown, text, html, article, links, metadata |
| selector | string | (none) | CSS selector to extract from a specific element |
| block_ads | boolean | true | Block ad network requests |
| block_cookie_banners | boolean | true | Remove cookie consent banners |
| delay | integer | 0 | Milliseconds to wait after page load (0-10000) |
| max_length | integer | 100000 | Max character length of extracted content (1-500000) |
Extract a page as Markdown:
jq -n --arg url 'https://stripe.com/docs/api' '{url: $url, type: "markdown"}' | curl -s -X POST "https://app.snap-render.com/v1/extract" -H "X-API-Key: $SNAPRENDER_API_KEY" -H "Content-Type: application/json" -d @- | tee /tmp/extract_response.json | jq '{url, type, wordCount, processingTimeMs}'Extract just the article content with metadata:
jq -n --arg url 'https://example.com/blog/post' '{url: $url, type: "article"}' | curl -s -X POST "https://app.snap-render.com/v1/extract" -H "X-API-Key: $SNAPRENDER_API_KEY" -H "Content-Type: application/json" -d @- | tee /tmp/extract_response.json | jq '{title: .content.title, author: .content.author, wordCount: .content.wordCount, processingTimeMs}'Get all links from a page:
jq -n --arg url 'https://example.com' '{url: $url, type: "links"}' | curl -s -X POST "https://app.snap-render.com/v1/extract" -H "X-API-Key: $SNAPRENDER_API_KEY" -H "Content-Type: application/json" -d @- | tee /tmp/extract_response.json | jq '.content | length' && jq '.content[:10]' /tmp/extract_response.jsonGet page metadata (OpenGraph, Twitter Card, SEO):
jq -n --arg url 'https://example.com' '{url: $url, type: "metadata"}' | curl -s -X POST "https://app.snap-render.com/v1/extract" -H "X-API-Key: $SNAPRENDER_API_KEY" -H "Content-Type: application/json" -d @- | tee /tmp/extract_response.json | jq '.content'Extract from a specific CSS selector:
jq -n --arg url 'https://example.com' --arg sel 'main article' '{url: $url, type: "text", selector: $sel}' | curl -s -X POST "https://app.snap-render.com/v1/extract" -H "X-API-Key: $SNAPRENDER_API_KEY" -H "Content-Type: application/json" -d @- | tee /tmp/extract_response.json | jq '{url, type, wordCount, processingTimeMs}'/tmp/extract_response.json)article type, highlight the title and author if availablelinks type, report how many links were foundmetadata type, show the key fields (title, description, og:image)delay parameter (3000ms) to wait longerFree at https://snap-render.com/auth/signup — 200 requests/month, no credit card.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.