{
  "name": "rasterly",
  "description": "The web-rendering layer for AI agents. Turn any URL into a screenshot, a PDF, or clean LLM-ready Markdown.",
  "endpoints": {
    "screenshot": "GET /v1/screenshot?url=<encoded>&format=png|jpeg|pdf|gif|mp4&full_page=true&width=1280&height=800&scale=2&delay=<ms>&fail_on_4xx=true&wait_for=<css>&selector=<css>&transparent=true&settle=true&settle_interval=<ms>&settle_frames=<n>&settle_timeout=<ms>&fps=10&duration_ms=5000&gif_quality=10&s3_put_url=<presigned>&ttl=<sec>  · mp4: fps 15..60 default 30, duration_ms 500..15000, max dim 1920",
    "read": "GET /v1/read?url=<encoded>&format=markdown|text|json  → clean, LLM-ready content (renders JS, strips chrome)",
    "extract": "GET /v1/extract?url=<encoded>[&fields=price,title,...][&schema=<json>|&prompt=<text>]  → structured data; fields= deterministic, schema=/prompt= LLM (needs ANTHROPIC_API_KEY)",
    "crawl": "GET /v1/crawl?url=<encoded>&limit=10  → follow same-origin links, return each page as Markdown (for RAG)",
    "pdf": "POST /v1/pdf  {html|url, format=A4, landscape, margin, print_background, scale, header_html, footer_html}  → a print-ready PDF document",
    "template": "POST /v1/template  {template:\"<html>…{{name}}…{{invoice.total}}…\"|template_id, data:{…}|[{…},…], format=pdf|png|jpeg, ...pdf/image knobs}  → fill an HTML template with your data and render it. Inline `template` or a stored `template_id`. data=object → one doc; data=array → up to 100 personalized docs (invoices, certificates, OG images) in one call. {{ }} escaped, {{{ }}} raw, dot-paths supported.",
    "templates": "POST /v1/templates {name, template, format} → store a template (returns template_id) · GET /v1/templates · GET|DELETE /v1/templates/:id · POST /v1/templates/:id/sign {data, format?, expires_in?} → an embeddable, keyless SIGNED URL you can drop in an <img>/<iframe>: GET /v1/render/:id?d=&f=&exp=&sig= renders it (charged once at sign time, then cached).",
    "monitors": "POST /v1/monitors {url, mode=content|selector|visual, selector, interval_minutes, webhook} · GET /v1/monitors · POST /v1/monitors/:id/check · DELETE /v1/monitors/:id  → watch a page, webhook on change",
    "jobs": "POST /v1/jobs {webhook_url, url|html|items, ...screenshot params} → 202 {job_id}. Long renders (100-URL batches, 30s settle=, MP4/GIF) that overflow HTTP timeouts. On done we POST result to your webhook_url (X-Rasterly-Signature: sha256=<hex>). GET /v1/jobs/:id for status; GET /v1/jobs/:id/output for the bytes.",
    "verify": "GET /v1/verify?url=&fetched_at=&hash=&sig=  → verify a provenance receipt (free, keyless)"
  },
  "proof": "read/extract/crawl responses carry signed provenance-receipt headers (x-rasterly-receipt-*); add &receipt=1 to embed it in JSON. Verify at /v1/verify — proof of what content came from which URL, when.",
  "auth": "X-Api-Key header",
  "pricing": {
    "note": "launch pricing — ~70% under Urlbox/ScreenshotOne",
    "per_1000_usd": 0.9
  }
}
