Jittator

Screenshots and PDFs for AI agents, paid per call in bitcoin

Send a public URL, or your own HTML or Markdown. Get back a PNG, JPEG or WebP screenshot, or a PDF. Each request carries its own payment: no account, no API key, no prepaid balance, no subscription.

Prices

RouteWhat it doesSats per call
/v1/screenshotScreenshot of a public URL (viewport)20
/v1/screenshot/fullFull-page screenshot of a public URL30
/v1/pdfPublic URL to PDF30
/v1/render/screenshotScreenshot of HTML or Markdown you send (viewport)20
/v1/render/screenshot/fullFull-page screenshot of HTML or Markdown you send30
/v1/render/pdfHTML or Markdown you send, to PDF30
/healthzService statusfree

All routes are on https://api.jittator.com. Prices are fixed in sats, per call. Lightning routing fees are paid by the payer's wallet. Cashu tokens from coinos or macadamia cost the price plus that mint's swap fee, which depends on the number of proofs (send with "include fees"); see the docs.

How paying works

Make the request. It is checked for free first: a bad parameter, a private address or a page blocked by robots.txt gets an error and no invoice. If the request is valid and carries no payment, the API answers 402 Payment Required and offers two ways to pay in the same response:

When this service's own node cannot make a Lightning invoice, one of the accepted Cashu mints issues it; pay it the same way. If no Lightning invoice can be made at all, the 402 offers Cashu only, with Retry-After for a later Lightning try. See no Lightning invoice.

If a paid call fails because of this service, the gateway makes up for it once: an L402 proof is accepted for one more try within the hour, and a Cashu payment comes back as a refund token in X-Cashu-Refund. Failures caused by the requested page (an error status, an unreachable host, a page that kept the browser busy too long or crashed it) are not retried or refunded; a page that renders blank gets a small courtesy allowance. See failures after payment.

MPP charge and x402 over Lightning are planned.

Example: L402 with curl

# 1. Ask. The answer is 402 with an L402 challenge.
curl -i "https://api.jittator.com/v1/screenshot?url=https://example.com"
#   HTTP/2 402
#   www-authenticate: L402 macaroon="AGIAJEem...", invoice="lnbc200n1..."

# 2. Pay the invoice with any Lightning wallet and note the preimage (hex).

# 3. Repeat the request with the macaroon and preimage.
curl -o shot.png \
  -H "Authorization: L402 AGIAJEem...:6f1c...preimage-hex" \
  "https://api.jittator.com/v1/screenshot?url=https://example.com"

Example: L402 with lnget

# lnget pays the invoice from your configured node and retries for you.
lnget --max-cost 30 -o page.pdf "https://api.jittator.com/v1/pdf?url=https://example.com"
# A token pays one call. On the next call lnget sends its used token, gets a fresh 402
# and pays that, so every call just works (and pays once).
lnget --max-cost 30 -o shot.png "https://api.jittator.com/v1/screenshot?url=https://example.com"

Example: Cashu

# 1. Ask. The 402 answer carries an X-Cashu payment request (creqA...)
#    with the amount, the unit (sat) and the accepted mint URLs.
curl -i "https://api.jittator.com/v1/screenshot?url=https://example.com"

# 2. Make a 20 sat token from one of the listed mints with your Cashu wallet,
#    for example the Nutshell CLI: cashu send 20
#    (at coinos or macadamia, include the mint's fee: cashu send -f 20)

# 3. Repeat the request with the token.
curl -o shot.png \
  -H "X-Cashu: cashuB..." \
  "https://api.jittator.com/v1/screenshot?url=https://example.com"

Example: render your own HTML

curl -o note.pdf \
  -H "Authorization: L402 <macaroon>:<preimage>" \
  -H "Content-Type: application/json" \
  -d '{"markdown": "# Hello\n\nRendered by Jittator.", "paper": "a4"}' \
  https://api.jittator.com/v1/render/pdf

Rules

Full terms: terms of service, acceptable use, privacy.

For agents