Snag Watcher API https://watcher-api-staging.manwhas.shop

Guides

Recipes

Each body goes to POST /v1/watchers. Add your own notify block; it's left out here.

Size back in stock

One size of a product on a Shopify store.

JSON
{
  "target": { "query": "https://www.allbirds.com/products/mens-wool-runners", "match": "url", "attributes": { "size": 10 } },
  "conditions": { "all": [{ "field": "availability", "op": "=", "value": "back_in_stock" }] },
  "where": { "sites": ["allbirds.com"] },
  "schedule": { "every": "1h", "until": "+30d" }
}

back_in_stock is true only on the run where it comes back. Use in_stock to hear as soon as it's available, even on the first run.

Price drop from today

10% under the price on the first check.

JSON
{
  "target": { "query": "https://www.sweetwater.com/store/detail/SM58--shure-sm58-cardioid-dynamic-vocal-microphone", "match": "url" },
  "conditions": { "all": [{ "field": "price_drop", "op": ">=", "value": "10%", "compare_to": "first_snapshot" }] },
  "where": { "sites": ["sweetwater.com"] },
  "schedule": { "every": "6h", "until": "+90d" }
}

Cheapest of several stores

The lowest price for one size, across stores.

JSON
{
  "target": { "query": "Brooks Ghost 17", "match": "exact", "attributes": { "size": 10 } },
  "conditions": { "all": [{ "field": "availability", "op": "=", "value": "in_stock" }, { "field": "price", "op": "<=", "value": 120 }] },
  "where": { "sites": ["brooksrunning.com", "runningwarehouse.com", "zappos.com"], "aggregate": "best" },
  "schedule": { "every": "1h", "until": "+30d" }
}

New product at a store

Anything new with "Q1" in its name.

JSON
{
  "target": { "query": "Q1", "match": "line", "exclude": ["Q1 Pro"] },
  "conditions": { "all": [{ "field": "availability", "op": "=", "value": "in_stock" }] },
  "where": { "sites": ["keychron.com"] },
  "schedule": { "every": "1h", "until": "+60d" },
  "notify": { "channels": ["webhook"], "repeat": "on_change", "webhook": { "url": "https://you.example/hook", "events": ["matched", "changed"] } }
}

changed fires when a new product appears in the results.

Next release of a repo

The first Node.js release at 25 or above.

JSON
{
  "target": { "query": "node", "match": "line" },
  "conditions": { "all": [{ "field": "version", "op": ">=", "value": 25 }, { "field": "release_status", "op": "=", "value": "available" }] },
  "where": { "sites": ["github.com/nodejs/node"] },
  "schedule": { "every": "1h", "until": "after_first_match" }
}

Prereleases come through as announced, so available skips them.

Two sizes at the same store

Size 10 and 10.5, both in stock from one seller.

JSON
{
  "target": { "query": "Brooks Ghost 17", "match": "exact", "attributes": { "size": [10, 10.5] } },
  "conditions": { "all": [{ "field": "availability", "op": "=", "value": "in_stock", "over": { "key": "sizes", "require": "all", "same": "seller" } }] },
  "where": { "sites": ["runningwarehouse.com", "zappos.com"] },
  "schedule": { "every": "1h", "until": "+14d" }
}

New product, then its price

When a store lists a new "Q6 HE", start watching that product for a price under $200. See Follow-up watchers.

JSON
{
  "target": { "query": "Q6 HE", "match": "line" },
  "conditions": { "all": [{ "field": "availability", "op": "=", "value": "in_stock" }] },
  "where": { "sites": ["keychron.com"], "aggregate": "first" },
  "schedule": { "every": "1h", "until": "+180d" },
  "then": {
    "conditions": { "all": [{ "field": "price", "op": "<", "value": 200 }] },
    "schedule": { "every": "6h", "until": "+90d" }
  }
}