From Bifröst to your browser — crisp, reliable captures across all nine realms.
curl -X POST https://heimdall.page/capture \ -H "Content-Type: application/json" \ -d '{"url": "https://github.com"}'
{
"success": true,
"job_id": "a1b2c3_1703700000",
"screenshot_id": "scr_7x8k2m9p4q",
"status": "queued"
}
Screenshots are stored for 7 days or until manually deleted using your screenshot_id.
We recommend downloading and saving screenshots locally for long-term storage.
Everything you need to capture website screenshots at scale.
Queue screenshots and check status. No blocking requests.
7-day cache with force refresh option. Fast repeat requests.
Handles certificate errors gracefully. Capture any site.
Multiple loading strategies for reliable captures.
Set width, height, and timeout per request.
DNS, HTTP status, and detailed error tracking.
Complete endpoint reference with examples.
| Name | Type | Default | Description |
|---|---|---|---|
| urlrequired | string | — | URL to capture |
| widthoptional | integer | 1280 | Viewport width |
| heightoptional | integer | 800 | Viewport height |
| forceoptional | boolean | false | Bypass cache |
curl -X POST https://heimdall.page/capture \ -H "Content-Type: application/json" \ -d '{"url": "https://github.com", "width": 1920}'
Same parameters as /capture. Waits for completion before returning.
curl https://heimdall.page/screenshot/a0714cb80b6e5b4eeb72c2e1c620d35d \ -o screenshot.png
{
"job_id": "a1b2c3_1703700000",
"screenshot_id": "scr_7x8k2m9p4q",
"status": "completed",
"screenshot_path": "/screenshot/d41d8cd9...",
"expires_at": "2025-01-04T10:30:00Z"
}
curl -X DELETE https://heimdall.page/screenshot/scr_7x8k2m9p4q
Quick start snippets for popular languages.
import requests response = requests.post( "https://heimdall.page/capture/sync", json={"url": "https://github.com"} ) data = response.json() if data["success"]: # Save screenshot_id for later deletion screenshot_id = data["screenshot_id"] image_url = f"https://heimdall.page{data['path']}"
const response = await fetch( "https://heimdall.page/capture/sync", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ url: "https://github.com" }) } ); const data = await response.json(); const imageUrl = `https://heimdall.page${data.path}`;
| Status | Error | Description |
|---|---|---|
400 |
Invalid URL | The provided URL is malformed or missing |
404 |
Not Found | Screenshot or job not found |
408 |
Timeout | Page load exceeded timeout limit |
429 |
Rate Limited | Too many requests, please slow down |
500 |
Capture Failed | Screenshot capture failed (check /debug endpoint) |
| Environment Variable | Default | Description |
|---|---|---|
SCREENSHOT_DIR |
/data/screenshots |
Storage directory for screenshots |
DEFAULT_TIMEOUT |
45000 |
Page load timeout (ms) |
DEFAULT_WIDTH |
1280 |
Default viewport width |
DEFAULT_HEIGHT |
800 |
Default viewport height |
MAX_CONCURRENT_JOBS |
3 |
Maximum parallel captures |
CACHE_DAYS |
7 |
Cache duration in days |