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.
50 screenshots/day · no credit card · takes 10 seconds
Parameters
Parameter
Type
Default
Description
url
string
—
URL to capture (required)
format
string
png
png · webp · jpeg · pdf
width
integer
1280
Viewport width in px (320–3840)
height
integer
800
Viewport height in px (200–3840)
full_page
boolean
false
Scroll and stitch the full page
dark_mode
boolean
false
Emulate prefers-color-scheme: dark
delay
integer
0
Wait ms after load (max 10000). Use for SPAs, charts, dashboards.
scale
number
1
Device pixel ratio: 1, 2 (retina), 3
block_ads
boolean
false
Block 25+ ad networks, trackers, cookie banners
full_page
boolean
false
Capture full scrollable page length
selector
string
—
CSS selector — capture a specific element only
js
string
—
JavaScript to execute before capture (max 2000 chars)
quality
integer
80
JPEG/WebP quality (1–100)
mobile
boolean
false
Emulate 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 defscreenshot_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
from fastapi import FastAPI, Request
import httpx
app = FastAPI()
# 1. Submit a job with your webhook URLasync defqueue_screenshot(url: str, api_key: str):
async with httpx.AsyncClient() as client:
r = await client.post(
"https://hermesforge.dev/api/screenshot/queue",
json={
"url": url,
"format": "webp",
"webhook_url": "https://yourapp.com/api/screenshot-done",
},
headers={"X-API-Key": api_key},
)
return r.json()["job_id"] # returns immediately# 2. Receive the result when it's ready@app.post("/api/screenshot-done")
async defscreenshot_done(request: Request):
data = await request.json()
# data = {"job_id": "...", "status": "done",# "result_url": "https://hermesforge.dev/api/screenshot/result/..."}
result_url = data["result_url"]
# Fetch and store, pass to LLM, etc.return {"ok": True}
# pip install langchain-hermes# or: pip install https://hermesforge.dev/packages/langchain_hermes-0.1.0-py3-none-any.whlfrom langchain_hermes import HermesScreenshotTool, HermesAsyncScreenshotTool
from langchain_core.agents import create_tool_calling_agent
# Sync tool — returns base64 data URL (works with multimodal LLMs)
screenshot = HermesScreenshotTool(api_key="YOUR_KEY")
# Async queue tool — non-blocking, returns job_id + status_url
screenshot_async = HermesAsyncScreenshotTool(
api_key="YOUR_KEY",
poll_for_result=True, # True = block until done, return result URL
)
# Add to any LangChain agent
tools = [screenshot]
agent = create_tool_calling_agent(llm=your_llm, tools=tools, prompt=your_prompt)
# Direct use
data_url = screenshot.run({"url": "https://example.com", "full_page": True})
# → "data:image/webp;base64,..."
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.