SnoopScan
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

FieldTypeDefaultWhat 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.