Bulk download
Need all screenshots for a monitor within a date range? You have two options: use the bulk export endpoint (returns a ZIP), or paginate through snapshots and download each file individually. Here's the export approach:
bash
# Export all September screenshots as ZIP (fastest method)
curl -X POST "https://api.snapshotarchive.com/v1/monitors/42/export" \
-H "Authorization: Bearer YOUR_API_KEY" \
-d "captured_after=2026-09-01&captured_before=2026-09-30&include=screenshot" \
-o september-screenshots.zip$response = Http::withToken('YOUR_API_KEY')
->post('https://api.snapshotarchive.com/v1/monitors/42/export', [
'captured_after' => '2026-09-01',
'captured_before' => '2026-09-30',
'include' => 'screenshot',
]);
file_put_contents('september-screenshots.zip', $response->body());import requests
resp = requests.post('https://api.snapshotarchive.com/v1/monitors/42/export',
headers={'Authorization': 'Bearer YOUR_API_KEY'},
data={'captured_after': '2026-09-01', 'captured_before': '2026-09-30',
'include': 'screenshot'})
with open('september-screenshots.zip', 'wb') as f:
f.write(resp.content)const resp = await fetch('https://api.snapshotarchive.com/v1/monitors/42/export', {
method: 'POST',
headers: { 'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/x-www-form-urlencoded' },
body: 'captured_after=2026-09-01&captured_before=2026-09-30&include=screenshot',
});
const blob = await resp.blob();
// save blob as september-screenshots.ziprequire 'net/http'
uri = URI('https://api.snapshotarchive.com/v1/monitors/42/export')
req = Net::HTTP::Post.new(uri, 'Authorization' => "Bearer #{API_KEY}")
req.set_form_data('captured_after' => '2026-09-01',
'captured_before' => '2026-09-30', 'include' => 'screenshot')
resp = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(req) }
File.write('september-screenshots.zip', resp.body)body := strings.NewReader("captured_after=2026-09-01&captured_before=2026-09-30&include=screenshot")
req, _ := http.NewRequest("POST", "https://api.snapshotarchive.com/v1/monitors/42/export", body)
req.Header.Set("Authorization", "Bearer "+apiKey)
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
out, _ := os.Create("september-screenshots.zip")
io.Copy(out, resp.Body)For more control (e.g., custom file naming), paginate through the snapshots list and download individually:
python
import os, requests
API_KEY = 'YOUR_API_KEY'
BASE = 'https://api.snapshotarchive.com/v1'
headers = {'Authorization': f'Bearer {API_KEY}', 'Accept': 'application/json'}
os.makedirs('./screenshots', exist_ok=True)
page = 1
while True:
resp = requests.get(f'{BASE}/monitors/42/snapshots', headers=headers,
params={'captured_after': '2026-09-01', 'captured_before': '2026-09-30',
'status': 'completed', 'per_page': 20, 'page': page}).json()
for snap in resp['data']:
url = snap['files']['screenshot_url']
if url:
img = requests.get(url)
date = snap['captured_at'][:10]
with open(f"./screenshots/{date}-{snap['id'][:8]}.png", 'wb') as f:
f.write(img.content)
if page >= resp['meta']['last_page']:
break
page += 1
Respect rate limits. Each download counts as an API request. For large archives, the ZIP export endpoint is more efficient.