Watchlists

GEThttps://scrapely.15.204.158.166.sslip.io/api/v1/watchlists
List watchlists
Parameters
limitintegerquery
= 100
Code samples
cURL
curl -X GET "https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists?limit="
TypeScript
const res = await fetch('https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists?limit=', {
  method: 'GET',
});
const data = await res.json();
Python
import requests

res = requests.request(
    "GET",
    "https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists?limit=",
)
data = res.json()
Go
package main

import (
	"fmt"
	"io"
	"net/http"
)

func main() {
	req, _ := http.NewRequest("GET", "https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists?limit=", nil)
	res, _ := http.DefaultClient.Do(req)
	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)
	fmt.Println(string(body))
}
PHP
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists?limit=');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
Ruby
require 'net/http'
require 'uri'

uri = URI('https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists?limit=')
req = Net::HTTP::Get.new(uri)
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == 'https') do |http|
  http.request(req)
end
puts res.body
Java
import java.net.URI;
import java.net.http.*;
import java.net.http.HttpRequest.BodyPublishers;

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists?limit="))
    .GET()
    .build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
Responses
200 Newest first.
Example
{
  "object": {},
  "data": [
    {
      "id": "wl_3f1c2a9e8d4b4c61",
      "object": {},
      "name": "string",
      "platform": "amazon",
      "marketplace": "us",
      "currency": "USD",
      "status": "active",
      "paused_reason": "user",
      "every": "15m",
      "every_seconds": 0,
      "refresh_every_runs": 0,
      "webhook_url": "string",
      "item_count": 0,
      "items_by_state": {
        "new": 0,
        "active": 0,
        "delisted": 0
      },
      "asin_count": 0,
      "asins_by_state": {
        "new": 0,
        "active": 0,
        "delisted": 0
      },
      "estimated_credits": {
        "pulseRun": 0,
        "refreshRun": 0,
        "newAsins": 0
      },
      "run_count": 0,
      "consecutive_skips": 0,
      "last_run_at": "2024-01-01T00:00:00Z",
      "last_run_status": "running",
      "next_run_at": "2024-01-01T00:00:00Z",
      "created_at": "2024-01-01T00:00:00Z",
      "updated_at": "2024-01-01T00:00:00Z",
      "url": "string"
    }
  ],
  "has_more": true
}
Schema
object
dataWatchlist[]
Show child parameters
idstring
object
namestring
platformstring
Whose item ids the list holds (id on each item).
marketplacestring
Every run fetches the list here.
currencystring
The currency of every price in its snapshots, changes and webhooks.
statusstring
active | paused
paused_reasonstring
everystring
every_secondsinteger
refresh_every_runsinteger
webhook_urlstring
item_countinteger
Items on the list, every state.
items_by_stateobject
Show child parameters
newinteger
activeinteger
delistedinteger
asin_countintegerdeprecated
Deprecated alias, same value as item_count (every platform).
asins_by_stateobjectdeprecated
Deprecated alias, same value as items_by_state (every platform).
Show child parameters
newinteger
activeinteger
delistedinteger
estimated_creditsobject
Up-front cost of the next runs: a sweep run with nothing changed (Amazon: pulse), a refresh run, and the one-off baseline fetch of new items (newAsins, on every platform). On Amazon, escalations add standard credits per moved ASIN.
Show child parameters
pulseRuninteger
refreshRuninteger
newAsinsinteger
run_countinteger
consecutive_skipsinteger
Runs skipped in a row for credits; the third pauses the list.
last_run_atstring
last_run_statusstring
next_run_atstring
null while paused.
created_atstring
updated_atstring
urlstring
has_moreboolean
401 UNAUTHORIZED: missing, unknown or revoked key.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
429 RATE_LIMITED or CONCURRENCY_LIMIT. Honour Retry-After.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
500 INTERNAL: our fault, not charged. Quote X-Request-Id.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
POSThttps://scrapely.15.204.158.166.sslip.io/api/v1/watchlists
Create a watchlist

Track up to 50,000 items of one platform and marketplace on a cadence (at most 100 lists per account). Creating is free. Send the item ids in ids (every platform); asins is still accepted on Amazon as a legacy alias. The first run starts at once and fetches every item at the baseline tier (Amazon: full; no change events). On Amazon each later run sweeps at pulse, escalates to standard the ASINs whose offer count or lowest new price moved (plus those whose buy box sat above the lowest offer, and any owed retry), and every refresh_every_runs-th run sweeps everything at standard; one-tier retailers fetch and diff every item each run. Runs are billed exactly like the /v1/products calls they make; a run the balance cannot cover is skipped (insufficient_credits), and the third skip in a row pauses the list.

Parameters
Idempotency-Keystringheader
Retrying with the same key returns the original response (Idempotent-Replayed: true) instead of creating a second list. Remembered 24 hours.
Request body application/json
namestringrequired
idsstring[]required
1 to 50,000 item ids of platform (ASINs, item ids, TCINs, SKUs…; de-duplicated). A newline- or comma-separated string is also accepted.
asinsstring[]deprecated
Amazon only, legacy: the same as ids (ASINs are case-insensitive). Send ids or asins, not both.
everystringrequired
Cadence, start to start: whole minutes, hours or days, at least 5 minutes, at most 7 days. E.g. 5m, 15m, 1h, 6h, 24h.
webhook_urlstring
HTTPS URL for this list's events (public host, port 443 or ≥ 1024). Omitted: your account webhook.
refresh_every_runsinteger
Amazon: every Nth run sweeps every ASIN at standard instead of pulse (sees buy-box seller changes at the same price; refreshes offer listing ids). 0 = never. One-tier platforms fetch every item at their one tier each run, so it changes nothing there.
= 8
platformstring
Which platform to read. Platforms: amazon (live: us; coming soon: uk, de, fr, it, es, ca, mx, jp, au, in, br, nl, se, pl), walmart (live: us), ebay (coming soon), target (live: us), bestbuy (live: us; coming soon: ca), aliexpress (coming soon). A coming-soon platform or marketplace answers 501 NOT_IMPLEMENTED with "coming_soon": true (nothing charged); an unknown one is a 400 listing the valid values. GET /v1/platforms has the full list.
= amazon
marketplacestring
The platform's regional storefront (us, uk, de…); default the platform's main one. Prices come back in its currency.
= us
{
  "name": "string",
  "ids": [
    "string"
  ],
  "asins": [
    "string"
  ],
  "every": "15m",
  "webhook_url": "string",
  "refresh_every_runs": 8,
  "platform": "amazon",
  "marketplace": "us"
}
Code samples
cURL
curl -X POST "https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists" \
  -H "Idempotency-Key: <value>" \
  -H "Content-Type: application/json" \
  -d '{"name":"string","ids":["string"],"asins":["string"],"every":"15m","webhook_url":"string","refresh_every_runs":8,"platform":"amazon","marketplace":"us"}'
TypeScript
const res = await fetch('https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists', {
  method: 'POST',
  headers: {
    'Idempotency-Key': '<value>',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({"name":"string","ids":["string"],"asins":["string"],"every":"15m","webhook_url":"string","refresh_every_runs":8,"platform":"amazon","marketplace":"us"}),
});
const data = await res.json();
Python
import requests

res = requests.request(
    "POST",
    "https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists",
    headers={
    "Idempotency-Key": "<value>",
    "Content-Type": "application/json",
    },
    json={"name": "string", "ids": ["string"], "asins": ["string"], "every": "15m", "webhook_url": "string", "refresh_every_runs": 8, "platform": "amazon", "marketplace": "us"},
)
data = res.json()
Go
package main

import (
	"fmt"
	"io"
	"net/http"
	"strings"
)

func main() {
	req, _ := http.NewRequest("POST", "https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists", strings.NewReader(`{"name":"string","ids":["string"],"asins":["string"],"every":"15m","webhook_url":"string","refresh_every_runs":8,"platform":"amazon","marketplace":"us"}`))
	req.Header.Set("Idempotency-Key", "<value>")
	req.Header.Set("Content-Type", "application/json")
	res, _ := http.DefaultClient.Do(req)
	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)
	fmt.Println(string(body))
}
PHP
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Idempotency-Key: <value>', 'Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{"name":"string","ids":["string"],"asins":["string"],"every":"15m","webhook_url":"string","refresh_every_runs":8,"platform":"amazon","marketplace":"us"}');
$response = curl_exec($ch);
curl_close($ch);
echo $response;
Ruby
require 'net/http'
require 'uri'

uri = URI('https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists')
req = Net::HTTP::Post.new(uri)
req['Idempotency-Key'] = '<value>'
req['Content-Type'] = 'application/json'
req.body = '{"name":"string","ids":["string"],"asins":["string"],"every":"15m","webhook_url":"string","refresh_every_runs":8,"platform":"amazon","marketplace":"us"}'
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == 'https') do |http|
  http.request(req)
end
puts res.body
Java
import java.net.URI;
import java.net.http.*;
import java.net.http.HttpRequest.BodyPublishers;

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists"))
    .header("Idempotency-Key", "<value>")
    .header("Content-Type", "application/json")
    .method("POST", BodyPublishers.ofString("{\"name\":\"string\",\"ids\":[\"string\"],\"asins\":[\"string\"],\"every\":\"15m\",\"webhook_url\":\"string\",\"refresh_every_runs\":8,\"platform\":\"amazon\",\"marketplace\":\"us\"}"))
    .build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
Responses
201 Created; the first run is due now.
Example
{
  "id": "wl_3f1c2a9e8d4b4c61",
  "object": {},
  "name": "string",
  "platform": "amazon",
  "marketplace": "us",
  "currency": "USD",
  "status": "active",
  "paused_reason": "user",
  "every": "15m",
  "every_seconds": 0,
  "refresh_every_runs": 0,
  "webhook_url": "string",
  "item_count": 0,
  "items_by_state": {
    "new": 0,
    "active": 0,
    "delisted": 0
  },
  "asin_count": 0,
  "asins_by_state": {
    "new": 0,
    "active": 0,
    "delisted": 0
  },
  "estimated_credits": {
    "pulseRun": 0,
    "refreshRun": 0,
    "newAsins": 0
  },
  "run_count": 0,
  "consecutive_skips": 0,
  "last_run_at": "2024-01-01T00:00:00Z",
  "last_run_status": "running",
  "next_run_at": "2024-01-01T00:00:00Z",
  "created_at": "2024-01-01T00:00:00Z",
  "updated_at": "2024-01-01T00:00:00Z",
  "url": "string"
}
Schema
idstring
object
namestring
platformstring
Whose item ids the list holds (id on each item).
marketplacestring
Every run fetches the list here.
currencystring
The currency of every price in its snapshots, changes and webhooks.
statusstring
active | paused
paused_reasonstring
everystring
every_secondsinteger
refresh_every_runsinteger
webhook_urlstring
item_countinteger
Items on the list, every state.
items_by_stateobject
Show child parameters
newinteger
activeinteger
delistedinteger
asin_countintegerdeprecated
Deprecated alias, same value as item_count (every platform).
asins_by_stateobjectdeprecated
Deprecated alias, same value as items_by_state (every platform).
Show child parameters
newinteger
activeinteger
delistedinteger
estimated_creditsobject
Up-front cost of the next runs: a sweep run with nothing changed (Amazon: pulse), a refresh run, and the one-off baseline fetch of new items (newAsins, on every platform). On Amazon, escalations add standard credits per moved ASIN.
Show child parameters
pulseRuninteger
refreshRuninteger
newAsinsinteger
run_countinteger
consecutive_skipsinteger
Runs skipped in a row for credits; the third pauses the list.
last_run_atstring
last_run_statusstring
next_run_atstring
null while paused.
created_atstring
updated_atstring
urlstring
400 MISSING_PARAM or INVALID_PARAM; param names the culprit.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
401 UNAUTHORIZED: missing, unknown or revoked key.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
403 DEMO_READ_ONLY.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
409 CONFLICT: idempotent request in flight, or the job is already running/done.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
422 INVALID_PARAM with param: idempotency_key: the key was used for a different request.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
429 RATE_LIMITED or CONCURRENCY_LIMIT. Honour Retry-After.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
500 INTERNAL: our fault, not charged. Quote X-Request-Id.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
GEThttps://scrapely.15.204.158.166.sslip.io/api/v1/watchlists/{id}
Get a watchlist
Parameters
idstringpathrequired
The watchlist id (wl_…).
Code samples
cURL
curl -X GET "https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists/{id}"
TypeScript
const res = await fetch('https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists/{id}', {
  method: 'GET',
});
const data = await res.json();
Python
import requests

res = requests.request(
    "GET",
    "https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists/{id}",
)
data = res.json()
Go
package main

import (
	"fmt"
	"io"
	"net/http"
)

func main() {
	req, _ := http.NewRequest("GET", "https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists/{id}", nil)
	res, _ := http.DefaultClient.Do(req)
	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)
	fmt.Println(string(body))
}
PHP
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
Ruby
require 'net/http'
require 'uri'

uri = URI('https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists/{id}')
req = Net::HTTP::Get.new(uri)
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == 'https') do |http|
  http.request(req)
end
puts res.body
Java
import java.net.URI;
import java.net.http.*;
import java.net.http.HttpRequest.BodyPublishers;

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists/{id}"))
    .GET()
    .build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
Responses
200 The watchlist, with item counts per state and credit estimates.
Example
{
  "id": "wl_3f1c2a9e8d4b4c61",
  "object": {},
  "name": "string",
  "platform": "amazon",
  "marketplace": "us",
  "currency": "USD",
  "status": "active",
  "paused_reason": "user",
  "every": "15m",
  "every_seconds": 0,
  "refresh_every_runs": 0,
  "webhook_url": "string",
  "item_count": 0,
  "items_by_state": {
    "new": 0,
    "active": 0,
    "delisted": 0
  },
  "asin_count": 0,
  "asins_by_state": {
    "new": 0,
    "active": 0,
    "delisted": 0
  },
  "estimated_credits": {
    "pulseRun": 0,
    "refreshRun": 0,
    "newAsins": 0
  },
  "run_count": 0,
  "consecutive_skips": 0,
  "last_run_at": "2024-01-01T00:00:00Z",
  "last_run_status": "running",
  "next_run_at": "2024-01-01T00:00:00Z",
  "created_at": "2024-01-01T00:00:00Z",
  "updated_at": "2024-01-01T00:00:00Z",
  "url": "string"
}
Schema
idstring
object
namestring
platformstring
Whose item ids the list holds (id on each item).
marketplacestring
Every run fetches the list here.
currencystring
The currency of every price in its snapshots, changes and webhooks.
statusstring
active | paused
paused_reasonstring
everystring
every_secondsinteger
refresh_every_runsinteger
webhook_urlstring
item_countinteger
Items on the list, every state.
items_by_stateobject
Show child parameters
newinteger
activeinteger
delistedinteger
asin_countintegerdeprecated
Deprecated alias, same value as item_count (every platform).
asins_by_stateobjectdeprecated
Deprecated alias, same value as items_by_state (every platform).
Show child parameters
newinteger
activeinteger
delistedinteger
estimated_creditsobject
Up-front cost of the next runs: a sweep run with nothing changed (Amazon: pulse), a refresh run, and the one-off baseline fetch of new items (newAsins, on every platform). On Amazon, escalations add standard credits per moved ASIN.
Show child parameters
pulseRuninteger
refreshRuninteger
newAsinsinteger
run_countinteger
consecutive_skipsinteger
Runs skipped in a row for credits; the third pauses the list.
last_run_atstring
last_run_statusstring
next_run_atstring
null while paused.
created_atstring
updated_atstring
urlstring
401 UNAUTHORIZED: missing, unknown or revoked key.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
404 NOT_FOUND.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
429 RATE_LIMITED or CONCURRENCY_LIMIT. Honour Retry-After.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
500 INTERNAL: our fault, not charged. Quote X-Request-Id.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
DELETEhttps://scrapely.15.204.158.166.sslip.io/api/v1/watchlists/{id}
Delete a watchlist

Deletes the list, its items and its run history. A run already in progress finishes but sends no webhooks.

Parameters
idstringpathrequired
The watchlist id (wl_…).
Code samples
cURL
curl -X DELETE "https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists/{id}"
TypeScript
const res = await fetch('https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists/{id}', {
  method: 'DELETE',
});
const data = await res.json();
Python
import requests

res = requests.request(
    "DELETE",
    "https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists/{id}",
)
data = res.json()
Go
package main

import (
	"fmt"
	"io"
	"net/http"
)

func main() {
	req, _ := http.NewRequest("DELETE", "https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists/{id}", nil)
	res, _ := http.DefaultClient.Do(req)
	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)
	fmt.Println(string(body))
}
PHP
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
Ruby
require 'net/http'
require 'uri'

uri = URI('https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists/{id}')
req = Net::HTTP::Delete.new(uri)
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == 'https') do |http|
  http.request(req)
end
puts res.body
Java
import java.net.URI;
import java.net.http.*;
import java.net.http.HttpRequest.BodyPublishers;

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists/{id}"))
    .method("DELETE", BodyPublishers.noBody())
    .build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
Responses
200 Deleted.
Example
{
  "id": "string",
  "object": {},
  "deleted": {}
}
Schema
idstring
object
deleted
401 UNAUTHORIZED: missing, unknown or revoked key.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
404 NOT_FOUND.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
429 RATE_LIMITED or CONCURRENCY_LIMIT. Honour Retry-After.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
500 INTERNAL: our fault, not charged. Quote X-Request-Id.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
PATCHhttps://scrapely.15.204.158.166.sslip.io/api/v1/watchlists/{id}
Update a watchlist

Rename, change the cadence (counted from the last run), the webhook or the refresh interval; pause or resume.

Parameters
idstringpathrequired
The watchlist id (wl_…).
Request body application/json
namestring
everystring
webhook_urlstring
null clears it (events go to the account webhook).
refresh_every_runsinteger
statusstring
Resuming clears an auto-pause and its skip count.
active | paused
{
  "name": "string",
  "every": "1h",
  "webhook_url": "string",
  "refresh_every_runs": 0,
  "status": "active"
}
Code samples
cURL
curl -X PATCH "https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists/{id}" \
  -H "Content-Type: application/json" \
  -d '{"name":"string","every":"1h","webhook_url":"string","refresh_every_runs":0,"status":"active"}'
TypeScript
const res = await fetch('https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists/{id}', {
  method: 'PATCH',
  headers: {
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({"name":"string","every":"1h","webhook_url":"string","refresh_every_runs":0,"status":"active"}),
});
const data = await res.json();
Python
import requests

res = requests.request(
    "PATCH",
    "https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists/{id}",
    headers={
    "Content-Type": "application/json",
    },
    json={"name": "string", "every": "1h", "webhook_url": "string", "refresh_every_runs": 0, "status": "active"},
)
data = res.json()
Go
package main

import (
	"fmt"
	"io"
	"net/http"
	"strings"
)

func main() {
	req, _ := http.NewRequest("PATCH", "https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists/{id}", strings.NewReader(`{"name":"string","every":"1h","webhook_url":"string","refresh_every_runs":0,"status":"active"}`))
	req.Header.Set("Content-Type", "application/json")
	res, _ := http.DefaultClient.Do(req)
	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)
	fmt.Println(string(body))
}
PHP
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PATCH');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{"name":"string","every":"1h","webhook_url":"string","refresh_every_runs":0,"status":"active"}');
$response = curl_exec($ch);
curl_close($ch);
echo $response;
Ruby
require 'net/http'
require 'uri'

uri = URI('https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists/{id}')
req = Net::HTTP::Patch.new(uri)
req['Content-Type'] = 'application/json'
req.body = '{"name":"string","every":"1h","webhook_url":"string","refresh_every_runs":0,"status":"active"}'
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == 'https') do |http|
  http.request(req)
end
puts res.body
Java
import java.net.URI;
import java.net.http.*;
import java.net.http.HttpRequest.BodyPublishers;

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists/{id}"))
    .header("Content-Type", "application/json")
    .method("PATCH", BodyPublishers.ofString("{\"name\":\"string\",\"every\":\"1h\",\"webhook_url\":\"string\",\"refresh_every_runs\":0,\"status\":\"active\"}"))
    .build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
Responses
200 Updated.
Example
{
  "id": "wl_3f1c2a9e8d4b4c61",
  "object": {},
  "name": "string",
  "platform": "amazon",
  "marketplace": "us",
  "currency": "USD",
  "status": "active",
  "paused_reason": "user",
  "every": "15m",
  "every_seconds": 0,
  "refresh_every_runs": 0,
  "webhook_url": "string",
  "item_count": 0,
  "items_by_state": {
    "new": 0,
    "active": 0,
    "delisted": 0
  },
  "asin_count": 0,
  "asins_by_state": {
    "new": 0,
    "active": 0,
    "delisted": 0
  },
  "estimated_credits": {
    "pulseRun": 0,
    "refreshRun": 0,
    "newAsins": 0
  },
  "run_count": 0,
  "consecutive_skips": 0,
  "last_run_at": "2024-01-01T00:00:00Z",
  "last_run_status": "running",
  "next_run_at": "2024-01-01T00:00:00Z",
  "created_at": "2024-01-01T00:00:00Z",
  "updated_at": "2024-01-01T00:00:00Z",
  "url": "string"
}
Schema
idstring
object
namestring
platformstring
Whose item ids the list holds (id on each item).
marketplacestring
Every run fetches the list here.
currencystring
The currency of every price in its snapshots, changes and webhooks.
statusstring
active | paused
paused_reasonstring
everystring
every_secondsinteger
refresh_every_runsinteger
webhook_urlstring
item_countinteger
Items on the list, every state.
items_by_stateobject
Show child parameters
newinteger
activeinteger
delistedinteger
asin_countintegerdeprecated
Deprecated alias, same value as item_count (every platform).
asins_by_stateobjectdeprecated
Deprecated alias, same value as items_by_state (every platform).
Show child parameters
newinteger
activeinteger
delistedinteger
estimated_creditsobject
Up-front cost of the next runs: a sweep run with nothing changed (Amazon: pulse), a refresh run, and the one-off baseline fetch of new items (newAsins, on every platform). On Amazon, escalations add standard credits per moved ASIN.
Show child parameters
pulseRuninteger
refreshRuninteger
newAsinsinteger
run_countinteger
consecutive_skipsinteger
Runs skipped in a row for credits; the third pauses the list.
last_run_atstring
last_run_statusstring
next_run_atstring
null while paused.
created_atstring
updated_atstring
urlstring
400 MISSING_PARAM or INVALID_PARAM; param names the culprit.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
401 UNAUTHORIZED: missing, unknown or revoked key.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
404 NOT_FOUND.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
429 RATE_LIMITED or CONCURRENCY_LIMIT. Honour Retry-After.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
500 INTERNAL: our fault, not charged. Quote X-Request-Id.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
POSThttps://scrapely.15.204.158.166.sslip.io/api/v1/watchlists/{id}/asins
Add or remove items (legacy path)

The historical path of POST /api/v1/watchlists/{id}/items: same body and behaviour on every platform; only object differs. Item ids of the list's platform. Removals apply first. Added items get a baseline fetch on the next run (Amazon: full; no change event); a delisted item added again gets another chance. At most 50,000 items per list. Free.

Parameters
idstringpathrequired
The watchlist id (wl_…).
Request body application/json
addstring[]
Item ids to add.
removestring[]
Item ids to remove.
{
  "add": [
    "string"
  ],
  "remove": [
    "string"
  ]
}
Code samples
cURL
curl -X POST "https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists/{id}/asins" \
  -H "Content-Type: application/json" \
  -d '{"add":["string"],"remove":["string"]}'
TypeScript
const res = await fetch('https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists/{id}/asins', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({"add":["string"],"remove":["string"]}),
});
const data = await res.json();
Python
import requests

res = requests.request(
    "POST",
    "https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists/{id}/asins",
    headers={
    "Content-Type": "application/json",
    },
    json={"add": ["string"], "remove": ["string"]},
)
data = res.json()
Go
package main

import (
	"fmt"
	"io"
	"net/http"
	"strings"
)

func main() {
	req, _ := http.NewRequest("POST", "https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists/{id}/asins", strings.NewReader(`{"add":["string"],"remove":["string"]}`))
	req.Header.Set("Content-Type", "application/json")
	res, _ := http.DefaultClient.Do(req)
	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)
	fmt.Println(string(body))
}
PHP
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists/{id}/asins');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{"add":["string"],"remove":["string"]}');
$response = curl_exec($ch);
curl_close($ch);
echo $response;
Ruby
require 'net/http'
require 'uri'

uri = URI('https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists/{id}/asins')
req = Net::HTTP::Post.new(uri)
req['Content-Type'] = 'application/json'
req.body = '{"add":["string"],"remove":["string"]}'
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == 'https') do |http|
  http.request(req)
end
puts res.body
Java
import java.net.URI;
import java.net.http.*;
import java.net.http.HttpRequest.BodyPublishers;

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists/{id}/asins"))
    .header("Content-Type", "application/json")
    .method("POST", BodyPublishers.ofString("{\"add\":[\"string\"],\"remove\":[\"string\"]}"))
    .build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
Responses
200 What changed.
Example
{
  "id": "string",
  "object": {},
  "platform": "amazon",
  "marketplace": "us",
  "added": 0,
  "reactivated": 0,
  "removed": 0,
  "unchanged": 0,
  "item_count": 0,
  "asin_count": 0
}
Schema
idstring
object
platformstring
marketplacestring
addedinteger
reactivatedinteger
Delisted items added again.
removedinteger
unchangedinteger
Already present (add) or not present (remove).
item_countinteger
asin_countintegerdeprecated
Deprecated alias, same value as item_count.
400 MISSING_PARAM or INVALID_PARAM; param names the culprit.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
401 UNAUTHORIZED: missing, unknown or revoked key.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
404 NOT_FOUND.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
429 RATE_LIMITED or CONCURRENCY_LIMIT. Honour Retry-After.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
500 INTERNAL: our fault, not charged. Quote X-Request-Id.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
POSThttps://scrapely.15.204.158.166.sslip.io/api/v1/watchlists/{id}/run
Run a watchlist now

Starts a run at once (202) and restarts the schedule from now. Billed like a scheduled run; works on a paused list. 409 while a run of this list is in progress.

Parameters
idstringpathrequired
The watchlist id (wl_…).
Code samples
cURL
curl -X POST "https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists/{id}/run"
TypeScript
const res = await fetch('https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists/{id}/run', {
  method: 'POST',
});
const data = await res.json();
Python
import requests

res = requests.request(
    "POST",
    "https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists/{id}/run",
)
data = res.json()
Go
package main

import (
	"fmt"
	"io"
	"net/http"
)

func main() {
	req, _ := http.NewRequest("POST", "https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists/{id}/run", nil)
	res, _ := http.DefaultClient.Do(req)
	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)
	fmt.Println(string(body))
}
PHP
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists/{id}/run');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
Ruby
require 'net/http'
require 'uri'

uri = URI('https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists/{id}/run')
req = Net::HTTP::Post.new(uri)
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == 'https') do |http|
  http.request(req)
end
puts res.body
Java
import java.net.URI;
import java.net.http.*;
import java.net.http.HttpRequest.BodyPublishers;

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists/{id}/run"))
    .method("POST", BodyPublishers.noBody())
    .build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
Responses
202 Started.
Example
{
  "id": "wlrun_5f0c8a1b2d3e4f56",
  "object": {},
  "watchlist_id": "string",
  "run_number": 0,
  "trigger": "schedule",
  "kind": "pulse",
  "status": "running",
  "credits": 0,
  "stats": {
    "tracked": 0,
    "sweep_tier": "pulse",
    "calls": {
      "pulse": null,
      "standard": null,
      "full": null
    },
    "escalated": {
      "changed": null,
      "buybox_above_lowest": null,
      "pending": null
    },
    "deferred": 0,
    "changed": 0,
    "delisted": 0,
    "retry_next_run": 0,
    "credits_needed": 0
  },
  "error": "string",
  "started_at": "2024-01-01T00:00:00Z",
  "finished_at": "2024-01-01T00:00:00Z",
  "runs_url": "string"
}
Schema
idstring
object
watchlist_idstring
run_numberinteger
triggerstring
schedule | manual
kindstring
pulse | refresh
statusstring
running | completed | insufficient_credits | failed
creditsinteger
Charged, after refunds.
statsobject
Show child parameters
trackedinteger
sweep_tierstring
pulse | standard
callsobject
Show child parameters
pulseobject
standardobject
fullobject
escalatedobject
Show child parameters
changedinteger
buybox_above_lowestinteger
pendinginteger
deferredinteger
Escalations postponed to the next run: the balance could not cover them.
changedinteger
delistedinteger
retry_next_runinteger
partial + unavailable items (free, retried next run, never a change).
credits_neededinteger
On insufficient_credits: what the run needed up front.
errorstring
started_atstring
finished_atstring
runs_urlstring
401 UNAUTHORIZED: missing, unknown or revoked key.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
404 NOT_FOUND.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
409 CONFLICT: idempotent request in flight, or the job is already running/done.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
429 RATE_LIMITED or CONCURRENCY_LIMIT. Honour Retry-After.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
500 INTERNAL: our fault, not charged. Quote X-Request-Id.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
GEThttps://scrapely.15.204.158.166.sslip.io/api/v1/watchlists/{id}/runs
List runs

Newest first; the newest 500 are kept.

Parameters
idstringpathrequired
The watchlist id (wl_…).
limitintegerquery
= 20
Code samples
cURL
curl -X GET "https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists/{id}/runs?limit="
TypeScript
const res = await fetch('https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists/{id}/runs?limit=', {
  method: 'GET',
});
const data = await res.json();
Python
import requests

res = requests.request(
    "GET",
    "https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists/{id}/runs?limit=",
)
data = res.json()
Go
package main

import (
	"fmt"
	"io"
	"net/http"
)

func main() {
	req, _ := http.NewRequest("GET", "https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists/{id}/runs?limit=", nil)
	res, _ := http.DefaultClient.Do(req)
	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)
	fmt.Println(string(body))
}
PHP
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists/{id}/runs?limit=');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
Ruby
require 'net/http'
require 'uri'

uri = URI('https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists/{id}/runs?limit=')
req = Net::HTTP::Get.new(uri)
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == 'https') do |http|
  http.request(req)
end
puts res.body
Java
import java.net.URI;
import java.net.http.*;
import java.net.http.HttpRequest.BodyPublishers;

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists/{id}/runs?limit="))
    .GET()
    .build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
Responses
200 Runs.
Example
{
  "object": {},
  "data": [
    {
      "id": "wlrun_5f0c8a1b2d3e4f56",
      "object": {},
      "watchlist_id": "string",
      "run_number": 0,
      "trigger": "schedule",
      "kind": "pulse",
      "status": "running",
      "credits": 0,
      "stats": {
        "tracked": null,
        "sweep_tier": null,
        "calls": null,
        "escalated": null,
        "deferred": null,
        "changed": null,
        "delisted": null,
        "retry_next_run": null,
        "credits_needed": null
      },
      "error": "string",
      "started_at": "2024-01-01T00:00:00Z",
      "finished_at": "2024-01-01T00:00:00Z"
    }
  ],
  "has_more": true
}
Schema
object
dataWatchlistRun[]
Show child parameters
idstring
object
watchlist_idstring
run_numberinteger
triggerstring
schedule | manual
kindstring
pulse | refresh
statusstring
running | completed | insufficient_credits | failed
creditsinteger
Charged, after refunds.
statsobject
Show child parameters
trackedinteger
sweep_tierstring
pulse | standard
callsobject
escalatedobject
deferredinteger
Escalations postponed to the next run: the balance could not cover them.
changedinteger
delistedinteger
retry_next_runinteger
partial + unavailable items (free, retried next run, never a change).
credits_neededinteger
On insufficient_credits: what the run needed up front.
errorstring
started_atstring
finished_atstring
has_moreboolean
401 UNAUTHORIZED: missing, unknown or revoked key.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
404 NOT_FOUND.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
429 RATE_LIMITED or CONCURRENCY_LIMIT. Honour Retry-After.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
500 INTERNAL: our fault, not charged. Quote X-Request-Id.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
GEThttps://scrapely.15.204.158.166.sslip.io/api/v1/watchlists/{id}/items
List items

The items on the list with their last snapshot, in id order. Each carries id (plus asin on Amazon lists). changed_since returns only items that changed or were delisted since then: the pull counterpart of the webhook.

Parameters
idstringpathrequired
The watchlist id (wl_…).
changed_sincestringquery
ISO 8601 or epoch milliseconds.
statestringquery
new | active | delisted
limitintegerquery
= 100
starting_afterstringquery
next_starting_after from the previous page.
Code samples
cURL
curl -X GET "https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists/{id}/items?changed_since=&state=&limit=&starting_after="
TypeScript
const res = await fetch('https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists/{id}/items?changed_since=&state=&limit=&starting_after=', {
  method: 'GET',
});
const data = await res.json();
Python
import requests

res = requests.request(
    "GET",
    "https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists/{id}/items?changed_since=&state=&limit=&starting_after=",
)
data = res.json()
Go
package main

import (
	"fmt"
	"io"
	"net/http"
)

func main() {
	req, _ := http.NewRequest("GET", "https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists/{id}/items?changed_since=&state=&limit=&starting_after=", nil)
	res, _ := http.DefaultClient.Do(req)
	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)
	fmt.Println(string(body))
}
PHP
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists/{id}/items?changed_since=&state=&limit=&starting_after=');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
Ruby
require 'net/http'
require 'uri'

uri = URI('https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists/{id}/items?changed_since=&state=&limit=&starting_after=')
req = Net::HTTP::Get.new(uri)
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == 'https') do |http|
  http.request(req)
end
puts res.body
Java
import java.net.URI;
import java.net.http.*;
import java.net.http.HttpRequest.BodyPublishers;

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists/{id}/items?changed_since=&state=&limit=&starting_after="))
    .GET()
    .build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
Responses
200 A page of items.
Example
{
  "object": {},
  "platform": "amazon",
  "marketplace": "us",
  "data": [
    {
      "id": "B0009KNLV6",
      "asin": "string",
      "state": "new",
      "added_at": "2024-01-01T00:00:00Z",
      "last_status": "ok",
      "pulse": {
        "newCount": null,
        "newMinPrice": null,
        "observed_at": null
      },
      "snapshot": {
        "price": null,
        "inStock": null,
        "availabilityType": null,
        "isFba": null,
        "fulfillerName": null,
        "offerListingId": null,
        "merchant": null,
        "condition": null,
        "newCount": null,
        "newMinPrice": null,
        "usedCount": null,
        "usedMinPrice": null,
        "title": null
      },
      "snapshot_at": "2024-01-01T00:00:00Z",
      "snapshot_tier": "full",
      "buybox_above_lowest": true,
      "pending_standard": true,
      "changed_at": "2024-01-01T00:00:00Z",
      "last_change": {},
      "delisted_at": "2024-01-01T00:00:00Z"
    }
  ],
  "has_more": true,
  "next_starting_after": "string"
}
Schema
object
platformstring
marketplacestring
dataWatchlistItem[]
Show child parameters
idstring
The item's id on the list's platform: an ASIN on Amazon, an item id on Walmart, a TCIN on Target, a SKU on Best Buy.
asinstringdeprecated
Amazon lists only: the same value as id, kept for clients written before platforms. Absent on every other platform.
statestring
new: waiting for its first (baseline) fetch. delisted: the retailer said not_found; never fetched again (add it again to retry).
new | active | delisted
added_atstring
last_statusstring
pulseobject
Show child parameters
newCountinteger
newMinPricenumber
observed_atstring
snapshotWatchlistSnapshot
Show child parameters
pricenumber
inStockboolean
availabilityTypestring
isFbaboolean
fulfillerNamestring
offerListingIdstring
merchantobject
conditionstring
newCountinteger
newMinPricenumber
usedCountinteger
usedMinPricenumber
titlestring
snapshot_atstring
snapshot_tierstring
buybox_above_lowestboolean
The buy box cost more than the lowest new offer at the last fetch, so every run checks it at standard.
pending_standardboolean
A standard fetch is owed (pulse moved, or the last standard failed or was deferred).
changed_atstring
last_changeobject
delisted_atstring
has_moreboolean
next_starting_afterstring
The last id of this page.
400 MISSING_PARAM or INVALID_PARAM; param names the culprit.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
401 UNAUTHORIZED: missing, unknown or revoked key.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
404 NOT_FOUND.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
429 RATE_LIMITED or CONCURRENCY_LIMIT. Honour Retry-After.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
500 INTERNAL: our fault, not charged. Quote X-Request-Id.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
POSThttps://scrapely.15.204.158.166.sslip.io/api/v1/watchlists/{id}/items
Add or remove items

Item ids of the list's platform. Removals apply first. Added items get a baseline fetch on the next run (Amazon: full; no change event); a delisted item added again gets another chance. At most 50,000 items per list. Free.

Parameters
idstringpathrequired
The watchlist id (wl_…).
Request body application/json
addstring[]
Item ids to add.
removestring[]
Item ids to remove.
{
  "add": [
    "string"
  ],
  "remove": [
    "string"
  ]
}
Code samples
cURL
curl -X POST "https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists/{id}/items" \
  -H "Content-Type: application/json" \
  -d '{"add":["string"],"remove":["string"]}'
TypeScript
const res = await fetch('https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists/{id}/items', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({"add":["string"],"remove":["string"]}),
});
const data = await res.json();
Python
import requests

res = requests.request(
    "POST",
    "https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists/{id}/items",
    headers={
    "Content-Type": "application/json",
    },
    json={"add": ["string"], "remove": ["string"]},
)
data = res.json()
Go
package main

import (
	"fmt"
	"io"
	"net/http"
	"strings"
)

func main() {
	req, _ := http.NewRequest("POST", "https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists/{id}/items", strings.NewReader(`{"add":["string"],"remove":["string"]}`))
	req.Header.Set("Content-Type", "application/json")
	res, _ := http.DefaultClient.Do(req)
	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)
	fmt.Println(string(body))
}
PHP
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists/{id}/items');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{"add":["string"],"remove":["string"]}');
$response = curl_exec($ch);
curl_close($ch);
echo $response;
Ruby
require 'net/http'
require 'uri'

uri = URI('https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists/{id}/items')
req = Net::HTTP::Post.new(uri)
req['Content-Type'] = 'application/json'
req.body = '{"add":["string"],"remove":["string"]}'
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == 'https') do |http|
  http.request(req)
end
puts res.body
Java
import java.net.URI;
import java.net.http.*;
import java.net.http.HttpRequest.BodyPublishers;

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://scrapely.15.204.158.166.sslip.io/api/v1/watchlists/{id}/items"))
    .header("Content-Type", "application/json")
    .method("POST", BodyPublishers.ofString("{\"add\":[\"string\"],\"remove\":[\"string\"]}"))
    .build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
Responses
200 What changed.
Example
{
  "id": "string",
  "object": {},
  "platform": "amazon",
  "marketplace": "us",
  "added": 0,
  "reactivated": 0,
  "removed": 0,
  "unchanged": 0,
  "item_count": 0,
  "asin_count": 0
}
Schema
idstring
object
platformstring
marketplacestring
addedinteger
reactivatedinteger
Delisted items added again.
removedinteger
unchangedinteger
Already present (add) or not present (remove).
item_countinteger
asin_countintegerdeprecated
Deprecated alias, same value as item_count.
400 MISSING_PARAM or INVALID_PARAM; param names the culprit.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
401 UNAUTHORIZED: missing, unknown or revoked key.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
404 NOT_FOUND.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
429 RATE_LIMITED or CONCURRENCY_LIMIT. Honour Retry-After.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
500 INTERNAL: our fault, not charged. Quote X-Request-Id.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
Updated