SnoopScan
Endpoints

Extract

A JSON schema and up to 100 URLs in, rows out — pricing tables, spec sheets, job listings. Reads the page's own structured markup first.

POST /v1/extract

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/extract',    headers={'Authorization': 'Bearer sk_YOUR_KEY'},    json={        'urls': [            'https://example.com/pricing'        ],        'schema': {            'type': 'object',            'properties': {                'plan': {                    'type': 'string'                },                'price': {                    'type': 'number'                }            }        },        'prompt': 'The cheapest paid plan'    },)print(r.json())
const r = await fetch('https://api.snoopscan.com/v1/extract', {  method: 'POST',  headers: { Authorization: 'Bearer sk_YOUR_KEY', 'Content-Type': 'application/json' },  body: JSON.stringify({      "urls": [          "https://example.com/pricing"      ],      "schema": {          "type": "object",          "properties": {              "plan": {                  "type": "string"              },              "price": {                  "type": "number"              }          }      },      "prompt": "The cheapest paid plan"  }),});console.log(await r.json());
curl -X POST https://api.snoopscan.com/v1/extract \  -H 'Authorization: Bearer sk_YOUR_KEY' \  -H 'Content-Type: application/json' \  -d '{    "urls": [        "https://example.com/pricing"    ],    "schema": {        "type": "object",        "properties": {            "plan": {                "type": "string"            },            "price": {                "type": "number"            }        }    },    "prompt": "The cheapest paid plan"}'
Returns json · in your schema · validated.

Parameters

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

FieldTypeDefaultWhat it does
schema required object
urls required array of string
model object
prompt string
scrapeOptions 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.