neonjelly

Reference

Catalog API

GET-only ecommerce catalog API on mcp.neonjelly.io. Same nj_ key as MCP.

Base: https://mcp.neonjelly.io

Same nj_ key works for MCP and the catalog REST. REST is GET-only (including signal reads + product-idea search). Create a watch via MCP create_signal. No scrape. No probe.

curl -H "Authorization: Bearer nj_…" "https://mcp.neonjelly.io/v1/whoami"
curl -H "Authorization: Bearer nj_…" "https://mcp.neonjelly.io/v1/stores?q=gruntstyle&limit=3"

Also X-Api-Key: nj_…. Do not put the key in a query string in production.

Live tester: /playground.

Catalog (auth)

Stores, apps, analytics, signals, product ideas: see tools. Products, idea search, and every change feed: products.

Blocked on REST: POST/PATCH/DELETE, /v1/scrapes, /v1/signals/{id}/probe. MCP create_signal is the exception.

Platform

MethodPathAuthDoes
GET/ /v1 /healthnoneService JSON
POST/v1/trialnoneMint or reuse trial. Body: installId, optional client
GET/v1/whoaminj_ / njc_Key + quotas (not metered)
GET/v1/upgradenone / nj_Checkout URL (not metered). Works after trial expiry.
GET/admin/keysADMIN_TOKENList keys
POST/admin/keysADMIN_TOKENMint
PATCH/admin/keys/:idADMIN_TOKENRevoke / quotas
POST/GET/DELETE/mcpnj_ / njc_MCP
POST/GET/DELETE/c/:connectToken/mcptoken in pathMCP

Trial response

{
  "existing": false,
  "key": {
    "id": "…",
    "prefix": "nj_…",
    "plan": "trial",
    "dailyQuota": 100,
    "rateLimitPerMin": 20
  },
  "connectUrl": "https://mcp.neonjelly.io/c/njc_…/mcp",
  "secret": "nj_…"
}

secret omitted when existing: true. Expired device+client → 403 { error: { code: "trial_used", checkout: "https://neonjelly.io/pricing" } }.

MCP errors

Tool failures come back as MCP text with this shape (from the catalog):

{
  "error": {
    "code": "not_found|bad_request|unauthorized|rate_limited|query_timeout|internal|upstream_error",
    "message": "…",
    "details": {}
  }
}

Lists:

{
  "data": [],
  "page": {
    "limit": 20,
    "offset": 0,
    "count": 0,
    "hasMore": false,
    "total": 0
  },
  "meta": {}
}

Neonjelly gate 401/429 (before MCP) uses the same error.code idea. 429 body includes retryAfter (seconds) or dailyQuota. We do not set Retry-After / X-RateLimit-* headers.