Install
openclaw skills install @scavio-ai/scavio-ebaySearch live or SOLD eBay listings, read a listing in full, and look up a seller's profile card as structured JSON. 3 endpoints, 1 credit each. Sold-listing search is the price-research feature eBay itself hides.
openclaw skills install @scavio-ai/scavio-ebaySearch eBay's live listings or its SOLD listings, read a single listing in full, and pull a seller's public profile card. All endpoints return structured JSON and cost 1 credit each.
Use this skill when the user asks to:
Get a free API key at https://scavio.dev (50 free credits to get started, no card required):
export SCAVIO_API_KEY=sk_live_your_key
Every request is a POST with a JSON body and:
Authorization: Bearer $SCAVIO_API_KEY
Base URL: https://api.scavio.dev. Every endpoint costs 1 credit.
| Endpoint | Credits | Description |
|---|---|---|
POST /api/v1/ebay/search | 1 | Search live or sold listings: price, condition, bids, shipping, seller, feedback |
POST /api/v1/ebay/product | 1 | One listing in full: images, item specifics, shipping, returns, auction state, seller |
POST /api/v1/ebay/seller | 1 | Seller profile card: store name, feedback score and percentage, items sold, followers, location, categories |
/ebay/search with query and sold: true. This is the differentiating call. It searches completed listings that actually sold, which is what a comp is./ebay/search with query and no sold flag./ebay/product with item_id (the eBay item number, or a full ebay.com/itm/... URL — tracking parameters are discarded)./ebay/search with seller set and NO query. That is the paginated route through a seller's catalogue./ebay/seller with the username as it appears in ebay.com/usr/<name>./search paginates with page. /product and /seller do not paginate.
/search)query or seller is required. At least one must be present.
| Parameter | Type | Default | Description |
|---|---|---|---|
query | string | one of | Search keywords (1-500 chars) |
seller | string | one of | Scope to one seller (1-64 chars). Usable with NO query to page their whole catalogue |
page | integer >= 1 | -- | Results page, 1-based |
per_page | integer | 60 | Accepts ONLY 60, 120 or 240 |
sort_by | string | best_match | best_match, ending_soonest, newly_listed, price_low, price_high |
min_price | number >= 0 | -- | Minimum price filter |
max_price | number >= 0 | -- | Maximum price filter |
condition | string | -- | new, open_box, refurbished, used, for_parts |
buying_format | string | -- | auction, buy_it_now, best_offer |
free_shipping | boolean | -- | Only listings with free shipping |
sold | boolean | -- | Search completed listings that actually SOLD |
category_id | string | -- | Numeric eBay category id, e.g. 112529 |
/product)| Parameter | Type | Default | Description |
|---|---|---|---|
item_id | string | required | eBay item number (e.g. 168591664725) or a full ebay.com/itm/... URL |
/seller)| Parameter | Type | Default | Description |
|---|---|---|---|
seller | string | required | eBay username as in ebay.com/usr/<name>, e.g. red-rock-uk (1-64 chars) |
import os, requests
BASE = "https://api.scavio.dev"
HEADERS = {"Authorization": f"Bearer {os.environ['SCAVIO_API_KEY']}"}
# 1. What did it actually sell for? (the price-research call)
sold = requests.post(f"{BASE}/api/v1/ebay/search", headers=HEADERS,
json={"query": "nintendo switch oled", "sold": True, "condition": "used"}).json()
# 2. Live listings, cheapest first, 120 per page
live = requests.post(f"{BASE}/api/v1/ebay/search", headers=HEADERS,
json={"query": "nintendo switch oled", "sort_by": "price_low", "per_page": 120}).json()
# 3. One listing in full
item = requests.post(f"{BASE}/api/v1/ebay/product", headers=HEADERS,
json={"item_id": "168591664725"}).json()
# 4. A seller's whole catalogue: /search with seller and no query
catalogue = requests.post(f"{BASE}/api/v1/ebay/search", headers=HEADERS,
json={"seller": "red-rock-uk", "page": 1}).json()
# 5. That seller's reputation card
profile = requests.post(f"{BASE}/api/v1/ebay/seller", headers=HEADERS,
json={"seller": "red-rock-uk"}).json()
Every response uses the envelope { data, response_time, credits_used, credits_remaining }.
count and total_results.total_results is null when sold: true. eBay publishes no headline count on the sold view, so a null there means "eBay did not say", not "zero results". Count the returned rows instead.
/seller is a PROFILE endpoint. It cannot enumerate a catalogue. If the user wants a seller's items, use /search with seller set and no keyword.per_page accepts only 60, 120 or 240. eBay silently falls back to 60 for any other value, so a request for 100 quietly returns 60 and looks successful.category_id must be numeric. An unrecognised category id returns the UNFILTERED result set under a 200, which looks like a successful filter and is not one. Verify the id before relying on it.condition: "refurbished" is eBay's parent condition, not one of its three graded refurbished tiers. Do not present it as a specific grade.400 means an invalid or missing parameter, most often neither query nor seller being supplied. Fix and retry.401 means the API key is invalid or missing. Check SCAVIO_API_KEY.404 means the item or seller was not found. Check the item number or the ebay.com/usr/<name> spelling.429 means a rate or usage limit was exceeded. Wait before retrying. See https://scavio.dev/docs/rate-limits.502 / 503 mean the upstream is temporarily unavailable. Wait a few seconds before retrying.SCAVIO_API_KEY is not set, prompt the user to export it before continuing.