Reference
API reference
Base URL https://jackbay.xyz. JSON in, JSON out, CORS open, nothing cached. Guides are in Docs.
Try it in 10 seconds
Free helper, no key needed.
curl -s https://jackbay.xyz/mcp -H 'content-type: application/json' -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"jackbay__search","arguments":{"query":"stock price"}}}'MCP endpoint
POST/mcp
JSON-RPC 2.0 over HTTP. Responses are plain JSON (no SSE stream); a batch array is accepted; notifications return 202. Key via ?key=pk_… or Authorization: Bearer pk_…. GET and DELETE return 405. Methods: initialize, ping, tools/list, tools/call, resources/list, prompts/list; anything else returns -32601.
Initialize:
curl -s https://jackbay.xyz/mcp \
-H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"curl","version":"1"}}}'{"jsonrpc":"2.0","id":1,"result":{
"protocolVersion":"2025-06-18",
"capabilities":{"tools":{"listChanged":false}},
"serverInfo":{"name":"jackbay","version":"1.0.0"},
"instructions":"Jackbay lists paid MCP tools. ..."}}List tools (helpers first, then every live tool as slug__tool):
curl -s https://jackbay.xyz/mcp \
-H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/list"}'{"jsonrpc":"2.0","id":2,"result":{"tools":[
{"name":"jackbay__search","description":"Free. Search the Jackbay directory ...","inputSchema":{...}},
{"name":"jackbay__account","description":"Free. Shows the wallet behind this Jackbay key ...","inputSchema":{...}},
{"name":"rh-stocks__price","description":"[0.002 USDG per call · ...] ...","inputSchema":{...}}
]}}Call a free helper (jackbay__search works without a key):
curl -s https://jackbay.xyz/mcp \
-H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"jackbay__search","arguments":{"query":"stock price"}}}'{"jsonrpc":"2.0","id":3,"result":{
"content":[{"type":"text","text":"[ ... ]"}],
"structuredContent":{"results":[
{"tool":"rh-stocks__price","listing":"...","does":"...","priceUsdg":"0.002","maker":"0x..."}]}}}Call a paid tool (needs a key):
curl -s "https://jackbay.xyz/mcp?key=YOUR_KEY" \
-H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":4,"method":"tools/call","params":{"name":"rh-stocks__price","arguments":{"symbol":"NVDA"}}}'{"jsonrpc":"2.0","id":4,"result":{
"content":[{"type":"text","text":"..."},
{"type":"text","text":"Jackbay: paid 0.002 USDG to 0x... · https://robinhoodchain.blockscout.com/tx/0x..."}],
"_meta":{"jackbay/receipt":{"priceUsdg":"0.002","payer":"0x...","payTo":"0x...","tx":"0x...","explorer":"https://..."}}}}Failures come back as a normal result with isError: true and cost nothing. Examples: no key (the result also carries _meta["jackbay/payment-required"] with price, asset, chainId, payTo), an unknown, revoked or expired key, Spending cap used up, a wallet balance too low, or did not answer when the upstream fails.
Directory
GET/api/config
Chain, token and limits.
curl -s https://jackbay.xyz/api/config{"chainId":4663,"explorer":"https://robinhoodchain.blockscout.com",
"usdg":{"address":"0x5fc5...d168","decimals":6,"name":"Global Dollar","version":"1"},
"relayer":"0x...","mcpUrl":"https://jackbay.xyz/mcp",
"priceMin":0.001,"priceMax":1,"capDefault":2,"capMax":20,"deadlineDaysMax":30,
"platformFeePct":0,"categories":["markets","onchain","data","web","dev"]}GET/api/stats
Totals from the Jackbay ledger.
curl -s https://jackbay.xyz/api/stats{"listings":3,"tools":5,"makers":1,"paidCalls":0,"paidUsdg":"0","payers":0,
"platformFeePct":0,"source":"...","updatedAt":"2026-10-29T12:00:00.000Z"}GET/api/categories
Live listing count per category.
curl -s https://jackbay.xyz/api/categories
[{"id":"markets","listings":1},{"id":"onchain","listings":2}, ...]GET/api/tools
Query params, all optional: category, q (text search), sort = used (default) | new | cheap.
curl -s "https://jackbay.xyz/api/tools?category=markets&sort=cheap"{"items":[{
"slug":"rh-stocks","name":"...","description":"...","category":"markets",
"maker":"0x...","byJackbay":true,"priceUsdg":"0.002",
"tools":[{"name":"price","mcpName":"rh-stocks__price","description":"...","inputSchema":{...}}],
"calls30d":0,"paid30dUsdg":"0","status":"live","createdAt":1761700000000}]}GET/api/tools/:slug
One listing, same fields as above plus recentCalls (up to 20). Unknown slug returns 404 {"error":"not_found"}.
curl -s https://jackbay.xyz/api/tools/rh-stocks{ ...listing,
"recentCalls":[{"at":"2026-10-29T12:00:00.000Z","payer":"0x...","slug":"rh-stocks","tool":"price",
"maker":"0x...","priceUsdg":"0.002","tx":"0x...","explorer":"https://...","status":"paid","source":"..."}]}GET/api/calls/recent
The 25 most recent calls. tx and explorer are null until a payment is sent.
curl -s https://jackbay.xyz/api/calls/recent
{"items":[{"at":"...","payer":"0x...","slug":"...","tool":"...","maker":"0x...","priceUsdg":"0.002","tx":"0x...","explorer":"https://...","status":"paid","source":"..."}]}GET/api/makers/:address
Listings owned by a wallet, including upstream URL. Bad address returns 400 bad_address.
curl -s https://jackbay.xyz/api/makers/0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168
{"items":[{ ...listing, "upstream":"https://..." }]}Agent keys
GET/api/permit?owner=0x…&cap=2&days=7
Returns the EIP-712 permit for the wallet to sign. owner required; cap in USDG, greater than 0 up to 20 (default 2); days 1-30 (default 7). Errors: bad_address, bad_cap, bad_days, 503 relayer_not_configured.
{"typedData":{"domain":{...},"types":{...},"primaryType":"Permit","message":{"owner":"0x...","spender":"<relayer>","value":"2000000","nonce":"0","deadline":"1762300000"}},
"balanceUsdg":"12.5","allowanceUsdg":"0"}POST/api/keys
Body: owner, value (raw, 6 decimals), deadline (unix seconds, at most 31 days out), signature, optional label. Jackbay submits the permit and returns the key once.
{"key":"pk_ab12cd34_...","id":"pk_ab12cd34","mcpUrl":"https://jackbay.xyz/mcp?key=pk_...",
"capUsdg":"2","expires":"2026-11-05T12:00:00.000Z","permitTx":"0x...","explorer":"https://..."}Errors: bad_request, bad_cap, bad_deadline, 422 permit_failed / permit_not_applied.
GET/api/keys?owner=0x…
Keys for a wallet (never the secret) plus live on-chain allowance and balance.
{"owner":"0x...","relayer":"0x...","allowanceUsdg":"2","balanceUsdg":"12.5",
"keys":[{"id":"pk_ab12cd34","label":"","capUsdg":"2","expires":"2026-11-05T12:00:00.000Z","revoked":false,"permitTx":"0x..."}]}POST/api/keys/:id/revoke
Wallet-signed (see below). Response: {"ok":true,"note":"Key revoked. To also zero the on-chain allowance, approve 0 USDG to the relayer from your wallet."}
Makers
GET/api/nonce
One-time nonce and timestamp for a signed action. Signatures are valid for 10 minutes.
{"nonce":"9f3a...","issued":"2026-10-29T12:00:00.000Z"}POST/api/launch/preview
Body {"url":"https://your-server.example/mcp"}. Checks the URL and lists the tools it exposes. 20 per hour per IP.
curl -s https://jackbay.xyz/api/launch/preview -H 'content-type: application/json' -d '{"url":"https://your-server.example/mcp"}'
{"url":"https://your-server.example/mcp","tools":[{"name":"...","description":"...","inputSchema":{...}}]}Errors: 422 upstream_failed or no_tools (with message), 429 rate_limited.
POST/api/launch
Body: slug, url, name, description, category, priceUsdg (string), plus address, nonce, issued, signature. The wallet signs this text (EIP-191 personal sign):
Jackbay: launch a listing
Listing: <slug>
Server: <url>
Price: <priceUsdg> USDG per call
Wallet: <your address>
Nonce: <nonce>
Issued: <issued>{"ok":true,"slug":"my-tool","mcpNames":["my-tool__lookup"],"page":"https://jackbay.xyz/explore/my-tool"}Errors: bad_slug, bad_text, bad_category, bad_price, 401 (stale_signature, signature_mismatch, nonce_used, …), 409 slug_taken, 422 upstream_failed / no_tools / bad_tool_name, 429 rate_limited (10 per hour per IP).
POST/api/tools/:slug/status
Pause or resume your listing. Body: status = live | paused, plus address, nonce, issued, signature. Signed text:
Jackbay: set listing status
Listing: <slug>
Status: <live|paused>
Wallet: <your address>
Nonce: <nonce>
Issued: <issued>Response {"ok":true}, or 404 not_yours.
Playground
POST/api/playground
Body {"question":"price of NVDA"} (3-200 chars). A simple router, not an LLM: it searches, picks a tool, calls it and pays from Jackbay’s playground wallet. 6 runs per hour per IP (429 rate_limited). Try it live in the playground.
{"steps":[
{"step":"search","query":"price of NVDA","found":[{"tool":"rh-stocks__price","listing":"...","does":"...","priceUsdg":"0.002","maker":"0x..."}]},
{"step":"choose","tool":"rh-stocks__price","args":{"symbol":"NVDA"},"priceUsdg":"0.002","payTo":"0x..."},
{"step":"call","ok":true,"ms":412},
{"step":"pay","paid":true,"priceUsdg":"0.002","from":"0x...","to":"0x...","tx":"0x...","explorer":"https://...","note":"Paid by Jackbay's playground wallet, not by you."}
],
"result":{"content":[...],"structuredContent":{...}}}When nothing matches, the response has steps and an answer string instead of result.
GET/api/health
Liveness: {"ok":true,"listings":3,"relayer":{"address":"0x...","eth":"0.004","usdg":"1.5"}}
Errors from the JSON API look like {"error":"code","message":"optional"}.