List checks
curl --request GET \
--url https://api.prefetch.io/monitor/{id}/checks \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.prefetch.io/monitor/{id}/checks"
headers = {"X-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<api-key>'}};
fetch('https://api.prefetch.io/monitor/{id}/checks', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.prefetch.io/monitor/{id}/checks",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.prefetch.io/monitor/{id}/checks"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.prefetch.io/monitor/{id}/checks")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.prefetch.io/monitor/{id}/checks")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"checks": [
{
"id": "chk_8e2d4f6a1b3c4d5e6f7a8b9c0d1e2f3a",
"monitor_id": "mon_3f9a1c2b7d4e4f6a8b0c1d2e3f4a5b6c",
"status": "completed",
"trigger": "scheduled",
"scheduled_for": "2026-10-12T06:00:00.000Z",
"started_at": "2026-10-12T06:00:04.112Z",
"finished_at": "2026-10-12T06:01:27.930Z",
"estimated_credits": 55,
"actual_credits": 24,
"summary": {
"total_pages": 19,
"same": 16,
"new": 1,
"changed": 1,
"removed": 1,
"error": 0
},
"target_results": [
{
"target_id": "tgt_8d1e0f2a3b4c5d6e",
"type": "scrape",
"pages": 1,
"checked": 1,
"baseline": false
},
{
"target_id": "tgt_1a2b3c4d5e6f7a8b",
"type": "crawl",
"discovered": 17,
"limit": 25,
"complete": true,
"baseline": false
}
],
"error": null,
"created_at": "2026-10-12T06:00:00.513Z",
"updated_at": "2026-10-12T06:01:27.930Z"
}
],
"total": 1,
"next": null
},
"meta": {
"requestId": "b4f7d8e9-0a1b-4c23-a4d5-6f708192a3b4",
"durationMs": 44
}
}{
"error": "Credit limit exceeded",
"error_code": "CREDITS_EXHAUSTED",
"retryable": false,
"success": false,
"retryAfterSeconds": 123,
"limit": 123,
"meta": {
"requestId": "a3f2c1d4-7b6e-4f2a-9c1d-8e3f2a1b4c5d",
"durationMs": 1842
}
}{
"error": "Credit limit exceeded",
"error_code": "CREDITS_EXHAUSTED",
"retryable": false,
"success": false,
"retryAfterSeconds": 123,
"limit": 123,
"meta": {
"requestId": "a3f2c1d4-7b6e-4f2a-9c1d-8e3f2a1b4c5d",
"durationMs": 1842
}
}{
"error": "Credit limit exceeded",
"error_code": "CREDITS_EXHAUSTED",
"retryable": false,
"success": false,
"retryAfterSeconds": 123,
"limit": 123,
"meta": {
"requestId": "a3f2c1d4-7b6e-4f2a-9c1d-8e3f2a1b4c5d",
"durationMs": 1842
}
}{
"error": "Credit limit exceeded",
"error_code": "CREDITS_EXHAUSTED",
"retryable": false,
"success": false,
"retryAfterSeconds": 123,
"limit": 123,
"meta": {
"requestId": "a3f2c1d4-7b6e-4f2a-9c1d-8e3f2a1b4c5d",
"durationMs": 1842
}
}{
"error": "Credit limit exceeded",
"error_code": "CREDITS_EXHAUSTED",
"retryable": false,
"success": false,
"retryAfterSeconds": 123,
"limit": 123,
"meta": {
"requestId": "a3f2c1d4-7b6e-4f2a-9c1d-8e3f2a1b4c5d",
"durationMs": 1842
}
}{
"error": "Credit limit exceeded",
"error_code": "CREDITS_EXHAUSTED",
"retryable": false,
"success": false,
"retryAfterSeconds": 123,
"limit": 123,
"meta": {
"requestId": "a3f2c1d4-7b6e-4f2a-9c1d-8e3f2a1b4c5d",
"durationMs": 1842
}
}Monitoring
GET /monitor/{id}/checks
A monitor’s check history, newest first. Free.
GET
/
monitor
/
{id}
/
checks
List checks
curl --request GET \
--url https://api.prefetch.io/monitor/{id}/checks \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.prefetch.io/monitor/{id}/checks"
headers = {"X-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<api-key>'}};
fetch('https://api.prefetch.io/monitor/{id}/checks', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.prefetch.io/monitor/{id}/checks",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.prefetch.io/monitor/{id}/checks"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.prefetch.io/monitor/{id}/checks")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.prefetch.io/monitor/{id}/checks")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"checks": [
{
"id": "chk_8e2d4f6a1b3c4d5e6f7a8b9c0d1e2f3a",
"monitor_id": "mon_3f9a1c2b7d4e4f6a8b0c1d2e3f4a5b6c",
"status": "completed",
"trigger": "scheduled",
"scheduled_for": "2026-10-12T06:00:00.000Z",
"started_at": "2026-10-12T06:00:04.112Z",
"finished_at": "2026-10-12T06:01:27.930Z",
"estimated_credits": 55,
"actual_credits": 24,
"summary": {
"total_pages": 19,
"same": 16,
"new": 1,
"changed": 1,
"removed": 1,
"error": 0
},
"target_results": [
{
"target_id": "tgt_8d1e0f2a3b4c5d6e",
"type": "scrape",
"pages": 1,
"checked": 1,
"baseline": false
},
{
"target_id": "tgt_1a2b3c4d5e6f7a8b",
"type": "crawl",
"discovered": 17,
"limit": 25,
"complete": true,
"baseline": false
}
],
"error": null,
"created_at": "2026-10-12T06:00:00.513Z",
"updated_at": "2026-10-12T06:01:27.930Z"
}
],
"total": 1,
"next": null
},
"meta": {
"requestId": "b4f7d8e9-0a1b-4c23-a4d5-6f708192a3b4",
"durationMs": 44
}
}{
"error": "Credit limit exceeded",
"error_code": "CREDITS_EXHAUSTED",
"retryable": false,
"success": false,
"retryAfterSeconds": 123,
"limit": 123,
"meta": {
"requestId": "a3f2c1d4-7b6e-4f2a-9c1d-8e3f2a1b4c5d",
"durationMs": 1842
}
}{
"error": "Credit limit exceeded",
"error_code": "CREDITS_EXHAUSTED",
"retryable": false,
"success": false,
"retryAfterSeconds": 123,
"limit": 123,
"meta": {
"requestId": "a3f2c1d4-7b6e-4f2a-9c1d-8e3f2a1b4c5d",
"durationMs": 1842
}
}{
"error": "Credit limit exceeded",
"error_code": "CREDITS_EXHAUSTED",
"retryable": false,
"success": false,
"retryAfterSeconds": 123,
"limit": 123,
"meta": {
"requestId": "a3f2c1d4-7b6e-4f2a-9c1d-8e3f2a1b4c5d",
"durationMs": 1842
}
}{
"error": "Credit limit exceeded",
"error_code": "CREDITS_EXHAUSTED",
"retryable": false,
"success": false,
"retryAfterSeconds": 123,
"limit": 123,
"meta": {
"requestId": "a3f2c1d4-7b6e-4f2a-9c1d-8e3f2a1b4c5d",
"durationMs": 1842
}
}{
"error": "Credit limit exceeded",
"error_code": "CREDITS_EXHAUSTED",
"retryable": false,
"success": false,
"retryAfterSeconds": 123,
"limit": 123,
"meta": {
"requestId": "a3f2c1d4-7b6e-4f2a-9c1d-8e3f2a1b4c5d",
"durationMs": 1842
}
}{
"error": "Credit limit exceeded",
"error_code": "CREDITS_EXHAUSTED",
"retryable": false,
"success": false,
"retryAfterSeconds": 123,
"limit": 123,
"meta": {
"requestId": "a3f2c1d4-7b6e-4f2a-9c1d-8e3f2a1b4c5d",
"durationMs": 1842
}
}Overview
Lists the monitor’s checks, newest first, with each one’s status, page counts and credits. Passstatus to filter — status=skipped_no_credits, say, to see when a key ran dry. Open any check with GET /monitor/{id}/checks/{checkId} to see its pages.
Checks are kept for the monitor’s retention_days (30 by default) and deleted after that.
Example request
curl "https://api.prefetch.io/monitor/mon_3f9a1c2b7d4e4f6a8b0c1d2e3f4a5b6c/checks?limit=10" \
-H "X-API-Key: $PREFETCH_API_KEY"
const res = await fetch(`https://api.prefetch.io/monitor/${monitorId}/checks?limit=10`, {
headers: { "X-API-Key": process.env.PREFETCH_API_KEY },
});
const { data } = await res.json();
for (const c of data.checks) console.log(c.finished_at, c.status, c.summary.changed);
import os, requests
data = requests.get(
f"https://api.prefetch.io/monitor/{monitor_id}/checks",
params={"limit": 10},
headers={"X-API-Key": os.environ["PREFETCH_API_KEY"]},
).json()["data"]
for c in data["checks"]:
print(c["finished_at"], c["status"], c["summary"]["changed"])
Example response
{
"success": true,
"data": {
"checks": [
{
"id": "chk_8e2d4f6a1b3c4d5e6f7a8b9c0d1e2f3a",
"monitor_id": "mon_3f9a1c2b7d4e4f6a8b0c1d2e3f4a5b6c",
"status": "completed",
"trigger": "scheduled",
"scheduled_for": "2026-10-12T06:00:00.000Z",
"started_at": "2026-10-12T06:00:04.112Z",
"finished_at": "2026-10-12T06:01:27.930Z",
"estimated_credits": 55,
"actual_credits": 24,
"summary": { "total_pages": 19, "same": 16, "new": 1, "changed": 1, "removed": 1, "error": 0 },
"target_results": [
{ "target_id": "tgt_8d1e0f2a3b4c5d6e", "type": "scrape", "pages": 1, "checked": 1, "baseline": false },
{ "target_id": "tgt_1a2b3c4d5e6f7a8b", "type": "crawl", "discovered": 17, "limit": 25, "complete": true, "baseline": false }
],
"error": null,
"created_at": "2026-10-12T06:00:00.513Z",
"updated_at": "2026-10-12T06:01:27.930Z"
}
],
"total": 1,
"next": null
},
"meta": {
"requestId": "b4f7d8e9-0a1b-4c23-a4d5-6f708192a3b4",
"durationMs": 44
}
}
Streaks
Monitors keep no failure counter. To find out how long something has been going on, count the leading run of a status: the list is newest first, so the checks at the top that share a status are the current streak, and the first check with a different status ends it.actual_credits is what each check was charged — 24 here: 18 pages fetched at 1 credit, plus the 3-credit surcharge on the one page tracking json, plus 3 pages judged at 1. Skipped checks are never charged.
Related
GET /monitor/{id}/checks/{checkId}
What one check found, page by page.
POST /monitor/{id}/run
Run a check now.
Authorizations
Your Prefetch API key. Obtain one from the dashboard.
Path Parameters
The monitor id returned by POST /monitor.
Example:
"mon_3f9a1c2b7d4e4f6a8b0c1d2e3f4a5b6c"
Query Parameters
Items to return per request.
Required range:
1 <= x <= 100Items to skip. Use the next link rather than building this by hand.
Required range:
x >= 0Only checks with this status.
Available options:
queued, running, completed, failed, partial, skipped_overlap, skipped_no_credits