Skip to main content
Use the Soundlinks API to discover soundlinks that belong to your organization and are not tied to a Soundlink-funded campaign. Those soundlinks do not appear in GET /v1/campaigns. For paid campaigns, use Syncing campaigns. Requires soundlinks:read. See Authentication. To create or archive a soundlink, see Creating soundlinks.
Existing API keys keep the scopes they were minted with. Create a new key and add soundlinks:read to call these routes.
Campaign-linked soundlinks are the campaign’s underlying resource. List and detail them with the Campaigns API. A campaign-backed soundlinkId on these routes returns 404. Missing soundlinks:read returns 403 insufficient_scope. See Errors for the full list. GET /v1/soundlinks Includes archived rows (status: archived). Supports pagination: sortBy is createdAt. soundlinkId is a URL-safe string — the same ID in the public sndl.ink URL — not a campaign UUID.
Walk pages until pagination.page >= pagination.totalPages. GET /v1/soundlinks/{soundlinkId} Returns catalog fields plus autoFollow, artistIdFollow, metaPixelId, and tiktokPixelId. Archived soundlinks still appear (status: archived). Unknown, cross-org, or campaign-linked IDs return 404. The Meta CAPI token is never returned. Use the soundlinkId from the list response in all /metrics/* paths.

Typical sync flow

  1. Daily: GET /v1/soundlinks — upsert catalog
  2. Daily: soundlink metrics per active soundlink

Organization scope

Your organization is determined only from the API key (or OAuth token). You never pass an organization id in query params.
  • Soundlink list and detail JSON uses organizationId.
  • Metrics JSONL / warehouse rows use account_id for the same organization UUID. Join catalog to metrics on soundlink_id.
Node.js: soundlink.soundlinks.listTypeScript SDK. DuckDB or BigQuery: warehouse connector.

Next

Creating soundlinks · Warehouse connector · Soundlink metricsAPI Reference