Docs
One backend, two doors: connect over MCP for agents, or call the REST API directly. Same auth, same data.
1 · Get a key
Grab a free so_live_ key from the dashboard. Pass it as a Bearer token on every call.
2 · Connect over MCP
Add a remote MCP connector (Claude Desktop / ChatGPT / Cursor):
{
"mcpServers": {
"selloracle": {
"url": "https://selloracle.com/mcp",
"headers": { "Authorization": "Bearer so_live_YOUR_KEY" }
}
}
}Then just ask: "Score the niche 'minimalist wedding invitation' on Etsy." Your agent calls get_niche_score and answers with real data.
3 · Or call REST
curl https://selloracle.com/api/v1/niche/score?keyword=minimalist+wedding+invitation \
-H "Authorization: Bearer so_live_YOUR_KEY"
# → { "success": true, "data": { "blueOceanScore": 72, "level": "blue", ... } }POST tools take a JSON body:
curl -X POST https://selloracle.com/api/v1/profit-calc \
-H "Authorization: Bearer so_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{ "price": 24, "shipping": 0, "offsiteAds": false }'Auth, rate limits & quotas
- · Header on every call: Authorization: Bearer so_live_…
- · Keys are stateless HMAC tokens, stable per account. Counting is per key (cloud agents rotate IPs).
- · Response headers: X-RateLimit-Remaining (free tier), X-Credits-Remaining (paid).
| Plan | Daily cap | Monthly credits | Burst |
|---|---|---|---|
| Free | 100 calls/day (A-tier only) | — | 5 req/s |
| Starter | no daily cap | 10,000 | 10 req/s |
| Pro | no daily cap | 50,000 | 20 req/s |
| Scale | no daily cap | 300,000 | 50 req/s |
Bursts above your tier return 429; back off and retry. Need higher throughput? Scale or a custom plan.
Data & freshness
- · Source — derived from Etsy's public Open API. We expose aggregated, computed signals (scores, demand, competition) — not a resale of raw Etsy rows.
- · A-tier (data) — niche aggregates & Blue Ocean scores are pre-computed and refreshed weekly. Each response is consistent for a given week.
- · Coverage — all categories; 45K+ listings and 1,400+ shops at full import.
- · Live service status & the refresh log live on the status page.
Quick client (no SDK needed)
Official TypeScript & Python SDKs are on the way. Until then it's a one-liner — here's a tiny typed wrapper you can paste in:
// selloracle.ts
const KEY = process.env.NICHEGRID_KEY!;
const BASE = "https://selloracle.com/api/v1";
export async function call(path: string, opts: RequestInit = {}) {
const res = await fetch(BASE + path, {
...opts,
headers: { Authorization: `Bearer ${KEY}`, "Content-Type": "application/json", ...opts.headers },
});
if (!res.ok) throw new Error(`SellOracle ${res.status}: ${await res.text()}`);
return res.json();
}
// usage
const { data } = await call("/niche/score?keyword=minimalist+wedding+invitation");
console.log(data.blueOceanScore); // 72Python:
# selloracle.py
import os, requests
KEY = os.environ["NICHEGRID_KEY"]
BASE = "https://selloracle.com/api/v1"
def call(path, method="GET", json=None):
r = requests.request(method, BASE + path,
headers={"Authorization": f"Bearer {KEY}"}, json=json)
r.raise_for_status()
return r.json()
data = call("/niche/score?keyword=minimalist+wedding+invitation")["data"]
print(data["blueOceanScore"]) # 72Error codes
| Status | Meaning |
|---|---|
| 401 | Missing or invalid API key |
| 402 | Out of credits (paid tiers) |
| 403 | Tier locked — upgrade your plan |
| 404 | Unknown endpoint or no data for input |
| 429 | Free daily limit reached |
Tool reference
get_niche_score Data · 1cr · GET /api/v1/niche/score
Blue Ocean Score (0–100) for one keyword, with the four underlying signals (demand, saturation, concentration, freshness) plus avg price, views, favorites, and shop count. The computed conclusion — not raw listings.
- keyword (string, required) — The search term to score, e.g. "boho wedding invitation".
get_niche_report Data · 2cr · GET /api/v1/niche/report
A multi-section deep report for one keyword: verdict, demand & competition read, price band, top shops, and a recommended angle. Everything an agent needs to make a go/no-go call in one call.
- keyword (string, required) — The niche keyword to report on.
find_blue_ocean Data · 1cr · GET /api/v1/blue-ocean
Discover low-competition, high-demand niches in a category, ranked by Blue Ocean Score. Free tier returns the top 5; the full ranked list is the core paid asset.
- category (string) — Optional category filter, e.g. "wedding", "home", "jewelry". Omit to scan all categories.
- limit (number) — How many niches to return (free tier capped at 5).
search_keywords Data · 1cr · GET /api/v1/keywords
Keyword lookup with cached stats (total results, avg price, score). The free hook that gets an agent onto the grid.
- q (string, required) — Substring to match against the keyword index.
get_best_sellers Data · 1cr · GET /api/v1/best-sellers
Top-selling listings in a category, by favorites/sales signal.
- category (string) — Category to rank within. Omit for an overall ranking.
get_top_shops Data · 1cr · GET /api/v1/shops/top
Leading shops in a category by sales, with sales/review/follower stats.
- category (string) — Category to rank shops within.
profit_calculator Data · 1cr · POST /api/v1/profit-calc
Full Etsy fee breakdown and net profit for a sale (listing, transaction, payment-processing, and optional offsite-ads fees). Pure math — no data lookup.
- price (number, required) — Item sale price (USD).
- cost (number) — Your cost of goods (USD).
- shipping (number) — Shipping charged to buyer (USD).
- offsiteAds (boolean) — Apply the 15% Offsite Ads fee?
ai_reply_writer AI · 10cr · POST /api/v1/ai/reply-writer
Draft a customer-service reply in the seller's voice.
- message (string, required) — The buyer message to reply to.