Watchlists
https://scrapelyserp.com /api/v1/watchlists Parameters
limitintegerquerycURL
curl -X GET "https://scrapelyserp.com/api/v1/watchlists?limit="TypeScript
const res = await fetch('https://scrapelyserp.com/api/v1/watchlists?limit=', {
method: 'GET',
});
const data = await res.json();Python
import requests
res = requests.request(
"GET",
"https://scrapelyserp.com/api/v1/watchlists?limit=",
)
data = res.json()Go
package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "https://scrapelyserp.com/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://scrapelyserp.com/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://scrapelyserp.com/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://scrapelyserp.com/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,
"pipeline": {
"entry": "string",
"baseline": null,
"refresh": null,
"steps": [
null
]
},
"default_pipeline": true,
"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_runsintegerpipelineobjectrun), the webhook (notify), or both. Chains cannot loop.Show child parameters
entrystringbaselinestringentry.refreshobjectstepsobject[]requireddefault_pipelinebooleanwebhook_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 lite 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://scrapelyserp.com /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. Send a pipeline to choose the scrapers each run uses and how they chain; without one the platform default runs. The first run starts at once and reads every item at the baseline step (default on Amazon: full; no change events). With the default pipeline, on Amazon each later run sweeps at pulse, escalates to lite 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 lite; 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_urlstring/v1/webhook_endpoints), by URL: this list's events go there only, signed with that endpoint's secret. An unregistered URL is a 400. Omitted: every endpoint subscribed to each event.webhook_endpoint_idstringwebhook_url: the endpoint's id (we_…). Send one or the other.refresh_every_runsintegerlite instead of pulse (sees buy-box seller changes at the same price; refreshes offer listing ids). 0 = never. A custom pipeline sets this with refresh.pipelineobjectShow child parameters
entrystringbaselinestringentry.refreshobjectShow child parameters
every_runsintegerrequiredentrystringrequiredstepsobject[]requiredShow child parameters
idstringrequiredscraperstringrequiredconditionstringamazon.offers only.routesobject[]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",
"webhook_endpoint_id": "string",
"refresh_every_runs": 8,
"pipeline": {
"entry": "string",
"baseline": "string",
"refresh": {
"every_runs": 0,
"entry": "string"
},
"steps": [
{
"id": "string",
"scraper": "amazon.pulse",
"condition": "all",
"routes": [
null
]
}
]
},
"platform": "amazon",
"marketplace": "us"
}cURL
curl -X POST "https://scrapelyserp.com/api/v1/watchlists" \
-H "Idempotency-Key: <value>" \
-H "Content-Type: application/json" \
-d '{"name":"string","ids":["string"],"asins":["string"],"every":"15m","webhook_url":"string","webhook_endpoint_id":"string","refresh_every_runs":8,"pipeline":{"entry":"string","baseline":"string","refresh":{"every_runs":0,"entry":"string"},"steps":[{"id":"string","scraper":"amazon.pulse","condition":"all","routes":[null]}]},"platform":"amazon","marketplace":"us"}'TypeScript
const res = await fetch('https://scrapelyserp.com/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","webhook_endpoint_id":"string","refresh_every_runs":8,"pipeline":{"entry":"string","baseline":"string","refresh":{"every_runs":0,"entry":"string"},"steps":[{"id":"string","scraper":"amazon.pulse","condition":"all","routes":[null]}]},"platform":"amazon","marketplace":"us"}),
});
const data = await res.json();Python
import requests
res = requests.request(
"POST",
"https://scrapelyserp.com/api/v1/watchlists",
headers={
"Idempotency-Key": "<value>",
"Content-Type": "application/json",
},
json={"name": "string", "ids": ["string"], "asins": ["string"], "every": "15m", "webhook_url": "string", "webhook_endpoint_id": "string", "refresh_every_runs": 8, "pipeline": {"entry": "string", "baseline": "string", "refresh": {"every_runs": 0, "entry": "string"}, "steps": [{"id": "string", "scraper": "amazon.pulse", "condition": "all", "routes": [None]}]}, "platform": "amazon", "marketplace": "us"},
)
data = res.json()Go
package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
req, _ := http.NewRequest("POST", "https://scrapelyserp.com/api/v1/watchlists", strings.NewReader(`{"name":"string","ids":["string"],"asins":["string"],"every":"15m","webhook_url":"string","webhook_endpoint_id":"string","refresh_every_runs":8,"pipeline":{"entry":"string","baseline":"string","refresh":{"every_runs":0,"entry":"string"},"steps":[{"id":"string","scraper":"amazon.pulse","condition":"all","routes":[null]}]},"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://scrapelyserp.com/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","webhook_endpoint_id":"string","refresh_every_runs":8,"pipeline":{"entry":"string","baseline":"string","refresh":{"every_runs":0,"entry":"string"},"steps":[{"id":"string","scraper":"amazon.pulse","condition":"all","routes":[null]}]},"platform":"amazon","marketplace":"us"}');
$response = curl_exec($ch);
curl_close($ch);
echo $response;Ruby
require 'net/http'
require 'uri'
uri = URI('https://scrapelyserp.com/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","webhook_endpoint_id":"string","refresh_every_runs":8,"pipeline":{"entry":"string","baseline":"string","refresh":{"every_runs":0,"entry":"string"},"steps":[{"id":"string","scraper":"amazon.pulse","condition":"all","routes":[null]}]},"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://scrapelyserp.com/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\",\"webhook_endpoint_id\":\"string\",\"refresh_every_runs\":8,\"pipeline\":{\"entry\":\"string\",\"baseline\":\"string\",\"refresh\":{\"every_runs\":0,\"entry\":\"string\"},\"steps\":[{\"id\":\"string\",\"scraper\":\"amazon.pulse\",\"condition\":\"all\",\"routes\":[null]}]},\"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,
"pipeline": {
"entry": "string",
"baseline": "string",
"refresh": {
"every_runs": 0,
"entry": "string"
},
"steps": [
{
"id": "string",
"scraper": "amazon.pulse",
"condition": "all",
"routes": [
null
]
}
]
},
"default_pipeline": true,
"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_runsintegerpipelineobjectrun), the webhook (notify), or both. Chains cannot loop.Show child parameters
entrystringbaselinestringentry.refreshobjectShow child parameters
every_runsintegerrequiredentrystringrequiredstepsobject[]requiredShow child parameters
idstringrequiredscraperstringrequiredconditionstringamazon.offers only.routesobject[]default_pipelinebooleanwebhook_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 lite 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://scrapelyserp.com /api/v1/watchlists/{id} Parameters
idstringpathrequiredwl_…).cURL
curl -X GET "https://scrapelyserp.com/api/v1/watchlists/{id}"TypeScript
const res = await fetch('https://scrapelyserp.com/api/v1/watchlists/{id}', {
method: 'GET',
});
const data = await res.json();Python
import requests
res = requests.request(
"GET",
"https://scrapelyserp.com/api/v1/watchlists/{id}",
)
data = res.json()Go
package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "https://scrapelyserp.com/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://scrapelyserp.com/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://scrapelyserp.com/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://scrapelyserp.com/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,
"pipeline": {
"entry": "string",
"baseline": "string",
"refresh": {
"every_runs": 0,
"entry": "string"
},
"steps": [
{
"id": "string",
"scraper": "amazon.pulse",
"condition": "all",
"routes": [
null
]
}
]
},
"default_pipeline": true,
"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_runsintegerpipelineobjectrun), the webhook (notify), or both. Chains cannot loop.Show child parameters
entrystringbaselinestringentry.refreshobjectShow child parameters
every_runsintegerrequiredentrystringrequiredstepsobject[]requiredShow child parameters
idstringrequiredscraperstringrequiredconditionstringamazon.offers only.routesobject[]default_pipelinebooleanwebhook_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 lite 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://scrapelyserp.com /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://scrapelyserp.com/api/v1/watchlists/{id}"TypeScript
const res = await fetch('https://scrapelyserp.com/api/v1/watchlists/{id}', {
method: 'DELETE',
});
const data = await res.json();Python
import requests
res = requests.request(
"DELETE",
"https://scrapelyserp.com/api/v1/watchlists/{id}",
)
data = res.json()Go
package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("DELETE", "https://scrapelyserp.com/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://scrapelyserp.com/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://scrapelyserp.com/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://scrapelyserp.com/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://scrapelyserp.com /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 every subscribed endpoint).webhook_endpoint_idstringwebhook_url: a registered endpoint's id.refresh_every_runsintegerpipelineWatchlistPipelinenull goes back to the platform default. Each item keeps what it last showed.Show child parameters
entrystringbaselinestringentry.refreshobjectShow child parameters
every_runsintegerrequiredentrystringrequiredstepsobject[]requiredShow child parameters
idstringrequiredscraperstringrequiredconditionstringamazon.offers only.routesobject[]statusstring{
"name": "string",
"every": "1h",
"webhook_url": "string",
"webhook_endpoint_id": "string",
"refresh_every_runs": 0,
"pipeline": {
"entry": "string",
"baseline": "string",
"refresh": {
"every_runs": null,
"entry": null
},
"steps": [
{
"id": null,
"scraper": null,
"condition": null,
"routes": null
}
]
},
"status": "active"
}cURL
curl -X PATCH "https://scrapelyserp.com/api/v1/watchlists/{id}" \
-H "Content-Type: application/json" \
-d '{"name":"string","every":"1h","webhook_url":"string","webhook_endpoint_id":"string","refresh_every_runs":0,"pipeline":{"entry":"string","baseline":"string","refresh":{"every_runs":null,"entry":null},"steps":[{"id":null,"scraper":null,"condition":null,"routes":null}]},"status":"active"}'TypeScript
const res = await fetch('https://scrapelyserp.com/api/v1/watchlists/{id}', {
method: 'PATCH',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({"name":"string","every":"1h","webhook_url":"string","webhook_endpoint_id":"string","refresh_every_runs":0,"pipeline":{"entry":"string","baseline":"string","refresh":{"every_runs":null,"entry":null},"steps":[{"id":null,"scraper":null,"condition":null,"routes":null}]},"status":"active"}),
});
const data = await res.json();Python
import requests
res = requests.request(
"PATCH",
"https://scrapelyserp.com/api/v1/watchlists/{id}",
headers={
"Content-Type": "application/json",
},
json={"name": "string", "every": "1h", "webhook_url": "string", "webhook_endpoint_id": "string", "refresh_every_runs": 0, "pipeline": {"entry": "string", "baseline": "string", "refresh": {"every_runs": None, "entry": None}, "steps": [{"id": None, "scraper": None, "condition": None, "routes": None}]}, "status": "active"},
)
data = res.json()Go
package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
req, _ := http.NewRequest("PATCH", "https://scrapelyserp.com/api/v1/watchlists/{id}", strings.NewReader(`{"name":"string","every":"1h","webhook_url":"string","webhook_endpoint_id":"string","refresh_every_runs":0,"pipeline":{"entry":"string","baseline":"string","refresh":{"every_runs":null,"entry":null},"steps":[{"id":null,"scraper":null,"condition":null,"routes":null}]},"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://scrapelyserp.com/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","webhook_endpoint_id":"string","refresh_every_runs":0,"pipeline":{"entry":"string","baseline":"string","refresh":{"every_runs":null,"entry":null},"steps":[{"id":null,"scraper":null,"condition":null,"routes":null}]},"status":"active"}');
$response = curl_exec($ch);
curl_close($ch);
echo $response;Ruby
require 'net/http'
require 'uri'
uri = URI('https://scrapelyserp.com/api/v1/watchlists/{id}')
req = Net::HTTP::Patch.new(uri)
req['Content-Type'] = 'application/json'
req.body = '{"name":"string","every":"1h","webhook_url":"string","webhook_endpoint_id":"string","refresh_every_runs":0,"pipeline":{"entry":"string","baseline":"string","refresh":{"every_runs":null,"entry":null},"steps":[{"id":null,"scraper":null,"condition":null,"routes":null}]},"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://scrapelyserp.com/api/v1/watchlists/{id}"))
.header("Content-Type", "application/json")
.method("PATCH", BodyPublishers.ofString("{\"name\":\"string\",\"every\":\"1h\",\"webhook_url\":\"string\",\"webhook_endpoint_id\":\"string\",\"refresh_every_runs\":0,\"pipeline\":{\"entry\":\"string\",\"baseline\":\"string\",\"refresh\":{\"every_runs\":null,\"entry\":null},\"steps\":[{\"id\":null,\"scraper\":null,\"condition\":null,\"routes\":null}]},\"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,
"pipeline": {
"entry": "string",
"baseline": "string",
"refresh": {
"every_runs": 0,
"entry": "string"
},
"steps": [
{
"id": "string",
"scraper": "amazon.pulse",
"condition": "all",
"routes": [
null
]
}
]
},
"default_pipeline": true,
"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_runsintegerpipelineobjectrun), the webhook (notify), or both. Chains cannot loop.Show child parameters
entrystringbaselinestringentry.refreshobjectShow child parameters
every_runsintegerrequiredentrystringrequiredstepsobject[]requiredShow child parameters
idstringrequiredscraperstringrequiredconditionstringamazon.offers only.routesobject[]default_pipelinebooleanwebhook_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 lite 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://scrapelyserp.com /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://scrapelyserp.com/api/v1/watchlists/{id}/asins" \
-H "Content-Type: application/json" \
-d '{"add":["string"],"remove":["string"]}'TypeScript
const res = await fetch('https://scrapelyserp.com/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://scrapelyserp.com/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://scrapelyserp.com/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://scrapelyserp.com/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://scrapelyserp.com/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://scrapelyserp.com/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://scrapelyserp.com /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://scrapelyserp.com/api/v1/watchlists/{id}/run"TypeScript
const res = await fetch('https://scrapelyserp.com/api/v1/watchlists/{id}/run', {
method: 'POST',
});
const data = await res.json();Python
import requests
res = requests.request(
"POST",
"https://scrapelyserp.com/api/v1/watchlists/{id}/run",
)
data = res.json()Go
package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("POST", "https://scrapelyserp.com/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://scrapelyserp.com/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://scrapelyserp.com/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://scrapelyserp.com/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,
"entry": "string",
"new_items": 0,
"steps": {},
"matched": 0,
"sweep_tier": "pulse",
"calls": {
"pulse": null,
"lite": 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
trackedintegerentrystringnew_itemsintegerstepsobjectmatchedintegerchanged.sweep_tierstringdeprecatedpulse, or lite on a refresh run. One-tier platforms: their one tier.callsobjectdeprecatedShow child parameters
pulseobjectliteobjectfullobjectescalatedobjectdeprecatedShow 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://scrapelyserp.com /api/v1/watchlists/scrapers What a pipeline step can run on a platform: each scraper, what it reads, its credits per item, the fields its routes can test and whether it is available in the marketplace; plus ready-made templates. Free.
Parameters
platformstringquerymarketplacestringquerycURL
curl -X GET "https://scrapelyserp.com/api/v1/watchlists/scrapers?platform=&marketplace="TypeScript
const res = await fetch('https://scrapelyserp.com/api/v1/watchlists/scrapers?platform=&marketplace=', {
method: 'GET',
});
const data = await res.json();Python
import requests
res = requests.request(
"GET",
"https://scrapelyserp.com/api/v1/watchlists/scrapers?platform=&marketplace=",
)
data = res.json()Go
package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "https://scrapelyserp.com/api/v1/watchlists/scrapers?platform=&marketplace=", 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://scrapelyserp.com/api/v1/watchlists/scrapers?platform=&marketplace=');
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://scrapelyserp.com/api/v1/watchlists/scrapers?platform=&marketplace=')
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://scrapelyserp.com/api/v1/watchlists/scrapers?platform=&marketplace="))
.GET()
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());Responses
Example
{
"object": {},
"platform": "string",
"marketplace": "string",
"branches": [
"string"
],
"ops": [
"string"
],
"data": [
{
"id": "string",
"name": "string",
"description": "string",
"credits_per_item": "string",
"reads": "string",
"input": "item",
"fields": [
{
"key": null,
"label": null,
"type": null
}
],
"available": true
}
],
"templates": [
{
"id": "string",
"name": "string",
"description": "string",
"pipeline": {
"entry": "string",
"baseline": null,
"refresh": null,
"steps": [
null
]
}
}
]
}Schema
objectplatformstringmarketplacestringbranchesstring[]opsstring[]dataobject[]Show child parameters
idstringnamestringdescriptionstringcredits_per_itemstringreadsstringinputstringfieldsobject[]Show child parameters
keystringlabelstringtypestringavailablebooleantemplatesobject[]Show child parameters
idstringnamestringdescriptionstringpipelineobjectrun), the webhook (notify), or both. Chains cannot loop.Show child parameters
entrystringbaselinestringentry.refreshobjectstepsobject[]requiredMISSING_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.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://scrapelyserp.com /api/v1/watchlists/{id}/runs Newest first; the newest 500 are kept.
Parameters
idstringpathrequiredwl_…).limitintegerquerycURL
curl -X GET "https://scrapelyserp.com/api/v1/watchlists/{id}/runs?limit="TypeScript
const res = await fetch('https://scrapelyserp.com/api/v1/watchlists/{id}/runs?limit=', {
method: 'GET',
});
const data = await res.json();Python
import requests
res = requests.request(
"GET",
"https://scrapelyserp.com/api/v1/watchlists/{id}/runs?limit=",
)
data = res.json()Go
package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "https://scrapelyserp.com/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://scrapelyserp.com/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://scrapelyserp.com/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://scrapelyserp.com/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,
"entry": null,
"new_items": null,
"steps": null,
"matched": 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
trackedintegerentrystringnew_itemsintegerstepsobjectmatchedintegerchanged.sweep_tierstringdeprecatedpulse, or lite on a refresh run. One-tier platforms: their one tier.callsobjectdeprecatedescalatedobjectdeprecateddeferredintegerchangedintegerdelistedintegerretry_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://scrapelyserp.com /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://scrapelyserp.com/api/v1/watchlists/{id}/items?changed_since=&state=&limit=&starting_after="TypeScript
const res = await fetch('https://scrapelyserp.com/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://scrapelyserp.com/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://scrapelyserp.com/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://scrapelyserp.com/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://scrapelyserp.com/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://scrapelyserp.com/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://scrapelyserp.com /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://scrapelyserp.com/api/v1/watchlists/{id}/items" \
-H "Content-Type: application/json" \
-d '{"add":["string"],"remove":["string"]}'TypeScript
const res = await fetch('https://scrapelyserp.com/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://scrapelyserp.com/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://scrapelyserp.com/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://scrapelyserp.com/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://scrapelyserp.com/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://scrapelyserp.com/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