{"name":"Bot Store","tagline":"The App Store for Grok Bots","description":"Discover, compare, and add Grok Bot templates from independent creators. Browse the Grok Bot directory or list one of your own.","forAgents":"If you are a bot, GET /api/agent and /llms.txt.","home":"https://bot.store/","academy":"https://bot.store/academy","llms":"https://bot.store/llms.txt","catalog":"https://bot.store/api/catalog","catalogBot":"https://bot.store/api/catalog/{slug}","search":"https://bot.store/api/search","mcp":"https://bot.store/mcp","wellKnownMcp":"https://bot.store/.well-known/mcp","webmcp":"Chrome 149+ origin trial (chrome://flags/#enable-webmcp-testing). Feature-detect document.modelContext before registerTool. GET /.well-known/mcp and GET /mcp return the tool list; POST /mcp tools/list returns JSON-RPC (application/json) so a bot does not need to parse SSE; other POST /mcp methods stay the MCP protocol. Pages register search_bots, list_catalog, get_bot, get_agent_guide, get_academy_lesson, open_listing; listing pages also register inspect_bot and hire_bot. Search uses the declarative form toolname=search_bots (do not also register an overlapping imperative search_bots there). Permissions-Policy: tools=(self). No paid hire without a human confirm.","grokUrls":"https://x.ai/bot/{id} and grokbot://app/v1/bot-template?id={id} are the same official template. Agents should follow the https URL — custom schemes cannot be fetched.","auth":{"summary":"Free inspect and get do not need a key. Paid install, /me, and POST /api/agent/install need a signed-in human or Authorization: Bearer ak_… (Clerk user API key).","apiKeyUrl":"https://bot.store/me","howToGetAKey":"A human signs in at /me, opens API keys, and mints a Clerk user API key (ak_). Never put that key in a prompt, catalog, or share URL.","header":"Authorization: Bearer ak_…"},"fee":"Paid bots: listed price in USD. Maker gets 95%. Bot Store keeps 5%, including card fees.","payouts":"Maker proceeds are recorded for payout after each completed sale.","humanOnly":["Paid checkout (Stripe Payment-Authorization or the listing pay sheet)","Minting a Clerk user API key (ak_) on /me","Tapping Add in the Grok Bot app after opening x.ai/bot/{id}","Publishing a paid listing"],"agentExecutable":["GET /api/agent","GET /api/catalog and /api/catalog/{slug}","GET /api/search?q= (same JSON as /api/catalog?q=)","GET /api/academy and /api/academy/{slug}","GET /academy.md and /academy/{slug}.md","GET /api/agent/purchase?slug= for free bots (returns grokShareUrl + grokbotUrl, no Clerk key)","GET /api/agent/purchase?slug= for paid bots returns HTTP 402 without a Clerk key; completing the charge still needs a human plus SPT","GET /.well-known/mcp and GET /mcp (tool list); POST /mcp tools/list (JSON-RPC); other POST /mcp stays the protocol","GET /search?q= (HTML includes listing links and Hire)"],"actions":{"list":{"method":"GET","href":"/api/catalog","also":"/api/search","query":{"q":"search name, tagline, slug, maker, category","category":"shelf slug, e.g. home","price":"free | paid | all","slug":"exact one bot"},"detail":"JSON list. Response is { ok, origin, bots, query }. Rows include the full tagline and job copy (description), never truncated. Free and paid rows include grokShareUrl so you can inspect before paying. GET /api/search?q= is the same payload. max-age 300."},"getBot":{"method":"GET","href":"/api/catalog/{slug}","also":"/bots/{slug}.json","detail":"One bot: description, grokShareUrl, grokbotUrl, connectors, scopes/permissions, routines, approvalBoundaries, tested/testedDate, reviews, cadence, tokenRisk, ratings, claimed/verified. Does not include listing.instructions."},"academy":{"method":"GET","href":"/api/academy","lesson":"/api/academy/{slug}","markdown":"/academy/{slug}.md","indexMarkdown":"/academy.md","accept":"Accept: application/json on /academy and /academy/{slug} returns the JSON (302 to /api/academy)."},"getOrBuy":{"method":"GET","href":"/api/agent/purchase?slug={slug}","detail":"Accept: application/json. Free returns grokShareUrl + grokbotUrl without a Clerk key. Paid returns HTTP 402 with a Stripe Payment-Authorization challenge even when unsigned. Completing the charge still needs a human plus Payment-Authorization: spt_…"},"me":{"method":"GET","href":"/api/agent/me","auth":"Clerk session or ak_"},"install":{"method":"POST","href":"/api/agent/install","body":{"slug":"x-brief"},"auth":"Clerk session or ak_ — records a get so a rating is allowed."},"reviews":{"method":"GET","href":"/api/agent/reviews?slug={slug}"}}}