Save Screenshots to S3 Automatically
Wire the S3 or AWS S3 app to your account, craft path templates, pass apps= on each API call, and combine batches with automatic object storage delivery.
Why push to S3?
Object storage is the durable sink for compliance archives, ML datasets, and customer deliverables. Instead of downloading every PNG from ScreenshotCenter yourself, configure an S3-compatible app so each finished screenshot lands in your bucket with a predictable key.
Read the integration pages for generic S3, AWS S3, and the S3 help doc. For historical context, see Save automated screenshots to S3.
Credentials and bucket policy
Create an IAM user or role with s3:PutObject (and optional s3:PutObjectAcl if you set canned ACLs). Scope the policy to one prefix. Store access keys in the ScreenshotCenter app configuration — rotate them on the same schedule as your other CI secrets.
Path templates
Templates support tokens such as {domain}, {yyyy}, {mm}, {dd}, and {id}. Example: archives/{domain}/{yyyy}/{mm}/{dd}/{id}.png keeps millions of objects sharded by day.
Per-request API call
After the app is verified, pass its app_id via the apps parameter. You can also override the template for a single job:
curl -sS "https://api.screenshotcenter.com/api/v1/screenshot/create?key=${SCREENSHOTCENTER_API_KEY}&url=https://example.com&apps%5Bprod-screenshots%5D=catalog%2F{domain}%2F{id}.png"
URL-encoded brackets (apps%5Bprod-screenshots%5D) keep shells from mangling the query string.
Batches + S3
Upload a CSV through /batch/create with the same apps mapping per row (or rely on the default template). When the batch completes, every successful row triggers the configured storage apps — ideal for nightly sitemap captures.
Verification checklist
| Check | Reason |
|---|---|
| Bucket blocks public ACLs | Prevent accidental world-readable compliance data. |
| Lifecycle rules | Move cold screenshots to Glacier after N days. |
| App test button | Validates credentials before production traffic. |
Fallback download
Keep using /screenshot/thumbnail as a safety net until you confirm the app status reads finished inside the API response — the apps array on /screenshot/info exposes per-integration states.