Create API keys in Soundlink, then use them with scopes, expiration, and Authorization Bearer.
Create an API key
Organization owners and admins can create keys in the Soundlink app — no support ticket required.
Open API keys in Settings
Sign in at Soundlink, open your profile menu → Settings, then Developer
→ API keys. The app uses your current organization automatically — no org ID
in the URL.
1
Open the API keys page
From your profile menu, go to Settings → Developer → API keys. Soundlink scopes this page
to your active organization — you never paste an org ID into the URL.
You’ll see every key for the org — active, expired, and revoked — with scopes, expiration,
and last used.
API keys list in Settings → Developer
2
Create a key
Click Create key. Give the key a name (required), choose an expiration, and select
one or more scopes (at least one required).
Field
Details
Name
A label you’ll recognize later (e.g. Warehouse sync, Staging).
Expiration
Pick one: 7 days, 30 days, 90 days, 1 year, or Never. When the date passes, the API returns 401 with api_key_expired.
Scopes
Any combination of the v1 scopes below — at least one required. See Scopes.
Create key — name, expiration, and scopes
Start with 30 days and both read scopes if you’re exploring the API. Rotate or revoke the
key when you’re done testing.
3
Copy and store the key
After you click Create key, Soundlink shows the full key exactly once. Copy it
immediately and store it in your secrets manager or password vault.
You cannot retrieve the full key later — only revoke it and create a new one. The keys list
never shows the secret, only a masked placeholder.
One-time key reveal — copy before closing
Members (non-admin roles) see API keys in Settings but cannot open the page — ask an owner or
admin to create a key for your integration.
API key format
sk_<prefix>_<secret>
Pass the full string in the Authorization header as a Bearer token:
-H 'Authorization: Bearer sk_abc123_...'
The same header also accepts an OAuth access token. See OAuth Integration.A missing or unrecognized API key returns 401 with invalid_api_key. An invalid or expired OAuth token returns 401 with invalid_token.
Scopes (v1)
Scopes limit which endpoints a key can call. Select them when you create the key; they cannot be changed without minting a new key.
Scope
Access
Self-serve UI
campaigns:read
List campaigns, campaign detail, strategy catalog, campaign tiers, activity
Yes
wallet:read
Organization wallet balance (GET /v1/wallet)
Yes
metrics:read
Metrics overview, creatives, breakdown, exports, and batch reads
Yes
soundlinks:read
List soundlinks, soundlink detail, soundlink metrics
Yes
soundlinks:write
Create, archive, and send test events for self-serve soundlinks
Save/rotate/delete Meta pixels and send test events
Yes
Typical read-only integrations enable bothcampaigns:read and metrics:read.
Add soundlinks:read when you need self-serve soundlink catalog or Insights metrics.
Add soundlinks:write to create, archive, or send a test event.
Add campaigns:write only when the integration should spend wallet credit or manage delivery.
Add pixels:read / pixels:write to manage organization Meta pixels.
Existing keys keep their original scopes. Create a new key to get wallet:read,
soundlinks:read, or soundlinks:write — wallet:read is not on an existing key
until that scope is granted. See Creating soundlinks.
GET /v1/ping accepts any valid v1 key regardless of which read scopes you
selected — useful for smoke tests after creation.
Expiration
Choose a lifetime at creation:
Preset
Duration
7 days
Short-lived (experiments, CI)
30 days
Default-friendly for most integrations
90 days
Longer-running services
1 year
Maximum fixed preset in the app
Never
No expiration — revoke manually when done
Prefer a fixed preset over Never for anything you can rotate. A key that never expires only
goes away when someone remembers to revoke it.
After expiresAt, requests fail with 401 and api_key_expired. Keys created with Never have
no expiresAt and only stop working when revoked. Create a replacement key before a fixed-lifetime
key lapses, update your integration, then revoke the old key.
Organization isolation
Your organization is determined only from the API key. The API ignores x-organization-id and similar spoofed headers.
Key lifecycle
Active — key is within its expiration window and not revoked.
Revoked — you deleted the key in Settings; API returns api_key_revoked.
Expired — past expiresAt; API returns api_key_expired.
Revoked keys stay visible in the list with status and date so you can audit past integrations.
Verify your new key in Quickstart with GET /v1/ping, then list campaigns.
⌘I
{"docsConfig":{"theme":"maple","$schema":"https://mintlify.com/docs.json","name":"Soundlink API","colors":{"primary":"#fafafa","light":"#ffffff","dark":"#a3a3a3"},"logo":{"light":"https://mintcdn.com/soundlink/r4t_NTp0RR8PWS5A/logo/light.svg?fit=max\u0026auto=format\u0026n=r4t_NTp0RR8PWS5A\u0026q=85\u0026s=3bcfd864337269deff6f2dfb20b5d54e","dark":"https://mintcdn.com/soundlink/r4t_NTp0RR8PWS5A/logo/dark.svg?fit=max\u0026auto=format\u0026n=r4t_NTp0RR8PWS5A\u0026q=85\u0026s=36f98e492d5d42f90d5e0cde857aae77","href":"https://getsoundlink.com"},"favicon":"https://mintcdn.com/soundlink/WOvNsxRqsW6JWKaS/favicon.svg?fit=max\u0026auto=format\u0026n=WOvNsxRqsW6JWKaS\u0026q=85\u0026s=e655476e4db08c398106e8952657a353","api":{"playground":{"display":"interactive"},"examples":{"defaults":"required","languages":["curl","python","javascript"]}},"navbar":{"links":[{"href":"/","label":"Documentation"},{"href":"/api-reference","label":"API Reference"},{"href":"mailto:hello@getsoundlink.com","label":"Support"}],"primary":{"type":"button","label":"Get started","href":"https://getsoundlink.com/auth"}},"footer":{"socials":{"website":"https://getsoundlink.com"}},"styling":{"codeblocks":{"theme":{"light":"github-light","dark":"github-dark"}},"latex":true},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"soundlink","hasAudioNarration":false,"actualSubdomain":"soundlink","customDomains":["www.getsoundlink.com"],"gitSource":{"type":"github","owner":"fan-id","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":false,"mountPath":"","label":""},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6af76e9147dbd2d2d12ec39b","clientVersion":"0.0.4143","searchFilterCounts":[{"language":"default","tag":"API Reference","count":45},{"language":"default","tag":"Documentation","count":39},{"language":"default","tag":"Campaigns","count":30},{"language":"default","tag":"For Developers","count":24},{"language":"default","tag":"Metrics","count":20},{"language":"default","tag":"Soundlinks","count":17},{"language":"default","tag":"Learn","count":13},{"language":"default","tag":"API guides","count":12},{"language":"default","tag":"Credit wallet","count":9},{"language":"default","tag":"Pixels","count":5}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"/docs","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":false},"customCss":[],"page":{"pagePath":"authentication","slug":"/authentication","pageMetadata":{"title":"Authentication","description":"Create API keys in Soundlink, then use them with scopes, expiration, and Authorization Bearer.","href":"/authentication"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Create API keys in Soundlink, then use them with scopes, expiration, and Authorization Bearer.\"\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,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,hr:`hr`,li:`li`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{Card,CodeBlock,Frame,Heading,Note,OptimizedImage,Step,Steps,Table,Tip,Warning}=_components;if(!Card)_missingMdxReference(`Card`,true);if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Frame)_missingMdxReference(`Frame`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Note)_missingMdxReference(`Note`,true);if(!OptimizedImage)_missingMdxReference(`OptimizedImage`,true);if(!Step)_missingMdxReference(`Step`,true);if(!Steps)_missingMdxReference(`Steps`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Tip)_missingMdxReference(`Tip`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(Heading,{level:`2`,id:`create-an-api-key`,children:`Create an API key`}),`\n`,_jsxs(_components.p,{children:[`Organization `,_jsx(_components.strong,{children:`owners`}),` and `,_jsx(_components.strong,{children:`admins`}),` can create keys in the Soundlink app — no support ticket required.`]}),`\n`,_jsx(Card,{title:`Open API keys in Settings`,icon:`key`,href:`https://getsoundlink.com/home`,children:_jsxs(_components.p,{children:[`Sign in at Soundlink, open your profile menu → `,_jsx(_components.strong,{children:`Settings`}),`, then `,_jsx(_components.strong,{children:`Developer\n→ API keys`}),`. The app uses your current organization automatically — no org ID\nin the URL.`]})}),`\n`,_jsxs(Steps,{children:[_jsxs(Step,{title:`Open the API keys page`,children:[_jsxs(_components.p,{children:[`From your profile menu, go to `,_jsx(_components.strong,{children:`Settings → Developer → API keys`}),`. Soundlink scopes this page\nto your active organization — you never paste an org ID into the URL.\nYou’ll see every key for the org — active, expired, and revoked — with scopes, expiration,\nand last used.`]}),_jsx(Frame,{caption:`API keys list in Settings → Developer`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/soundlink/KlliMmjVHYTSKvtB/images/api-keys/list.png?fit=max\u0026auto=format\u0026n=KlliMmjVHYTSKvtB\u0026q=85\u0026s=a444461f2f042cd10203521be3f68cf5`,alt:`Soundlink Settings Developer API keys table with name, scopes, expiration, status, and Create key button`,\"data-og-width\":`2934`,width:`2934`,\"data-og-height\":`1668`,height:`1668`,\"data-path\":`images/api-keys/list.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/soundlink/KlliMmjVHYTSKvtB/images/api-keys/list.png?w=280\u0026fit=max\u0026auto=format\u0026n=KlliMmjVHYTSKvtB\u0026q=85\u0026s=7ee8b5115f9ff2ad5492b92bca457bca 280w, https://mintcdn.com/soundlink/KlliMmjVHYTSKvtB/images/api-keys/list.png?w=560\u0026fit=max\u0026auto=format\u0026n=KlliMmjVHYTSKvtB\u0026q=85\u0026s=22f9b104c51c72243962ba97228d6288 560w, https://mintcdn.com/soundlink/KlliMmjVHYTSKvtB/images/api-keys/list.png?w=840\u0026fit=max\u0026auto=format\u0026n=KlliMmjVHYTSKvtB\u0026q=85\u0026s=e284923089034d5006d94c954d305085 840w, https://mintcdn.com/soundlink/KlliMmjVHYTSKvtB/images/api-keys/list.png?w=1100\u0026fit=max\u0026auto=format\u0026n=KlliMmjVHYTSKvtB\u0026q=85\u0026s=0ca65ab2924de76b468c781783528719 1100w, https://mintcdn.com/soundlink/KlliMmjVHYTSKvtB/images/api-keys/list.png?w=1650\u0026fit=max\u0026auto=format\u0026n=KlliMmjVHYTSKvtB\u0026q=85\u0026s=e63e36124e7d485704612d7ec15b66e9 1650w, https://mintcdn.com/soundlink/KlliMmjVHYTSKvtB/images/api-keys/list.png?w=2500\u0026fit=max\u0026auto=format\u0026n=KlliMmjVHYTSKvtB\u0026q=85\u0026s=581ad5de36bd671a0839f5a74bd5c96f 2500w`})})]}),_jsxs(Step,{title:`Create a key`,children:[_jsxs(_components.p,{children:[`Click `,_jsx(_components.strong,{children:`Create key`}),`. Give the key a `,_jsx(_components.strong,{children:`name`}),` (required), choose an `,_jsx(_components.strong,{children:`expiration`}),`, and select\none or more `,_jsx(_components.strong,{children:`scopes`}),` (at least one required).`]}),_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Field`}),_jsx(_components.th,{children:`Details`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Name`})}),_jsxs(_components.td,{children:[`A label you’ll recognize later (e.g. `,_jsx(_components.code,{children:`Warehouse sync`}),`, `,_jsx(_components.code,{children:`Staging`}),`).`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Expiration`})}),_jsxs(_components.td,{children:[`Pick one: `,_jsx(_components.strong,{children:`7 days`}),`, `,_jsx(_components.strong,{children:`30 days`}),`, `,_jsx(_components.strong,{children:`90 days`}),`, `,_jsx(_components.strong,{children:`1 year`}),`, or `,_jsx(_components.strong,{children:`Never`}),`. When the date passes, the API returns `,_jsx(_components.code,{children:`401`}),` with `,_jsx(_components.code,{children:`api_key_expired`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Scopes`})}),_jsxs(_components.td,{children:[`Any combination of the v1 scopes below — at least one required. See `,_jsx(_components.a,{href:`#scopes-v1`,children:`Scopes`}),`.`]})]})]})]}),_jsx(Frame,{caption:`Create key — name, expiration, and scopes`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/soundlink/KlliMmjVHYTSKvtB/images/api-keys/create-dialog.png?fit=max\u0026auto=format\u0026n=KlliMmjVHYTSKvtB\u0026q=85\u0026s=bdda1590a290793338864982e0095fb0`,alt:`Create API key dialog with name field, expiration dropdown, and scope checkboxes`,\"data-og-width\":`2934`,width:`2934`,\"data-og-height\":`1668`,height:`1668`,\"data-path\":`images/api-keys/create-dialog.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/soundlink/KlliMmjVHYTSKvtB/images/api-keys/create-dialog.png?w=280\u0026fit=max\u0026auto=format\u0026n=KlliMmjVHYTSKvtB\u0026q=85\u0026s=a1065cd2d40bcdfd455ed58906579495 280w, https://mintcdn.com/soundlink/KlliMmjVHYTSKvtB/images/api-keys/create-dialog.png?w=560\u0026fit=max\u0026auto=format\u0026n=KlliMmjVHYTSKvtB\u0026q=85\u0026s=2fe14da34e1d14f5682b71543a438574 560w, https://mintcdn.com/soundlink/KlliMmjVHYTSKvtB/images/api-keys/create-dialog.png?w=840\u0026fit=max\u0026auto=format\u0026n=KlliMmjVHYTSKvtB\u0026q=85\u0026s=2d8a93a201cfa415484d46e866fd60c0 840w, https://mintcdn.com/soundlink/KlliMmjVHYTSKvtB/images/api-keys/create-dialog.png?w=1100\u0026fit=max\u0026auto=format\u0026n=KlliMmjVHYTSKvtB\u0026q=85\u0026s=7628f60198027e4059845b3239ba9154 1100w, https://mintcdn.com/soundlink/KlliMmjVHYTSKvtB/images/api-keys/create-dialog.png?w=1650\u0026fit=max\u0026auto=format\u0026n=KlliMmjVHYTSKvtB\u0026q=85\u0026s=72aaa366eadf5babc6ac2397d81a3a26 1650w, https://mintcdn.com/soundlink/KlliMmjVHYTSKvtB/images/api-keys/create-dialog.png?w=2500\u0026fit=max\u0026auto=format\u0026n=KlliMmjVHYTSKvtB\u0026q=85\u0026s=e22c2b7dd79c161feb02fbe1368536df 2500w`})}),_jsx(Tip,{children:_jsxs(_components.p,{children:[`Start with `,_jsx(_components.strong,{children:`30 days`}),` and both read scopes if you’re exploring the API. Rotate or revoke the\nkey when you’re done testing.`]})})]}),_jsxs(Step,{title:`Copy and store the key`,children:[_jsxs(_components.p,{children:[`After you click `,_jsx(_components.strong,{children:`Create key`}),`, Soundlink shows the `,_jsx(_components.strong,{children:`full key exactly once`}),`. Copy it\nimmediately and store it in your secrets manager or password vault.`]}),_jsx(Warning,{children:_jsx(_components.p,{children:`You cannot retrieve the full key later — only revoke it and create a new one. The keys list\nnever shows the secret, only a masked placeholder.`})}),_jsx(Frame,{caption:`One-time key reveal — copy before closing`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/soundlink/KlliMmjVHYTSKvtB/images/api-keys/key-reveal.png?fit=max\u0026auto=format\u0026n=KlliMmjVHYTSKvtB\u0026q=85\u0026s=3b9e3a7233b3180c7a343617afc5ac10`,alt:`Save your API key dialog with masked key, reveal and copy buttons, and warning that the key is shown only once`,\"data-og-width\":`2934`,width:`2934`,\"data-og-height\":`1668`,height:`1668`,\"data-path\":`images/api-keys/key-reveal.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/soundlink/KlliMmjVHYTSKvtB/images/api-keys/key-reveal.png?w=280\u0026fit=max\u0026auto=format\u0026n=KlliMmjVHYTSKvtB\u0026q=85\u0026s=4354557f0a44c0110a4f85f790cb74d7 280w, https://mintcdn.com/soundlink/KlliMmjVHYTSKvtB/images/api-keys/key-reveal.png?w=560\u0026fit=max\u0026auto=format\u0026n=KlliMmjVHYTSKvtB\u0026q=85\u0026s=f171d1d50d539b78e7e57f0f4c8a3b53 560w, https://mintcdn.com/soundlink/KlliMmjVHYTSKvtB/images/api-keys/key-reveal.png?w=840\u0026fit=max\u0026auto=format\u0026n=KlliMmjVHYTSKvtB\u0026q=85\u0026s=4409b533aafe0df35b2b5b9233613039 840w, https://mintcdn.com/soundlink/KlliMmjVHYTSKvtB/images/api-keys/key-reveal.png?w=1100\u0026fit=max\u0026auto=format\u0026n=KlliMmjVHYTSKvtB\u0026q=85\u0026s=51107b2707bd856eb958d151f8ce129b 1100w, https://mintcdn.com/soundlink/KlliMmjVHYTSKvtB/images/api-keys/key-reveal.png?w=1650\u0026fit=max\u0026auto=format\u0026n=KlliMmjVHYTSKvtB\u0026q=85\u0026s=066e527da1e58ea3b19e7d469f279190 1650w, https://mintcdn.com/soundlink/KlliMmjVHYTSKvtB/images/api-keys/key-reveal.png?w=2500\u0026fit=max\u0026auto=format\u0026n=KlliMmjVHYTSKvtB\u0026q=85\u0026s=4a736f6ffc339a66891936a0babc7c62 2500w`})})]})]}),`\n`,_jsxs(_components.p,{children:[`Members (non-admin roles) see `,_jsx(_components.strong,{children:`API keys`}),` in Settings but cannot open the page — ask an owner or\nadmin to create a key for your integration.`]}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`api-key-format`,children:`API key format`}),`\n`,_jsx(CodeBlock,{numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light github-dark`,style:{backgroundColor:`#fff`,\"--shiki-dark-bg\":`#24292e`,color:`#24292e`,\"--shiki-dark\":`#e1e4e8`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`sk_\u003cprefix>_\u003csecret>`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsxs(_components.p,{children:[`Pass the full string in the `,_jsx(_components.strong,{children:_jsx(_components.code,{children:`Authorization`})}),` header as a Bearer token:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light github-dark`,style:{backgroundColor:`#fff`,\"--shiki-dark-bg\":`#24292e`,color:`#24292e`,\"--shiki-dark\":`#e1e4e8`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#6F42C1`,\"--shiki-dark\":`#B392F0`},children:`-H`}),_jsx(_components.span,{style:{color:`#032F62`,\"--shiki-dark\":`#9ECBFF`},children:` 'Authorization: Bearer sk_abc123_...'`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`The same header also accepts an OAuth access token. See `,_jsx(_components.a,{href:`/set-up-soundlink-oauth`,children:`OAuth Integration`}),`.`]}),`\n`,_jsxs(_components.p,{children:[`A missing or unrecognized API key returns `,_jsx(_components.code,{children:`401`}),` with `,_jsx(_components.code,{children:`invalid_api_key`}),`. An invalid or expired OAuth token returns `,_jsx(_components.code,{children:`401`}),` with `,_jsx(_components.code,{children:`invalid_token`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`scopes-v1`,children:`Scopes (v1)`}),`\n`,_jsx(_components.p,{children:`Scopes limit which endpoints a key can call. Select them when you create the key; they cannot be changed without minting a new key.`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Scope`}),_jsx(_components.th,{children:`Access`}),_jsx(_components.th,{children:`Self-serve UI`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`campaigns:read`})}),_jsx(_components.td,{children:`List campaigns, campaign detail, strategy catalog, campaign tiers, activity`}),_jsx(_components.td,{children:`Yes`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`wallet:read`})}),_jsxs(_components.td,{children:[`Organization wallet balance (`,_jsx(_components.code,{children:`GET /v1/wallet`}),`)`]}),_jsx(_components.td,{children:`Yes`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`metrics:read`})}),_jsx(_components.td,{children:`Metrics overview, creatives, breakdown, exports, and batch reads`}),_jsx(_components.td,{children:`Yes`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`soundlinks:read`})}),_jsx(_components.td,{children:`List soundlinks, soundlink detail, soundlink metrics`}),_jsx(_components.td,{children:`Yes`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`soundlinks:write`})}),_jsx(_components.td,{children:`Create, archive, and send test events for self-serve soundlinks`}),_jsx(_components.td,{children:`Yes`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`campaigns:write`})}),_jsx(_components.td,{children:`Create/stop wallet campaigns, budget, tiers, auto-renew`}),_jsx(_components.td,{children:`Yes`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`videos:write`})}),_jsx(_components.td,{children:`Import partner videos for Full Control creatives`}),_jsx(_components.td,{children:`Yes`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`pixels:read`})}),_jsxs(_components.td,{children:[`List organization Meta pixels (`,_jsx(_components.code,{children:`GET /v1/pixels`}),`)`]}),_jsx(_components.td,{children:`Yes`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`pixels:write`})}),_jsx(_components.td,{children:`Save/rotate/delete Meta pixels and send test events`}),_jsx(_components.td,{children:`Yes`})]})]})]}),`\n`,_jsxs(_components.p,{children:[`Typical read-only integrations enable `,_jsx(_components.strong,{children:`both`}),` `,_jsx(_components.code,{children:`campaigns:read`}),` and `,_jsx(_components.code,{children:`metrics:read`}),`.\nAdd `,_jsx(_components.code,{children:`soundlinks:read`}),` when you need self-serve soundlink catalog or Insights metrics.\nAdd `,_jsx(_components.code,{children:`soundlinks:write`}),` to `,_jsx(_components.a,{href:`/creating-soundlinks`,children:`create`}),`, `,_jsx(_components.a,{href:`/creating-soundlinks#archive-a-soundlink`,children:`archive`}),`, or `,_jsx(_components.a,{href:`/creating-soundlinks#send-a-test-event`,children:`send a test event`}),`.\nAdd `,_jsx(_components.code,{children:`campaigns:write`}),` only when the integration should spend wallet credit or manage delivery.\nAdd `,_jsx(_components.code,{children:`pixels:read`}),` / `,_jsx(_components.code,{children:`pixels:write`}),` to `,_jsx(_components.a,{href:`/managing-pixels`,children:`manage organization Meta pixels`}),`.`]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[`Existing keys keep their original scopes. Create a new key to get `,_jsx(_components.code,{children:`wallet:read`}),`,\n`,_jsx(_components.code,{children:`soundlinks:read`}),`, or `,_jsx(_components.code,{children:`soundlinks:write`}),` — `,_jsx(_components.code,{children:`wallet:read`}),` is not on an existing key\nuntil that scope is granted. See `,_jsx(_components.a,{href:`/creating-soundlinks`,children:`Creating soundlinks`}),`.`]})}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[_jsx(_components.code,{children:`GET /v1/ping`}),` accepts any valid v1 key regardless of which read scopes you\nselected — useful for smoke tests after creation.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`expiration`,children:`Expiration`}),`\n`,_jsx(_components.p,{children:`Choose a lifetime at creation:`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Preset`}),_jsx(_components.th,{children:`Duration`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`7 days`}),_jsx(_components.td,{children:`Short-lived (experiments, CI)`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`30 days`}),_jsx(_components.td,{children:`Default-friendly for most integrations`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`90 days`}),_jsx(_components.td,{children:`Longer-running services`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`1 year`}),_jsx(_components.td,{children:`Maximum fixed preset in the app`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Never`}),_jsx(_components.td,{children:`No expiration — revoke manually when done`})]})]})]}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[`Prefer a fixed preset over `,_jsx(_components.strong,{children:`Never`}),` for anything you can rotate. A key that never expires only\ngoes away when someone remembers to revoke it.`]})}),`\n`,_jsxs(_components.p,{children:[`After `,_jsx(_components.code,{children:`expiresAt`}),`, requests fail with `,_jsx(_components.code,{children:`401`}),` and `,_jsx(_components.code,{children:`api_key_expired`}),`. Keys created with `,_jsx(_components.strong,{children:`Never`}),` have\nno `,_jsx(_components.code,{children:`expiresAt`}),` and only stop working when revoked. Create a replacement key before a fixed-lifetime\nkey lapses, update your integration, then revoke the old key.`]}),`\n`,_jsx(Heading,{level:`2`,id:`organization-isolation`,children:`Organization isolation`}),`\n`,_jsxs(_components.p,{children:[`Your organization is determined `,_jsx(_components.strong,{children:`only`}),` from the API key. The API ignores `,_jsx(_components.code,{children:`x-organization-id`}),` and similar spoofed headers.`]}),`\n`,_jsx(Heading,{level:`2`,id:`key-lifecycle`,children:`Key lifecycle`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Active`}),` — key is within its expiration window and not revoked.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Revoked`}),` — you deleted the key in Settings; API returns `,_jsx(_components.code,{children:`api_key_revoked`}),`.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Expired`}),` — past `,_jsx(_components.code,{children:`expiresAt`}),`; API returns `,_jsx(_components.code,{children:`api_key_expired`}),`.`]}),`\n`]}),`\n`,_jsx(_components.p,{children:`Revoked keys stay visible in the list with status and date so you can audit past integrations.`}),`\n`,_jsx(Heading,{level:`2`,id:`ping-vs-data-endpoints`,children:`Ping vs data endpoints`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Endpoint`}),_jsx(_components.th,{children:`Scope required`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`GET /v1/ping`})}),_jsx(_components.td,{children:`Valid key only (any v1 scope)`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.code,{children:`GET /v1/campaigns`}),`, `,_jsx(_components.code,{children:`/v1/strategies`}),`, etc.`]}),_jsx(_components.td,{children:_jsx(_components.code,{children:`campaigns:read`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`GET /v1/wallet`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`wallet:read`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Metrics overview / creatives / breakdown / exports / batch`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`metrics:read`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Campaign activity (single or batch)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`campaigns:read`})})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.code,{children:`GET /v1/soundlinks`}),` and soundlink metrics`]}),_jsx(_components.td,{children:_jsx(_components.code,{children:`soundlinks:read`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`POST /v1/soundlinks`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`soundlinks:write`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`DELETE /v1/soundlinks/{soundlinkId}`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`soundlinks:write`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`POST /v1/soundlinks/{soundlinkId}/test-events`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`soundlinks:write`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Create / stop / budget / tier write routes`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`campaigns:write`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Video import routes`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`videos:write`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`GET /v1/pixels`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`pixels:read`})})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.code,{children:`PUT`}),` / `,_jsx(_components.code,{children:`DELETE /v1/pixels/{pixelId}`}),`, test-events`]}),_jsx(_components.td,{children:_jsx(_components.code,{children:`pixels:write`})})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`next`,children:`Next`}),`\n`,_jsxs(_components.p,{children:[`Verify your new key in `,_jsx(_components.a,{href:`/quickstart`,children:`Quickstart`}),` with `,_jsx(_components.code,{children:`GET /v1/ping`}),`, then list campaigns.`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"codeStyling":{"theme":{"light":"github-light","dark":"github-dark"}},"config":{},"pageMetadata":{"title":"Authentication","description":"Create API keys in Soundlink, then use them with scopes, expiration, and Authorization Bearer.","href":"/authentication"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Create an API key","slug":"create-an-api-key","depth":2,"children":[]},{"title":"API key format","slug":"api-key-format","depth":2,"children":[]},{"title":"Scopes (v1)","slug":"scopes-v1","depth":2,"children":[]},{"title":"Expiration","slug":"expiration","depth":2,"children":[]},{"title":"Organization isolation","slug":"organization-isolation","depth":2,"children":[]},{"title":"Key lifecycle","slug":"key-lifecycle","depth":2,"children":[]},{"title":"Ping vs data endpoints","slug":"ping-vs-data-endpoints","depth":2,"children":[]},{"title":"Next","slug":"next","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"soundlink","siteName":"Soundlink API","title":"Authentication - Soundlink API","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-12T17:24:56.194Z","originalFileLocation":"authentication.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=\"system\"}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=\"Create API keys in Soundlink, then use them with scopes, expiration, and Authorization Bearer.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Soundlink API\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/docs/mintlify-assets/_mintlify/favicons/soundlink/SIre4Eol0p8vhnU7/_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=\"/docs/mintlify-assets/_mintlify/favicons/soundlink/SIre4Eol0p8vhnU7/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/docs/mintlify-assets/_mintlify/favicons/soundlink/SIre4Eol0p8vhnU7/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/docs/mintlify-assets/_mintlify/favicons/soundlink/SIre4Eol0p8vhnU7/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/docs/mintlify-assets/_mintlify/favicons/soundlink/SIre4Eol0p8vhnU7/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/docs/mintlify-assets/_mintlify/favicons/soundlink/SIre4Eol0p8vhnU7/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/docs/mintlify-assets/_mintlify/favicons/soundlink/SIre4Eol0p8vhnU7/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/docs/mintlify-assets/_mintlify/favicons/soundlink/SIre4Eol0p8vhnU7/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/docs/mintlify-assets/_mintlify/favicons/soundlink/SIre4Eol0p8vhnU7/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Authentication - Soundlink API\">\u003cmeta data-mint-head property=\"og:description\" content=\"Create API keys in Soundlink, then use them with scopes, expiration, and Authorization Bearer.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Soundlink API\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://www.getsoundlink.com/docs/authentication\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://soundlink.mintlify.site/docs/_mintlify/api/og/v2?division=For+Developers\u0026amp;title=Authentication\u0026amp;description=Create+API+keys+in+Soundlink%2C+then+use+them+with+scopes%2C+expiration%2C+and+Authorization+Bearer.\u0026amp;theme=cf71b8103be73e247f19db28\u0026amp;signature=f93f9d8e2485ebabf07d0f8e4d2c82adfd305724e7cdcf01c6b9769f760acbc7\">\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=\"Authentication - Soundlink API\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Create API keys in Soundlink, then use them with scopes, expiration, and Authorization Bearer.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://soundlink.mintlify.site/docs/_mintlify/api/og/v2?division=For+Developers\u0026amp;title=Authentication\u0026amp;description=Create+API+keys+in+Soundlink%2C+then+use+them+with+scopes%2C+expiration%2C+and+Authorization+Bearer.\u0026amp;theme=cf71b8103be73e247f19db28\u0026amp;signature=f93f9d8e2485ebabf07d0f8e4d2c82adfd305724e7cdcf01c6b9769f760acbc7\">\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=\"/docs/mintlify-assets/_mintlify/favicons/soundlink/SIre4Eol0p8vhnU7/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Soundlink API\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#fafafa\">\u003clink data-mint-head rel=\"canonical\" href=\"https://www.getsoundlink.com/docs/authentication\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/docs/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/docs/authentication.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://www.getsoundlink.com/#organization\",\"name\":\"Soundlink API\",\"url\":\"https://www.getsoundlink.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/soundlink/r4t_NTp0RR8PWS5A/logo/light.svg?fit=max\u0026auto=format\u0026n=r4t_NTp0RR8PWS5A\u0026q=85\u0026s=3bcfd864337269deff6f2dfb20b5d54e\"}},{\"@type\":\"WebSite\",\"@id\":\"https://www.getsoundlink.com/docs#website\",\"name\":\"Soundlink API\",\"url\":\"https://www.getsoundlink.com/docs\",\"publisher\":{\"@id\":\"https://www.getsoundlink.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://www.getsoundlink.com/docs/authentication#webpage\",\"url\":\"https://www.getsoundlink.com/docs/authentication\",\"name\":\"Authentication\",\"description\":\"Create API keys in Soundlink, then use them with scopes, expiration, and Authorization Bearer.\",\"dateModified\":\"2026-11-12T17:24:56.194Z\",\"isPartOf\":{\"@id\":\"https://www.getsoundlink.com/docs#website\"},\"breadcrumb\":{\"@id\":\"https://www.getsoundlink.com/docs/authentication#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://www.getsoundlink.com/docs/authentication#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"For Developers\",\"item\":\"https://www.getsoundlink.com/docs/developers\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Authentication\",\"item\":\"https://www.getsoundlink.com/docs/authentication\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://www.getsoundlink.com/docs/authentication#article\",\"headline\":\"Authentication\",\"name\":\"Authentication\",\"description\":\"Create API keys in Soundlink, then use them with scopes, expiration, and Authorization Bearer.\",\"url\":\"https://www.getsoundlink.com/docs/authentication\",\"mainEntityOfPage\":{\"@id\":\"https://www.getsoundlink.com/docs/authentication#webpage\"},\"dateModified\":\"2026-11-12T17:24:56.194Z\",\"publisher\":{\"@id\":\"https://www.getsoundlink.com/#organization\"},\"isPartOf\":{\"@id\":\"https://www.getsoundlink.com/docs#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Soundlink API\",\"publisher\":{\"@type\":\"Organization\",\"name\":\"Soundlink API\"},\"provider\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","agentPointerHref":"/docs/authentication.md","siteName":"Soundlink API","nav":{"global":null,"tabs":[{"tab":"Documentation","icon":"book-open","groups":[{"group":"Get started","pages":[{"title":"Introduction","href":""}]},{"group":"AI tools","pages":[{"title":"MCP server","sidebarTitle":"MCP","href":"/mcp-server"}]},{"group":"For Developers","pages":[{"title":"Public API","href":"/developers"},{"title":"Quickstart","description":"Create an API key in Soundlink, verify it with ping, and fetch your first campaign list.","href":"/quickstart"},{"title":"Authentication","href":"/authentication"},{"title":"Errors","description":"Standard error codes and HTTP status mapping for the Public API v1.","href":"/errors"},{"group":"SDKs and tools","pages":[{"title":"Overview","href":"/sdks"},{"title":"Access the API with TypeScript","href":"/typescript-sdk"},{"title":"API emulator","href":"/api-emulator"},{"title":"Warehouse connector","href":"/warehouse-connector"}]},{"group":"API guides","pages":[{"group":"Campaigns","pages":[{"title":"Syncing campaigns","href":"/syncing-campaigns"},{"title":"Creating campaigns","href":"/creating-campaigns"},{"title":"Managing campaigns","href":"/managing-campaigns"},{"title":"Campaign metrics","href":"/understanding-metrics"},{"title":"Listening insights","href":"/listening-insights"},{"title":"Playlist position","href":"/playlist-position"},{"title":"JSONL exports","href":"/jsonl-exports"}]},{"group":"Soundlinks","pages":[{"title":"Syncing soundlinks","href":"/soundlinks"},{"title":"Creating soundlinks","href":"/creating-soundlinks"},{"title":"Soundlink metrics","href":"/soundlink-metrics"},{"title":"JSONL exports","href":"/jsonl-exports"}]},{"group":"Videos","pages":[{"title":"Importing videos","href":"/importing-videos"}]},{"group":"Pixels","pages":[{"title":"Managing pixels","href":"/managing-pixels"}]}]},{"group":"OAuth","pages":[{"title":"Soundlink OAuth Integration","sidebarTitle":"OAuth Integration","icon":"key","href":"/set-up-soundlink-oauth"},{"title":"OAuth: Authorization Code + PKCE","sidebarTitle":"Authorization Code","icon":"user-check","href":"/oauth-authorization-code"},{"title":"OAuth: Client Credentials","sidebarTitle":"Client Credentials","icon":"server","href":"/oauth-client-credentials"},{"title":"OAuth: Scopes, Endpoints \u0026 Errors","sidebarTitle":"Scopes \u0026 Errors","icon":"shield-check","href":"/oauth-scopes-and-errors"}]}]},{"group":"Learn","pages":[{"title":"Introduction","href":"/learn/index"},{"group":"Credit wallet","pages":[{"title":"Overview","href":"/learn/wallet/index"},{"title":"Balance \u0026 ledger","href":"/learn/wallet/balance-and-ledger"},{"title":"Payment methods","href":"/learn/wallet/payment-methods"},{"title":"Auto-recharge","href":"/learn/wallet/auto-recharge"},{"title":"Top up","href":"/learn/wallet/top-up"},{"title":"Paying for campaigns","href":"/learn/wallet/paying-for-campaigns"},{"title":"Renewals","href":"/learn/wallet/renewals"},{"title":"Campaign budget changes","href":"/learn/wallet/campaign-budget-top-up"},{"title":"Limitations \u0026 edge cases","href":"/learn/wallet/limitations-and-edge-cases"}]},{"group":"Self-Serve","pages":[{"title":"Overview","href":"/learn/self-serve/index"},{"title":"What counts","href":"/learn/self-serve/what-counts"},{"title":"Plans and usage","href":"/learn/self-serve/plans-and-usage"}]}]}]},{"tab":"API Reference","icon":"square-terminal","pages":[{"title":"API Reference","href":"/api-reference/system/verify-connectivity-and-authentication"}]}]},"basePath":"","title":"Authentication - Soundlink API","buildId":"dpl_Aw98ji4XvBsgtZwL1VrkUF9ehFqz","deploymentId":"dpl_Aw98ji4XvBsgtZwL1VrkUF9ehFqz","dynamics":["07c022d89b","a74be98ba7"],"chunks":["Frame-0domioUa.js","DynamicMarkdown-BcGRTrw6.js","zoom-image-lightbox-DsiWwPWR.js","lightbox-handle-r17bVUz3.js"]}