Replace the commands shown on the bot’s page. PUT rather than POST on purpose: a bot that removed a command has to be able to say so, and a merge would leave the removed one on the page with nothing able to delete it.
The shape mirrors Discord’s own application command objects, so a bot can forward what it already registered. Duplicate names are dropped, keeping the first. An empty array clears the list. Rate limit: 10 requests per minute per token — enough to clear a restart loop, not a stream.
The bot's API token, generated on its edit page. Sent bare or as Bearer <token> -- both are accepted, because the libraries already posting to other lists send both. The token is shown once; generating a new one invalidates the old.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Picked.gg API","description":"Post server counts, publish commands, read votes and receive vote webhooks from picked.gg.","colors":{"primary":"#3f6b00","light":"#b6f24a","dark":"#3f6b00"},"logo":{"light":"https://mintcdn.com/discord-bot-list/ejs7hyHiUJZbewnI/logo/light.png?fit=max\u0026auto=format\u0026n=ejs7hyHiUJZbewnI\u0026q=85\u0026s=b3c2ca9e1350b7d8f5788bd130b50b97","dark":"https://mintcdn.com/discord-bot-list/ejs7hyHiUJZbewnI/logo/dark.png?fit=max\u0026auto=format\u0026n=ejs7hyHiUJZbewnI\u0026q=85\u0026s=d2165dccd4ae3b8dad03991888f1535f","href":"https://picked.gg"},"favicon":"https://mintcdn.com/discord-bot-list/KJaZKDpHL7K-BdvD/favicon.png?fit=max\u0026auto=format\u0026n=KJaZKDpHL7K-BdvD\u0026q=85\u0026s=e99fa65cbfdd7473cb2e59955ce475cb","appearance":{"default":"dark"},"background":{"color":{"light":"#f5f6f8","dark":"#07090c"}},"navbar":{"links":[{"href":"https://picked.gg","label":"Site"}],"primary":{"type":"button","label":"List Your Bot","href":"https://picked.gg/submit"}},"footer":{"socials":{"website":"https://picked.gg"}},"fonts":{"heading":{"family":"Space Grotesk","weight":700},"body":{"family":"Inter","weight":400}},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"discord-bot-list","hasAudioNarration":false,"actualSubdomain":"discord-bot-list","customDomains":["docs.picked.gg"],"gitSource":{"type":"github","owner":"quadey","repo":"picked.gg","deployBranch":"main","contentDirectory":"api-docs","isPrivate":true,"mountPath":"","label":""},"entitlements":{"AI_CHAT":{"status":"DISABLED"},"WEB_MCP":{"status":"DISABLED"},"NARRATION":{"status":"DISABLED"}},"buildId":"6abe2597d34a93f1d1a189e4","clientVersion":"0.0.4124","searchFilterCounts":[{"language":"default","tag":"API Reference","count":5},{"language":"default","tag":"Guides","count":4},{"language":"default","tag":"Getting Started","count":3},{"language":"default","tag":"Bot","count":2},{"language":"default","tag":"Votes","count":2},{"language":"default","tag":"Public","count":1}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-rbac-roles","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":true},"customCss":[{"filePath":"style.css","content":"html.dark #topbar-cta-button .bg-primary-dark{background-color:#b6f24a}html.dark #topbar-cta-button .text-white,html.dark #topbar-cta-button .text-white\\/90{color:#0a0f02}.mdx-content table td{min-width:0}.mdx-content table td code{white-space:nowrap}:root{--dur-base: 220ms;--dur-page: 450ms;--ease-out-expo: cubic-bezier(0.16, 1, 0.3, 1)}@media (prefers-reduced-motion: no-preference){@keyframes doc-enter{from{opacity:0;transform:translateY(14px)}}@keyframes doc-reveal{from{opacity:0;transform:translateY(14px)}to{opacity:1;transform:none}}#header,.mdx-content>:nth-child(-n+6){animation:doc-enter var(--dur-page) var(--ease-out-expo) backwards}.mdx-content>:nth-child(2){animation-delay:40ms}.mdx-content>:nth-child(3){animation-delay:80ms}.mdx-content>:nth-child(4){animation-delay:120ms}.mdx-content>:nth-child(5){animation-delay:160ms}.mdx-content>:nth-child(6){animation-delay:200ms}.card{transition:transform var(--dur-base) var(--ease-out-expo),\n border-color var(--dur-base) var(--ease-out-expo)}.card:hover{transform:translateY(-2px)}@supports (animation-timeline: view()){.mdx-content>:nth-child(n+7){animation:doc-reveal linear both;animation-timeline:view();animation-range:entry 0% entry 30%}}}"}],"page":{"pagePath":"api-reference/bot/publish-the-commands","slug":"/api-reference/bot/publish-the-commands","pageMetadata":{"title":"Publish the Commands","description":"Replace the commands shown on the bot's page. PUT rather than POST on purpose: a bot that removed a command has to be able to say so, and a merge would leave the removed one on the page with nothing able to delete it.\n\nThe shape mirrors Discord's own application command objects, so a bot can forward what it already registered. Duplicate names are dropped, keeping the first. An empty array clears the list. Rate limit: 10 requests per minute per token -- enough to clear a restart loop, not a stream.","deprecated":null,"version":null,"openapi":"/openapi.json put /api/v1/bots/{id}/commands","href":"/api-reference/bot/publish-the-commands","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {Fragment: _Fragment, jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsx(_components.p, {\n children: \"Replace the commands shown on the bot’s page. PUT rather than POST on purpose: a bot that removed a command has to be able to say so, and a merge would leave the removed one on the page with nothing able to delete it.\"\n }), \"\\n\", _jsx(_components.p, {\n children: \"The shape mirrors Discord’s own application command objects, so a bot can forward what it already registered. Duplicate names are dropped, keeping the first. An empty array clears the list. Rate limit: 10 requests per minute per token — enough to clear a restart loop, not a stream.\"\n })]\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Publish the Commands","description":"Replace the commands shown on the bot's page. PUT rather than POST on purpose: a bot that removed a command has to be able to say so, and a merge would leave the removed one on the page with nothing able to delete it.\n\nThe shape mirrors Discord's own application command objects, so a bot can forward what it already registered. Duplicate names are dropped, keeping the first. An empty array clears the list. Rate limit: 10 requests per minute per token -- enough to clear a restart loop, not a stream.","deprecated":null,"version":null,"openapi":"/openapi.json put /api/v1/bots/{id}/commands","href":"/api-reference/bot/publish-the-commands","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"operationId":"putCommands","summary":"Publish the Commands","description":"Replace the commands shown on the bot's page. PUT rather than POST on purpose: a bot that removed a command has to be able to say so, and a merge would leave the removed one on the page with nothing able to delete it.\n\nThe shape mirrors Discord's own application command objects, so a bot can forward what it already registered. Duplicate names are dropped, keeping the first. An empty array clears the list. Rate limit: 10 requests per minute per token -- enough to clear a restart loop, not a stream.","tags":["Bot"],"x-codeSamples":[{"lang":"bash","label":"cURL","source":"curl -X PUT https://picked.gg/api/v1/bots/YOUR_BOT_ID/commands \\\n -H \"Authorization: YOUR_API_TOKEN\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\"commands\": [{\"name\": \"ban\", \"description\": \"Ban a member\"}]}'"},{"lang":"javascript","label":"discord.js","source":"client.once(Events.ClientReady, async () => {\n const registered = await client.application.commands.fetch();\n const commands = registered.map((c) => ({ name: c.name, description: c.description }));\n\n await fetch(`https://picked.gg/api/v1/bots/${client.user.id}/commands`, {\n method: 'PUT',\n headers: {\n Authorization: process.env.PICKED_TOKEN,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ commands }),\n });\n});"},{"lang":"python","label":"discord.py","source":"import os, aiohttp\n\[email protected]\nasync def on_ready():\n commands = [\n {\"name\": c.name, \"description\": c.description}\n for c in bot.tree.get_commands()\n ]\n async with aiohttp.ClientSession() as session:\n await session.put(\n f\"https://picked.gg/api/v1/bots/{bot.user.id}/commands\",\n headers={\"Authorization\": os.environ[\"PICKED_TOKEN\"]},\n json={\"commands\": commands},\n )"}],"parameters":["3d7c9106-e266-4b7f-8c5a-024eace82fff"],"requestBody":"af0309de-1c4d-48de-87e9-3c78ec863073","responses":{"200":"19e4b90f-db3b-48c4-8675-300fae5182ca","400":"87191d4c-d5f3-400a-a935-9ad8ca837080","401":"8c174e31-4538-4107-afd0-37b66bcf878a","404":"7dc0ecf4-f1be-493d-a109-6f7b96e4cb40","429":"bb454968-c54f-4684-9d04-9778d2d787ac"},"method":"put","type":"path","servers":["755fe365-e06e-4d26-95ca-7c6da2a485ae"],"security":["d8fa3247-b2b3-4c37-aab6-cfc626ce8b65"],"path":"/api/v1/bots/{id}/commands","baseUrlOptions":["https://picked.gg"],"title":"Publish the Commands","codeSamples":[{"label":"cURL","lang":"bash","source":"curl -X PUT https://picked.gg/api/v1/bots/YOUR_BOT_ID/commands \\\n -H \"Authorization: YOUR_API_TOKEN\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\"commands\": [{\"name\": \"ban\", \"description\": \"Ban a member\"}]}'"},{"label":"discord.js","lang":"javascript","source":"client.once(Events.ClientReady, async () => {\n const registered = await client.application.commands.fetch();\n const commands = registered.map((c) => ({ name: c.name, description: c.description }));\n\n await fetch(`https://picked.gg/api/v1/bots/${client.user.id}/commands`, {\n method: 'PUT',\n headers: {\n Authorization: process.env.PICKED_TOKEN,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ commands }),\n });\n});"},{"label":"discord.py","lang":"python","source":"import os, aiohttp\n\[email protected]\nasync def on_ready():\n commands = [\n {\"name\": c.name, \"description\": c.description}\n for c in bot.tree.get_commands()\n ]\n async with aiohttp.ClientSession() as session:\n await session.put(\n f\"https://picked.gg/api/v1/bots/{bot.user.id}/commands\",\n headers={\"Authorization\": os.environ[\"PICKED_TOKEN\"]},\n json={\"commands\": commands},\n )"}],"requiredOnlyExamples":false,"requestExampleType":"codeSamples","responseExampleType":"generated"},"dependencies":{"parameters":{"3d7c9106-e266-4b7f-8c5a-024eace82fff":{"name":"id","in":"path","required":true,"description":"The bot's Discord application id. It has to be the bot the token belongs to.","schema":{"type":"string","pattern":"^\\d{17,19}$","isRequired":true,"description":"The bot's Discord application id. It has to be the bot the token belongs to.","uniqueKey":"","typeLabel":"string"},"example":"1092194789458481202"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["commands"],"properties":{"commands":{"type":"array","maxItems":100,"items":{"type":"object","required":["name","description"],"properties":{"name":{"type":"string","minLength":1,"maxLength":32,"description":"Discord's own bound: a list Discord accepted is a list this accepts.","isRequired":true,"uniqueKey":"commands.items.[INDEX].name","typeLabel":"string"},"description":{"type":"string","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"commands.items.[INDEX].description","typeLabel":"string"}},"uniqueKey":"commands.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"commands","typeLabel":"object[]"}},"uniqueKey":"","typeLabel":"object"},"example":{"commands":[{"name":"ban","description":"Ban a member"},{"name":"warn","description":"Warn a member and log it"}]},"examples":{"Example":{"title":"Example","value":{"commands":[{"name":"ban","description":"Ban a member"},{"name":"warn","description":"Warn a member and log it"}]}}},"exampleType":"examples"}},"exampleType":"examples"},"responses":{"19e4b90f-db3b-48c4-8675-300fae5182ca":{"description":"Stored. count is what survived de-duplication.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","uniqueKey":"success","typeLabel":"boolean"},"count":{"type":"integer","uniqueKey":"count","typeLabel":"integer"}},"uniqueKey":"","typeLabel":"object"},"example":{"success":true,"count":2},"examples":{"Example":{"title":"Example","value":{"success":true,"count":2}}},"exampleType":"examples"}},"exampleType":"examples"},"87191d4c-d5f3-400a-a935-9ad8ca837080":{"description":"The body or a query parameter is malformed.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"One sentence, safe to show a developer.","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"retryAfter":{"type":"integer","description":"Seconds until the limit resets. Only on 429.","uniqueKey":"retryAfter","typeLabel":"integer"}},"required":["error"],"uniqueKey":"","typeLabel":"object"},"example":{"error":"Invalid JSON body."},"examples":{"Example":{"title":"Example","value":{"error":"Invalid JSON body."}}},"exampleType":"examples"}},"exampleType":"examples"},"8c174e31-4538-4107-afd0-37b66bcf878a":{"description":"Missing, malformed or unknown token.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"One sentence, safe to show a developer.","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"retryAfter":{"type":"integer","description":"Seconds until the limit resets. Only on 429.","uniqueKey":"retryAfter","typeLabel":"integer"}},"required":["error"],"uniqueKey":"","typeLabel":"object"},"example":{"error":"Invalid token."},"examples":{"Example":{"title":"Example","value":{"error":"Invalid token."}}},"exampleType":"examples"}},"exampleType":"examples"},"7dc0ecf4-f1be-493d-a109-6f7b96e4cb40":{"description":"No such bot, or the token belongs to a different one.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"One sentence, safe to show a developer.","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"retryAfter":{"type":"integer","description":"Seconds until the limit resets. Only on 429.","uniqueKey":"retryAfter","typeLabel":"integer"}},"required":["error"],"uniqueKey":"","typeLabel":"object"},"example":{"error":"Bot not found."},"examples":{"Example":{"title":"Example","value":{"error":"Bot not found."}}},"exampleType":"examples"}},"exampleType":"examples"},"bb454968-c54f-4684-9d04-9778d2d787ac":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"One sentence, safe to show a developer.","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"retryAfter":{"type":"integer","description":"Seconds until the limit resets. Only on 429.","uniqueKey":"retryAfter","typeLabel":"integer"}},"required":["error"],"uniqueKey":"","typeLabel":"object"},"example":{"error":"Rate limit exceeded.","retryAfter":42},"examples":{"Example":{"title":"Example","value":{"error":"Rate limit exceeded.","retryAfter":42}}},"exampleType":"examples"}},"exampleType":"examples"}},"security":{"d8fa3247-b2b3-4c37-aab6-cfc626ce8b65":{"botToken":{"type":"apiKey","in":"header","name":"Authorization","description":"The bot's API token, generated on its edit page. Sent bare or as `Bearer \u003ctoken>` -- both are accepted, because the libraries already posting to other lists send both. The token is shown once; generating a new one invalidates the old.","scopes":[]}}},"servers":{"755fe365-e06e-4d26-95ca-7c6da2a485ae":{"url":"https://picked.gg","description":"Production"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"apiKey","in":"header","name":"Authorization","description":"The bot's API token, generated on its edit page. Sent bare or as `Bearer \u003ctoken>` -- both are accepted, because the libraries already posting to other lists send both. The token is shown once; generating a new one invalidates the old.","scopes":[]},"schema":{"title":"Authorization","type":"string","description":"The bot's API token, generated on its edit page. Sent bare or as `Bearer \u003ctoken>` -- both are accepted, because the libraries already posting to other lists send both. The token is shown once; generating a new one invalidates the old.","isRequired":true,"typeLabel":"string","deprecated":false},"schemeName":"botToken","name":"Authorization"}],"title":"botToken"}]},"originalFileLocation":"openapi.json"},"subdomain":"discord-bot-list","siteName":"Picked.gg API","title":"Publish the Commands - Picked.gg API","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-01T09:19:23.347Z","originalFileLocation":"api-reference/bot/publish-the-commands.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"dark\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Replace the commands shown on the bot\u0026#x27;s page. PUT rather than POST on purpose: a bot that removed a command has to be able to say so, and a merge would leave the removed one on the page with nothing able to delete it. The shape mirrors Discord\u0026#x27;s own application command objects, so a bot can forward what it already registered. Duplicate names are dropped, keeping the first. An empty array clears the list. Rate limit: 10 requests per minute per token -- enough to clear a restart loop, not a stream.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Picked.gg API\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/discord-bot-list/WTUM4iwY_nK2wmqu/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/discord-bot-list/WTUM4iwY_nK2wmqu/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/discord-bot-list/WTUM4iwY_nK2wmqu/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/discord-bot-list/WTUM4iwY_nK2wmqu/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/discord-bot-list/WTUM4iwY_nK2wmqu/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/discord-bot-list/WTUM4iwY_nK2wmqu/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/discord-bot-list/WTUM4iwY_nK2wmqu/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/discord-bot-list/WTUM4iwY_nK2wmqu/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/discord-bot-list/WTUM4iwY_nK2wmqu/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Publish the Commands - Picked.gg API\">\u003cmeta data-mint-head property=\"og:description\" content=\"Replace the commands shown on the bot\u0026#x27;s page. PUT rather than POST on purpose: a bot that removed a command has to be able to say so, and a merge would leave the removed one on the page with nothing able to delete it. The shape mirrors Discord\u0026#x27;s own application command objects, so a bot can forward what it already registered. Duplicate names are dropped, keeping the first. An empty array clears the list. Rate limit: 10 requests per minute per token -- enough to clear a restart loop, not a stream.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Picked.gg API\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.picked.gg/api-reference/bot/publish-the-commands\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://discord-bot-list.mintlify.site/_mintlify/api/og/v2?division=Bot\u0026amp;title=Publish+the+Commands\u0026amp;description=Replace+the+commands+shown+on+the+bot%27s+page.+PUT+rather+than+POST+on+purpose%3A+a+bot+that+removed+a+command+has+to+be+able+to+say+so%2C+and+a+merge+would+leave+th\u0026amp;theme=19a5af8f0aff01bf5002c367\u0026amp;signature=d19300def2ce600fa4b9374a34b851f164acfe890aa0b9da219ea44b1b5090df\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Publish the Commands - Picked.gg API\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Replace the commands shown on the bot\u0026#x27;s page. PUT rather than POST on purpose: a bot that removed a command has to be able to say so, and a merge would leave the removed one on the page with nothing able to delete it. The shape mirrors Discord\u0026#x27;s own application command objects, so a bot can forward what it already registered. Duplicate names are dropped, keeping the first. An empty array clears the list. Rate limit: 10 requests per minute per token -- enough to clear a restart loop, not a stream.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://discord-bot-list.mintlify.site/_mintlify/api/og/v2?division=Bot\u0026amp;title=Publish+the+Commands\u0026amp;description=Replace+the+commands+shown+on+the+bot%27s+page.+PUT+rather+than+POST+on+purpose%3A+a+bot+that+removed+a+command+has+to+be+able+to+say+so%2C+and+a+merge+would+leave+th\u0026amp;theme=19a5af8f0aff01bf5002c367\u0026amp;signature=d19300def2ce600fa4b9374a34b851f164acfe890aa0b9da219ea44b1b5090df\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/discord-bot-list/WTUM4iwY_nK2wmqu/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Picked.gg API\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#3f6b00\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.picked.gg/api-reference/bot/publish-the-commands\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/bot/publish-the-commands.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.picked.gg/#organization\",\"name\":\"Picked.gg API\",\"url\":\"https://docs.picked.gg\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/discord-bot-list/ejs7hyHiUJZbewnI/logo/light.png?fit=max\u0026auto=format\u0026n=ejs7hyHiUJZbewnI\u0026q=85\u0026s=b3c2ca9e1350b7d8f5788bd130b50b97\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.picked.gg#website\",\"name\":\"Picked.gg API\",\"url\":\"https://docs.picked.gg\",\"publisher\":{\"@id\":\"https://docs.picked.gg/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.picked.gg/api-reference/bot/publish-the-commands#webpage\",\"url\":\"https://docs.picked.gg/api-reference/bot/publish-the-commands\",\"name\":\"Publish the Commands\",\"description\":\"Replace the commands shown on the bot's page. PUT rather than POST on purpose: a bot that removed a command has to be able to say so, and a merge would leave the removed one on the page with nothing able to delete it. The shape mirrors Discord's own application command objects, so a bot can forward what it already registered. Duplicate names are dropped, keeping the first. An empty array clears the list. Rate limit: 10 requests per minute per token -- enough to clear a restart loop, not a stream.\",\"dateModified\":\"2026-10-01T09:19:23.347Z\",\"isPartOf\":{\"@id\":\"https://docs.picked.gg#website\"},\"breadcrumb\":{\"@id\":\"https://docs.picked.gg/api-reference/bot/publish-the-commands#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.picked.gg/api-reference/bot/publish-the-commands#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"API Reference\",\"item\":\"https://docs.picked.gg/api-reference/bot/post-the-server-count\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Bot\",\"item\":\"https://docs.picked.gg/api-reference/bot/post-the-server-count\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Publish the Commands\",\"item\":\"https://docs.picked.gg/api-reference/bot/publish-the-commands\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.picked.gg/api-reference/bot/publish-the-commands#apireference\",\"headline\":\"Publish the Commands\",\"name\":\"Publish the Commands\",\"description\":\"Replace the commands shown on the bot's page. PUT rather than POST on purpose: a bot that removed a command has to be able to say so, and a merge would leave the removed one on the page with nothing able to delete it. The shape mirrors Discord's own application command objects, so a bot can forward what it already registered. Duplicate names are dropped, keeping the first. An empty array clears the list. Rate limit: 10 requests per minute per token -- enough to clear a restart loop, not a stream.\",\"url\":\"https://docs.picked.gg/api-reference/bot/publish-the-commands\",\"mainEntityOfPage\":{\"@id\":\"https://docs.picked.gg/api-reference/bot/publish-the-commands#webpage\"},\"dateModified\":\"2026-10-01T09:19:23.347Z\",\"publisher\":{\"@id\":\"https://docs.picked.gg/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.picked.gg#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Picked.gg API\",\"publisher\":{\"@type\":\"Organization\",\"name\":\"Picked.gg API\"},\"provider\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","agentPointerHref":"/api-reference/bot/publish-the-commands.md","siteName":"Picked.gg API","nav":{"global":null,"groups":[{"group":"Getting Started","pages":[{"title":"Picked.gg API","href":"/index"},{"title":"Authentication","href":"/authentication"},{"title":"Errors and Rate Limits","href":"/errors"}]},{"group":"API Reference","pages":[{"group":"Bot","pages":[{"title":"Post the Server Count","description":"Report how many servers the bot is in. Rate limit: 60 requests per minute per token, which is well above one post per shard per interval.\n\nRe-posting the same number is cheap: the page cache is only invalidated when the value actually changes. The check-in timestamp is written every time, and it is what the bot page reads as a liveness signal.","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/bots/{id}/stats","href":"/api-reference/bot/post-the-server-count"},{"title":"Publish the Commands","deprecated":null,"version":null,"openapi":"/openapi.json put /api/v1/bots/{id}/commands","href":"/api-reference/bot/publish-the-commands"}]},{"group":"Votes","pages":[{"title":"Check a User Vote","description":"Answers whether a user is inside their current 12-hour vote window. This is the endpoint that makes vote-for-perks possible, so its limit is the highest on the API: 600 requests per minute per token.\n\n`voted` is 0 or 1 because that is what bot code written against other lists expects; `hasVoted` is the readable alias for new code. `nextVoteAt` lets the bot tell the user when to come back without recomputing the cooldown.","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/bots/{id}/check","href":"/api-reference/votes/check-a-user-vote"},{"title":"Recent Votes","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/bots/{id}/votes","href":"/api-reference/votes/recent-votes"}]},{"group":"Public","pages":[{"title":"Vote Count Badge","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/bots/{id}/widget","href":"/api-reference/public/vote-count-badge"}]}]},{"group":"Guides","pages":[{"title":"Official Libraries","href":"/guides/libraries"},{"title":"Autoposting Your Server Count","href":"/guides/autoposting"},{"title":"Vote Webhook","href":"/guides/vote-webhook"},{"title":"Vote Rewards","href":"/guides/vote-rewards"}]}]},"basePath":"","title":"Publish the Commands - Picked.gg API","buildId":"dpl_8hoxaqFTU7hTr6A2fUraxAyjuiZo","deploymentId":"dpl_8hoxaqFTU7hTr6A2fUraxAyjuiZo","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-CDiBsYGW.js","utils-KF9rPlmF.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-C26urKTX.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-BdjmJAC1.js","snippetPresets-3IpDBjt3.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","conditional-requirements-CFM0id0Q.js","ApiExamples-D4x_2vvo.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-BIWdc5Pa.js","shallow-LQqfiMNd.js","getApiPlaygroundDisplay-DryzlOZG.js","CodeSnippet-tcJujU4r.js","CodeSnippets-BHp0nVLL.js","Page-1CZdsdAn.js","getPastedJson-DU-1ayUv.js","icon-CZK2hPr4.js","MethodPill-DOaqmTFC.js","DuplicateIcon-B5-nUxxl.js","createIcon-CDP_U77G.js","DynamicMarkdown-GHvayGOn.js","SectionHeading-BYvpkmUD.js","axios-vUo_bRtp.js","Markdown-uxhlayGT.js","clsx-B35qUV0p.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-BvrGG8gU.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-CAf0yVYe.js"]}