SnoopScan
Endpoints

Batch

Thousands of URLs as one job, for a backfill or a nightly refresh, running at whatever concurrency your plan allows. Poll it or take a webhook.

POST /v1/batch/scrape

Request

Every tool takes the same shape: a URL or a list, a few options, and back comes data plus what the call cost.

import requestsr = requests.post(    'https://api.snoopscan.com/v1/batch/scrape',    headers={'Authorization': 'Bearer sk_YOUR_KEY'},    json={        'urls': [            'https://example.com/a',            'https://example.com/b'        ],        'maxConcurrency': 10,        'scrapeOptions': {            'formats': [                'markdown'            ]        }    },)print(r.json())
const r = await fetch('https://api.snoopscan.com/v1/batch/scrape', {  method: 'POST',  headers: { Authorization: 'Bearer sk_YOUR_KEY', 'Content-Type': 'application/json' },  body: JSON.stringify({      "urls": [          "https://example.com/a",          "https://example.com/b"      ],      "maxConcurrency": 10,      "scrapeOptions": {          "formats": [              "markdown"          ]      }  }),});console.log(await r.json());
curl -X POST https://api.snoopscan.com/v1/batch/scrape \  -H 'Authorization: Bearer sk_YOUR_KEY' \  -H 'Content-Type: application/json' \  -d '{    "urls": [        "https://example.com/a",        "https://example.com/b"    ],    "maxConcurrency": 10,    "scrapeOptions": {        "formats": [            "markdown"        ]    }}'
Returns job id · one job · from 1 credit a page.

Parameters

Read from the engine itself, so this table is the request it actually validates.

FieldTypeDefaultWhat it does
urls required array of string
maxConcurrency integer 10
scrapeOptions object
webhook object

Response

A success is always {"success": true, "data": {…}}. data carries what you asked for in formats, the page's metadata, and a cost object saying what the call was charged. A failure is {"success": false, "error": {…}} with a code you can branch on — see Errors.

Nothing is charged for a request that failed. A page you already fetched, re-read within maxAge, is free; one served from the shared index costs a single credit. The cost object says which it was.