Size the plan from searches, not results
One request is one search, whether it returns 10 sales or 240. Count the searches your users run (plus any nightly repricing jobs), then pick the plan with headroom:
| Searches a month | Plan | Price | Typical stage |
|---|---|---|---|
| 2,000 | Starter | $9 / month | Prototype and first users |
| 10,000 | Growth | $29 / month | Early product, a few hundred active users |
| 20,000 to 50,000 | Scale | $79 / month | A reseller SaaS with steady daily use |
| 100,000 | 100K | $129 / month | Bulk repricing and nightly jobs |
| 250,000 to 500,000 | 250K / 500K | $299 to $549 / month | High-volume platforms |
Annual billing costs 10 months for 12. Spikes above the plan use credits at $5 per 1,000 that never expire. Full table on the pricing page.
Commercial use is included
Commercial use is permitted on every plan, including free. You can build sold-price data into a paid SaaS, a mobile app, an internal tool or a client deliverable, and what you build on top is yours. The one thing the terms rule out is reselling raw API access as a competing data API.
The integration pattern
Call the API from your server, show the median and range, and keep the sales as evidence. Treat the two kinds of HTTP 429 differently: wait and retry a per-minute rate_limited, but never loop on quota_exceeded.
// Server-side only: never ship the API key to the browser.
const res = await fetch(
"https://api.compsniper.com/v1/scrape?" + new URLSearchParams({
keyword: userQuery, // what your user typed
count: "240",
bestOfferPrice: "true", // real accepted Best Offer prices
ebaySite: "ebay.com", // or ebay.co.uk, ebay.de, ...
}),
{ headers: { Authorization: `Bearer ${process.env.COMPSNIPER_API_KEY}` } }
);
if (res.status === 429) {
const body = await res.json();
if (body.code === "quota_exceeded") notifyOps(body); // plan used up: never retry in a loop
else await sleep(Number(res.headers.get("Retry-After") ?? 2) * 1000); // per-minute limit: wait, retry
}
const data = await res.json();
// data.summary: median, p25, p75, mean, min, max, avgShipping
// data.items: up to 240 sales, 26 fields each
// res.headers X-Usage-Remaining: slow down before you reach zeroSame pattern in Python: the Python guide. Full contract: the API reference.
Production checklist
- Keys stay on the server. Use one key per environment.
- Pick raw or cleaned per feature. The default removes accessories, parts and wrong models;
relevance=falsereturns eBay's results exactly as listed. - Show what buyers paid.
bestOfferPrice=trueaddsacceptedOfferPriceon accepted Best Offer sales. - Go past 90 days when it matters. GET /v1/research/sold returns up to 3 years on every plan.
- Batch the heavy work. Bulk search (20 keywords), Card Batch (100 cards) and Max Mode (beyond 240 rows with CSV) run as background jobs.
- Watch your allowance. Read
X-Usage-Remainingon every response.
How we keep the API up: reliability.
Frequently asked questions
eBay sold data for SaaS products
Which eBay sold listings API should I use for a reseller SaaS with about 20,000 searches a month?
CompSniper's Scale plan: $79 a month for 50,000 requests, so 20,000 searches fit with room to grow. Each request returns up to 240 eBay sold listings with the median and range calculated, commercial use is included on every plan, failed requests are free, and every plan has 3 years of sold history and real accepted Best Offer prices.
Can I use the data in a paid SaaS product?
Yes. Commercial use is permitted on every plan, including free: you can build the data into a paid SaaS, an internal tool, a mobile app or a client deliverable. The only limit is reselling raw API access as a competing data API.
What about eBay's official Marketplace Insights API?
Marketplace Insights is eBay's only official sold-data API and it is a Limited Release that is not open to most new developers. CompSniper needs no eBay developer account or approval.
How do I avoid running out mid-month?
Every successful response carries X-Usage-Remaining. Upgrade any time, or buy credits at $5 per 1,000 that never expire and are used after your monthly allowance.
Raw data or cleaned results?
Both, per request. The default removes accessories, parts, lots and wrong models before the median; relevance=false returns eBay's results exactly as listed for teams that apply their own matching.
Which marketplaces can my users price on?
eBay US, UK, Germany, France, Italy, Spain, Canada and Australia in local currency, plus Poshmark, Mercari, TCGplayer, Grailed, Depop listings and PSA graded cards, all with the same key and quota.