Watchlists
https://scrapely.15.204.158.166.sslip.io /api/v1/watchlists Parameters
limitintegerquerycURL
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.bodyJava
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
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
objectdataWatchlist[]Show child parameters
idstringobjectnamestringplatformstringid on each item).marketplacestringcurrencystringstatusstringpaused_reasonstringeverystringevery_secondsintegerrefresh_every_runsintegerwebhook_urlstringitem_countintegeritems_by_stateobjectShow child parameters
newintegeractiveintegerdelistedintegerasin_countintegerdeprecateditem_count (every platform).asins_by_stateobjectdeprecateditems_by_state (every platform).Show child parameters
newintegeractiveintegerdelistedintegerestimated_creditsobjectnew items (newAsins, on every platform). On Amazon, escalations add standard credits per moved ASIN.Show child parameters
pulseRunintegerrefreshRunintegernewAsinsintegerrun_countintegerconsecutive_skipsintegerlast_run_atstringlast_run_statusstringnext_run_atstringcreated_atstringupdated_atstringurlstringhas_morebooleanUNAUTHORIZED: missing, unknown or revoked key.Example
{
"error": {
"code": "MISSING_PARAM",
"message": "string",
"param": "string",
"docs": "/docs/errors#insufficient_credits"
}
}Schema
errorobjectrequiredShow child parameters
codestringrequiredmessage.messagestringrequiredparamstringdocsstringRATE_LIMITED or CONCURRENCY_LIMIT. Honour Retry-After.Example
{
"error": {
"code": "MISSING_PARAM",
"message": "string",
"param": "string",
"docs": "/docs/errors#insufficient_credits"
}
}Schema
errorobjectrequiredShow child parameters
codestringrequiredmessage.messagestringrequiredparamstringdocsstringINTERNAL: our fault, not charged. Quote X-Request-Id.Example
{
"error": {
"code": "MISSING_PARAM",
"message": "string",
"param": "string",
"docs": "/docs/errors#insufficient_credits"
}
}Schema
errorobjectrequiredShow child parameters
codestringrequiredmessage.messagestringrequiredparamstringdocsstringhttps://scrapely.15.204.158.166.sslip.io /api/v1/watchlists 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-KeystringheaderIdempotent-Replayed: true) instead of creating a second list. Remembered 24 hours.Request body application/json
namestringrequiredidsstring[]requiredplatform (ASINs, item ids, TCINs, SKUs…; de-duplicated). A newline- or comma-separated string is also accepted.asinsstring[]deprecatedids (ASINs are case-insensitive). Send ids or asins, not both.everystringrequired5m, 15m, 1h, 6h, 24h.webhook_urlstringrefresh_every_runsintegerstandard 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.platformstringamazon (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.marketplacestringus, uk, de…); default the platform's main one. Prices come back in its currency.{
"name": "string",
"ids": [
"string"
],
"asins": [
"string"
],
"every": "15m",
"webhook_url": "string",
"refresh_every_runs": 8,
"platform": "amazon",
"marketplace": "us"
}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.bodyJava
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
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
idstringobjectnamestringplatformstringid on each item).marketplacestringcurrencystringstatusstringpaused_reasonstringeverystringevery_secondsintegerrefresh_every_runsintegerwebhook_urlstringitem_countintegeritems_by_stateobjectShow child parameters
newintegeractiveintegerdelistedintegerasin_countintegerdeprecateditem_count (every platform).asins_by_stateobjectdeprecateditems_by_state (every platform).Show child parameters
newintegeractiveintegerdelistedintegerestimated_creditsobjectnew items (newAsins, on every platform). On Amazon, escalations add standard credits per moved ASIN.Show child parameters
pulseRunintegerrefreshRunintegernewAsinsintegerrun_countintegerconsecutive_skipsintegerlast_run_atstringlast_run_statusstringnext_run_atstringcreated_atstringupdated_atstringurlstringMISSING_PARAM or INVALID_PARAM; param names the culprit.Example
{
"error": {
"code": "MISSING_PARAM",
"message": "string",
"param": "string",
"docs": "/docs/errors#insufficient_credits"
}
}Schema
errorobjectrequiredShow child parameters
codestringrequiredmessage.messagestringrequiredparamstringdocsstringUNAUTHORIZED: missing, unknown or revoked key.Example
{
"error": {
"code": "MISSING_PARAM",
"message": "string",
"param": "string",
"docs": "/docs/errors#insufficient_credits"
}
}Schema
errorobjectrequiredShow child parameters
codestringrequiredmessage.messagestringrequiredparamstringdocsstringDEMO_READ_ONLY.Example
{
"error": {
"code": "MISSING_PARAM",
"message": "string",
"param": "string",
"docs": "/docs/errors#insufficient_credits"
}
}Schema
errorobjectrequiredShow child parameters
codestringrequiredmessage.messagestringrequiredparamstringdocsstringCONFLICT: 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
errorobjectrequiredShow child parameters
codestringrequiredmessage.messagestringrequiredparamstringdocsstringINVALID_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
errorobjectrequiredShow child parameters
codestringrequiredmessage.messagestringrequiredparamstringdocsstringRATE_LIMITED or CONCURRENCY_LIMIT. Honour Retry-After.Example
{
"error": {
"code": "MISSING_PARAM",
"message": "string",
"param": "string",
"docs": "/docs/errors#insufficient_credits"
}
}Schema
errorobjectrequiredShow child parameters
codestringrequiredmessage.messagestringrequiredparamstringdocsstringINTERNAL: our fault, not charged. Quote X-Request-Id.Example
{
"error": {
"code": "MISSING_PARAM",
"message": "string",
"param": "string",
"docs": "/docs/errors#insufficient_credits"
}
}Schema
errorobjectrequiredShow child parameters
codestringrequiredmessage.messagestringrequiredparamstringdocsstringhttps://scrapely.15.204.158.166.sslip.io /api/v1/watchlists/{id} Parameters
idstringpathrequiredwl_…).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.bodyJava
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
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
idstringobjectnamestringplatformstringid on each item).marketplacestringcurrencystringstatusstringpaused_reasonstringeverystringevery_secondsintegerrefresh_every_runsintegerwebhook_urlstringitem_countintegeritems_by_stateobjectShow child parameters
newintegeractiveintegerdelistedintegerasin_countintegerdeprecateditem_count (every platform).asins_by_stateobjectdeprecateditems_by_state (every platform).Show child parameters
newintegeractiveintegerdelistedintegerestimated_creditsobjectnew items (newAsins, on every platform). On Amazon, escalations add standard credits per moved ASIN.Show child parameters
pulseRunintegerrefreshRunintegernewAsinsintegerrun_countintegerconsecutive_skipsintegerlast_run_atstringlast_run_statusstringnext_run_atstringcreated_atstringupdated_atstringurlstringUNAUTHORIZED: missing, unknown or revoked key.Example
{
"error": {
"code": "MISSING_PARAM",
"message": "string",
"param": "string",
"docs": "/docs/errors#insufficient_credits"
}
}Schema
errorobjectrequiredShow child parameters
codestringrequiredmessage.messagestringrequiredparamstringdocsstringNOT_FOUND.Example
{
"error": {
"code": "MISSING_PARAM",
"message": "string",
"param": "string",
"docs": "/docs/errors#insufficient_credits"
}
}Schema
errorobjectrequiredShow child parameters
codestringrequiredmessage.messagestringrequiredparamstringdocsstringRATE_LIMITED or CONCURRENCY_LIMIT. Honour Retry-After.Example
{
"error": {
"code": "MISSING_PARAM",
"message": "string",
"param": "string",
"docs": "/docs/errors#insufficient_credits"
}
}Schema
errorobjectrequiredShow child parameters
codestringrequiredmessage.messagestringrequiredparamstringdocsstringINTERNAL: our fault, not charged. Quote X-Request-Id.Example
{
"error": {
"code": "MISSING_PARAM",
"message": "string",
"param": "string",
"docs": "/docs/errors#insufficient_credits"
}
}Schema
errorobjectrequiredShow child parameters
codestringrequiredmessage.messagestringrequiredparamstringdocsstringhttps://scrapely.15.204.158.166.sslip.io /api/v1/watchlists/{id} Deletes the list, its items and its run history. A run already in progress finishes but sends no webhooks.
Parameters
idstringpathrequiredwl_…).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.bodyJava
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
Example
{
"id": "string",
"object": {},
"deleted": {}
}Schema
idstringobjectdeletedUNAUTHORIZED: missing, unknown or revoked key.Example
{
"error": {
"code": "MISSING_PARAM",
"message": "string",
"param": "string",
"docs": "/docs/errors#insufficient_credits"
}
}Schema
errorobjectrequiredShow child parameters
codestringrequiredmessage.messagestringrequiredparamstringdocsstringNOT_FOUND.Example
{
"error": {
"code": "MISSING_PARAM",
"message": "string",
"param": "string",
"docs": "/docs/errors#insufficient_credits"
}
}Schema
errorobjectrequiredShow child parameters
codestringrequiredmessage.messagestringrequiredparamstringdocsstringRATE_LIMITED or CONCURRENCY_LIMIT. Honour Retry-After.Example
{
"error": {
"code": "MISSING_PARAM",
"message": "string",
"param": "string",
"docs": "/docs/errors#insufficient_credits"
}
}Schema
errorobjectrequiredShow child parameters
codestringrequiredmessage.messagestringrequiredparamstringdocsstringINTERNAL: our fault, not charged. Quote X-Request-Id.Example
{
"error": {
"code": "MISSING_PARAM",
"message": "string",
"param": "string",
"docs": "/docs/errors#insufficient_credits"
}
}Schema
errorobjectrequiredShow child parameters
codestringrequiredmessage.messagestringrequiredparamstringdocsstringhttps://scrapely.15.204.158.166.sslip.io /api/v1/watchlists/{id} Rename, change the cadence (counted from the last run), the webhook or the refresh interval; pause or resume.
Parameters
idstringpathrequiredwl_…).Request body application/json
namestringeverystringwebhook_urlstringnull clears it (events go to the account webhook).refresh_every_runsintegerstatusstring{
"name": "string",
"every": "1h",
"webhook_url": "string",
"refresh_every_runs": 0,
"status": "active"
}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.bodyJava
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
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
idstringobjectnamestringplatformstringid on each item).marketplacestringcurrencystringstatusstringpaused_reasonstringeverystringevery_secondsintegerrefresh_every_runsintegerwebhook_urlstringitem_countintegeritems_by_stateobjectShow child parameters
newintegeractiveintegerdelistedintegerasin_countintegerdeprecateditem_count (every platform).asins_by_stateobjectdeprecateditems_by_state (every platform).Show child parameters
newintegeractiveintegerdelistedintegerestimated_creditsobjectnew items (newAsins, on every platform). On Amazon, escalations add standard credits per moved ASIN.Show child parameters
pulseRunintegerrefreshRunintegernewAsinsintegerrun_countintegerconsecutive_skipsintegerlast_run_atstringlast_run_statusstringnext_run_atstringcreated_atstringupdated_atstringurlstringMISSING_PARAM or INVALID_PARAM; param names the culprit.Example
{
"error": {
"code": "MISSING_PARAM",
"message": "string",
"param": "string",
"docs": "/docs/errors#insufficient_credits"
}
}Schema
errorobjectrequiredShow child parameters
codestringrequiredmessage.messagestringrequiredparamstringdocsstringUNAUTHORIZED: missing, unknown or revoked key.Example
{
"error": {
"code": "MISSING_PARAM",
"message": "string",
"param": "string",
"docs": "/docs/errors#insufficient_credits"
}
}Schema
errorobjectrequiredShow child parameters
codestringrequiredmessage.messagestringrequiredparamstringdocsstringNOT_FOUND.Example
{
"error": {
"code": "MISSING_PARAM",
"message": "string",
"param": "string",
"docs": "/docs/errors#insufficient_credits"
}
}Schema
errorobjectrequiredShow child parameters
codestringrequiredmessage.messagestringrequiredparamstringdocsstringRATE_LIMITED or CONCURRENCY_LIMIT. Honour Retry-After.Example
{
"error": {
"code": "MISSING_PARAM",
"message": "string",
"param": "string",
"docs": "/docs/errors#insufficient_credits"
}
}Schema
errorobjectrequiredShow child parameters
codestringrequiredmessage.messagestringrequiredparamstringdocsstringINTERNAL: our fault, not charged. Quote X-Request-Id.Example
{
"error": {
"code": "MISSING_PARAM",
"message": "string",
"param": "string",
"docs": "/docs/errors#insufficient_credits"
}
}Schema
errorobjectrequiredShow child parameters
codestringrequiredmessage.messagestringrequiredparamstringdocsstringhttps://scrapely.15.204.158.166.sslip.io /api/v1/watchlists/{id}/asins 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
idstringpathrequiredwl_…).Request body application/json
addstring[]removestring[]{
"add": [
"string"
],
"remove": [
"string"
]
}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.bodyJava
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
Example
{
"id": "string",
"object": {},
"platform": "amazon",
"marketplace": "us",
"added": 0,
"reactivated": 0,
"removed": 0,
"unchanged": 0,
"item_count": 0,
"asin_count": 0
}Schema
idstringobjectplatformstringmarketplacestringaddedintegerreactivatedintegerremovedintegerunchangedintegeritem_countintegerasin_countintegerdeprecateditem_count.MISSING_PARAM or INVALID_PARAM; param names the culprit.Example
{
"error": {
"code": "MISSING_PARAM",
"message": "string",
"param": "string",
"docs": "/docs/errors#insufficient_credits"
}
}Schema
errorobjectrequiredShow child parameters
codestringrequiredmessage.messagestringrequiredparamstringdocsstringUNAUTHORIZED: missing, unknown or revoked key.Example
{
"error": {
"code": "MISSING_PARAM",
"message": "string",
"param": "string",
"docs": "/docs/errors#insufficient_credits"
}
}Schema
errorobjectrequiredShow child parameters
codestringrequiredmessage.messagestringrequiredparamstringdocsstringNOT_FOUND.Example
{
"error": {
"code": "MISSING_PARAM",
"message": "string",
"param": "string",
"docs": "/docs/errors#insufficient_credits"
}
}Schema
errorobjectrequiredShow child parameters
codestringrequiredmessage.messagestringrequiredparamstringdocsstringRATE_LIMITED or CONCURRENCY_LIMIT. Honour Retry-After.Example
{
"error": {
"code": "MISSING_PARAM",
"message": "string",
"param": "string",
"docs": "/docs/errors#insufficient_credits"
}
}Schema
errorobjectrequiredShow child parameters
codestringrequiredmessage.messagestringrequiredparamstringdocsstringINTERNAL: our fault, not charged. Quote X-Request-Id.Example
{
"error": {
"code": "MISSING_PARAM",
"message": "string",
"param": "string",
"docs": "/docs/errors#insufficient_credits"
}
}Schema
errorobjectrequiredShow child parameters
codestringrequiredmessage.messagestringrequiredparamstringdocsstringhttps://scrapely.15.204.158.166.sslip.io /api/v1/watchlists/{id}/run 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
idstringpathrequiredwl_…).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.bodyJava
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
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
idstringobjectwatchlist_idstringrun_numberintegertriggerstringkindstringstatusstringcreditsintegerstatsobjectShow child parameters
trackedintegersweep_tierstringcallsobjectShow child parameters
pulseobjectstandardobjectfullobjectescalatedobjectShow child parameters
changedintegerbuybox_above_lowestintegerpendingintegerdeferredintegerchangedintegerdelistedintegerretry_next_runintegercredits_neededintegerinsufficient_credits: what the run needed up front.errorstringstarted_atstringfinished_atstringruns_urlstringUNAUTHORIZED: missing, unknown or revoked key.Example
{
"error": {
"code": "MISSING_PARAM",
"message": "string",
"param": "string",
"docs": "/docs/errors#insufficient_credits"
}
}Schema
errorobjectrequiredShow child parameters
codestringrequiredmessage.messagestringrequiredparamstringdocsstringNOT_FOUND.Example
{
"error": {
"code": "MISSING_PARAM",
"message": "string",
"param": "string",
"docs": "/docs/errors#insufficient_credits"
}
}Schema
errorobjectrequiredShow child parameters
codestringrequiredmessage.messagestringrequiredparamstringdocsstringCONFLICT: 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
errorobjectrequiredShow child parameters
codestringrequiredmessage.messagestringrequiredparamstringdocsstringRATE_LIMITED or CONCURRENCY_LIMIT. Honour Retry-After.Example
{
"error": {
"code": "MISSING_PARAM",
"message": "string",
"param": "string",
"docs": "/docs/errors#insufficient_credits"
}
}Schema
errorobjectrequiredShow child parameters
codestringrequiredmessage.messagestringrequiredparamstringdocsstringINTERNAL: our fault, not charged. Quote X-Request-Id.Example
{
"error": {
"code": "MISSING_PARAM",
"message": "string",
"param": "string",
"docs": "/docs/errors#insufficient_credits"
}
}Schema
errorobjectrequiredShow child parameters
codestringrequiredmessage.messagestringrequiredparamstringdocsstringhttps://scrapely.15.204.158.166.sslip.io /api/v1/watchlists/{id}/runs Newest first; the newest 500 are kept.
Parameters
idstringpathrequiredwl_…).limitintegerquerycURL
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.bodyJava
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
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
objectdataWatchlistRun[]Show child parameters
idstringobjectwatchlist_idstringrun_numberintegertriggerstringkindstringstatusstringcreditsintegerstatsobjectShow child parameters
trackedintegersweep_tierstringcallsobjectescalatedobjectdeferredintegerchangedintegerdelistedintegerretry_next_runintegercredits_neededintegerinsufficient_credits: what the run needed up front.errorstringstarted_atstringfinished_atstringhas_morebooleanUNAUTHORIZED: missing, unknown or revoked key.Example
{
"error": {
"code": "MISSING_PARAM",
"message": "string",
"param": "string",
"docs": "/docs/errors#insufficient_credits"
}
}Schema
errorobjectrequiredShow child parameters
codestringrequiredmessage.messagestringrequiredparamstringdocsstringNOT_FOUND.Example
{
"error": {
"code": "MISSING_PARAM",
"message": "string",
"param": "string",
"docs": "/docs/errors#insufficient_credits"
}
}Schema
errorobjectrequiredShow child parameters
codestringrequiredmessage.messagestringrequiredparamstringdocsstringRATE_LIMITED or CONCURRENCY_LIMIT. Honour Retry-After.Example
{
"error": {
"code": "MISSING_PARAM",
"message": "string",
"param": "string",
"docs": "/docs/errors#insufficient_credits"
}
}Schema
errorobjectrequiredShow child parameters
codestringrequiredmessage.messagestringrequiredparamstringdocsstringINTERNAL: our fault, not charged. Quote X-Request-Id.Example
{
"error": {
"code": "MISSING_PARAM",
"message": "string",
"param": "string",
"docs": "/docs/errors#insufficient_credits"
}
}Schema
errorobjectrequiredShow child parameters
codestringrequiredmessage.messagestringrequiredparamstringdocsstringhttps://scrapely.15.204.158.166.sslip.io /api/v1/watchlists/{id}/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
idstringpathrequiredwl_…).changed_sincestringquerystatestringquerylimitintegerquerystarting_afterstringquerynext_starting_after from the previous page.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.bodyJava
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
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
objectplatformstringmarketplacestringdataWatchlistItem[]Show child parameters
idstringasinstringdeprecatedid, kept for clients written before platforms. Absent on every other platform.statestringnew: waiting for its first (baseline) fetch. delisted: the retailer said not_found; never fetched again (add it again to retry).added_atstringlast_statusstringpulseobjectShow child parameters
newCountintegernewMinPricenumberobserved_atstringsnapshotWatchlistSnapshotShow child parameters
pricenumberinStockbooleanavailabilityTypestringisFbabooleanfulfillerNamestringofferListingIdstringmerchantobjectconditionstringnewCountintegernewMinPricenumberusedCountintegerusedMinPricenumbertitlestringsnapshot_atstringsnapshot_tierstringbuybox_above_lowestbooleanpending_standardbooleanchanged_atstringlast_changeobjectdelisted_atstringhas_morebooleannext_starting_afterstringid of this page.MISSING_PARAM or INVALID_PARAM; param names the culprit.Example
{
"error": {
"code": "MISSING_PARAM",
"message": "string",
"param": "string",
"docs": "/docs/errors#insufficient_credits"
}
}Schema
errorobjectrequiredShow child parameters
codestringrequiredmessage.messagestringrequiredparamstringdocsstringUNAUTHORIZED: missing, unknown or revoked key.Example
{
"error": {
"code": "MISSING_PARAM",
"message": "string",
"param": "string",
"docs": "/docs/errors#insufficient_credits"
}
}Schema
errorobjectrequiredShow child parameters
codestringrequiredmessage.messagestringrequiredparamstringdocsstringNOT_FOUND.Example
{
"error": {
"code": "MISSING_PARAM",
"message": "string",
"param": "string",
"docs": "/docs/errors#insufficient_credits"
}
}Schema
errorobjectrequiredShow child parameters
codestringrequiredmessage.messagestringrequiredparamstringdocsstringRATE_LIMITED or CONCURRENCY_LIMIT. Honour Retry-After.Example
{
"error": {
"code": "MISSING_PARAM",
"message": "string",
"param": "string",
"docs": "/docs/errors#insufficient_credits"
}
}Schema
errorobjectrequiredShow child parameters
codestringrequiredmessage.messagestringrequiredparamstringdocsstringINTERNAL: our fault, not charged. Quote X-Request-Id.Example
{
"error": {
"code": "MISSING_PARAM",
"message": "string",
"param": "string",
"docs": "/docs/errors#insufficient_credits"
}
}Schema
errorobjectrequiredShow child parameters
codestringrequiredmessage.messagestringrequiredparamstringdocsstringhttps://scrapely.15.204.158.166.sslip.io /api/v1/watchlists/{id}/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
idstringpathrequiredwl_…).Request body application/json
addstring[]removestring[]{
"add": [
"string"
],
"remove": [
"string"
]
}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.bodyJava
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
Example
{
"id": "string",
"object": {},
"platform": "amazon",
"marketplace": "us",
"added": 0,
"reactivated": 0,
"removed": 0,
"unchanged": 0,
"item_count": 0,
"asin_count": 0
}Schema
idstringobjectplatformstringmarketplacestringaddedintegerreactivatedintegerremovedintegerunchangedintegeritem_countintegerasin_countintegerdeprecateditem_count.MISSING_PARAM or INVALID_PARAM; param names the culprit.Example
{
"error": {
"code": "MISSING_PARAM",
"message": "string",
"param": "string",
"docs": "/docs/errors#insufficient_credits"
}
}Schema
errorobjectrequiredShow child parameters
codestringrequiredmessage.messagestringrequiredparamstringdocsstringUNAUTHORIZED: missing, unknown or revoked key.Example
{
"error": {
"code": "MISSING_PARAM",
"message": "string",
"param": "string",
"docs": "/docs/errors#insufficient_credits"
}
}Schema
errorobjectrequiredShow child parameters
codestringrequiredmessage.messagestringrequiredparamstringdocsstringNOT_FOUND.Example
{
"error": {
"code": "MISSING_PARAM",
"message": "string",
"param": "string",
"docs": "/docs/errors#insufficient_credits"
}
}Schema
errorobjectrequiredShow child parameters
codestringrequiredmessage.messagestringrequiredparamstringdocsstringRATE_LIMITED or CONCURRENCY_LIMIT. Honour Retry-After.Example
{
"error": {
"code": "MISSING_PARAM",
"message": "string",
"param": "string",
"docs": "/docs/errors#insufficient_credits"
}
}Schema
errorobjectrequiredShow child parameters
codestringrequiredmessage.messagestringrequiredparamstringdocsstringINTERNAL: our fault, not charged. Quote X-Request-Id.Example
{
"error": {
"code": "MISSING_PARAM",
"message": "string",
"param": "string",
"docs": "/docs/errors#insufficient_credits"
}
}Schema
errorobjectrequiredShow child parameters
codestringrequiredmessage.messagestringrequiredparamstringdocsstring