Watchlists

Embed
Preview of the card
<a href="https://scrapelyserp.com/docs/ref-watchlists"><img src="https://scrapelyserp.com/docs/_api/public/orgs/affc5b0f-d3c2-423a-8143-9d10db5736ae/spaces/981e6275-da3f-446c-82de-889f59c83b6f/pages/c30bb652-b5cc-4b4a-b569-6f0117095a80/social-card.svg?v=3e7ae33eec8b" alt="Watchlists" width="600" height="315"></a>
GEThttps://scrapelyserp.com/api/v1/watchlists
List watchlists
Parameters
limitintegerquery
= 100
Code samples
cURL
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.body
Java
import java.net.URI;
import java.net.http.*;
import java.net.http.HttpRequest.BodyPublishers;

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://scrapelyserp.com/api/v1/watchlists?limit="))
    .GET()
    .build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
Responses
200 Newest first.
Example
{
  "object": {},
  "data": [
    {
      "id": "wl_3f1c2a9e8d4b4c61",
      "object": {},
      "name": "string",
      "platform": "amazon",
      "marketplace": "us",
      "currency": "USD",
      "status": "active",
      "paused_reason": "user",
      "every": "15m",
      "every_seconds": 0,
      "refresh_every_runs": 0,
      "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
object
dataWatchlist[]
Show child parameters
idstring
object
namestring
platformstring
Whose item ids the list holds (id on each item).
marketplacestring
Every run fetches the list here.
currencystring
The currency of every price in its snapshots, changes and webhooks.
statusstring
active | paused
paused_reasonstring
everystring
every_secondsinteger
refresh_every_runsinteger
pipelineobject
Up to 10 steps, each running one scraper over the items sent to it; its routes send the items on a branch to another step (run), the webhook (notify), or both. Chains cannot loop.
Show child parameters
entrystring
The step every run starts with. Default: the first step.
baselinestring
Where items never read before start instead. Default: entry.
refreshobject
stepsobject[]required
default_pipelineboolean
True when the list runs its platform default.
webhook_urlstring
item_countinteger
Items on the list, every state.
items_by_stateobject
Show child parameters
newinteger
activeinteger
delistedinteger
asin_countintegerdeprecated
Deprecated alias, same value as item_count (every platform).
asins_by_stateobjectdeprecated
Deprecated alias, same value as items_by_state (every platform).
Show child parameters
newinteger
activeinteger
delistedinteger
estimated_creditsobject
Up-front cost of the next runs: a sweep run with nothing changed (Amazon: pulse), a refresh run, and the one-off baseline fetch of new items (newAsins, on every platform). On Amazon, escalations add lite credits per moved ASIN.
Show child parameters
pulseRuninteger
refreshRuninteger
newAsinsinteger
run_countinteger
consecutive_skipsinteger
Runs skipped in a row for credits; the third pauses the list.
last_run_atstring
last_run_statusstring
next_run_atstring
null while paused.
created_atstring
updated_atstring
urlstring
has_moreboolean
401 UNAUTHORIZED: missing, unknown or revoked key.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
429 RATE_LIMITED or CONCURRENCY_LIMIT. Honour Retry-After.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
500 INTERNAL: our fault, not charged. Quote X-Request-Id.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
POSThttps://scrapelyserp.com/api/v1/watchlists
Create a watchlist

Track up to 50,000 items of one platform and marketplace on a cadence (at most 100 lists per account). Creating is free. Send the item ids in ids (every platform); asins is still accepted on Amazon as a legacy alias. 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-Keystringheader
Retrying with the same key returns the original response (Idempotent-Replayed: true) instead of creating a second list. Remembered 24 hours.
Request body application/json
namestringrequired
idsstring[]required
1 to 50,000 item ids of platform (ASINs, item ids, TCINs, SKUs…; de-duplicated). A newline- or comma-separated string is also accepted.
asinsstring[]deprecated
Amazon only, legacy: the same as ids (ASINs are case-insensitive). Send ids or asins, not both.
everystringrequired
Cadence, start to start: whole minutes, hours or days, at least 5 minutes, at most 7 days. E.g. 5m, 15m, 1h, 6h, 24h.
webhook_urlstring
One of your registered webhook endpoints (/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_idstring
Alternative to webhook_url: the endpoint's id (we_…). Send one or the other.
refresh_every_runsinteger
Default pipeline on Amazon: every Nth run sweeps every ASIN at lite 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.
= 8
pipelineobject
What each run does. Omitted: the platform default.
Show child parameters
entrystring
The step every run starts with. Default: the first step.
baselinestring
Where items never read before start instead. Default: entry.
refreshobject
Show child parameters
every_runsintegerrequired
entrystringrequired
stepsobject[]required
Show child parameters
idstringrequired
scraperstringrequired
GET /v1/watchlists/scrapers lists them with their fields.
amazon.pulse | amazon.lite | amazon.full | amazon.offers | amazon.offer_check | walmart.standard | target.standard | bestbuy.standard
conditionstring
amazon.offers only.
all | new | used
routesobject[]
platformstring
Which platform to read. Platforms: amazon (live: us; coming soon: uk, de, fr, it, es, ca, mx, jp, au, in, br, nl, se, pl), walmart (live: us), ebay (coming soon), target (live: us), bestbuy (live: us; coming soon: ca), aliexpress (coming soon). A coming-soon platform or marketplace answers 501 NOT_IMPLEMENTED with "coming_soon": true (nothing charged); an unknown one is a 400 listing the valid values. GET /v1/platforms has the full list.
= amazon
marketplacestring
The platform's regional storefront (us, uk, de…); default the platform's main one. Prices come back in its currency.
= us
{
  "name": "string",
  "ids": [
    "string"
  ],
  "asins": [
    "string"
  ],
  "every": "15m",
  "webhook_url": "string",
  "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"
}
Code samples
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.body
Java
import java.net.URI;
import java.net.http.*;
import java.net.http.HttpRequest.BodyPublishers;

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://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
201 Created; the first run is due now.
Example
{
  "id": "wl_3f1c2a9e8d4b4c61",
  "object": {},
  "name": "string",
  "platform": "amazon",
  "marketplace": "us",
  "currency": "USD",
  "status": "active",
  "paused_reason": "user",
  "every": "15m",
  "every_seconds": 0,
  "refresh_every_runs": 0,
  "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
idstring
object
namestring
platformstring
Whose item ids the list holds (id on each item).
marketplacestring
Every run fetches the list here.
currencystring
The currency of every price in its snapshots, changes and webhooks.
statusstring
active | paused
paused_reasonstring
everystring
every_secondsinteger
refresh_every_runsinteger
pipelineobject
Up to 10 steps, each running one scraper over the items sent to it; its routes send the items on a branch to another step (run), the webhook (notify), or both. Chains cannot loop.
Show child parameters
entrystring
The step every run starts with. Default: the first step.
baselinestring
Where items never read before start instead. Default: entry.
refreshobject
Show child parameters
every_runsintegerrequired
entrystringrequired
stepsobject[]required
Show child parameters
idstringrequired
scraperstringrequired
GET /v1/watchlists/scrapers lists them with their fields.
amazon.pulse | amazon.lite | amazon.full | amazon.offers | amazon.offer_check | walmart.standard | target.standard | bestbuy.standard
conditionstring
amazon.offers only.
all | new | used
routesobject[]
default_pipelineboolean
True when the list runs its platform default.
webhook_urlstring
item_countinteger
Items on the list, every state.
items_by_stateobject
Show child parameters
newinteger
activeinteger
delistedinteger
asin_countintegerdeprecated
Deprecated alias, same value as item_count (every platform).
asins_by_stateobjectdeprecated
Deprecated alias, same value as items_by_state (every platform).
Show child parameters
newinteger
activeinteger
delistedinteger
estimated_creditsobject
Up-front cost of the next runs: a sweep run with nothing changed (Amazon: pulse), a refresh run, and the one-off baseline fetch of new items (newAsins, on every platform). On Amazon, escalations add lite credits per moved ASIN.
Show child parameters
pulseRuninteger
refreshRuninteger
newAsinsinteger
run_countinteger
consecutive_skipsinteger
Runs skipped in a row for credits; the third pauses the list.
last_run_atstring
last_run_statusstring
next_run_atstring
null while paused.
created_atstring
updated_atstring
urlstring
400 MISSING_PARAM or INVALID_PARAM; param names the culprit.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
401 UNAUTHORIZED: missing, unknown or revoked key.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
403 DEMO_READ_ONLY.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
409 CONFLICT: idempotent request in flight, or the job is already running/done.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
422 INVALID_PARAM with param: idempotency_key: the key was used for a different request.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
429 RATE_LIMITED or CONCURRENCY_LIMIT. Honour Retry-After.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
500 INTERNAL: our fault, not charged. Quote X-Request-Id.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
GEThttps://scrapelyserp.com/api/v1/watchlists/{id}
Get a watchlist
Parameters
idstringpathrequired
The watchlist id (wl_…).
Code samples
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.body
Java
import java.net.URI;
import java.net.http.*;
import java.net.http.HttpRequest.BodyPublishers;

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://scrapelyserp.com/api/v1/watchlists/{id}"))
    .GET()
    .build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
Responses
200 The watchlist, with item counts per state and credit estimates.
Example
{
  "id": "wl_3f1c2a9e8d4b4c61",
  "object": {},
  "name": "string",
  "platform": "amazon",
  "marketplace": "us",
  "currency": "USD",
  "status": "active",
  "paused_reason": "user",
  "every": "15m",
  "every_seconds": 0,
  "refresh_every_runs": 0,
  "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
idstring
object
namestring
platformstring
Whose item ids the list holds (id on each item).
marketplacestring
Every run fetches the list here.
currencystring
The currency of every price in its snapshots, changes and webhooks.
statusstring
active | paused
paused_reasonstring
everystring
every_secondsinteger
refresh_every_runsinteger
pipelineobject
Up to 10 steps, each running one scraper over the items sent to it; its routes send the items on a branch to another step (run), the webhook (notify), or both. Chains cannot loop.
Show child parameters
entrystring
The step every run starts with. Default: the first step.
baselinestring
Where items never read before start instead. Default: entry.
refreshobject
Show child parameters
every_runsintegerrequired
entrystringrequired
stepsobject[]required
Show child parameters
idstringrequired
scraperstringrequired
GET /v1/watchlists/scrapers lists them with their fields.
amazon.pulse | amazon.lite | amazon.full | amazon.offers | amazon.offer_check | walmart.standard | target.standard | bestbuy.standard
conditionstring
amazon.offers only.
all | new | used
routesobject[]
default_pipelineboolean
True when the list runs its platform default.
webhook_urlstring
item_countinteger
Items on the list, every state.
items_by_stateobject
Show child parameters
newinteger
activeinteger
delistedinteger
asin_countintegerdeprecated
Deprecated alias, same value as item_count (every platform).
asins_by_stateobjectdeprecated
Deprecated alias, same value as items_by_state (every platform).
Show child parameters
newinteger
activeinteger
delistedinteger
estimated_creditsobject
Up-front cost of the next runs: a sweep run with nothing changed (Amazon: pulse), a refresh run, and the one-off baseline fetch of new items (newAsins, on every platform). On Amazon, escalations add lite credits per moved ASIN.
Show child parameters
pulseRuninteger
refreshRuninteger
newAsinsinteger
run_countinteger
consecutive_skipsinteger
Runs skipped in a row for credits; the third pauses the list.
last_run_atstring
last_run_statusstring
next_run_atstring
null while paused.
created_atstring
updated_atstring
urlstring
401 UNAUTHORIZED: missing, unknown or revoked key.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
404 NOT_FOUND.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
429 RATE_LIMITED or CONCURRENCY_LIMIT. Honour Retry-After.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
500 INTERNAL: our fault, not charged. Quote X-Request-Id.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
DELETEhttps://scrapelyserp.com/api/v1/watchlists/{id}
Delete a watchlist

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

Parameters
idstringpathrequired
The watchlist id (wl_…).
Code samples
cURL
curl -X DELETE "https://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.body
Java
import java.net.URI;
import java.net.http.*;
import java.net.http.HttpRequest.BodyPublishers;

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

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

Parameters
idstringpathrequired
The watchlist id (wl_…).
Request body application/json
namestring
everystring
webhook_urlstring
A registered endpoint URL; null clears it (events go to every subscribed endpoint).
webhook_endpoint_idstring
Alternative to webhook_url: a registered endpoint's id.
refresh_every_runsinteger
pipelineWatchlistPipeline
null goes back to the platform default. Each item keeps what it last showed.
Show child parameters
entrystring
The step every run starts with. Default: the first step.
baselinestring
Where items never read before start instead. Default: entry.
refreshobject
Show child parameters
every_runsintegerrequired
entrystringrequired
stepsobject[]required
Show child parameters
idstringrequired
scraperstringrequired
GET /v1/watchlists/scrapers lists them with their fields.
amazon.pulse | amazon.lite | amazon.full | amazon.offers | amazon.offer_check | walmart.standard | target.standard | bestbuy.standard
conditionstring
amazon.offers only.
all | new | used
routesobject[]
statusstring
Resuming clears an auto-pause and its skip count.
active | paused
{
  "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"
}
Code samples
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.body
Java
import java.net.URI;
import java.net.http.*;
import java.net.http.HttpRequest.BodyPublishers;

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://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
200 Updated.
Example
{
  "id": "wl_3f1c2a9e8d4b4c61",
  "object": {},
  "name": "string",
  "platform": "amazon",
  "marketplace": "us",
  "currency": "USD",
  "status": "active",
  "paused_reason": "user",
  "every": "15m",
  "every_seconds": 0,
  "refresh_every_runs": 0,
  "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
idstring
object
namestring
platformstring
Whose item ids the list holds (id on each item).
marketplacestring
Every run fetches the list here.
currencystring
The currency of every price in its snapshots, changes and webhooks.
statusstring
active | paused
paused_reasonstring
everystring
every_secondsinteger
refresh_every_runsinteger
pipelineobject
Up to 10 steps, each running one scraper over the items sent to it; its routes send the items on a branch to another step (run), the webhook (notify), or both. Chains cannot loop.
Show child parameters
entrystring
The step every run starts with. Default: the first step.
baselinestring
Where items never read before start instead. Default: entry.
refreshobject
Show child parameters
every_runsintegerrequired
entrystringrequired
stepsobject[]required
Show child parameters
idstringrequired
scraperstringrequired
GET /v1/watchlists/scrapers lists them with their fields.
amazon.pulse | amazon.lite | amazon.full | amazon.offers | amazon.offer_check | walmart.standard | target.standard | bestbuy.standard
conditionstring
amazon.offers only.
all | new | used
routesobject[]
default_pipelineboolean
True when the list runs its platform default.
webhook_urlstring
item_countinteger
Items on the list, every state.
items_by_stateobject
Show child parameters
newinteger
activeinteger
delistedinteger
asin_countintegerdeprecated
Deprecated alias, same value as item_count (every platform).
asins_by_stateobjectdeprecated
Deprecated alias, same value as items_by_state (every platform).
Show child parameters
newinteger
activeinteger
delistedinteger
estimated_creditsobject
Up-front cost of the next runs: a sweep run with nothing changed (Amazon: pulse), a refresh run, and the one-off baseline fetch of new items (newAsins, on every platform). On Amazon, escalations add lite credits per moved ASIN.
Show child parameters
pulseRuninteger
refreshRuninteger
newAsinsinteger
run_countinteger
consecutive_skipsinteger
Runs skipped in a row for credits; the third pauses the list.
last_run_atstring
last_run_statusstring
next_run_atstring
null while paused.
created_atstring
updated_atstring
urlstring
400 MISSING_PARAM or INVALID_PARAM; param names the culprit.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
401 UNAUTHORIZED: missing, unknown or revoked key.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
404 NOT_FOUND.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
429 RATE_LIMITED or CONCURRENCY_LIMIT. Honour Retry-After.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
500 INTERNAL: our fault, not charged. Quote X-Request-Id.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
POSThttps://scrapelyserp.com/api/v1/watchlists/{id}/asins
Add or remove items (legacy path)

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

Parameters
idstringpathrequired
The watchlist id (wl_…).
Request body application/json
addstring[]
Item ids to add.
removestring[]
Item ids to remove.
{
  "add": [
    "string"
  ],
  "remove": [
    "string"
  ]
}
Code samples
cURL
curl -X POST "https://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.body
Java
import java.net.URI;
import java.net.http.*;
import java.net.http.HttpRequest.BodyPublishers;

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

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

Parameters
idstringpathrequired
The watchlist id (wl_…).
Code samples
cURL
curl -X POST "https://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.body
Java
import java.net.URI;
import java.net.http.*;
import java.net.http.HttpRequest.BodyPublishers;

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://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
202 Started.
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
idstring
object
watchlist_idstring
run_numberinteger
triggerstring
schedule | manual
kindstring
pulse | refresh
statusstring
running | completed | insufficient_credits | failed
creditsinteger
Charged, after refunds.
statsobject
Show child parameters
trackedinteger
entrystring
The step the run started from.
new_itemsinteger
Items read for the first time.
stepsobject
Per step that ran, in run order.
matchedinteger
Items a notify rule matched on a branch other than changed.
sweep_tierstringdeprecated
Runs before pipelines. Amazon: pulse, or lite on a refresh run. One-tier platforms: their one tier.
callsobjectdeprecated
Runs before pipelines, keyed by tier.
Show child parameters
pulseobject
liteobject
fullobject
escalatedobjectdeprecated
Show child parameters
changedinteger
buybox_above_lowestinteger
pendinginteger
deferredinteger
Step items postponed to the next run: the balance could not cover them.
changedinteger
delistedinteger
retry_next_runinteger
partial + unavailable items (free, retried next run, never a change).
credits_neededinteger
On insufficient_credits: what the run needed up front.
errorstring
started_atstring
finished_atstring
runs_urlstring
401 UNAUTHORIZED: missing, unknown or revoked key.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
404 NOT_FOUND.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
409 CONFLICT: idempotent request in flight, or the job is already running/done.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
429 RATE_LIMITED or CONCURRENCY_LIMIT. Honour Retry-After.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
500 INTERNAL: our fault, not charged. Quote X-Request-Id.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
GEThttps://scrapelyserp.com/api/v1/watchlists/scrapers
List pipeline 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
platformstringquery
= amazon
marketplacestringquery
= us
Code samples
cURL
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.body
Java
import java.net.URI;
import java.net.http.*;
import java.net.http.HttpRequest.BodyPublishers;

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://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
200 Scrapers and templates.
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
object
platformstring
marketplacestring
branchesstring[]
opsstring[]
dataobject[]
Show child parameters
idstring
namestring
descriptionstring
credits_per_itemstring
readsstring
inputstring
item | offer
fieldsobject[]
Show child parameters
keystring
labelstring
typestring
number | money | boolean | text
availableboolean
templatesobject[]
Show child parameters
idstring
namestring
descriptionstring
pipelineobject
Up to 10 steps, each running one scraper over the items sent to it; its routes send the items on a branch to another step (run), the webhook (notify), or both. Chains cannot loop.
Show child parameters
entrystring
The step every run starts with. Default: the first step.
baselinestring
Where items never read before start instead. Default: entry.
refreshobject
stepsobject[]required
400 MISSING_PARAM or INVALID_PARAM; param names the culprit.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
401 UNAUTHORIZED: missing, unknown or revoked key.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
429 RATE_LIMITED or CONCURRENCY_LIMIT. Honour Retry-After.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
500 INTERNAL: our fault, not charged. Quote X-Request-Id.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
GEThttps://scrapelyserp.com/api/v1/watchlists/{id}/runs
List runs

Newest first; the newest 500 are kept.

Parameters
idstringpathrequired
The watchlist id (wl_…).
limitintegerquery
= 20
Code samples
cURL
curl -X GET "https://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.body
Java
import java.net.URI;
import java.net.http.*;
import java.net.http.HttpRequest.BodyPublishers;

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://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
200 Runs.
Example
{
  "object": {},
  "data": [
    {
      "id": "wlrun_5f0c8a1b2d3e4f56",
      "object": {},
      "watchlist_id": "string",
      "run_number": 0,
      "trigger": "schedule",
      "kind": "pulse",
      "status": "running",
      "credits": 0,
      "stats": {
        "tracked": null,
        "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
object
dataWatchlistRun[]
Show child parameters
idstring
object
watchlist_idstring
run_numberinteger
triggerstring
schedule | manual
kindstring
pulse | refresh
statusstring
running | completed | insufficient_credits | failed
creditsinteger
Charged, after refunds.
statsobject
Show child parameters
trackedinteger
entrystring
The step the run started from.
new_itemsinteger
Items read for the first time.
stepsobject
Per step that ran, in run order.
matchedinteger
Items a notify rule matched on a branch other than changed.
sweep_tierstringdeprecated
Runs before pipelines. Amazon: pulse, or lite on a refresh run. One-tier platforms: their one tier.
callsobjectdeprecated
Runs before pipelines, keyed by tier.
escalatedobjectdeprecated
deferredinteger
Step items postponed to the next run: the balance could not cover them.
changedinteger
delistedinteger
retry_next_runinteger
partial + unavailable items (free, retried next run, never a change).
credits_neededinteger
On insufficient_credits: what the run needed up front.
errorstring
started_atstring
finished_atstring
has_moreboolean
401 UNAUTHORIZED: missing, unknown or revoked key.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
404 NOT_FOUND.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
429 RATE_LIMITED or CONCURRENCY_LIMIT. Honour Retry-After.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
500 INTERNAL: our fault, not charged. Quote X-Request-Id.
Example
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "string",
    "param": "string",
    "docs": "/docs/errors#insufficient_credits"
  }
}
Schema
errorobjectrequired
Show child parameters
codestringrequired
Stable, machine-readable. Branch on this, never on message.
MISSING_PARAM | INVALID_PARAM | UNAUTHORIZED | DEMO_READ_ONLY | INSUFFICIENT_CREDITS | NOT_FOUND | CONFLICT | CONCURRENCY_LIMIT | RATE_LIMITED | TARGET_FAILED | UNAVAILABLE | NOT_IMPLEMENTED | INTERNAL
messagestringrequired
Human-readable; may change.
paramstring
The parameter at fault, when there is one.
docsstring
Link to this code on /docs/errors.
GEThttps://scrapelyserp.com/api/v1/watchlists/{id}/items
List items

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

Parameters
idstringpathrequired
The watchlist id (wl_…).
changed_sincestringquery
ISO 8601 or epoch milliseconds.
statestringquery
new | active | delisted
limitintegerquery
= 100
starting_afterstringquery
next_starting_after from the previous page.
Code samples
cURL
curl -X GET "https://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.body
Java
import java.net.URI;
import java.net.http.*;
import java.net.http.HttpRequest.BodyPublishers;

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

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

Parameters
idstringpathrequired
The watchlist id (wl_…).
Request body application/json
addstring[]
Item ids to add.
removestring[]
Item ids to remove.
{
  "add": [
    "string"
  ],
  "remove": [
    "string"
  ]
}
Code samples
cURL
curl -X POST "https://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.body
Java
import java.net.URI;
import java.net.http.*;
import java.net.http.HttpRequest.BodyPublishers;

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