{"componentChunkName":"component---src-templates-blog-post-js","path":"/api-credentials-cli-openapi-github","result":{"data":{"site":{"siteMetadata":{"title":"SoundCloud Backstage Blog","author":"SoundCloud"}},"markdownRemark":{"id":"7810df09-d206-5de1-8b14-c2815d78616b","excerpt":"In May we opened self-service app registration for Artist Pro subscribers. That fixed the browser flow. Two requests kept coming up anyway: can I do this from the terminal? and where is the OpenAPI file? Here is what we shipped. Register from the terminal Not everyone wants to fill in a web form. If you live in a , or you are wiring up an agent that expects shell steps, we added  to soundcloud/api. It opens a browser for OAuth (think ), registers your app, and prints your Client ID and the…","html":"<p>In May we opened <a href=\"https://developers.soundcloud.com/docs/api/register-app\">self-service app registration</a> for <a href=\"https://checkout.soundcloud.com/artist/buy/artist-pro?ref=t10809\">Artist Pro</a> subscribers. That fixed the browser flow. Two requests kept coming up anyway: <em>can I do this from the terminal?</em> and <em>where is the OpenAPI file?</em></p>\n<p>Here is what we shipped.</p>\n<hr>\n<h2>Register from the terminal</h2>\n<p>Not everyone wants to fill in a web form. If you live in a <code class=\"language-text\">shell</code>, or you are wiring up an agent that expects shell steps, we added <strong><code class=\"language-text\">sc-api-auth.mjs</code></strong> to <a href=\"https://github.com/soundcloud/api\">soundcloud/api</a>.</p>\n<p>It opens a browser for OAuth (think <code class=\"language-text\">aws sso login</code>), registers your app, and prints your Client ID and the credential JSON to <code class=\"language-text\">stdout</code>. One file, Node.js 18+, no <code class=\"language-text\">npm install</code>.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 800px;\"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/blog/static/7bca9855b54dcb518061667614ad0d3c/e644c/oauth-login.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 75.7201646090535%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAYAAADkmO9VAAAACXBIWXMAABYlAAAWJQFJUiTwAAACG0lEQVQ4y4VSyY4aUQzsI4vEb3Dgn7gRBMwV/o4DIKDZIewExL6JVWzN0lDpstKISYbJk0r267bLfmUrl8sFrVYLw+EQy+US/X7/6Y9GI9TrdUynU8xmM7GVSgWLxQI89/sdj8dDfNMqm80G8XgcyWRSgsfjMaLRKHK5HCKRiNhCoQBVVVGr1ZBIJLBarfB6TDIhnM/niMViSKfTElwsFpFKpaQAydvtthCSuFqtotvtiuV/Ftntdv92mM1mhbBUKkm3TGa3fHKz2USj0ZD7z3JZCrKJyWQiMlyv18+ErMBq+XxeLMlJyOpM5jcWUg2bTqnoGB3/fT49mReKawps2vP5LNXvhq/rOm76AxcduN0BnTEvOSaEkMH7/V6wXq9xOBzEHwwGMlX6h/0Oy+0JvyZXTNe6kH51SKqwCkmI4/EoMO+apj0LaNrJ8Pc48vvJwJH+zpj4GpzDs0MmZDIZGcqrpXacLi01NfXkt0KlDTXfRKHcQs2YOPeY+ywd8snsRHS63aQb6kcw6HQ6ib/dbqV76ncwtFxowOGLpyu9Xg+BQAA+nw9+v1982lcEg0GEQqHnPeD34sOA3/cDHo8HXq8XbrdbFl/hmtjtdlitVthstqc1YbFY4HQ64XK5xJeYP6DPXIfDAUVREA6HofBJ3PzvQN24i1zudzFlY+kpl0yZ+/YO1K/T6YjwLE6d38WS67+EBIdjLvp3INdv1wEW1s1GRZMAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"SoundCloud API Registration OAuth consent screen\"\n        title=\"SoundCloud API Registration OAuth consent screen\"\n        src=\"/blog/static/7bca9855b54dcb518061667614ad0d3c/8ff1e/oauth-login.png\"\n        srcset=\"/blog/static/7bca9855b54dcb518061667614ad0d3c/9ec3c/oauth-login.png 200w,\n/blog/static/7bca9855b54dcb518061667614ad0d3c/c7805/oauth-login.png 400w,\n/blog/static/7bca9855b54dcb518061667614ad0d3c/8ff1e/oauth-login.png 800w,\n/blog/static/7bca9855b54dcb518061667614ad0d3c/e644c/oauth-login.png 972w\"\n        sizes=\"(max-width: 800px) 100vw, 800px\"\n        loading=\"lazy\"\n      />\n  </a>\n    </span></p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function\">curl</span> -fsSL https://raw.githubusercontent.com/soundcloud/api/master/scripts/sc-api-auth.mjs -o sc-api-auth.mjs\nnode sc-api-auth.mjs <span class=\"token punctuation\">\\</span>\n  --name <span class=\"token string\">\"My API App\"</span> <span class=\"token punctuation\">\\</span>\n  --description <span class=\"token string\">\"What my integration does\"</span> <span class=\"token punctuation\">\\</span>\n  --website <span class=\"token string\">\"https://example.com\"</span></code></pre></div>\n<p>Same rules as the website: Artist Pro, app metadata, <a href=\"https://developers.soundcloud.com/docs/api/terms-of-use\">API Terms of Use</a>. Already have an app? It returns what you have instead of creating a second one.</p>\n<p>Docs: <a href=\"https://developers.soundcloud.com/docs/api/register-app#alternative-register-from-the-command-line\">Get an API key (command line)</a>.</p>\n<hr>\n<h2>OpenAPI spec on GitHub</h2>\n<p>The <a href=\"https://developers.soundcloud.com/docs/api/explorer/open-api\">Swagger UI explorer</a> is still the place to click around and try calls.</p>\n<p>If you want the spec as a file (codegen, offline reference, LLM context), it now lives on GitHub: <a href=\"https://github.com/soundcloud/api/blob/master/openapi/api.yaml\"><code class=\"language-text\">openapi/api.yaml</code></a> in <a href=\"https://github.com/soundcloud/api\">soundcloud/api</a>. Same document as the explorer. We update it when the API changes.</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function\">curl</span> -fsSL https://raw.githubusercontent.com/soundcloud/api/master/openapi/api.yaml -o soundcloud-api.yaml</code></pre></div>\n<p>Building with an AI assistant? Point it at the YAML plus our <a href=\"https://developers.soundcloud.com/docs/building-with-ai\">Building with AI</a> page or the <a href=\"https://developers.soundcloud.com/docs/llm-context\">LLM context</a> summary so it stops inventing auth headers.</p>\n<hr>\n<h2>Where to look on GitHub</h2>\n<p><a href=\"https://github.com/soundcloud/api\">soundcloud/api</a> is the public repo for API discussion, <a href=\"https://github.com/soundcloud/api/releases\">release notes</a>, the <a href=\"https://github.com/soundcloud/api/blob/master/scripts/sc-api-auth.mjs\"><code class=\"language-text\">sc-api-auth.mjs</code></a> script, and <a href=\"https://github.com/soundcloud/api/blob/master/openapi/api.yaml\"><code class=\"language-text\">openapi/api.yaml</code></a>. Bugs and feature requests go to <a href=\"https://github.com/soundcloud/api/issues\">GitHub Issues</a> there.</p>\n<hr>\n<p>Happy Building!</p>","fields":{"teaserPlainText":"A small CLI for API credentials, plus the OpenAPI spec on GitHub where you can actually wget it."},"frontmatter":{"title":"API Credentials from Your Terminal, and OpenAPI on GitHub","date":"June 16th, 2026","categories":["API","Announcement"],"authors":[{"name":"Danny Preussler","link":null}],"image":null}}},"pageContext":{"isCreatedByStatefulCreatePages":false,"slug":"api-credentials-cli-openapi-github","previous":{"fields":{"slug":"vibe-coding-ai-agent-docs-self-serve-api-keys"},"frontmatter":{"permalink":"vibe-coding-ai-agent-docs-self-serve-api-keys","title":"Vibe Coding with SoundCloud: Announcing New Docs for your Agents","categories":["API","Announcement","AI"],"authors":[{"name":"Danny Preussler","link":null}]}},"next":null}}}