Skip to main content
GET
/
v1
/
campaigns
/
{campaignId}
/
metrics
/
engagement
/
export
Campaign engagement export (JSONL)
curl --request GET \
  --url https://api.getsoundlink.com/v1/campaigns/{campaignId}/metrics/engagement/export \
  --header 'x-api-key: <api-key>'
"{\"provider\":\"soundlink\",\"account_id\":\"a7ac3173-2f71-4e79-921f-d15d7112cc9a\",\"schema_version\":\"1.0\",\"report_date\":\"2026-04-08\",\"report_date_timezone\":\"UTC\",\"exported_at\":\"2026-05-22T10:12:11Z\",\"campaign_id\":\"8ccd7b88-2591-4b94-848f-f142f5c6bba1\",\"campaign_name\":\"9 To 5\",\"campaign_target_type\":\"track\",\"campaign_target_isrc\":\"DEXW62500272\",\"campaign_target_spotify_track_id\":\"2RkZ5WPkKyBf0u8vN3dNgb\",\"campaign_target_playlist_id\":null,\"status\":\"ended\",\"engagement_context\":\"catalog\",\"country_code\":\"US\",\"engaged_track_isrc\":\"DEXW62500001\",\"engaged_spotify_track_id\":\"4cOdK2wGLETKBW3PvgPWqT\",\"engaged_track_name\":\"Till The Sunrise\",\"playlist_position\":null,\"new_listeners\":42,\"returning_listeners\":18,\"listeners\":60,\"new_listener_streams\":58,\"returning_listener_streams\":31,\"streams\":89,\"spl\":1.48}\n{\"provider\":\"soundlink\",\"account_id\":\"a7ac3173-2f71-4e79-921f-d15d7112cc9a\",\"schema_version\":\"1.0\",\"report_date\":\"2026-04-08\",\"report_date_timezone\":\"UTC\",\"exported_at\":\"2026-05-22T10:12:11Z\",\"campaign_id\":\"8ccd7b88-2591-4b94-848f-f142f5c6bba1\",\"campaign_name\":\"9 To 5\",\"campaign_target_type\":\"track\",\"campaign_target_isrc\":\"DEXW62500272\",\"campaign_target_spotify_track_id\":\"2RkZ5WPkKyBf0u8vN3dNgb\",\"campaign_target_playlist_id\":null,\"status\":\"ended\",\"engagement_context\":\"catalog\",\"country_code\":\"DE\",\"engaged_track_isrc\":\"DEXW62500001\",\"engaged_spotify_track_id\":\"4cOdK2wGLETKBW3PvgPWqT\",\"engaged_track_name\":\"Till The Sunrise\",\"playlist_position\":14,\"new_listeners\":19,\"returning_listeners\":7,\"listeners\":26,\"new_listener_streams\":24,\"returning_listener_streams\":11,\"streams\":35,\"spl\":1.35}\n"

Authorizations

x-api-key
string
header
required

Pass your Soundlink sk_* API key in the x-api-key header. Keys can carry explicit scopes (for example campaigns:read, metrics:read) enforced by the backend.

Path Parameters

campaignId
string
required

Campaign identifier (e.g. camp_abc123)

Query Parameters

startDate
string<date>

Inclusive start date (YYYY-MM-DD). Defaults to campaign start date.

endDate
string<date>

Inclusive end date (YYYY-MM-DD). Defaults to today.

engagementContext
enum<string>

Filter to a single engagement context. Omit to return both.

Available options:
catalog,
playlist

Response

JSONL stream. Each line is a campaign_engagement_daily v1.0 row. Lines are sorted by (report_date asc, engagement_context, country_code, engaged_spotify_track_id).

One row of the campaign_engagement_daily v1.0 schema. Primary key: (provider, account_id, report_date, campaign_id, engagement_context, country_code, engaged_spotify_track_id). Rows are idempotent — re-ingesting on the primary key is safe. Values for a given report_date may be revised for up to 7 days after the date closes due to delayed Spotify playback events.

provider
enum<string>
required

Always soundlink. Identifies the data provider for multi-source warehouses.

Available options:
soundlink
account_id
string
required

Soundlink organization ID (UUID).

schema_version
string
required

Schema version string. Pin your ingest pipeline to this value.

Example:

"1.0"

report_date
string<date>
required

UTC calendar date the metrics belong to (YYYY-MM-DD). Rows can change for up to 7 days after close.

report_date_timezone
enum<string>
required

Always UTC.

Available options:
UTC
exported_at
string<date-time>
required

ISO 8601 UTC timestamp when this row was generated. Use for deduplication if the same report_date is re-delivered.

campaign_id
string
required

Soundlink campaign UUID. Stable for the lifetime of the campaign.

campaign_name
string
required

Human-readable campaign name.

campaign_target_type
enum<string> | null
required

Whether this campaign promotes a track or a playlist. null if undetermined.

Available options:
track,
playlist
status
enum<string>
required

Campaign lifecycle status on report_date. active = campaign was running; ended = campaign had ended or was refunded; scheduled = report_date is before campaign start. Post-campaign rows will have status = ended.

Available options:
active,
ended,
scheduled
engagement_context
enum<string>
required

Which dashboard section the row maps to. catalog = same-artist spillover (and direct promoted-track plays) on track campaigns. playlist = per-track performance inside the promoted playlist on playlist campaigns.

Available options:
catalog,
playlist
country_code
string
required

ISO 3166-1 alpha-2. Derived from the listener's IP at time of engagement. Uppercase.

Example:

"US"

engaged_spotify_track_id
string
required

Stable track identifier used in the primary key. Currently this is the Spotify track ID for the engaged track.

Example:

"4cOdK2wGLETKBW3PvgPWqT"

engaged_track_name
string
required

Display name of the engaged track.

new_listeners
integer
required

Unique listeners whose first play of this track on this smart link occurred on report_date.

Required range: x >= 0
returning_listeners
integer
required

Unique listeners who played this track on report_date but whose first play was on an earlier date.

Required range: x >= 0
listeners
integer
required

Total unique listeners on report_date: new_listeners + returning_listeners. Do not sum across days — the same listener can appear on multiple report_date rows.

Required range: x >= 0
new_listener_streams
integer
required

Stream count from new listeners on report_date.

Required range: x >= 0
returning_listener_streams
integer
required

Stream count from returning listeners on report_date.

Required range: x >= 0
streams
integer
required

Total streams on report_date: new_listener_streams + returning_listener_streams. Safe to sum within a day; summing across days counts repeat listens.

Required range: x >= 0
spl
number
required

Streams per listener (streams / listeners). Zero if listeners is zero.

campaign_target_isrc
string | null

ISRC of the promoted track. Populated when campaign_target_type = track; otherwise null.

campaign_target_spotify_track_id
string | null

Spotify track ID of the promoted track. Populated when campaign_target_type = track; otherwise null.

campaign_target_playlist_id
string | null

Spotify playlist ID. Populated when campaign_target_type = playlist; otherwise null.

engaged_track_isrc
string | null

ISRC of the track that received listens. May differ from campaign_target_isrc for catalog spillover rows. null if ISRC could not be resolved.

playlist_position
integer | null

1-based slot index of the engaged track in the promoted playlist on report_date. Populated for engagement_context = playlist when playlist snapshot data is available. null for catalog rows and until position data is delivered (reserved for future delivery in v1.0).

Required range: x >= 1