Watch API

Paste a product URL. We watch the price. You get a POST when an alert fires. Same loop as the app.

Base https://pricesaurus.com/api/v1. IDs are UUIDs. JSON in, JSON out.

SDK and CLI

Official npm package: pricesaurus. Extract, watch, list alerts, pause, resume, and delete. Same Watch API as this page.

npx pricesaurus extract https://www.amazon.com/dp/B00CH9QWOU

Auth

Create a token on Plus or Max under Account → API. Send it as Authorization: Bearer. The app token is not a developer token.

Same product and alert caps as your plan. 60 requests a minute.

curl https://pricesaurus.com/api/v1/me \
  -H "Authorization: Bearer ps_live_xxxxxxxx"

Errors

{
  "error": {
    "code": "no_price",
    "message": "We could not read a price on that page.",
    "retryable": false,
    "driver": "scrapingbee"
  }
}
NameTypeNotes
401HTTPMissing or invalid bearer
403HTTPEco plan, or not your resource
404HTTPUnknown id
422HTTPno_price | unavailable | invalid body
429HTTPMore than 60/min
503HTTPblocked | quota | timeout (retryable)
GET/me

Account

Plan, product cap, and whether a webhook URL is set.

{
  "data": {
    "email": "dev@example.com",
    "plan": "plus",
    "products_used": 3,
    "products_limit": 15,
    "webhook_configured": true
  }
}
POST/extract

Read a page (does not save)

NameTypeNotes
url*stringhttps, max 2048
countrystringISO 3166-1 alpha-2, e.g. US, MX
currencystringISO 4217, e.g. USD, MXN
curl https://pricesaurus.com/api/v1/extract \
  -H "Authorization: Bearer ps_live_xxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://www.amazon.com/dp/B00CH9QWOU"}'
GET/products

List products

NameTypeNotes
pageintegerdefault 1
per_pageintegerdefault 20, max 100
POST/products

Watch a URL

NameTypeNotes
url*stringCounts toward the plan cap
namestringoptional, max 255
countrystringISO 3166-1 alpha-2
currencystringISO 4217

201. status: watching | pending | failing

curl https://pricesaurus.com/api/v1/products \
  -H "Authorization: Bearer ps_live_xxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://www.amazon.com/dp/B00CH9QWOU"}'
GET/products/{id}

Retrieve a product

id is a UUID.

PATCH/products/{id}

Rename or pause

NameTypeNotes
namestringmax 255
is_activebooleanfalse pauses and frees a slot without deleting history
DELETE/products/{id}

Delete

204

POST/products/{id}/checks

Check now

Returns product + snapshot.

GET/products/{id}/prices

Price history

NameTypeNotes
pageintegerdefault 1
per_pageintegerdefault 50, max 200
GET/products/{id}/alerts

List alerts

POST/products/{id}/alerts

Create an alert

NameTypeNotes
condition*drops | below | abovedrops = any decrease (repeatable). below/above = threshold, once
thresholdnumberRequired for below and above
namestringoptional
curl https://pricesaurus.com/api/v1/products/2c4e0a1b-9f3d-4e8a-a111-0b9c8d7e6f55/alerts \
  -H "Authorization: Bearer ps_live_xxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{"condition":"below","threshold":500}'
PATCH/alerts/{id}

Rename or disable

NameTypeNotes
namestringmax 255
is_activebooleanfalse stops firing
curl -X PATCH https://pricesaurus.com/api/v1/alerts/8a91b2c3-d4e5-4f60-a1b2-c3d4e5f60718 \
  -H "Authorization: Bearer ps_live_xxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{"is_active":false}'
DELETE/alerts/{id}

Delete an alert

204

Webhook

We POST { event, occurred_at, data } to your URL. Sign with HMAC-SHA256. Header X-Pricesaurus-Signature: sha256=…

POST https://example.com/hooks/pricesaurus
X-Pricesaurus-Event: price.alert
X-Pricesaurus-Signature: sha256=…
{
  "event": "price.alert",
  "occurred_at": "2026-09-11T12:00:00+00:00",
  "data": {
    "product": { "id": "2c4e0a1b-9f3d-4e8a-a111-0b9c8d7e6f55", "name": "Kettle", "url": "https://www.amazon.com/dp/B00CH9QWOU" },
    "price": 42.5,
    "alerts": [{ "id": "8a91b2c3-d4e5-4f60-a1b2-c3d4e5f60718", "name": "When the price drops" }]
  }
}

HMAC-SHA256 of the raw body. Events: price.alert, webhook.test.