Screenshot API

Give your agents and pipelines
visual web perception

Capture any URL as PNG, WebP, JPEG, or PDF. No signup required for the free tier. Used by AI agents, automation pipelines, compliance teams, and developers.

69msMedian latency
FreeNo signup needed
99.9%Uptime
$4Starter tier / 30 days
Get API key — free See pricing →

Try it now

Rate limit reached. Free demo allows 2 captures per minute. Get a key for 50/day — no payment needed.

Screenshot
Quickstart
curl
Python
JavaScript
PHP
# Free tier — no API key required
curl "https://hermesforge.dev/api/screenshot?url=https://example.com" --output screenshot.png

# With API key (higher rate limits)
curl "https://hermesforge.dev/api/screenshot?url=https://example.com&format=webp&dark_mode=true&width=1280" \
  -H "X-API-Key: YOUR_KEY" \
  --output screenshot.webp

# Full page capture with ad blocking
curl "https://hermesforge.dev/api/screenshot?url=https://example.com&full_page=true&block_ads=true&format=png" \
  -H "X-API-Key: YOUR_KEY" \
  --output fullpage.png
import requests

# Free tier — no key needed
resp = requests.get("https://hermesforge.dev/api/screenshot", params={
    "url": "https://example.com",
    "format": "png",
    "width": 1280,
    "height": 800,
})
with open("screenshot.png", "wb") as f:
    f.write(resp.content)

# With API key
resp = requests.get("https://hermesforge.dev/api/screenshot",
    headers={"X-API-Key": "YOUR_KEY"},
    params={"url": "https://example.com", "format": "webp", "dark_mode": "true", "full_page": "true"},
)
with open("screenshot.webp", "wb") as f:
    f.write(resp.content)
// Free tier
const resp = await fetch(
  "https://hermesforge.dev/api/screenshot?url=https://example.com&format=png&width=1280"
);
const blob = await resp.blob();
const url = URL.createObjectURL(blob);

// With API key
const resp = await fetch("https://hermesforge.dev/api/screenshot?url=https://example.com&format=webp", {
  headers: { "X-API-Key": "YOUR_KEY" }
});
const arrayBuffer = await resp.arrayBuffer();
// write to file, upload to S3, etc.
<?php
$params = http_build_query([
  "url"    => "https://example.com",
  "format" => "png",
  "width"  => 1280,
]);
$ctx = stream_context_create(["http" => [
  "header" => "X-API-Key: YOUR_KEY\r\n"
]]);
$img = file_get_contents(
  "https://hermesforge.dev/api/screenshot?" . $params,
  false, $ctx
);
file_put_contents("screenshot.png", $img);
Get your free API key
50 screenshots/day · no credit card · takes 10 seconds
Parameters
ParameterTypeDefaultDescription
urlstringURL to capture (required)
formatstringpngpng · webp · jpeg · pdf
widthinteger1280Viewport width in px (320–3840)
heightinteger800Viewport height in px (200–3840)
full_pagebooleanfalseScroll and stitch the full page
dark_modebooleanfalseEmulate prefers-color-scheme: dark
delayinteger0Wait ms after load (max 10000). Use for SPAs, charts, dashboards.
scalenumber1Device pixel ratio: 1, 2 (retina), 3
block_adsbooleanfalseBlock 25+ ad networks, trackers, cookie banners
full_pagebooleanfalseCapture full scrollable page length
selectorstringCSS selector — capture a specific element only
jsstringJavaScript to execute before capture (max 2000 chars)
qualityinteger80JPEG/WebP quality (1–100)
mobilebooleanfalseEmulate mobile device (touch, UA, viewport)
For AI Agent Pipelines

Built for AI Agent Pipelines

Non-blocking. Webhook delivery. LangChain native. Screenshot any URL as a step in your agent workflow — without stalling the pipeline.

Async Queue
POST a job, get a job_id back in <100ms. Screenshot processes in background. Poll or receive webhook.
🔔
Webhook Delivery
Pass a webhook_url and we POST the result to your endpoint the moment it's ready. No polling required.
🦜
LangChain Native
Drop-in BaseTool for any LangChain agent. Returns base64 data URLs for multimodal LLMs.
import asyncio, httpx

async def screenshot_pipeline(urls: list[str], api_key: str):
    """Non-blocking: submit all jobs, then gather results."""
    async with httpx.AsyncClient() as client:
        headers = {"X-API-Key": api_key, "Content-Type": "application/json"}

        # Submit all jobs without waiting
        jobs = []
        for url in urls:
            r = await client.post(
                "https://hermesforge.dev/api/screenshot/queue",
                json={"url": url, "format": "webp"},
                headers=headers,
            )
            jobs.append(r.json()["job_id"])

        # Poll until all done
        results = {}
        while jobs:
            await asyncio.sleep(2)
            still_pending = []
            for job_id in jobs:
                s = await client.get(
                    f"https://hermesforge.dev/api/screenshot/status/{job_id}",
                    headers=headers,
                )
                data = s.json()
                if data["status"] == "done":
                    results[job_id] = f"https://hermesforge.dev/api/screenshot/result/{job_id}"
                elif data["status"] == "pending":
                    still_pending.append(job_id)
            jobs = still_pending
        return results
Why langchain-hermes? Direct API calls work fine for scripts. Use this package when you need screenshots as a native LangChain tool — automatic base64 data URL conversion for multimodal LLMs (GPT-4o, Claude), tool-call schema generation, and optional async queue for non-blocking pipeline steps. Drop-in compatible with any AgentExecutor or LCEL chain.
Download langchain-hermes v0.1.0 → pip install https://hermesforge.dev/packages/langchain_hermes-0.1.0-py3-none-any.whl Full integration docs →
Async Queue endpoints
POST /api/screenshot/queue
GET /api/screenshot/status/{job_id}
GET /api/screenshot/result/{job_id}
# Submit
curl -X POST https://hermesforge.dev/api/screenshot/queue \
  -H "X-API-Key: YOUR_KEY" -H "Content-Type: application/json" \
  -d '{"url":"https://example.com","format":"webp","webhook_url":"https://yourapp.com/hook"}'
# → {"job_id":"abc123","status":"pending","status_url":"..."}

# Poll
curl https://hermesforge.dev/api/screenshot/status/abc123
# → {"status":"done","result_url":"https://hermesforge.dev/api/screenshot/result/abc123"}

# Fetch
curl https://hermesforge.dev/api/screenshot/result/abc123 -o screenshot.webp
Rate limits & API keys

Free tier works without a key. Get a free key for higher limits. Paid tiers for production use.

Free
$0
5 screenshots/day
2 per minute
No key required
Get free key →
Pro
$9 / 30 days
1,000 screenshots/day
30 per minute
Buy Pro →

Business plan ($29/30 days · 5,000/day) available at pricing page. All plans: one-time purchase, 30-day access window. Check your usage →

Get a free API key

Higher rate limits. Track your usage at /api/usage. No credit card required.

✓ Check your email to verify and activate your key.

Use it as a query param: ?key=YOUR_KEY or header: X-API-Key: YOUR_KEY

Chart Rendering API

Render charts as images

POST a Chart.js config, get back a PNG or JPEG. Same API key. Built for dashboards, reports, and agent pipelines that need dynamic data visualisation.

📊
Chart.js Config
POST any valid Chart.js JSON. Bar, line, pie, doughnut, radar, scatter.
🖼️
PNG / JPEG Output
Returns binary image. Specify format and width/height.
1h Cache
Identical configs return cached results. Embed in reports without re-rendering on every load.
🔑
Same Key
Your existing API key works for both Screenshot and Chart Rendering. Shared rate limit pool.
curl -X POST https://hermesforge.dev/api/charts/render \
  -H "X-API-Key: YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "config": {
      "type": "bar",
      "data": {
        "labels": ["Jan","Feb","Mar","Apr","May"],
        "datasets": [{"label":"Revenue","data":[4200,5100,4800,6300,7100],"backgroundColor":"#3fb950"}]
      }
    },
    "format": "png",
    "width": 800,
    "height": 400
  }' \
  --output chart.png

Endpoint: POST /api/charts/render  |  Visual Infrastructure Bundle →  |  OpenAPI spec →

Other APIs also available