Storage, caching and links

Three ways to deliver a render besides the response body: upload it to your own bucket, cache it so repeat requests are free, or get a hosted link.

Upload to your own bucket

Any render can go straight to an S3-compatible bucket: AWS S3, Cloudflare R2, Backblaze B2, MinIO and others. The response is JSON instead of the file.

ParameterDefaultDescription
storage_bucket—Bucket name. Setting it turns the upload on.
storage_access_key_id
storage_secret_access_key
—Credentials, used for this upload only and never stored or logged.
storage_key—Object path, e.g. shots/home.png. Without it, a unique name is generated.
storage_endpoint—https endpoint for non-AWS providers, e.g. https://<account>.r2.cloudflarestorage.com.
storage_region—Bucket region; us-east-1 on AWS and auto with a custom endpoint unless set.
storage_acl—e.g. public-read, if your bucket allows ACLs.
{"stored": true, "bucket": "my-shots", "key": "shots/home.png", "url": "https://…/shots/home.png", "etag": "…", "bytes": 48211, "format": "png"}

The url is the object's address in your bucket; whether it opens publicly depends on your bucket settings.

Caching

Set cache_ttl (seconds, up to 30 days) and identical requests within that time are served from the cache for free. The response carries X-Cache: HIT, MISS or BYPASS. Signed URLs cache for 24 hours unless you set another TTL. Bot-protection pages are never cached.

Add response_type=json to get a link instead of the file, which suits no-code tools and agents:

{"url": "https://shotlane.dev/r/Es-3aC3F1W.png", "expires_in": 86400, "format": "png", "bytes": 55003, "width": 1280, "height": 800, "target_status": 200, "credits_remaining": 1833}

Links are unguessable and expire after 24 hours. Multi-device renders and checks return links too, and take keep_days (up to 30) for longer ones.

Hosted links are deleted after 24 hours (or your keep_days), cached results when their cache time ends. Details in the privacy policy.