The Gap API.
Quickstart
curl "https://exniche.com/v1/gaps?verdict=go,maybe&sort=score&limit=10"
const res = await fetch("https://exniche.com/v1/gaps?verdict=go,maybe&sort=score&limit=10");
const { gaps } = await res.json();
for (const g of gaps) console.log(g.verdict, g.score_band, g.label);
import requests
r = requests.get("https://exniche.com/v1/gaps", params={"verdict": "go,maybe", "sort": "score", "limit": 10})
for g in r.json()["gaps"]:
print(g["verdict"], g["score_band"], g["label"])
Credits
A$10 buys 10,000 credits. They never expire.
| Call | Credits | A$ equivalent |
|---|---|---|
search_products / GET /v1/search | 1 | 0.001 |
check_demand | 1 | 0.001 |
report_not_found | 0 | free |
list_gaps / GET /v1/gaps, public fields | 1 per call | 0.001 |
list_gaps with detail=full | 1 + 10 per row | 0.01 per row |
get_gap full detail | 100 | 0.10 |
get_dossier, not yet unlocked | 19,000 | 19.00, unlocks it for your account |
get_dossier, already unlocked | 0 | 0 |
Endpoints
GET/v1/gaps
Filters: q, category, verdict (go, maybe, no-go, comma-separated), class, trend, source, min_score, since, sort (score, newest, asks, rising), limit (up to 50), cursor, detail (summary or full), include=unscored. Unscored leads come back with verdict: null.
{ "gaps": [ { "slug": "…", "label": "…", "category": "…", "verdict": "go", "score_band": "70–100",
"class": "absent", "trend": "rising",
"source_counts": { "community_ask": 0, "agent_search": 0, "store_search": 0 },
"first_seen": "…", "last_seen": "…",
"ask": { "text": "…", "url": "…", "source_label": "Community ask · r/…" },
"licence": "…", "attribution": "…" } ],
"next_cursor": null }
GET/v1/gaps/:slug
One gap. Public fields by default; full detail (exact score and parts, every ask, requirements) costs 100 credits.
GET/v1/gaps/:slug/dossier
The full dossier. Needs a key. Unlocks the gap for your account the first time (19,000 credits), then costs nothing. Live Shopify rows are fetched at request time and are not cached.
GET/v1/gaps/stats
Counts the ledger holds: community_asks, agent_searches, store_searches, scored, by_verdict. Free.
GET/v1/gaps.csv
Operator plan. Same filters as /v1/gaps, up to 10,000 rows.
GET/v1/search
Search the exNiche product catalogue. See the OpenAPI document for every parameter.
MCP
Endpoint https://exniche.com/mcp (streamable HTTP, key optional). Lead with check_demand: when a shopper’s request finds nothing, it returns matching gaps and records the ask.
claude mcp add --transport http exniche https://exniche.com/mcp
Tools: check_demand, list_gaps, get_gap, get_dossier, search_products, report_not_found, get_setup_and_upgrade_links. Setup for every client is on /agents.
Errors
| Status | Meaning |
|---|---|
| 400 | A parameter is invalid. The body names it. |
| 401 | The key is missing or wrong on a route that needs one. |
| 402 | Out of credits. The body has upgrade_url and human_message to show your user. Nothing is charged automatically. |
| 404 | No public gap with that slug. |
| 429 | Too many requests. Wait for retry-after. |
| 503 | Temporarily unavailable. Retry later. |
Licence
exNiche data: use with attribution to exniche.com. Quoted asks keep their source licence (Stack Exchange: CC BY-SA 4.0, with link and author). Every record carries licence and attribution fields.