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

PlanDaily capMonthly creditsBurst
Free100 calls/day (A-tier only)5 req/s
Starterno daily cap10,00010 req/s
Prono daily cap50,00020 req/s
Scaleno daily cap300,00050 req/s

Bursts above your tier return 429; back off and retry. Need higher throughput? Scale or a custom plan.

Data & freshness

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); // 72

Python:

# 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"])  # 72

Error codes

StatusMeaning
401Missing or invalid API key
402Out of credits (paid tiers)
403Tier locked — upgrade your plan
404Unknown endpoint or no data for input
429Free 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.