Endpoints
Monitor
Watch a page on a schedule and get a webhook only when it really changed. Price drops, job boards, terms and docs.
POST
/v1/monitor
Request
Send a JSON body with a URL (or a list) and any options. The response holds data and what the call cost.
import requestsr = requests.post( 'https://api.snoopscan.com/v1/monitor', headers={'Authorization': 'Bearer sk_YOUR_KEY'}, json={ 'name': 'Pricing', 'urls': [ 'https://example.com/pricing' ], 'intervalMinutes': 60, 'webhook': 'https://hooks.example.com/snoop' },)print(r.json())
const r = await fetch('https://api.snoopscan.com/v1/monitor', { method: 'POST', headers: { Authorization: 'Bearer sk_YOUR_KEY', 'Content-Type': 'application/json' }, body: JSON.stringify({ "name": "Pricing", "urls": [ "https://example.com/pricing" ], "intervalMinutes": 60, "webhook": "https://hooks.example.com/snoop" }),});console.log(await r.json());
curl -X POST https://api.snoopscan.com/v1/monitor \ -H 'Authorization: Bearer sk_YOUR_KEY' \ -H 'Content-Type: application/json' \ -d '{ "name": "Pricing", "urls": [ "https://example.com/pricing" ], "intervalMinutes": 60, "webhook": "https://hooks.example.com/snoop"}'
Returns monitor id · webhook on change · billed per page checked.
Parameters
| Field | Type | Default | What it does |
|---|---|---|---|
name
required |
string | — | A name for the monitor, up to 120 characters. |
goal
|
string | — | What you are watching for, in your own words. Stored and returned with the monitor; it does not yet affect which changes are reported. |
intervalMinutes
|
integer | 60 | How often to check, in minutes: at least 5, at most a week (10,080). |
url
|
string | — | A page to watch. Give this, urls, or both. |
urls
|
array of string | — | Pages to watch in the one monitor, up to 50. |
webhook
|
string | — | A URL to POST to when a check finds a page changed, new or failing. |
Response
A success returns {"success": true, "data": {…}}. data holds the formats you asked for, the page's metadata, and a cost object with what the call was charged. A failure returns {"success": false, "error": {…}} with an error code. See Errors.
Failed requests are not charged.
Re-reading a page you already fetched, within
maxAge, is free. See Credits for every rate.