List monitors
Monitors are the core of Snapshot Archive. Each monitor tracks a single URL and captures screenshots on a schedule you define. You can configure viewport dimensions, device type, capture timing, CSS selectors to hide or wait for, HTTP authentication, custom headers, cookies, and visual diff settings — all through the API.
The typical workflow is: create a monitor → let it capture on schedule (or trigger manually) → retrieve snapshots → optionally compare them using visual diffs.
List monitors
Returns all monitors on your account with flexible filtering options. You can narrow results by status, project, URL pattern, name, or tag. This is often the first call you make when connecting to the API — it gives you the monitor IDs you need for all other operations.
/v1/monitorsQuery parameters
| Parameter | Type | Description |
|---|---|---|
project_id | integer | Filter monitors by project |
status | string | Filter: active, paused, error, plan_exceeded |
url | string | Search by URL (partial match) |
name | string | Search by name (partial match) |
tag | string | Filter by tag name (exact match) |
sort | string | created_at (default), updated_at, url, name, status, last_snapshot_at, next_snapshot_at |
order | string | desc (default) or asc |
per_page | integer | Items per page (default: 20) |
# List all active monitors
curl "https://api.snapshotarchive.com/v1/monitors?status=active" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Accept: application/json"
# Search by URL
curl "https://api.snapshotarchive.com/v1/monitors?url=example.com" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Accept: application/json"$response = Http::withToken('YOUR_API_KEY')
->get('https://api.snapshotarchive.com/v1/monitors', ['status' => 'active']);
foreach ($response->json('data') as $monitor) {
echo "{$monitor['id']}: {$monitor['url']} — {$monitor['status']}\n";
}resp = requests.get(f'{BASE}/monitors', headers=headers, params={'status': 'active'})
for m in resp.json()['data']:
print(f"{m['id']}: {m['url']} — {m['status']}")const { data: monitors } = await fetch(`${BASE}/monitors?status=active`, { headers })
.then(r => r.json());
monitors.forEach(m => console.log(`${m.id}: ${m.url} — ${m.status}`));uri = URI("#{BASE}/monitors?status=active")
req = Net::HTTP::Get.new(uri, headers)
resp = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |h| h.request(req) }
monitors = JSON.parse(resp.body)['data']
monitors.each { |m| puts "#{m['id']}: #{m['url']} — #{m['status']}" }req, _ := http.NewRequest("GET", BASE+"/monitors?status=active", nil)
req.Header.Set("Authorization", "Bearer "+apiKey)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
var result struct { Data []map[string]interface{} `json:"data"` }
json.NewDecoder(resp.Body).Decode(&result)Response
Each monitor in the response includes its configuration, status, schedule timestamps, and nested project object.
{
"data": [
{
"id": 42,
"url": "https://example.com",
"name": "Example Homepage",
"status": "active",
"frequency_minutes": 360,
"viewport_width": 1920,
"viewport_height": 1080,
"device_type": "desktop",
"full_page": true,
"diff_enabled": true,
"diff_threshold_percent": "5.00",
"alert_enabled": true,
"alert_email": "[email protected]",
"last_snapshot_at": "2026-10-01T11:00:00Z",
"next_snapshot_at": "2026-10-01T17:00:00Z",
"project": { "id": 1, "name": "My Website" },
"created_at": "2026-09-15T10:00:00Z"
}
],
"meta": { "current_page": 1, "per_page": 20, "total": 1, "last_page": 1 }
}