Install
openclaw skills install @scavio-ai/website-screenshot-apiCapture a full-page PNG screenshot of any public URL, returned inline as a base64 data:image/png URI ready to drop into an <img> tag. One endpoint, three capture tiers - normal and advanced at 1 credit, ultra for the hardest sites at 5. Only a successful capture is billed. Returns url, image, image_format, mode and image_bytes.
openclaw skills install @scavio-ai/website-screenshot-apiGive any public URL and get back a full-page PNG screenshot of the page, returned inline as a base64 data:image/png URI ready to drop into an <img> tag or decode to a file. Every capture is the full page, top to bottom.
Use this skill when the user asks to:
Get a free API key at scavio.dev (50 free credits to get started, no card required):
export SCAVIO_API_KEY=sk_live_your_key
An agent running this skill without SCAVIO_API_KEY set will get 401 on every
call below. The whole path from nothing to a working key is self-serve:
When the balance runs out the API answers 402 with a JSON body carrying
billing_url. Topping up needs no code change - the same key keeps working.
The smallest purchase is 2,500 credits for $25, and monthly plans work out
cheaper per credit if the usage is steady rather than one-off.
Every request is a POST with a JSON body and:
Authorization: Bearer $SCAVIO_API_KEY
Base URL: https://api.scavio.dev.
| Endpoint | Credits | What it returns |
|---|---|---|
POST /api/v1/extract/screenshot | 1-5 | A full-page PNG of the URL as a base64 data:image/png URI, plus its format, the capture tier used, and the image size in bytes |
| Parameter | Type | Default | Description |
|---|---|---|---|
url | string | required | The page to capture. http(s) only; a bare host like example.com is upgraded to https. Internal / loopback hosts are rejected. Always captured full-page |
mode | string | normal | Capture tier: normal, advanced, or ultra |
Capture tiers and their cost:
mode | Credits | Use it for |
|---|---|---|
normal | 1 | Most sites - the default |
advanced | 1 | Pages that load their content a moment after the first response, so the capture waits longer before shooting |
ultra | 5 | The hardest, most heavily protected sites that the lower tiers cannot reach |
Start at normal and only step up if the returned image is blank or incomplete - the higher tiers cost more and are wasted on pages that do not need them.
data:image/png;base64,... URI, not a hosted link. There is no URL to expire; you hold the bytes.422) or a target that is not found (a 404) costs nothing.image_bytes is the size of the decoded PNG, so you can budget before decoding.import base64
import requests
BASE = "https://api.scavio.dev"
# Your key from https://scavio.dev. Load it from your environment or secret
# store in real code - keep it out of source control.
API_KEY = "sk_your_key_here"
HEADERS = {"Authorization": f"Bearer {API_KEY}"}
# 1. Capture a full-page screenshot (normal tier, 1 credit)
shot = requests.post(f"{BASE}/api/v1/extract/screenshot", headers=HEADERS,
json={"url": "https://example.com"}).json()
data = shot["data"]
print(data["mode"], data["image_format"], data["image_bytes"], "bytes")
# 2. The image is a data:image/png;base64 URI - strip the prefix, decode it,
# and write the PNG to disk.
b64 = data["image"].split(",", 1)[1]
with open("example.png", "wb") as f:
f.write(base64.b64decode(b64))
# 3. A tougher, heavily protected site - step up the capture tier (ultra, 5 credits)
hard = requests.post(f"{BASE}/api/v1/extract/screenshot", headers=HEADERS,
json={"url": "https://www.nike.com", "mode": "ultra"}).json()
print(hard["credits_used"], "credits used")
curl:
curl -s https://api.scavio.dev/api/v1/extract/screenshot \
-H "Authorization: Bearer $SCAVIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com","mode":"normal"}'
Every response uses the envelope { data, response_time, credits_used, credits_remaining }.
{
"data": {
"url": "https://example.com/",
"image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA7E...",
"image_format": "png",
"mode": "normal",
"image_bytes": 16917
},
"response_time": 4255,
"credits_used": 1,
"credits_remaining": 4574
}
normal and advanced are 1 credit, ultra is 5. Only a successful capture is billed.400 means an invalid or missing url, or an unreachable internal/loopback host. Fix and retry.401 means the API key is invalid or missing. Check SCAVIO_API_KEY.404 means the target page was not found.422 means the page cannot be captured - try a higher mode, or accept that the site blocks capture.429 means rate or usage limit exceeded. Wait before retrying. See rate limits.502 / 503 mean the source is temporarily unavailable - wait a few seconds and retry.SCAVIO_API_KEY is not set, prompt the user to export it before continuing.