Introduction
Welcome! You can use Feature.fm’s API to access our inventory of promoted songs.
Our API will power your mobile app and website with high quality music while simultaneously providing you with the opportunity to monetize your air-play in a smarter, modern way.
About the API
The Feature.fm API is organized around REST. Our API is designed to have predictable, resource-oriented URLs and use JSON response to indicate if the call was successful or not.
We use built-in HTTP features, like HTTP verbs, which can be understood by off-the-shelf HTTP clients. We also support cross-origin resource sharing to allow you to interact securely with our API from a client-side web application.
JSON will be returned in all responses from the API, including errors.
We hope you enjoy using our API the same way we enjoyed building it for you!
Key Concepts
Feature.fm Partners
Do you have a music app, music blog or music related website? Do you share our passion in helping artists promote their music? Are you tired of clogging your service with ads and want to use high quality content in conjunction with a monetization solution instead?
If you answered yes, Feature.fm is for you.
Why should I join the Feature.fm Partners program
Feature.fm is an excellent solution for music services that are looking to monetize their music website/applications without using traditional ads that intrude on their content, increase churn, and disrupt the user experience.
Feature.fm is a music promotional platform that powers music services, websites and apps with great music content while allowing them to effectively monetize.
Additionally, our partners also get a dashboard! Our music services have access to detailed reports on their revenues and are able to cash out the money anytime with the touch of a button.
Feature.fm Customers
Feature.fm’s main customers are the artists, music labels and music promoters. They are the reason we built Feature.fm and our goal is to help them effectively promote music in the digital streaming age.
Feature.fm was build with the customer in mind, and we put an extensive effort in building a platform that would make it seamless for our customers to enjoy increased exposure in the music apps where their fans are listening.
So how does it work
Artists who want to promote their music on Feature.fm’s network may create a campaign using Feature.fm’s Advertiser Dashboard. This is done by simply uploading a song to Feature.fm, specifying the target audience, and sending the campaign for approval.
Once the campaign has been approved, it will be served to our partners apps and websites.
What targeting does Feature.fm support
Feature.fm supports many targeting options, including playing a song to consumers who:
- Listen to specific music genres
- Like specific artists
- Are located in a specific city or country
- Are distinguished by gender & age
How does the budget work?
As part of the campaign creation process, the artist sets a budget for the campaign. The artist has complete control on his/her spending by specifying a daily budget, maximum budget, and maximum bid.
The campaign that will eventually get played is the campaign that is relevant to a specific consumer and has the highest bid attached to it.
How does the artist monitor campaign performance?
The artist receives access to a powerful dashboard with information about the performance of each campaign and the subsequent user interaction (plays, skips, vote up, share, tweet, and more).
Music services that are part of the Feature.fm network sends events that inform us on what happened when the song was played as part of a campaign.
These events, in real-time, are displayed to the customer in an impressive dashboard, helping the customer better understand the performance of the campaign so he/she may optimize it.
Best Practices To Consider
There are many unique ways to integrate Feature.fm. Every app has specific needs and distinct standards for user experience. We have outlined some of our best practices for integrating that will work very well for both artists and music streaming services.
All of the examples listed in this section are targeted towards mobile platforms. However, they are applicable to web, tablet, tv, or any other streaming platform.
In-Stream Song Promotion
In-Stream integration involves automatically playing a featured song after every X number of songs. This should be used to help an artist gain exposure to new listeners the same way the “old” radio does but in a smarter,modern way.
What are the benefits?
- It is a great discovery feature for the end user
- It is a great way for music streaming services to monetize their airplay without disrupting the user experience with traditional advertisements.
- It does not require a user action such as a click, swipe, etc. to enjoy this revenue stream.
In this example we see a promoted song being played in an example music app. The song is marked as promoted content and the user may add it to a playlist, like it, share it, etc. It is the best practice to use a promoted song as if it were any other song in the hosting music service.
In-Search Song Promotion
In-Search integration involves displaying a featured song as part of the search results and can be compared to Google’s sponsored search results.
In one scenario, this can be used to help artists gain exposure during the user’s creation of a playlist by allowing him/her to participate in more and more playlists. It is also an excellent way for music streaming services to monetize their search results with high quality music content.
In this example we see three promoted songs being displayed as part of the search results in an example music app. The songs are marked as a promoted content and the user can add the song to playlist, like it, share it, etc. It is the best practice to use a promoted song as if it were any other song in the hosting music service.
In-Discovery Song Promotion
In-Discovery Song Promotion is to display a featured song in discovery sections in the music streaming services, blog and websites.
Discovery sections may include
- Music News Feed
- Popular Songs
- Music Charts
- Music News
- Any Browsable Section
This should be used to help artists gain exposure in front of users who want to discover new music. It is also great way for music streaming services to monetize their discovery screens without disturbing the user experience.
In this example we see a promoted song being displayed in an example music app. The song is being displayed with a mark indicating it is a promoted song. The user may add the song to a playlist, like it, share it, etc. It is the best practice to use a promoted song as if it were any other song in the hosting music service.
Publisher API
Consumers
Who is a Consumer
We define consumers as our partners' end users who are using their platforms to listen to and discover music.
Identify Consumer
This endpoint should be used to identify the end consumer. This request would normaly be called from the client side. When calling it from server side ipaddr parameter should be added to request payload.
In order to operate efficiently, Feature.fm requires a unique identifier for each user who receives a promoted song. This allows Feature.fm to avoid playing the same song to the same user multiple times and also to make better song recommendations based on the user's activity.
HTTP Request
curl -v -X POST -H "Content-Type: application/json" -d '{"api_key": "valid_api_key", "cuid":user_unique_id_in_music_service, "gender": "male","1990": null}' 'APIDOMAIN/consumer/identify'
The above command returns JSON structured like this:
{
"status":0,
"message":"Consumer was identified successfully",
"consumer_token":"e978264b-ecea-4692-a4cd-2f725ee37d09"
}
POST /consumer/identify
POST Parameters
Parameter | Required | Description |
---|---|---|
api_key | true | In order to work with our API you must create an application in our music service’s dashboard. Every app has a unique API key that must be sent with all calls to the API. |
cuid | false | Unique id of the user inside the application/website. This will allow feature.fm to choose campaigns more wisely for the user. |
gender | false | Valid values: "male" or "female" |
year_of_birth | false | Valid year (YYYY) |
ipaddr | false | the user's ip address (mandatory for server side integration) |
Featured Songs
Get Featured Song
The endpoint will return a campaign to be played according to consumer and targeting parameters. Each request will generate a thread with a unique ID that should be used when conducting additional operations such as playing the song, sending events, etc.
HTTP Request
curl -v -X POST -H "Content-Type: application/json" -d '{"api_key":"valid_api_key", "consumer_token":"valid_consumer_token" ,"num_campaigns":1, "placement":"in_stream", "genres":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22], "tags":["happy", "running"], "latest_songs": ["USAT21602948", "USQX91700384"]}' 'APIDOMAIN/featured/song'
The above command returns JSON structured like this:
{
"status": 0,
"data": {
"campaign_id": 1,
"song": {
"genres": [{
"name": "alternative/indie"
}],
"title": "song name",
"duration": "song duration in seconds",
"albumart_url": "albumart valid image url",
"sample_url": "song sample url",
"soundcloud_url": "soundcloud url if exist",
"buy_song_url": "buy_song_url if exist",
"id": 0,
"artist": {
"name": "artist name",
"image": "artist image url",
"id": 0,
"facebook_page_url": "artist page facebook url if exists",
"twitter_page_url": "artist twitter handle url if exists",
"bio": "artist short bio",
},
"publisher_catalog_id": "916339",
"publisher_album_id": "103242",
"stream_url": "FEATUREFMDOMAIN/play/{{song_play_id}}",
"event_url": "APIDOMAIN/event/{{song_play_id}}",
"youtube_url": "youtube url if exist",
"share_on_twitter_url": "url to tweet this song on Twitter",
"share_on_facebook_url": "url to share this song on Facebook",
"spotlight_page_url": "artist Spotlight page on feature.fm",
"share_url": "FEATUREFMDOMAIN/share/{{song_play_id}}"
},
"song_play_id": "should be used to send events",
"social_optimization_type": "playlist",
"custom_action_name": "Visit my page",
"custom_action_url": "FEATUREFMDOMAIN/playlist/1353278355",
"custom_action_event_url": "APIDOMAIN/event/58f6862c3300005dbff11af9.58f6866f33000032c0f11afd.5901ece82300004a002119ba/visit_playlist_page?api_key=7684aa0a76552139436d12ebbbd3da6e&consumer_token=cc4437d6-a260-4564-9193-c30eafb9ddb6&seconds_played="
}
}
POST /featured/song
POST Parameters
Parameter | Required | Description |
---|---|---|
api_key | true | In order to work with our API you must create an application in our music service’s dashboard. Every app has a unique API key that must be sent with all calls to the API. |
num_campaigns | false | Number of campaigns to return. Valid values are 1,2, or 3. |
placement | false | Placement parameter may be used to get more detailed reports about the performance of a specific widget in specific location. |
consumer_token | true | Valid consumer token. |
genres | true | Array of genre codes. Allows the service to provide some information about the user’s context. For example: if he’s listening to Rock radio or likes Folk music, etc. Feature.fm will make sure that the user will get featured songs in the same context. |
tags | false | Array of free-text tags. Allows the service to provide some information about the user’s context. For example: if he’s listening to songs attached to specific tags like: activities, moods, etc. Feature.fm will make sure that the user will get featured songs relevant to the specified tags. |
artists | true | Array of free-text artist names. Allows the service to provide some information about the user’s context. For example: if he’s listening session with different artists Feature.fm will make sure that the user will get featured songs from similar artists. |
latest_songs | false | Array of song's ISRC. Latest songs that the user listened to. Allows the service to provide some information about the user’s context. Helps our system to fine-tune the recommended songs. |
Supported Genres
Code | Name |
---|---|
0 | rock |
1 | soul/r&b |
2 | alternative/indie |
3 | pop |
4 | electronica/dance |
5 | rap/hip hop |
6 | comedy/spoken word |
7 | world |
8 | classical/opera |
9 | reggae/ska |
10 | christian/gospel |
11 | soundtracks |
12 | new age |
13 | folk |
14 | latin |
15 | cast recordings/cabaret |
16 | country |
17 | instrumental |
18 | children's |
19 | jazz |
20 | vocals |
21 | seasonal |
22 | blues |
Campaign Events
Feature.fm is a music promotion network, as such, we are obligated to providing our customers data and statistics regarding their campaigns.
Feature.fm Supported Events
Partners should send Feature.fm an event upon the occurrence of:
- Song Skip
- Song Vote-Up
- Song Vote-Down
- Song Like
- Favorite Song
- Song Added to Playlist
- Visit Artist Page
- Visit Album Page
- Follow
- Download
- Repost
- Share
- Comment
To be able to do that in efficient way and in real-time we kindly ask our partners to send us the relevant events specified in the Campaign Events section.
Please Note: The Skip event is mandatory and required to be sent when a featured song is being skipped.
Play Progress Update
This method should be used to notify Feature.fm about the song progress. Feature.fm uses this data to monitor the campaigns and to enhance the artist's dashboard. This endpoint must be called every 10 seconds as long as the song is playing.
POST /thread/{song_play_id}/progress
curl -v -X POST -H "Content-Type: application/json" -d '{"api_key":"valid_api_key", "consumer_token":"valid_consumer_token", "progress":147}' 'APIDOMAIN/thread/{{song_play_id}}/progress'
POST Parameters
Parameter | Required | Description |
---|---|---|
progress | true | the current song position |
song_play_id | true | the song play id that was retrieved from getFeaturedSong method |
Skip
This endpoint should be used to report a skip event of a featured song. It is mandatory to report back if the user has skipped the song and at which position during the song, as this data is very valuable to the artists and will be displayed on their campaign dashboard.
curl -v -X POST -H "Content-Type: application/json" -d '{"api_key":"valid_api_key", "consumer_token":"valid_consumer_token", "seconds_played":147}' 'APIDOMAIN/event/{{song_play_id}}/skip'
The above command returns JSON structured like this:
{
"status": 0,
"message": "success"
}
On error the status will be <> 0 and message will provide more details about the error:
{
"status": 1,
"message": "invalid parameter: seconds_played"
}
POST /event/{song_play_id}/skip
POST Parameters
Parameter | Required | Description |
---|---|---|
api_key | true | In order to work with our API you must create an application in our music service’s dashboard. Every app has a unique API key that must be sent with all calls to the API. |
seconds_played | true | The number of seconds the song was played before the user skipped the song. |
consumer_token | true | Valid consumer token. |
Vote Up
This endpoint should be used to report a vote up event of a featured song. It is mandatory to report back if the user has voted up the song and at which position during the song, as this data is very valuable to the artists and will be displayed on their campaign dashboard.
curl -v -X POST -H "Content-Type: application/json" -d '{"api_key":"valid_api_key", "consumer_token":"valid_consumer_token", "seconds_played":147}' 'APIDOMAIN/event/{{song_play_id}}/voteup'
The above command returns JSON structured like this:
{
"status": 0,
"message": "success"
}
On error the status will be <> 0 and message will provide more details about the error:
{
"status": 1,
"message": "invalid parameter: seconds_played"
}
POST /event/{song_play_id}/voteup
POST Parameters
Parameter | Required | Description |
---|---|---|
api_key | true | In order to work with our API you must create an application in our music service’s dashboard. Every app has a unique API key that must be sent with all calls to the API. |
seconds_played | true | The number of seconds the song was played before the event occurred. Specify (-1) if seconds_played is unknown. |
consumer_token | true | Valid consumer token. |
Vote Down
This endpoint should be used to report a vote down event of a featured song. It is mandatory to report back if the user has voted down the song and at which position during the song, as this data is very valuable to the artists and will be displayed on their campaign dashboard.
curl -v -X POST -H "Content-Type: application/json" -d '{"api_key":"valid_api_key", "consumer_token":"valid_consumer_token", "seconds_played":147}' 'APIDOMAIN/event/{{song_play_id}}/votedown'
The above command returns JSON structured like this:
{
"status": 0,
"message": "success"
}
On error the status will be <> 0 and message will provide more details about the error:
{
"status": 1,
"message": "invalid parameter: seconds_played"
}
POST /event/{song_play_id}/votedown
POST Parameters
Parameter | Required | Description |
---|---|---|
api_key | true | In order to work with our API you must create an application in our music service’s dashboard. Every app has a unique API key that must be sent with all calls to the API. |
seconds_played | true | The number of seconds the song was played before the event occurred. Specify (-1) if seconds_played is unknown. |
consumer_token | true | Valid consumer token. |
Like
This endpoint should be used to report a like event of a featured song. It is mandatory to report back if the user has liked the song and at which position during the song, as this data is very valuable to the artists and will be displayed on their campaign dashboard.
curl -v -X POST -H "Content-Type: application/json" -d '{"api_key":"valid_api_key", "consumer_token":"valid_consumer_token", "seconds_played":147}' 'APIDOMAIN/event/{{song_play_id}}/like'
The above command returns JSON structured like this:
{
"status": 0,
"message": "success"
}
On error the status will be <> 0 and message will provide more details about the error:
{
"status": 1,
"message": "invalid parameter: seconds_played"
}
POST /event/{song_play_id}/like
POST Parameters
Parameter | Required | Description |
---|---|---|
api_key | true | In order to work with our API you must create an application in our music service’s dashboard. Every app has a unique API key that must be sent with all calls to the API. |
seconds_played | true | The number of seconds the song was played before the event occurred. Specify (-1) if seconds_played is unknown. |
consumer_token | true | Valid consumer token. |
Favorite
This endpoint should be used to report a favorite event of a featured song. It is mandatory to report back if the user has favorited the song and at which position during the song, as this data is very valuable to the artists and will be displayed on their campaign dashboard.
curl -v -X POST -H "Content-Type: application/json" -d '{"api_key":"valid_api_key", "consumer_token":"valid_consumer_token", "seconds_played":147}' 'APIDOMAIN/event/{{song_play_id}}/favorite'
The above command returns JSON structured like this:
{
"status": 0,
"message": "success"
}
On error the status will be <> 0 and message will provide more details about the error:
{
"status": 1,
"message": "invalid parameter: seconds_played"
}
POST /event/{song_play_id}/favorite
POST Parameters
Parameter | Required | Description |
---|---|---|
api_key | true | In order to work with our API you must create an application in our music service’s dashboard. Every app has a unique API key that must be sent with all calls to the API. |
seconds_played | true | The number of seconds the song was played before the event occurred. Specify (-1) if seconds_played is unknown. |
consumer_token | true | Valid consumer token. |
Added To Playlist
This endpoint should be used to report an add to playlist event as a result of playing a featured song. It is mandatory to report back if the user has added the song to a playlist and at which position during the song, as this data is very valuable to the artists and will be displayed on their campaign dashboard.
curl -v -X POST -H "Content-Type: application/json" -d '{"api_key":"valid_api_key", "consumer_token":"valid_consumer_token", "seconds_played":147, "playlist_name":"eclectisch"}' 'APIDOMAIN/event/{{song_play_id}}/added_to_playlist'
The above command returns JSON structured like this:
{
"status": 0,
"message": "success"
}
On error the status will be <> 0 and message will provide more details about the error:
{
"status": 1,
"message": "invalid parameter: seconds_played"
}
POST /event/{song_play_id}/added_to_playlist
POST Parameters
Parameter | Required | Description |
---|---|---|
api_key | true | In order to work with our API you must create an application in our music service’s dashboard. Every app has a unique API key that must be sent with all calls to the API. |
seconds_played | true | The number of seconds the song was played before the event occurred. Specify (-1) if seconds_played is unknown. |
playlist_id | true | The id of the playlist the song was added to. |
consumer_token | true | Valid consumer token. |
Visit Artist Page
This endpoint should be used to report click on the artist/user profile page event of a featured song. It is mandatory to report back if the user has clicked the link and at which position during the song, as this data is very valuable to the artists and will be displayed on their campaign dashboard.
curl -v -X POST -H "Content-Type: application/json" -d '{"api_key":"valid_api_key", "consumer_token":"valid_consumer_token", "seconds_played":147}' 'APIDOMAIN/event/{{song_play_id}}/visit_artist_page'
The above command returns JSON structured like this:
{
"status": 0,
"message": "success"
}
On error the status will be <> 0 and message will provide more details about the error:
{
"status": 1,
"message": "invalid parameter: seconds_played"
}
POST /event/{song_play_id}/visit_artist_page
POST Parameters
Parameter | Required | Description |
---|---|---|
api_key | true | In order to work with our API you must create an application in our music service’s dashboard. Every app has a unique API key that must be sent with all calls to the API. |
seconds_played | true | The number of seconds the song was played before the event occurred. Specify (-1) if seconds_played is unknown. |
consumer_token | true | Valid consumer token. |
Visit Album Page
This endpoint should be used to report click on the album page event of a featured song. It is mandatory to report back if the user has clicked the link and at which position during the song, as this data is very valuable to the artists and will be displayed on their campaign dashboard.
curl -v -X POST -H "Content-Type: application/json" -d '{"api_key":"valid_api_key", "consumer_token":"valid_consumer_token", "seconds_played":147}' 'APIDOMAIN/event/{{song_play_id}}/visit_album_page'
The above command returns JSON structured like this:
{
"status": 0,
"message": "success"
}
On error the status will be <> 0 and message will provide more details about the error:
{
"status": 1,
"message": "invalid parameter: seconds_played"
}
POST /event/{song_play_id}/visit_album_page
POST Parameters
Parameter | Required | Description |
---|---|---|
api_key | true | In order to work with our API you must create an application in our music service’s dashboard. Every app has a unique API key that must be sent with all calls to the API. |
seconds_played | true | The number of seconds the song was played before the event occurred. Specify (-1) if seconds_played is unknown. |
consumer_token | true | Valid consumer token. |
Follow
This endpoint should be used to report a follow event of a featured song. It is mandatory to report back if the user has followed the artist/user and at which position during the song, as this data is very valuable to the artists and will be displayed on their campaign dashboard.
curl -v -X POST -H "Content-Type: application/json" -d '{"api_key":"valid_api_key", "consumer_token":"valid_consumer_token", "seconds_played":147}' 'APIDOMAIN/event/{{song_play_id}}/follow'
The above command returns JSON structured like this:
{
"status": 0,
"message": "success"
}
On error the status will be <> 0 and message will provide more details about the error:
{
"status": 1,
"message": "invalid parameter: seconds_played"
}
POST /event/{song_play_id}/follow
POST Parameters
Parameter | Required | Description |
---|---|---|
api_key | true | In order to work with our API you must create an application in our music service’s dashboard. Every app has a unique API key that must be sent with all calls to the API. |
seconds_played | true | The number of seconds the song was played before the event occurred. Specify (-1) if seconds_played is unknown. |
consumer_token | true | Valid consumer token. |
Download
This endpoint should be used to report a download event of a featured song. It is mandatory to report back if the user has downloaded the song and at which position during the song, as this data is very valuable to the artists and will be displayed on their campaign dashboard.
curl -v -X POST -H "Content-Type: application/json" -d '{"api_key":"valid_api_key", "consumer_token":"valid_consumer_token", "seconds_played":147}' 'APIDOMAIN/event/{{song_play_id}}/download'
The above command returns JSON structured like this:
{
"status": 0,
"message": "success"
}
On error the status will be <> 0 and message will provide more details about the error:
{
"status": 1,
"message": "invalid parameter: seconds_played"
}
POST /event/{song_play_id}/download
POST Parameters
Parameter | Required | Description |
---|---|---|
api_key | true | In order to work with our API you must create an application in our music service’s dashboard. Every app has a unique API key that must be sent with all calls to the API. |
seconds_played | true | The number of seconds the song was played before the event occurred. Specify (-1) if seconds_played is unknown. |
consumer_token | true | Valid consumer token. |
Repost
This endpoint should be used to report a repost event of a featured song. It is mandatory to report back if the user has reposted the song and at which position during the song, as this data is very valuable to the artists and will be displayed on their campaign dashboard.
curl -v -X POST -H "Content-Type: application/json" -d '{"api_key":"valid_api_key", "consumer_token":"valid_consumer_token", "seconds_played":147}' 'APIDOMAIN/event/{{song_play_id}}/repost'
The above command returns JSON structured like this:
{
"status": 0,
"message": "success"
}
On error the status will be <> 0 and message will provide more details about the error:
{
"status": 1,
"message": "invalid parameter: seconds_played"
}
POST /event/{song_play_id}/repost
POST Parameters
Parameter | Required | Description |
---|---|---|
api_key | true | In order to work with our API you must create an application in our music service’s dashboard. Every app has a unique API key that must be sent with all calls to the API. |
seconds_played | true | The number of seconds the song was played before the event occurred. Specify (-1) if seconds_played is unknown. |
consumer_token | true | Valid consumer token. |
Share
This endpoint should be used to report a shared event of a featured song. It is mandatory to report back if the user has shared the song and at which position during the song, as this data is very valuable to the artists and will be displayed on their campaign dashboard.
curl -v -X POST -H "Content-Type: application/json" -d '{"api_key":"valid_api_key", "consumer_token":"valid_consumer_token", "seconds_played":147}' 'APIDOMAIN/event/{{song_play_id}}/share'
The above command returns JSON structured like this:
{
"status": 0,
"message": "success"
}
On error the status will be <> 0 and message will provide more details about the error:
{
"status": 1,
"message": "invalid parameter: seconds_played"
}
POST /event/{song_play_id}/share
POST Parameters
Parameter | Required | Description |
---|---|---|
api_key | true | In order to work with our API you must create an application in our music service’s dashboard. Every app has a unique API key that must be sent with all calls to the API. |
seconds_played | true | The number of seconds the song was played before the event occurred. Specify (-1) if seconds_played is unknown. |
consumer_token | true | Valid consumer token. |
Comment
This endpoint should be used to report a comment event of a featured song. It is mandatory to report back if the user has commented on the song and at which position during the song, as this data is very valuable to the artists and will be displayed on their campaign dashboard.
curl -v -X POST -H "Content-Type: application/json" -d '{"api_key":"valid_api_key", "consumer_token":"valid_consumer_token", "seconds_played":147, "comment_text": "Great song"}' 'APIDOMAIN/event/{{song_play_id}}/comment'
The above command returns JSON structured like this:
{
"status": 0,
"message": "success"
}
On error the status will be <> 0 and message will provide more details about the error:
{
"status": 1,
"message": "invalid parameter: seconds_played"
}
POST /event/{song_play_id}/comment
POST Parameters
Parameter | Required | Description |
---|---|---|
api_key | true | In order to work with our API you must create an application in our music service’s dashboard. Every app has a unique API key that must be sent with all calls to the API. |
seconds_played | true | The number of seconds the song was played before the event occurred. Specify (-1) if seconds_played is unknown. |
consumer_token | true | Valid consumer token. |
comment_text | false | The commant that the user entered |
Marketing API
Authentication
All requests to the Marketing API require a valid x-api-key
header to be included in the request. This header is used to authenticate your requests and ensure secure access to the API. Requests without a valid API key will be rejected.
To get your API access, click here.
Artists
The Artist Object
The below JSON is an example of a artist object:
{
"id": "5ad4a2b11e0000f94a1cf85b",
"artistName": "Feature.fm",
"artistImage": "http://www.feature.fm/blog/assets/images/feature_fm_no_text_logo.png?v=7d8241cd74",
"type": "artist",
"countryCode": "US",
"shortBio": "My Biography",
"websiteUrl": "http://feature.fm",
"facebookPage": "https://www.facebook.com/Featurefm-497931363607317/",
"twitterUrl": "https://twitter.com/featurefm?lang=en",
"youtubeChannel": "https://www.youtube.com/channel/UCY1B_SZrt8sWNScujMCoNWw",
"spotifyArtistUrl": "",
"tags": ["tag1", "tag2"],
"linkSettings": {
"defaultStores": [
"spotify",
"amazon",
"soundcloud",
"apple",
"deezer",
"youtube"
],
"customDomains": [
{
"domain": "custom.ffm.to",
"isDefault": true
}
],
"notifications": {
"toggle": true,
"showArtistImage": true,
"message": "Thank you for pre-saving my release",
"subject": "My new release is out and available in your library",
"hideFFMBranding": true,
"footer": "85 Broad Street Suite 17.089 New York, NY 10004",
"sender": "noreply@myartist.com"
},
"localization": [
{
"locale": "default",
"callToActionText": "Choose your preferred music service",
"enabledStores": [
{
"storeId": "youtube",
"actionName": "Watch Now"
},
{
"storeId": "spotify",
"actionName": "Play Now"
},
{
"storeId": "amazon",
"actionName": "Download Now"
}
],
"disabledStores": [
{
"storeId": "deezer",
"actionName": "Play Now"
},
{
"storeId": "soundcloud",
"actionName": "Stream Now"
}
]
},
{
"locale": "fr",
"callToActionText": "Choisissez votre service de musique préféré",
"enabledStores": [
{
"storeId": "amazon",
"actionName": "Jouer"
},
{
"storeId": "spotify",
"actionName": "Jouerify"
}
],
"disabledStores": [
{
"storeId": "tidal",
"actionName": "Touer"
},
{
"storeId": "apple",
"actionName": "Fichsse"
}
]
}
],
"pixels": {
"facebook": "123456789",
"google": "123456789",
"googleTagManager": "123456789"
},
"affiliates": {
"apple": "apple_affiliate_code",
"amazon": [
{
"tag": "big",
"countryCode": "us"
},
{
"tag": "small",
"countryCode": "il"
}
]
},
"analytics": {
"google": "UA-9876-1"
},
"legal": {
"termsOfServiceUrl": "https://en.wikipedia.org/wiki/Angelina_Jolie",
"privacyPolicyUrl": "https://www.facebook.com/angelinajoliegoddess/"
}
}
}
Attribute | Type | Description |
---|---|---|
id | string | The unique identifier of the artist |
artistName | string | The artist name |
artistImage | string | Link to artist image |
type | string | Can be either artist or band |
countryCode | string | ISO 3166-1 alpha-2 code (ex. US) |
shortBio | string | Short bio of the artist/band |
websiteUrl | string | Url to the artist website |
facebookPage | string | Facebook page url |
twitterUrl | string | Twitter full url or twitter handle for the artist/band profile |
youtubeChannel | string | youtube url for the artist channel |
tikTokArtistUrl | string | tiktok url for the artist page |
spotifyArtistUrl | string | Url to the artist profile on Spotify |
tags | array | An array of strings representing tags associated with the artist. These tags can be used for categorization, searching, and filtering (Optional) |
linkSettings | object | Default SmartLink/Action Pages settings |
Artist default link settings objects
Attribute | Type | Description |
---|---|---|
customDomains | array | List of custom domains that can be used for the artist's SmartLink/Action Pages. Note: The custom domain must be approved for your api_key before using it. Once the domain is approved, you can choose to attach it to any of your artists |
localization | array <object> | Localization settings |
pixels | object | Re-targeting pixels |
affiliates | object | Affiliate programs that are connected to your SmartLink/Action Page (such as Apple or Amazon) |
analytics | object | Analytics programs that are connected to your SmartLink/Action Page (such as Google analytics) |
legal | object | Legal object, defines the link privacy policy and terms of service URLs |
notifications | object | Artist default fan notification settings (Optional). This feature automatically notifies fans that pre-save when your release is available. For this feature to work - it should be activated by contacting clientservices@feature.fm |
Artist default localization settings for links
Attribute | Type | Description |
---|---|---|
locale | string | ISO 3166-1 alpha-2 code (ex. US). use 'default' for all other locales |
callToActionText | string | The default call to action to use for the link page locale |
enabledStores | array <object> | Ordered list of music stores to show on display for the current link page locale |
disabledStores | array <object> | Ordered list of music stores to hide from display for the current link page locale |
Artist default fan notification settings for links
Attribute | Type | Description |
---|---|---|
toggle | boolean | Indicate the default status of the Fan Notification feature at the artist level. If the value is 'true', the Fan Notification feature will be active by default for newly created links moving forward |
showArtistImage | boolean | Indicate to display the ArtistImage in the header of the email. If the value is 'true', the image will show by default |
message | string | The default text shown in the body of the Fan Notification email (maximum 150 characters) |
subject | string | The default text of the subject line of the Fan Notification email (maximum 64 characters) |
hideFFMBranding | boolean | Indicate to hide "Powered By Feature.fm" by default in the email notification |
footer | string | A text that will be displayed in the email notification footer. For example: can be Physical Address. (maximum 264 characters) |
sender | string | The email address that will be shown as the sender in Fan Pre-Save Email Notifications. Must be the one set for the account or the default feature.fm sender. If not set, will use the default feature.fm sender |
List Artists
Returns a list of artists associated to a specific api_key
curl -v -X GET -H "Content-Type: application/json" -H 'x-api-key: {YOUR_API_KEY}' 'APIDOMAIN/manage/v1/artists'
GET Parameters
Parameter | Required | Description |
---|---|---|
page | number | Page number (Optional). If page specified, number of results per page are 10. if not specified, all artists are included. |
Returns
The above command returns JSON structured like this:
[
{
"id": "5b0d0f4f1a0000bdd53824e2",
"name": "My Artist"
}
]
Attribute | Required | Description |
---|---|---|
data | array <object> | array of artist's list summary object |
The Artist's List Object
Attribute | Type | Description |
---|---|---|
id | string | The unique identifier of the artist |
name | string | The artist name |
Search Artists (New)
Returns a list of artists associated to a specific api_key for a given search term
curl -v -X GET -H "Content-Type: application/json" -H 'x-api-key: {YOUR_API_KEY}' 'APIDOMAIN/manage/v1/artists/search?term=artist&page=1&limit=1'
GET Parameters
Parameter | Required | Description |
---|---|---|
term | string | Search term (Optional). If not specified, all artists are included. |
page | number | Page number (Optional, Default 1) |
limit | number | Number of result per page (Optional, Default 10. Max 100) |
exact | boolean | Indicate either to run exact search or phrase search (Optional, default false) |
Returns
The above command returns JSON structured like this:
{
"page": 1,
"pages": 10,
"data": [
{
"id": "5b0d0f4f1a0000bdd53824e2",
"name": "My Artist"
}
]
}
Attribute | Required | Description |
---|---|---|
page | number | The page number being returned |
pages | number | number of pages available |
data | array <object> | array of artist's list summary object filtered by the given search term |
Get Artist
Retrieves the details of an existing artist. You need only supply the unique artist identifier that was returned upon artist creation.
curl -v -X GET -H "Content-Type: application/json" -H 'x-api-key: {YOUR_API_KEY}' 'APIDOMAIN/manage/v1/artist/:artistId'
Path Parameters
Parameter | Required | Description |
---|---|---|
artistId | string | The id of the artist to retrieve |
Returns
Returns an artist object if a valid identifier was provided.
Create Artist
Creates artist object
curl -v -X POST -H "Content-Type: application/json" -H 'x-api-key: {YOUR_API_KEY}' -d '
{
"artistName": "Feature.fm",
"artistImage": "http://www.feature.fm/blog/assets/images/feature_fm_no_text_logo.png?v=7d8241cd74",
"type": "artist",
"countryCode": "IL",
"shortBio": "My Biography",
"websiteUrl": "http://feature.fm",
"facebookPage": "https://www.facebook.com/Featurefm-497931363607317/",
"twitterUrl": "https://twitter.com/featurefm?lang=en",
"youtubeChannel": "https://www.youtube.com/channel/UCY1B_SZrt8sWNScujMCoNWw",
"spotifyArtistUrl": "",
"tags": ["tag1", "tag2"],
"linkSettings": {
"defaultStores": [
"spotify",
"amazon",
"soundcloud",
"apple",
"deezer",
"youtube"
],
"customDomains": [
{
"domain": "custom.ffm.to",
"isDefault": true
}
],
"notifications": {
"toggle": true,
"showArtistImage": true,
"message": "Thank you for pre-saving my release",
"subject": "My new release is out and available in your library",
"hideFFMBranding": true,
"footer": "85 Broad Street Suite 17.089 New York, NY 10004",
"sender": "noreply@myartist.com"
},
"localization": [
{
"locale": "default",
"callToActionText": "Choose your preferred music service",
"enabledStores": [
{
"storeId": "youtube",
"actionName": "Watch Now"
},
{
"storeId": "spotify",
"actionName": "Play Now"
},
{
"storeId": "amazon",
"actionName": "Download Now"
}
],
"disabledStores": [
{
"storeId": "deezer",
"actionName": "Play Now"
},
{
"storeId": "soundcloud",
"actionName": "Stream Now"
}
]
},
{
"locale": "fr",
"callToActionText": "Choisissez votre service de musique préféré",
"enabledStores": [
{
"storeId": "amazon",
"actionName": "Jouer"
},
{
"storeId": "spotify",
"actionName": "Jouerify"
}
],
"disabledStores": [
{
"storeId": "tidal",
"actionName": "Touer"
},
{
"storeId": "apple",
"actionName": "Fichsse"
}
]
}
],
"pixels": {
"facebook": "123456789",
"google": "123456789",
"googleTagManager": "123456789"
},
"affiliates": {
"apple": "apple_affiliate_code",
"amazon": [
{
"tag": "big",
"countryCode": "us"
},
{
"tag": "small",
"countryCode": "il"
}
]
},
"analytics": {
"google": "UA-9876-1"
},
"legal": {
"termsOfServiceUrl": "https://en.wikipedia.org/wiki/Angelina_Jolie",
"privacyPolicyUrl": "https://www.facebook.com/angelinajoliegoddess/"
}
}
}' 'APIDOMAIN/manage/v1/artist'
POST Parameters
Attribute | Type | Description |
---|---|---|
artistName | string | The artist name (Required) |
artistImage | string | A valid url to artist image (Optional) |
type | string | valid options: artist/band (Required) |
countryCode | string | ISO 3166-1 alpha-2 code (ex. US) (Required) |
shortBio | string | Short bio of the artist/band (Optional) |
websiteUrl | string | Url to the artist website (Optional) |
facebookPage | string | Facebook page url (Optional) |
twitterUrl | string | Twitter full url or twitter handle for the artist/band profile (Optional) |
youtubeChannel | string | Youtube url for the artist channel (Optional) |
spotifyArtistUrl | string | Url to the artist profile on Spotify (Optional) |
tags | array | An array of strings representing tags associated with the artist. These tags can be used for categorization, searching, and filtering (Optional) |
linkSettings | object | Default SmartLink/Action Pages settings (Optional). If not provided will derived from the account defaults |
Returns
Returns an artist object if a valid identifier was provided.
Update Artist
Update artist object
curl -v -X PUT -H "Content-Type: application/json" -H 'x-api-key: {YOUR_API_KEY}' -d '
{
"artistName": "Feature.fm",
"artistImage": "http://www.feature.fm/blog/assets/images/feature_fm_no_text_logo.png?v=7d8241cd74",
"type": "artist",
"countryCode": "IL",
"shortBio": "My Biography",
"websiteUrl": "http://feature.fm",
"facebookPage": "https://www.facebook.com/Featurefm-497931363607317/",
"twitterUrl": "https://twitter.com/featurefm?lang=en",
"youtubeChannel": "https://www.youtube.com/channel/UCY1B_SZrt8sWNScujMCoNWw",
"spotifyArtistUrl": "",
"tags", ["tag1", "tag2", "tag3"],
"linkSettings": {
"defaultStores": [
"spotify",
"amazon",
"soundcloud",
"apple",
"deezer",
"youtube"
],
"customDomains": [
{
"domain": "custom.ffm.to",
"isDefault": true
}
],
"localization": [
{
"locale": "default",
"callToActionText": "Choose your preferred music service",
"enabledStores": [
{
"storeId": "youtube",
"actionName": "Watch Now"
},
{
"storeId": "spotify",
"actionName": "Play Now"
},
{
"storeId": "amazon",
"actionName": "Download Now"
}
],
"disabledStores": [
{
"storeId": "deezer",
"actionName": "Play Now"
},
{
"storeId": "soundcloud",
"actionName": "Stream Now"
}
]
},
{
"locale": "fr",
"callToActionText": "Choisissez votre service de musique préféré",
"enabledStores": [
{
"storeId": "amazon",
"actionName": "Jouer"
},
{
"storeId": "spotify",
"actionName": "Jouerify"
}
],
"disabledStores": [
{
"storeId": "tidal",
"actionName": "Touer"
},
{
"storeId": "apple",
"actionName": "Fichsse"
}
]
}
],
"pixels": {
"facebook": "123456789",
"google": "123456789",
"googleTagManager": "123456789"
},
"affiliates": {
"apple": "apple_affiliate_code",
"amazon": [
{
"tag": "big",
"countryCode": "us"
},
{
"tag": "small",
"countryCode": "il"
}
]
},
"analytics": {
"google": "UA-9876-1"
},
"legal": {
"termsOfServiceUrl": "https://en.wikipedia.org/wiki/Angelina_Jolie",
"privacyPolicyUrl": "https://www.facebook.com/angelinajoliegoddess/"
}
}
}' 'APIDOMAIN/manage/v1/artist/:artistId'
PUT Parameters
Attribute | Type | Description |
---|---|---|
artistName | string | The artist name (Required) |
artistImage | string | A valid url to artist image (Optional) |
type | string | valid options: artist/band (Required) |
countryCode | string | ISO 3166-1 alpha-2 code (ex. US) (Required) |
shortBio | string | Short bio of the artist/band (Optional) |
websiteUrl | string | Url to the artist website (Optional) |
facebookPage | string | Facebook page url (Optional) |
twitterUrl | string | Twitter full url or twitter handle for the artist/band profile (Optional) |
youtubeChannel | string | Youtube url for the artist channel (Optional) |
spotifyArtistUrl | string | Url to the artist profile on Spotify (Optional) |
tags | array | An array of strings representing tags associated with the artist. These tags can be used for categorization, searching, and filtering (Optional) |
linkSettings | object | Default SmartLink/Action Pages settings (Optional) |
Returns
If success, Returns the artist object, otherwise, returns error code.
As the update is a PUT request, the entire Artist object should be sent with your request. Empty fields will be treated as missing (Required params) or empty values (Optional params)
Smart Links
SmartLink object allow you to define a behaviour for SmartLink pages, pre-save pages and future release pages. You can create Track, Album, Playlist or content link, update or fetch the link data including real-time analytics. You can retrieve individual SmartLink as well as a list of all your SmartLinks.
The SmartLink Object
The below JSON is an example of a SmartLink object:
{
"id": "5ad4a2b11e0000f94a1cf85b",
"artistId": "5ad4a2b11e0000f94a1cf85c",
"shortId": "greatest_hits",
"createdAt": 1526373512,
"status": "ACTIVE",
"scanLink": "https://itunes.apple.com/il/album/sweet-child-o-mine/68192941?i=68192994",
"domain": "https://ffm.to",
"pageLayout": "base_layout",
"title": "Greatest Hits",
"image": "https://i.ytimg.com/vi/O1fHxPY3TJo/hqdefault.jpg",
"description": "Listen to my Album",
"preReleaseDescription": "Save Now!",
"background": {
"type": "blur",
"image": "https://i.ytimg.com/vi/O1fHxPY3TJo/hqdefault.jpg"
},
"stores": [
{
"storeId": "apple",
"url": "https://geo.itunes.apple.com/us/album/fields-of-joy/712308582?i=712308671&app=music"
},
{
"storeId": "spotify",
"url": "https://open.spotify.com/track/0XcR8kUxhai3H7wqB0R2eE"
},
{
"storeId": "deezer",
"url": "https://www.deezer.com/en/playlist/1354282275"
}
],
"preview": {
"storeId": "apple",
"url": "https://audio-ssl.itunes.apple.com/apple-assets-us-std-000001/Music1/v4/fa/8e/ab/fa8eab5b-cd77-3b4d-8931-1943e61d47de/mzaf_6427571633371052040.plus.aac.p.m4a"
},
"enabledStores": [
{
"storeId": "spotify",
"actionName": "Play Now"
}
],
"localization" : [
{
"locale": "fr",
"title": "French Title",
"image": "https://i.ytimg.com/vi/O1fHxPY3TJo/hqdefault.jpg",
"description": "French description",
"preview" : {
"storeId": "deezer",
"url": "https://www.amazon.com/Sweet-Child-Mine-Lost-Roses/dp/1945322071"
},
"enabledStores": [
{
"storeId": "deezer",
"actionName": "Play"
}
],
"conditionalRouting": [
{
"condition": "ios",
"storeId": "deezer"
}
],
"routingRules": {
"idleTimeoutRouting": {
"timeout": 2,
"storeId": "spotify"
},
"usePreferredService": true
}
},
{
"locale": "gb",
"title": "Great Title"
}
],
"conditionalRouting": [{
"condition": "ios",
"storeId": "spotify"
}],
"routingRules": {
"idleTimeoutRouting": {
"timeout": 2,
"storeId": "spotify"
},
"usePreferredService": true
},
"songName": "Greatest Hits",
"albumName": "Greatest Hits",
"pixels": {
"facebook": "123456999",
"google": "123456998",
"googleTagManager": "123456997"
},
"affiliates": {
"apple": "app",
"amazon": [{
"tag": "sweet-fr",
"countryCode": "fr"
},{
"tag": "sweet-uk",
"countryCode": "gb"
}]
},
"analytics": {
"google": "UA-4444-5"
},
"legal": {
"termsOfServiceUrl": "https://en.wikipedia.org/wiki/Slash_(musician)",
"privacyPolicyUrl": "https://en.wikipedia.org/wiki/Axl_Rose"
},
"targeting": {
"artists": [
"Guns&Roses"
],
"tags": [
"rock",
"alternative"
]
},
"emailCollection": {
"enabled": true,
"title": "Stay Tuned",
"actionButton": "Subscribe"
},
"socialIcons": {
"enabled": true,
"useArtistDefaults": false,
"socialLinks": {
"facebook": "https://facebook.com/pluf",
"instagram": "https://instagram.com/plupi",
"twitter": "https://twitter.com/twit",
"youtube": "https://youtube.com/yoyo",
"spotify": "https://open.spotify.com/artist/slus",
"soundcloud": "https://soundcloud.com/cluc",
"other": "https://www.other.com",
},
},
"socialEmbeds": {
"title": "soctit",
"description": "social media desc",
"preReleaseDescription": "Save Now!",
"image": "https://image.shutterstock.com/image-vector/cute-funny-hippo-450w-351867221.jpg",
}
}
Attribute | Type | Description |
---|---|---|
id | string | The SmartLink id |
artistId | string | The artist id associated with the SmartLink object |
shortId | string | SmartLink short code |
createdAt | date | Timestamp of the SmartLink creation |
status | string | The status of the SmartLink. Valid options are: "ACTIVE", "ARCHIVED" |
scanLink | string | the target link that is used to auto generate the SmartLink page |
domain | string | The domain specified for this SmartLink |
pageLayout | string | Page layout for the SmartLink. Valid options are: 'base_layout', 'action_page', 'modern_layout' |
title | string | SmartLink page title |
image | string | SmartLink image url |
type | string | Type of link. Valid options are: "post_release", "future_release", "pre_release" |
description | string | SmartLink page description |
background | object | The styling of the background of the Smart Link page. Available options are the default blur of the hero image, a solid color, or an image |
preReleaseDescription | string | SmartLink Pre Release Description. After Release the description will be used |
stores | array <object> | List of music stores object associated with this SmartLink |
preview | object | SmartLink preview object |
enabledStores | array <object> | Ordered list of music stores to show on display for the current link page |
disabledStores | array <object> | list of music stores to hide from display for the current link page |
localization | array <object> | List of customized locale display options |
conditionalRouting | object | Allow customized routing rules per browser/channel |
routingRules | object | Setting fans idle timeout behavior and allow direct linking to user preferred service (Optional) |
songName | string | The song name associated with the SmartLink (in case of track link) |
albumName | string | The album name associated with the SmartLink (in case of album or track link) |
pixels | object | Re-targeting pixels object for ad re-targeting |
affiliates | object | Affiliates object representing your affiliate programs that are connected to your SmartLink (such as Apple or Amazon) |
analytics | object | Analytics object representing your analytics programs that are connected to your SmartLink (such as Google analytics) |
saveSuccessfulMessage | string | Message to show after successful save |
legal | object | Legal object, defines the SmartLink privacy policy and terms of service URLs |
targeting | object | Targeting object, tags and artists that will be sent to your re-targeting programs |
preSaveFollow | object | Pre Save Follow object, currently, only spotify supported (Optional) |
emailCollection | object | Enable Widget to collect fans emails |
socialIcons | object | Social links info |
socialEmbeds | object | Social Embeds info for social sharing |
Background Object Details
Attribute | Type | Description |
---|---|---|
type | string | This is the kind of background declared for the Smart Link. Allowed values are: blur, color, image |
color | string | Required when type is color and must be ‘hex’ format (example: #000000) |
image | string | Required when type is image. Value must be the URL to a hosted image |
SmartLink Preview Object Details
Attribute | Type | Description |
---|---|---|
storeId | string | Store id (See stores list to find allowed values) |
url | string | url to the media file to play. Valid options are: MP3, MP4a, YouTube URL (only in case the store is YouTube), SoundCloud URL (only in case the store is SoundCloud) |
Enabled Stores Object Details
Attribute | Type | Description |
---|---|---|
storeId | string | Store id (See stores list to find allowed values) |
actionName | string | Action name to display when displaying the store on a SmartLink page |
preSaveActionName | string | Store's action name to display when displaying a Pre-Save/Pre-Order SmartLink page. |
SmartLink Email Collection
Attribute | Type | Description |
---|---|---|
enabled | boolean | Show/Hide email collection |
title | string | Email collection title text |
actionButton | string | Email collection button text |
SmartLink Social Icons
Attribute | Type | Description |
---|---|---|
enabled | boolean | Show/Hide social icons |
useArtistDefaults | boolean | Inherit social links from the artist object |
socialLinks | Map |
Social links Map. override artist default. Supported: facebook, instagram, twitter, youtube, spotify, tiktok, soundcloud, other |
SmartLink Social Embeds
Attribute | Type | Description |
---|---|---|
title | string | Social title |
description | string | Social description |
preReleaseDescription | string | SmartLink Pre Release Description. After Release the description will be used |
image | string | Social embeded image link |
Disabled Stores Object Details
Attribute | Type | Description |
---|---|---|
storeId | string | Store id (See stores list to find allowed values) |
actionName | string | Action name to display when displaying the store on a SmartLink page |
Conditional Routing Object Details
Attribute | Type | Description |
---|---|---|
condition | string | Device (ios, android, desktop) or channel code |
storeId | string | redirect to store id when condition match |
Routing Rules Object Details
Attribute | Type | Description |
---|---|---|
idleTimeoutRouting | object | Send fans to a destination of your choice if they don't click on any service buttons on your landing page |
usePreferredService | boolean | Automatically send fans to their preferred service if they've visited a Feature.fm link before |
Idle Timeout Object Details
Attribute | Type | Description |
---|---|---|
timeout | integer | The number of seconds a user can remain inactive on the page before being automatically redirected to a service of your choise |
storeId | string | Store id (See stores list to find allowed values) |
SmartLink Localization Object Details
Attribute | Type | Description |
---|---|---|
locale | string | Locale code (ISO 3166-1 alpha-2 code) |
title | string | Locale page title |
image | string | Locale image url |
description | string | Locale page description |
preReleaseDescription | string | SmartLink Pre Release Description. After Release the description will be used |
preview | object | Locale preview object |
conditionalRouting | array <object> | Locale customized routing rules per browser/channel |
routingRules | object | Locale customized setting for fans idle timeout behavior and sirect linking settings (Optional) |
enabledStores | array <object> | Locale ordered list of music stores to display for the current link page |
disabledStores | array <object> | Locale list of music stores to hide from display for the current link page |
Retargeting Pixels Object Details
Attribute | Type | Description |
---|---|---|
string | Google adwords remarketing id | |
string | Facebook re-targeting pixel id | |
tiktok | string | TikTok re-targeting pixel id |
googleTagManager | string | Google tag manager id |
Affiliates Object Details
Attribute | Type | Description |
---|---|---|
amazon | array | List of amazon affiliate objects |
apple | string | Apple affiliate id |
spotify | string | Spotify affiliate id |
Amazon Affilaite Object
Attribute | Type | Description |
---|---|---|
tag | string | Amazon affiliate tag |
countryCode | string | The country code that the amazon tag applied to (ISO 3166-1 alpha-2 code) |
Analytics Object Details
Attribute | Type | Description |
---|---|---|
string | Google analytics id |
Legal Object Details
Attribute | Type | Description |
---|---|---|
privacyPolicyUrl | string | Url for the privacy policy of the SmartLink page |
termsOfServiceUrl | string | Url for the privacy policy of the SmartLink page |
Targeting Object Details
Attribute | Type | Description |
---|---|---|
tags | array | Free text list of tags that will be sent with the retargeting pixels (ie. rock, pop, happy) |
artists | array | Free text list of artists relevant for this link, it will be sent with the re-targeting pixels |
Pre Save Follow Entity Object Details
Attribute | Type | Description |
---|---|---|
url | string | Spotify URL. allowed User, Playlist, Artist |
Pre Save Follow Object Details
Attribute | Type | Description |
---|---|---|
storeId | string | Music store id. currently, only spotify is supported |
entities | array <object> | Entities to follow, max allowed 3 entities |
Fan Notification Object Details
Attribute | Type | Description |
---|---|---|
toggle | boolean | Indicate the status of the Fan Notification feature on the SmartLink |
showArtistImage | boolean | Indicate to display the Artist Image in the header of the email. If the value is 'true', the image will show |
message | string | The text shown in the body of the Fan Notification email (maximum 150 characters) |
subject | string | The text of the subject line of the Fan Notification email (maximum 64 characters) |
artistName | string | The text of the artist name (maximum 64 characters) |
releaseName | string | The text of the release name (maximum 64 characters) |
artistImage | string | Artist image URL |
hideFFMBranding | boolean | Indicate to hide "Powered By Feature.fm" by default in the email notification |
footer | string | A text that will be displayed in the email notification footer. For example: can be Physical Address. (maximum 264 characters) |
sender | string | The email address that will be shown as the sender in Fan Pre-Save Email Notifications. Must be the one set for the account or the default feature.fm sender. If not set, will use the default feature.fm sender |
Music Store Object Details
Attribute | Type | Description |
---|---|---|
id | string | Music store id |
url | string | The content url for this music store |
fallbackUrl | string | The destination a fan is directed to after a successful pre-save. The value must be a valid URL |
autoScan | boolean | Should this store be auto scanned for a URL |
title | string | Title of the url content |
streamType | string | Valid options are: "track", "album", "playlist" |
showAfterRelease | boolean | show store only after the release date (Optional, default false) |
tracks | array | In case of album or playlist, list of tracks preview (Up to 30 secs) |
territories | array <object> | List of MusicStoreTerritory objects that define custom music store urls for specific territories |
Music Store Territory Object Details
Attribute | Type | Description |
---|---|---|
countryCode | string | Valid country code (ISO 3166-1 alpha-2 code) |
webUrl | string | The content url for this country |
mobileUrl | string | The mobile url for this country |
The SmartLink Summary Object
In some API endpoints, where we do not need all the SmartLink object data, a summary object can be returned with a subset of the SmartLink object information (useful listing SmartLinks)
SmartLink Summary Object Details
The below JSON is an example of a SmartLink object:
{
"id": "5ad4a2b11e0000f94a1cf85b",
"createdAt": 1523884721506,
"artist": "599450031b0000a208fcbc85",
"status": "ACTIVE",
"type": "post_release",
"domain": "https://ffm.to",
"scanLink": "https://open.spotify.com/album/3OW1dbZnmZpAMtTUVgQ1pu",
"shortId": "0b0rnrn",
"title": "Lenny Kravitz - Fly Away",
"image": "https://is1-ssl.mzstatic.com/image/thumb/Music6/v4/b2/e2/1b/b2e21bd2-e67e-ce9d-20dc-3f5faa5b8cb2/source/500x0w.jpg",
}
Attribute | Type | Description |
---|---|---|
id | string | The SmartLink id |
createdAt | date | Timestamp of the SmartLink creation |
artist | string | The artist id associated with the SmartLink object |
status | string | The status of the SmartLink. Valid options are: "ACTIVE", "ARCHIVED" |
type | string | Type of link. Valid options are: "post_release", "future_release", "pre_release" |
domain | string | domain to be used for this SmartLink |
shortId | string | SmartLink short code |
title | string | SmartLink page title |
image | string | SmartLink image url |
Get SmartLink
Retrieves the details of an existing SmartLink. You need only supply the unique SmartLink identifier that was returned upon SmartLink creation.
curl -v -X GET -H "Content-Type: application/json" -H 'x-api-key: {YOUR_API_KEY}' 'APIDOMAIN/manage/v1/smartlink/:smartlinkId'
Path Parameters
Parameter | Required | Description |
---|---|---|
smartlinkId | true | The id of the SmartLink to retrieve |
Returns
Returns a SmartLink object if a valid identifier was provided.
Attribute | Type | Description |
---|---|---|
status | string | "success" if was successful |
data | object | SmartLink object details |
Get SmartLink By ShortId and Domain
Retrieves the details of an existing SmartLink by short id and domain. The domain parameter should not include the HTTP protocol.
curl -v -X GET -H "Content-Type: application/json" -H 'x-api-key: {YOUR_API_KEY}' 'APIDOMAIN/manage/v1/smartlink/shortid/:shortId?domain={domain}'
Path Parameters
Parameter | Required | Description |
---|---|---|
shortId | true | The short id of the SmartLink to retrieve |
GET Parameters
Parameter | Required | Description |
---|---|---|
domain | true | The domain of the smartlink (e.g.: ffm.to) |
Returns
Returns a SmartLink object if a valid identifier/s were provided.
Create SmartLink
Creates a new post release SmartLink object. If your music has already been released and is now available to stream or buy.
If you already know the end destinations for some of your stores, you can skip part of the scanning process. See the following example:
curl -v -X POST -H "Content-Type: application/json" -H 'x-api-key: {YOUR_API_KEY}' -d '
{
"artistId": "5ad4a2b11e0000f94a1cf85c",
"scanLink": "https://itunes.apple.com/il/album/sweet-child-o-mine/68192941?i=68192994",
"domain": "https://ffm.to",
"pageLayout": "base_layout",
"title": "Greatest Hits",
"image": "https://i.ytimg.com/vi/O1fHxPY3TJo/hqdefault.jpg",
"description": "Listen to my Album",
"background": {
"type": "image",
"image": "https://i.ytimg.com/vi/O1fHxPY3TJo/hqdefault.jpg"
},
"stores": [
{
"storeId": "apple",
"url": "https://geo.itunes.apple.com/us/album/fields-of-joy/712308582?i=712308671&app=music"
},
{
"storeId": "spotify",
"url": "https://open.spotify.com/track/0XcR8kUxhai3H7wqB0R2eE"
},
{
"storeId": "deezer",
"url": "https://www.deezer.com/en/playlist/1354282275"
}
],
"preview": {
"storeId": "apple",
"url": "https://audio-ssl.itunes.apple.com/apple-assets-us-std-000001/Music1/v4/fa/8e/ab/fa8eab5b-cd77-3b4d-8931-1943e61d47de/mzaf_6427571633371052040.plus.aac.p.m4a"
},
"enabledStores": [
{
"storeId": "spotify",
"actionName": "Play Now"
}
],
"localization" : [
{
"locale": "fr",
"title": "French Title",
"image": "https://i.ytimg.com/vi/O1fHxPY3TJo/hqdefault.jpg",
"description": "French description",
"preview" : {
"storeId": "deezer",
"url": "https://www.amazon.com/Sweet-Child-Mine-Lost-Roses/dp/1945322071"
},
"enabledStores": [
{
"storeId": "deezer",
"actionName": "Play"
}
],
"conditionalRouting": [
{
"condition": "ios",
"storeId": "deezer"
}
],
"routingRules": {
"idleTimeoutRouting": {
"timeout": 10,
"storeId": "spotify"
},
"usePreferredService": true
}
},
{
"locale": "gb",
"title": "Great Title"
}
],
"conditionalRouting": [{
"condition": "ios",
"storeId": "spotify"
}],
"routingRules": {
"idleTimeoutRouting": {
"timeout": 2,
"storeId": "deezer"
},
"usePreferredService": true
},
"songName": "Greatest Hits",
"albumName": "Greatest Hits",
"pixels": {
"facebook": "123456999",
"google": "123456998",
"googleTagManager": "123456997"
},
"affiliates": {
"apple": "app",
"amazon": [{
"tag": "sweet-fr",
"countryCode": "fr"
},{
"tag": "sweet-uk",
"countryCode": "gb"
}]
},
"analytics": {
"google": "UA-4444-5"
},
"legal": {
"termsOfServiceUrl": "https://en.wikipedia.org/wiki/Slash_(musician)",
"privacyPolicyUrl": "https://en.wikipedia.org/wiki/Axl_Rose"
},
"targeting": {
"artists": [
"Guns&Roses"
],
"tags": [
"rock",
"alternative"
]
}
}' 'APIDOMAIN/manage/v1/smartlink'
To create a SmartLink that all stores is automatically being generated from a scan link you can use this example:
curl -v -X POST -H "Content-Type: application/json" -H 'x-api-key: {YOUR_API_KEY}' -d '
{
"artistId": "5dd4a2b11e0000f94a1cf85c",
"shortId": "greatest_hits",
"domain": "https://ffm.to",
"scanLink": "https://www.youtube.com/watch?v=aNFvM5XqF8g",
}' 'APIDOMAIN/manage/v1/smartlink'
POST Parameters
Parameter | Type | Description |
---|---|---|
artistId | string | The artist id associated with the SmartLink object (Required) |
shortId | string | SmartLink short code (Required) |
transactionId | uuid | provide a valid GUID identifying this specific transaction. If connection lost you can use the same body with the transactionId and retrieve the original response (Optional) |
scanLink | string | the target link that is used to auto generate the SmartLink page (Optional if stored provided) |
domain | string | The domain specified for this SmartLink (Optional, default: ffm.to). to use custom domain, please add it first to the link associated artist |
pageLayout | string | Page layout for the SmartLink. Valid options are: 'base_layout', 'action_page' or 'modern_layout' (Optional, default: base_layout) |
title | string | SmartLink page title (Optional, if scanLink exists, it will try to automatically fill) |
image | string | SmartLink image url (Optional, if scanLink exists, it will try to automatically fill) |
description | string | SmartLink page description (Optional) |
stores | array <object> | List of music stores object associated with this SmartLink (Optional if scanLink provided). |
preview | object | SmartLink preview object (Optional) |
enabledStores | array <object> | List of music stores to display (Optional. All stores are visible) |
localization | array <object> | List of customized locale display options (Optional. if empty, all locale will use defaults) |
conditionalRouting | object | Allow customized routing rules per browser/channel (Optional) |
routingRules | object | Setting fans idle timeout behavior and allow direct linking to user preferred service (Optional) |
songName | string | The song name associated with the SmartLink (in case of track link) (Optional) |
albumName | string | The album name associated with the SmartLink (in case of album or track link) (Optional) |
pixels | object | Re-targeting pixels object for ad re-targeting (Optional) |
affiliates | object | Affiliates object representing your affiliate programs that are connected to your SmartLink (such as Apple or Amazon) (Optional) |
analytics | object | Analytics object representing your analytics programs that are connected to your SmartLink (such as Google analytics) (Optional) |
legal | object | Legal object, defines the SmartLink privacy policy and terms of service URLs (Optional) |
targeting | object | Targeting object, tags and artists that will be sent to your re-targeting programs (Optional) |
emailCollection | object | Enable Widget to collect fans emails |
socialIcons | object | Social links info |
socialEmbeds | object | Social Embeds info for social sharing |
Returns
If success, Returns the SmartLink object, otherwise, returns error code.
Create Future SmartLink
Creates a new future release SmartLink object. Your music is not released yet, but you want to create your link ahead of time so it's ready on release date. On release date, the link converts to post release link and all marked stores are scanned.
curl -v -X POST -H "Content-Type: application/json" -H 'x-api-key: {YOUR_API_KEY}' -d '
{
"artistId": "5dd4a2b11e0000f94a1cf85c",
"releaseDate": "2028-05-18",
"timezone": "America/New_York",
"domain": "https://ffm.to",
"scanLink": "https://itunes.apple.com/il/album/sweet-child-o-mine/68192941?i=68192994",
"stores": [
{
"storeId": "apple"
},
{
"storeId": "spotify"
},
{
"storeId": "youtube"
},
{
"storeId": "deezer",
"url": "https://www.deezer.com/en/playlist/1354282275"
}
],
"title": "Greatest Hits",
"image": "https://i.ytimg.com/vi/O1fHxPY3TJo/hqdefault.jpg"
}' 'APIDOMAIN/manage/v1/smartlink/future-release'
POST Parameters
Parameter | Required | Description |
---|---|---|
releaseDate | Date | The release date of the song / album (Required) |
releaseTime | string | The release time (HH:MM 24-hour) of the song / album, default 00:00 |
timezone | string | The release date's full timezone name (https://en.wikipedia.org/wiki/List_of_tz_database_time_zones#List) |
artistId | string | The artist id associated with the SmartLink object (Required) |
transactionId | uuid | provide a valid GUID identifying this specific transaction. If connection lost you can use the same body with the transactionId and retrieve the original response (Optioanl) |
shortId | string | SmartLink short code (Required) |
scanLink | string | the target link that is used to auto generate the SmartLink page (Required) |
domain | string | The domain specified for this SmartLink (Optional, default: ffm.to). to use custom domain, please add it first to the link associated artist |
background | object | The styling of the background of the Smart Link page. Available options are the default blur of the hero image, a solid color, or an image |
pageLayout | string | Page layout for the SmartLink. Valid options are: 'base_layout', 'action_page' or 'modern_layout' (Optional, default: base_layout) |
title | string | SmartLink page title (Optional, if scanLink exists, it will try to automatically fill) |
image | string | SmartLink image url (Optional, if scanLink exists, it will try to automatically fill) |
description | string | SmartLink page description (Optional) |
preReleaseDescription | string | SmartLink Pre Release Description. After Release the description will be used (Optional) |
stores | array <object> | List of music stores object associated with this SmartLink (Required). |
preview | object | SmartLink preview object (Optional) |
enabledStores | array <object> | List of music stores to display (Optional. All stores are visible) |
localization | array <object> | List of customized locale display options (Optional. if empty, all locale will use defaults) |
conditionalRouting | object | Allow customized routing rules per browser/channel (Optional) |
routingRules | object | Setting fans idle timeout behavior and allow direct linking to user preferred service (Optional) |
songName | string | The song name associated with the SmartLink (in case of track link) (Optional) |
albumName | string | The album name associated with the SmartLink (in case of album or track link) (Optional) |
pixels | object | Re-targeting pixels object for ad re-targeting (Optional) |
affiliates | object | Affiliates object representing your affiliate programs that are connected to your SmartLink (such as Apple or Amazon) (Optional) |
analytics | object | Analytics object representing your analytics programs that are connected to your SmartLink (such as Google analytics) (Optional) |
legal | object | Legal object, defines the SmartLink privacy policy and terms of service URLs (Optional) |
targeting | object | Targeting object, tags and artists that will be sent to your re-targeting programs (Optional) |
emailCollection | object | Enable Widget to collect fans emails |
socialIcons | object | Social links info |
socialEmbeds | object | Social Embeds info for social sharing |
Returns
If success, Returns the SmartLink object, otherwise, returns error code.
Create Pre-Save SmartLink
Creates a new pre-save release SmartLink object. Your music is not released, but you want to share it as a Pre-Order or Pre-Save (Spotify / Deezer) until release day
curl -v -X POST -H "Content-Type: application/json" -H 'x-api-key: {YOUR_API_KEY}' -d '
{
"artistId": "5dd4a2b11e0000f94a1cf85c",
"releaseDate": "2028-05-18",
"timezone": "America/New_York",
"domain": "https://ffm.to",
"background": {
"type": "blur"
},
"notifications": {
"toggle": true,
"showArtistImage": true,
"message": "Thank you for pre-saving my release",
"subject": "My new release is out and available in your library",
"artistName": "Guns N Roses",
"releaseName": "100% Guns N Roses",
"artistImage": "https://i.ytimg.com/vi/O1fHxPY3TJo/hqdefault.jpg",
"hideFFMBranding": true,
"footer": "85 Broad Street Suite 17.089 New York, NY 10004",
"sender": "noreply@gunsandroses.com"
},
"stores": [
{
"storeId": "apple",
"url": "https://geo.itunes.apple.com/us/album/fields-of-joy/712308582?i=712308671&app=music"
},
{
"storeId": "spotify",
"url": "",
"fallbackUrl": "https://open.spotify.com/track/0XcR8kUxhai3H7wqB0R2eE"
},
{
"storeId": "deezer",
"url": "https://www.deezer.com/en/playlist/1354282275"
}
],
"preSaveFollow": [
{
"storeId": "spotify",
"entities": [
{
"url": "https://open.spotify.com/artist/6tbjWDEIzxoDsBA1FuhfPW"
},
{
"url": "https://open.spotify.com/playlist/3JiPfA9qVRzQcOEixkQB5Z"
}
]
}
],
"title": "Greatest Hits",
"emailCollection": {
"enabled": true,
"title": "Stay Tuned",
"actionButton": "Subscribe"
},
"preReleaseDescription": "Save Now!",
"description": "Listen To",
"image": "https://i.ytimg.com/vi/O1fHxPY3TJo/hqdefault.jpg",
"enableFutureSave": true
}' 'APIDOMAIN/manage/v1/smartlink/pre-save'
POST Parameters
Parameter | Required | Description |
---|---|---|
releaseDate | Date | The release date of the song / album (Required) |
releaseTime | string | The release time (HH:MM 24-hour) of the song / album, default 00:00 |
isLocalRelease | boolean | Allow to set a local release for each territory (Optional, default false) |
scanLink | string | the target link/upc/isrc that is used to auto generate the SmartLink page on release date |
timezone | string | The release date's full timezone name (https://en.wikipedia.org/wiki/List_of_tz_database_time_zones#List) (Optional if local release) |
background | object | The styling of the background of the Smart Link page. Available options are the default blur of the hero image, a solid color, or an image |
artistId | string | The artist id associated with the SmartLink object (Required) |
transactionId | uuid | provide a valid GUID identifying this specific transaction. If connection lost you can use the same body with the transactionId and retrieve the original response (Optional) |
shortId | string | SmartLink short code (Required) |
domain | string | The domain specified for this SmartLink (Optional, default: ffm.to). to use custom domain, please add it first to the link associated artist |
pageLayout | string | Page layout for the SmartLink. Valid options are: 'base_layout', 'action_page' or 'modern_layout' (Optional, default: base_layout) |
title | string | SmartLink page title (Required) |
image | string | SmartLink image url (Required) |
description | string | SmartLink page description (Optional) |
preReleaseDescription | string | SmartLink Pre Release Description. After Release the description will be used (Optional) |
enableFutureSave | boolean | When the value is true, the Smart Link both collects new Future Save opt-ins after a successful pre-save as well as delivers the content to Future Save fans at time of conversion (Optional) |
notifications | object | Fan notification settings for this specific link (Optional). This feature automatically notifies fans that pre-save when your release is available. For this feature to work - it should be activated by contacting clientservices@feature.fm |
stores | array <object> | List of music stores object associated with this SmartLink (Required). Spotify/Deezer url is optional as pre-save is allowed before the link is available. For other stores, in case they provided, url parameter is mandatory and should contains the pre-order page url. |
preview | object | SmartLink preview object (Optional) |
enabledStores | array <object> | List of music stores to display (Optional. All stores are visible) |
localization | array <object> | List of customized locale display options (Optional. if empty, all locale will use defaults) |
conditionalRouting | object | Allow customized routing rules per browser/channel (Optional) |
routingRules | object | Setting fans idle timeout behavior and allow direct linking to user preferred service (Optional) |
songName | string | The song name associated with the SmartLink (in case of track link) (Optional) |
albumName | string | The album name associated with the SmartLink (in case of album or track link) (Optional) |
pixels | object | Re-targeting pixels object for ad re-targeting (Optional) |
affiliates | object | Affiliates object representing your affiliate programs that are connected to your SmartLink (such as Apple or Amazon) (Optional) |
analytics | object | Analytics object representing your analytics programs that are connected to your SmartLink (such as Google analytics) (Optional) |
legal | object | Legal object, defines the SmartLink privacy policy and terms of service URLs (Optional) |
targeting | object | Targeting object, tags and artists that will be sent to your re-targeting programs (Optional) |
preSaveFollow | object | Pre Save Follow object, currently, only spotify supported (Optional) |
emailCollection | object | Enable Widget to collect fans emails |
socialIcons | object | Social links info |
socialEmbeds | object | Social Embeds info for social sharing |
saveSuccessfulMessage | string | Message to show after successful pre-save |
Rescan SmartLink
Rescans an existing SmartLink. Existing stores may be overridden by the scan result, however, stores which couldn't be resolved are not overridden
curl -v -X PUT -H "Content-Type: application/json" -H 'x-api-key: {YOUR_API_KEY}' -d '
{
"scanLink": "ISRC:USSM10505527"
}' 'APIDOMAIN/manage/v1/smartlink/:smartlinkId/rescan'
Path Parameters
Parameter | Required | Description |
---|---|---|
smartlinkId | true | The id of the smartlink to rescan |
Body Parameters
Parameter | Required | Description |
---|---|---|
scanLink | boolean | Link to rescan (Optional), If not specified - the current smartlink's scanLink will be rescanned. |
Returns
If success, returns the SmartLink object, otherwise, returns error code.
Update SmartLink
curl -v -X PUT -H "Content-Type: application/json" -H 'x-api-key: {YOUR_API_KEY}' -d '
{
"scanLink": "https://itunes.apple.com/il/album/sweet-child-o-mine/68192941?i=68192994",
"domain": "https://ffm.to",
"pageLayout": "base_layout",
"title": "Greatest Hits",
"image": "https://i.ytimg.com/vi/O1fHxPY3TJo/hqdefault.jpg",
"description": "Listen to my Album",
"background": {
"type": "color",
"image": "#000000"
},
"stores": [
{
"storeId": "apple",
"url": "https://geo.itunes.apple.com/us/album/fields-of-joy/712308582?i=712308671&app=music"
},
{
"storeId": "spotify",
"url": "https://open.spotify.com/track/0XcR8kUxhai3H7wqB0R2eE"
},
{
"storeId": "deezer",
"url": "https://www.deezer.com/en/playlist/1354282275"
}
],
"preview": {
"storeId": "apple",
"url": "https://audio-ssl.itunes.apple.com/apple-assets-us-std-000001/Music1/v4/fa/8e/ab/fa8eab5b-cd77-3b4d-8931-1943e61d47de/mzaf_6427571633371052040.plus.aac.p.m4a"
},
"enabledStores": [
{
"storeId": "spotify",
"actionName": "Play Now"
}
],
"localization" : [
{
"locale": "fr",
"title": "French Title",
"image": "https://i.ytimg.com/vi/O1fHxPY3TJo/hqdefault.jpg",
"description": "French description",
"preview" : {
"storeId": "deezer",
"url": "https://www.amazon.com/Sweet-Child-Mine-Lost-Roses/dp/1945322071"
},
"enabledStores": [
{
"storeId": "deezer",
"actionName": "Play"
}
],
"conditionalRouting": [
{
"condition": "ios",
"storeId": "deezer"
}
],
"routingRules": {
"idleTimeoutRouting": {
"timeout": 5,
"storeId": "spotify"
},
"usePreferredService": true
}
},
{
"locale": "gb",
"title": "Great Title"
}
],
"conditionalRouting": [{
"condition": "ios",
"storeId": "spotify"
}],
"routingRules": {
"idleTimeoutRouting": {
"timeout": 4,
"storeId": "spotify"
},
"usePreferredService": true
},
"songName": "Greatest Hits",
"albumName": "Greatest Hits",
"pixels": {
"facebook": "123456999",
"google": "123456998",
"googleTagManager": "123456997"
},
"affiliates": {
"apple": "app",
"amazon": [{
"tag": "sweet-fr",
"countryCode": "fr"
},{
"tag": "sweet-uk",
"countryCode": "gb"
}]
},
"analytics": {
"google": "UA-4444-5"
},
"legal": {
"termsOfServiceUrl": "https://en.wikipedia.org/wiki/Slash_(musician)",
"privacyPolicyUrl": "https://en.wikipedia.org/wiki/Axl_Rose"
},
"targeting": {
"artists": [
"Guns&Roses"
],
"tags": [
"rock",
"alternative"
]
}
}' 'APIDOMAIN/manage/v1/smartlink/:smartlinkId'
PUT Parameters
Parameter | Required | Description |
---|---|---|
shortId | string | SmartLink short code |
releaseDate | Date | The release date of the song / album |
releaseTime | string | The release time (HH:MM 24-hour) of the song / album, default 00:00 |
timezone | string | The release date's full timezone name (https://en.wikipedia.org/wiki/List_of_tz_database_time_zones#List) |
scanLink | string | the target link that is used to auto generate the SmartLink page (Optional if stored provided) |
domain | string | The domain specified for this SmartLink (Optional, default: ffm.to). to use custom domain, please add it first to the link associated artist |
background | object | The styling of the background of the Smart Link page. Available options are the default blur of the hero image, a solid color, or an image |
pageLayout | string | Page layout for the SmartLink. Valid options are: 'base_layout' or 'action_page' (Optional, default: base_layout) |
title | string | SmartLink page title (Optional, if scanLink exists, it will try to automatically fill) |
image | string | SmartLink image url (Optional, if scanLink exists, it will try to automatically fill) |
description | string | SmartLink page description (Optional) |
preReleaseDescription | string | SmartLink Pre Release Description. After Release the description will be used (Optional) |
stores | array <object> | List of music stores object associated with this SmartLink (Optional if scanLink provided) |
preview | object | SmartLink preview object (Optional) |
enabledStores | array <object> | List of music stores to display (Optional. All stores are visible) |
localization | array <object> | List of customized locale display options (Optional. if empty, all locale will use defaults) |
conditionalRouting | object | Allow customized routing rules per browser/channel (Optional) |
routingRules | object | Setting fans idle timeout behavior and allow direct linking to user preferred service (Optional) |
songName | string | The song name associated with the SmartLink (in case of track link) (Optional) |
albumName | string | The album name associated with the SmartLink (in case of album or track link) (Optional) |
pixels | object | Re-targeting pixels object for ad re-targeting (Optional) |
affiliates | object | Affiliates object representing your affiliate programs that are connected to your SmartLink (such as Apple or Amazon) (Optional) |
analytics | object | Analytics object representing your analytics programs that are connected to your SmartLink (such as Google analytics) (Optional) |
legal | object | Legal object, defines the SmartLink privacy policy and terms of service URLs (Optional) |
targeting | object | Targeting object, tags and artists that will be sent to your re-targeting programs (Optional) |
updateToPostRelease | Boolean | Used to convert pre-release link to post-release effective immediately |
emailCollection | object | Enable Widget to collect fans emails |
socialIcons | object | Social links info |
socialEmbeds | object | Social Embeds info for social sharing |
Returns
If success, Returns the SmartLink object, otherwise, returns error code.
Archive SmartLink
curl -v -X DELETE -H "Content-Type: application/json" -H 'x-api-key: {YOUR_API_KEY}' 'APIDOMAIN/manage/v1/smartlink/:smartlinkId'
Path Parameters
Parameter | Required | Description |
---|---|---|
smartlinkId | true | The id of the SmartLink to archive |
Returns
If success, Returns an empty JSON, otherwise, returns error code.
Restore SmartLink
curl -v -X POST -H "Content-Type: application/json" -H 'x-api-key: {YOUR_API_KEY}' 'APIDOMAIN/manage/v1/smartlink/:smartlinkId/restore'
Path Parameters
Parameter | Required | Description |
---|---|---|
smartlinkId | true | The id of the SmartLink to restore |
Returns
If success, Returns the SmartLink object, otherwise, returns error code.
List SmartLinks
Returns a list of SmartLinks associated to a specific artist
curl -v -X GET -H "Content-Type: application/json" -H 'x-api-key: {YOUR_API_KEY}' 'APIDOMAIN/manage/v1/artist/:artistId/smartlinks?search=faded&page=1&limit=1&pagingInfo=true'
Path Parameters
Parameter | Required | Description |
---|---|---|
artistId | true | The id of the artist to search |
Query Parameters
Parameter | Required | Description |
---|---|---|
search | string | Search term (Optional). If not specified, all smartlinks are included. |
page | number | Page number (Optional, Default 1) |
limit | number | Number of result per page (Optional, Default 10. Max 100) |
pagingInfo | boolean | Show pagination information (Optional) |
Returns
The above command returns JSON structured like this:
[
{
"id": "5adf52c71b0000e303332e17",
"title": "Faded Love",
"type": "post_release",
"status": "ACTIVE",
"domain": "https://ffm.to",
"shortId": "nk2bx8y",
"artist": "599450031b0000a208fcbc85",
"scanLink": "https://open.spotify.com/album/4bX8UQWtlQQPrJunO3K345",
"artistName": "My Artist",
"createdAt": 1524585159263,
"image": "https://i.scdn.co/image/9e48265689d8896cb562fc49bcdd506bb2e1f018",
}
]
Attribute | Required | Description |
---|---|---|
data | array | array of SmartLink summary object |
Search SmartLinks (New)
Returns a list of smartlinks associated to a specific api_key for a given search term
curl -v -X GET -H "Content-Type: application/json" -H 'x-api-key: {YOUR_API_KEY}' 'APIDOMAIN/manage/v1/smartlink?search=faded&page=1&limit=1&pagingInfo=true'
GET Parameters
Parameter | Required | Description |
---|
dashboard. Every app has a unique API key that must be sent with all calls to the API. search | string | Search term (Optional). If not specified, all smartlinks are included. page | number | Page number (Optional, Default 1) limit | number | Number of result per page (Optional, Default 10. Max 100) pagingInfo | boolean | Show pagination information (Optional)
Returns
The above command returns JSON structured like this:
[
{
"id": "5adf52c71b0000e303332e17",
"title": "Faded Love",
"type": "post_release",
"status": "ACTIVE",
"domain": "https://ffm.to",
"shortId": "nk2bx8y",
"artist": "599450031b0000a208fcbc85",
"scanLink": "https://open.spotify.com/album/4bX8UQWtlQQPrJunO3K345",
"artistName": "My Artist",
"createdAt": 1524585159263,
"image": "https://i.scdn.co/image/9e48265689d8896cb562fc49bcdd506bb2e1f018",
}
]
Returns
With pageInfo set to true:
{
"page": 1,
"pages": 12,
"data": [
{
"id": "5adf52c71b0000e303332e17",
"title": "Faded Love",
"type": "post_release",
"status": "ACTIVE",
"domain": "https://ffm.to",
"shortId": "nk2bx8y",
"artist": "599450031b0000a208fcbc85",
"scanLink": "https://open.spotify.com/album/4bX8UQWtlQQPrJunO3K345",
"artistName": "My Artist",
"createdAt": 1524585159263,
"image": "https://i.scdn.co/image/9e48265689d8896cb562fc49bcdd506bb2e1f018",
}
]
}
Attribute | Required | Description |
---|---|---|
page | integer | The number of the current page |
pages | integer | Total number of pages in the search result |
data | array | array of SmartLink summary object |
Query Analytics & Audience
curl -v -X GET -H "Content-Type: application/json" -H 'x-api-key: {YOUR_API_KEY}' "APIDOMAIN/manage/v1/smartlink/:smartlinkId/analytics?start=2018-04-21&end=2018-04-29&timeZoneOffset=180"
Returns SmartLink Analytics
Path Parameters
Parameter | Required | Description |
---|---|---|
smartlinkId | true | The id of the smartlink |
The above command returns JSON structured like this:
{
"totals": {
"clicks": 40,
"uniqueUsers": 6,
"songPreviews": 0,
"clicksToService": 48
},
"timeline": [{
"date": "2017-12-05",
"clicks": 2,
"songPreviews": 0,
"clicksToService": 1
},{
"date": "2017-12-06",
"clicks": 1,
"songPreviews": 0,
"clicksToService": 0
},{
"date": "2017-12-07",
"clicks": 1,
"songPreviews": 0,
"clicksToService": 1
},{
"date": "2017-12-08",
"clicks": 32,
"songPreviews": 0,
"clicksToService": 0
},{
"date": "2017-12-09",
"clicks": 1,
"songPreviews": 0,
"clicksToService": 26
},{
"date": "2017-12-10",
"clicks": 1,
"songPreviews": 0,
"clicksToService": 16
},{
"date": "2018-02-06",
"clicks": 2,
"songPreviews": 0,
"clicksToService": 4
}],
"channels": [{
"name": "Direct Link (DL)",
"clicks": 1,
"songPreviews": 0,
"clicksToService": 1
},{
"name": "Original",
"clicks": 39,
"songPreviews": 0,
"clicksToService": 47
}],
"channelTypes": [
{
"name": "Organic",
"clicks": 40,
"songPreviews": 0,
"clicksToService": 48
}],
"referrals": [{
"name": "direct",
"clicks": 40,
"songPreviews": 0,
"clicksToService": 48
}],
"streams": [{
"name": "spotify",
"clicks": 0,
"songPreviews": 0,
"clicksToService": 48
}],
"locations": [{
"code": "FR",
"clicks": 23,
"songPreviews": 0,
"clicksToService": 0
},{
"code": "US",
"clicks": 17,
"songPreviews": 0,
"clicksToService": 48
}],
"follow": [
{
"follow": 1,
"targetId": "3658521",
"service": "tidal",
"targetType": "artist",
"name": "Bruno Mars",
},
{
"follow": 1,
"targetId": "10926",
"service": "tidal",
"targetType": "artist",
"name": "Lenny Kravitz",
}
],
"audience": [{
"service": "spotify",
"service_user_id": "john.doe",
"userData": {
"displayName": "john.doe",
"webUrl": "https://open.spotify.com/user/john.doe",
"email": "john.doe@gmail.com",
"image": "https://profile-images.scdn.co/images/userprofile/default/0319a3cde14b70dc6bc1c923634eff77326d3e02",
"profileFollowers": 3,
"country": "US",
"birthdate": "1994-05-01",
"playlistsFollowers": null,
"subscriptionType": "free"
}
}]
}
Returns
Attribute | Required | Description |
---|---|---|
totals | object | Total analytics summary |
timeline | object | Total analytics groups by timeline |
channels | object | Total analytics grouped by channels |
channelTypes | object | Total analytics grouped by channel types (Organic/Paid) |
referrals | object | Total analytics grouped by referrals source |
referralsSourceTypes | object | Total analytics grouped by referrals source type |
activities | object | Total analytics grouped by activities |
streams | object | Total analytics grouped by streams |
locations | object | Total analytics grouped by locations |
follow | object | Multiple follow statistics |
audience | object | Only for pre release links. Shows data for users who Pre-Saved the link and agreed to share their contact. |
Shortlinks
The Shortlink Management API allows you to create, retrieve, update, delete, restore, and fetch analytics for shortlinks. Shortlinks provide a simplified way to create branded short URLs that redirect to your content.
The Shortlink Object
The below JSON is an example of a Shortlink object:
{
"id": "5cb5f69b160000f812eaf4a3",
"artistId": "5cb5f69b160000f812eaf4a3",
"title": "My New Single",
"link": "https://open.spotify.com/track/your-track-id",
"domain": "ffm.link",
"shortId": "mynewsingle",
"image": "https://i.scdn.co/image/your-image-id",
"createdAt": 1526373512,
"status": "ACTIVE",
"localization": [
{
"locale": "us",
"link": "https://open.spotify.com/track/us-track-id"
},
{
"locale": "gb",
"link": "https://open.spotify.com/track/uk-track-id"
}
],
"targeting": {
"tags": ["pop", "summer"],
"artists": ["Artist Name"]
},
"pixels": {
"google": "G-XXXXXXXX",
"facebook": "1234567890",
"tiktok": "ABCDEF1234567890ABCD"
},
"affiliates": {
"amazon": [
{
"tag": "myaffiliate-20",
"countryCode": "us"
}
],
"apple": "1234567",
"spotify": "partner123"
},
"analytics": {
"google": "UA-XXXXXXXX-X"
},
"legal": {
"privacyPolicyUrl": "https://example.com/privacy",
"termsOfServiceUrl": "https://example.com/terms"
},
"socialEmbeds": {
"enabled": true,
"title": "Check out my new single!",
"description": "Now available on all platforms",
"preReleaseDescription": "Coming soon!",
"image": "https://example.com/social-image.jpg"
},
"sharedAnalytics": {
"enabled": true
}
}
Shortlink Object Fields
Field | Type | Required | Description |
---|---|---|---|
link | string | Yes | The primary destination URL for the shortlink. Must be a valid URL with http or https protocol. |
artistId | string | Yes | The ID of the artist this shortlink belongs to. |
title | string | Yes | A title for the shortlink, used for internal identification and in some social media embeds. |
domain | string | Optional | The domain to use for the shortlink (e.g., ffm.link). Must be a valid URI. If not provided, a default domain will be used. |
shortId | string | Optional | A custom short identifier (e.g., ffm.link/:shortId). Can contain letters, numbers, hyphens, and underscores. Max 50 characters. |
image | string | Optional | A URL for an image to be used in social media embeds. Must be a valid http or https URL. |
transactionId | string | Optional | Provide a valid GUID identifying this specific transaction. If connection lost you can use the same body with the transactionId and retrieve the original response. |
localization | array | Optional | An array of objects for localizing the link based on the user's country. See Localization Object. |
targeting | object | Optional | An object for audience targeting. See Targeting Object. |
pixels | object | Optional | An object for adding retargeting pixels. See Retargeting Pixels Object. |
affiliates | object | Optional | An object for configuring affiliate programs. See Affiliates Object. |
analytics | object | Optional | An object for configuring third-party analytics. See Analytics Object. |
legal | object | Optional | An object for providing links to legal documents. See Legal Object. |
socialEmbeds | object | Optional | An object for customizing how the link appears on social media. See Social Embeds Object. |
sharedAnalytics | object | Optional | An object to configure a publicly shareable analytics report. See Shared Analytics Object. |
Localization Object
Used within the localization array to provide different destination links for different countries.
Field | Type | Required | Description |
---|---|---|---|
locale | string | Yes | The two-letter ISO country code (e.g., "us", "gb", "jp"). |
link | string | Yes | The destination URL for this specific locale. Must be a valid http/https URL. |
Targeting Object
Used to target specific audiences.
Field | Type | Required | Description |
---|---|---|---|
tags | array | Optional | An array of strings. |
artists | array | Optional | An array of artist names. |
Retargeting Pixels Object
Used to add tracking pixels from various ad platforms.
Field | Type | Description |
---|---|---|
string | Your Google Ads pixel ID. | |
string | Your Facebook Pixel ID. | |
googleTagManager | string | Your Google Tag Manager container ID. |
tiktok | string | Your TikTok Pixel ID (must be 20 alphanumeric characters). |
snapchat | string | Your Snapchat Pixel ID. |
appnexus | string | Your AppNexus pixel ID. |
Affiliates Object
Used to configure affiliate marketing programs.
Field | Type | Required | Description |
---|---|---|---|
amazon | array | Optional | An array of Amazon affiliate objects with tag (string) and countryCode (2-letter country code). |
apple | string | Optional | Your Apple affiliate token. |
spotify | string | Optional | Your Spotify affiliate token. |
Analytics Object
Used for integrating with third-party analytics services.
Field | Type | Required | Description |
---|---|---|---|
string | Optional | Your Google Analytics Tracking ID (e.g., "UA-XXXXXXXX-X"). |
Legal Object
Used to link to your terms of service and privacy policy.
Field | Type | Required | Description |
---|---|---|---|
privacyPolicyUrl | string | Optional | A URL to your privacy policy. Must be a valid http/https URL. |
termsOfServiceUrl | string | Optional | A URL to your terms of service. Must be a valid http/https URL. |
Social Embeds Object
Used to customize the link's appearance on social media platforms.
Field | Type | Required | Description |
---|---|---|---|
enabled | boolean | Optional | Defaults to true. Set to false to disable custom social embeds. |
title | string | Optional | A custom title for the social media embed. |
description | string | Optional | A custom description. Max 48 characters. |
preReleaseDescription | string | Optional | A description to show before the release date. Max 48 characters. |
image | string | Optional | A URL for a custom image. Must be a valid http/https URL. |
Shared Analytics Object
Used to enable a public-facing analytics report for this link.
Field | Type | Required | Description |
---|---|---|---|
enabled | boolean | Optional | Defaults to false. Set to true to enable the report. |
Create a Shortlink
Creates a new shortlink.
HTTP Request
POST APIDOMAIN/manage/v1/shortlink
curl -X POST \
'APIDOMAIN/manage/v1/shortlink' \
-H 'Content-Type: application/json' \
-H 'x-api-key: {YOUR_API_KEY}' \
-d '{
"artistId": "5cb5f69b160000f812eaf4a3",
"title": "My New Single",
"link": "https://open.spotify.com/track/your-track-id",
"image": "https://i.scdn.co/image/your-image-id",
"domain": "ffm.link"
}'
The above command returns JSON structured like this:
{
"status": 0,
"data": {
"id": "5cb5f69b160000f812eaf4a3",
"artistId": "5cb5f69b160000f812eaf4a3",
"title": "My New Single",
"link": "https://open.spotify.com/track/your-track-id",
"domain": "ffm.link",
"shortId": "mynewsingle",
"image": "https://i.scdn.co/image/your-image-id",
"createdAt": 1526373512,
"status": "ACTIVE"
}
}
POST Parameters
See The Shortlink Object for all available fields.
Returns
If success, returns the created shortlink object, otherwise, returns error code.
List All Shortlinks
Retrieves a list of all shortlinks for all artists associated with your key.
HTTP Request
GET APIDOMAIN/manage/v1/shortlink
curl -X GET \
'APIDOMAIN/manage/v1/shortlink?limit=10&page=1' \
-H 'x-api-key: {YOUR_API_KEY}'
The above command returns JSON structured like this:
{
"status": 0,
"data": [
{
"id": "5cb5f69b160000f812eaf4a3",
"artistId": "5cb5f69b160000f812eaf4a3",
"title": "My New Single",
"link": "https://open.spotify.com/track/your-track-id",
"domain": "ffm.link",
"shortId": "mynewsingle",
"status": "ACTIVE"
}
],
"paging": {
"page": 1,
"limit": 10,
"total": 100
}
}
Query Parameters
Parameter | Required | Description |
---|---|---|
limit | Optional | Number of results per page (Default 10, Max 100) |
page | Optional | Page number (Default 1) |
Returns
Returns a list of shortlink objects.
Get Shortlink by Short ID and Domain
Retrieves a shortlink by its short ID and domain.
HTTP Request
GET APIDOMAIN/manage/v1/shortlink/shortid/:shortId?domain={domain}
curl -X GET \
'APIDOMAIN/manage/v1/shortlink/shortid/aBc12D?domain=ffm.link' \
-H 'x-api-key: {YOUR_API_KEY}'
Path Parameters
Parameter | Required | Description |
---|---|---|
shortId | Yes | The short ID of the shortlink to retrieve |
GET Parameters
Parameter | Required | Description |
---|---|---|
domain | Yes | The domain of the shortlink (e.g., ffm.link) |
Returns
If found, returns the shortlink object, otherwise, returns error code.
Get Shortlink by ID
Retrieves a shortlink by its unique ID.
HTTP Request
GET APIDOMAIN/manage/v1/shortlink/:shortlinkId
curl -X GET \
'APIDOMAIN/manage/v1/shortlink/:shortlinkId' \
-H 'x-api-key: {YOUR_API_KEY}'
GET Parameters
Parameter | Required | Description |
---|---|---|
shortlinkId | Yes | The ID of the shortlink to retrieve |
Returns
If found, returns the shortlink object, otherwise, returns error code.
Update a Shortlink
Updates an existing shortlink.
HTTP Request
PUT APIDOMAIN/manage/v1/shortlink/:shortlinkId
curl -X PUT \
'APIDOMAIN/manage/v1/shortlink/:shortlinkId' \
-H 'Content-Type: application/json' \
-H 'x-api-key: {YOUR_API_KEY}' \
-d '{
"title": "My Awesome New Single",
"link": "https://music.apple.com/us/album/your-album/your-id"
}'
PUT Parameters
See The Shortlink Object for all available fields. Only include fields you want to update.
Returns
If success, returns the updated shortlink object, otherwise, returns error code.
Delete (Archive) a Shortlink
Archives (soft-deletes) a shortlink.
HTTP Request
DELETE APIDOMAIN/manage/v1/shortlink/:shortlinkId
curl -X DELETE \
'APIDOMAIN/manage/v1/shortlink/:shortlinkId' \
-H 'x-api-key: {YOUR_API_KEY}'
Returns
Returns a success status if the shortlink was archived successfully.
Restore a Shortlink
Restores an archived shortlink.
HTTP Request
POST APIDOMAIN/manage/v1/shortlink/:shortlinkId/restore
curl -X POST \
'APIDOMAIN/manage/v1/shortlink/:shortlinkId/restore' \
-H 'x-api-key: {YOUR_API_KEY}'
Returns
Returns the restored shortlink object if successful.
Get Shortlink Analytics
Retrieves analytics for a specific shortlink.
HTTP Request
GET APIDOMAIN/manage/v1/shortlink/:shortlinkId/analytics
curl -X GET \
'APIDOMAIN/manage/v1/shortlink/:shortlinkId/analytics?start=2024-01-01&end=2024-01-31' \
-H 'x-api-key: {YOUR_API_KEY}'
The above command returns JSON structured like this:
{
"status": 0,
"data": {
"totals": {
"clicks": 1500,
"uniqueClicks": 1200
},
"timeline": {
"2024-01-01": {
"clicks": 50,
"uniqueClicks": 45
}
},
"locations": {
"US": {
"clicks": 800,
"uniqueClicks": 700
},
"GB": {
"clicks": 300,
"uniqueClicks": 250
}
},
"referrals": {
"twitter.com": {
"clicks": 500,
"uniqueClicks": 400
}
}
}
}
Path Parameters
Parameter | Required | Description |
---|---|---|
shortlinkId | true | The id of the shortlink |
GET Parameters
Parameter | Required | Description |
---|---|---|
start | Optional | Start date for analytics (YYYY-MM-DD format) |
end | Optional | End date for analytics (YYYY-MM-DD format) |
Returns
Returns analytics data including totals, timeline breakdown, locations, and referral sources.
Action Pages
The Action Page Object
The below JSON is an example of a Action Page object:
{
"id": "5b02c896260000b596db4837",
"artistId": "599450031b0000a208fcbc85",
"shortId": "qby54qo",
"domain": "https://ffm.to",
"title": "Like I Do",
"image": "https://i.scdn.co/image/2e55b9c247cc6b0b713fbbce9db0527a932f8748",
"previewUrl": "https://open.spotify.com/track/6RnkFd8Fqqgk1Uni8RgqCQ",
"description": "Choose your preferred music service",
"localization": [{
"locale": "US",
"title": "Like I Do",
"image": "https://i.scdn.co/image/2e55b9c247cc6b0b713fbbce9db0527a932f8748",
"previewUrl": "https://open.spotify.com/track/6RnkFd8Fqqgk1Uni8RgqCQ",
"description": "Choose your preferred music service",
"actionButtons": [{
"id": "9de244ec-5d62-48b9-9c09-e863ae882b14",
"platformCode": "spotify",
"actionCode": "pre_save",
"actionText": "Pre-Save on Spotify",
"releaseDate": "2020-05-21",
"linkUrl": "https://open.spotify.com/track/6RnkFd8Fqqgk1Uni8RgqCQ",
"saveSuccessfulMessage": "Your music library will update automatically on release day!",
"artistProfileUrl": "https://open.spotify.com/artist/1Cs0zKBU1kc0i8ypK3B9ai",
"addEmail": true
}]
}],
"actionButtons": [
{
"id": "9de244ec-5d62-48b9-9c09-e863ae882b13",
"platformCode": "spotify",
"actionCode": "pre_save",
"actionText": "Pre-Save on Spotify",
"releaseDate": "2020-05-21",
"linkUrl": "https://open.spotify.com/track/6RnkFd8Fqqgk1Uni8RgqCQ",
"saveSuccessfulMessage": "Your music library will update automatically on release day!",
"artistProfileUrl": "https://open.spotify.com/artist/1Cs0zKBU1kc0i8ypK3B9ai",
"addEmail": true
},
{
"id": "ddd4bcf9-de70-496b-9114-61d431125678",
"platformCode": "spotify",
"actionCode": "save",
"actionText": "Save on Spotify",
"linkUrl": "https://open.spotify.com/track/6RnkFd8Fqqgk1Uni8RgqCQ",
"saveSuccessfulMessage": "Thanks for saving! Your music library has been updated",
"artistProfileUrl": "https://open.spotify.com/artist/1Cs0zKBU1kc0i8ypK3B9ai",
"addEmail": true
},
{
"id": "f61a0610-9f5d-4d70-b20d-1bec31447b7a",
"platformCode": "spotify",
"actionCode": "follow",
"actionText": "Follow on Spotify",
"linkUrl": "https://open.spotify.com/artist/1Cs0zKBU1kc0i8ypK3B9ai",
"saveSuccessfulMessage": "Thanks for following!",
"artistProfileUrl": "https://open.spotify.com/artist/1Cs0zKBU1kc0i8ypK3B9ai",
"addEmail": true
}
],
"targeting": {
"tags": [
"bosanova"
],
"artists": [
"David Guetta"
]
},
"legal": {
"privacyPolicyUrl": "https://www.sonymusic.com/privacy-policy/",
"termsOfServiceUrl": "https://www.sonymusic.com/terms-and-conditions/"
},
"pixels": {
"google": "2394872331",
"googleTagManager": "GTM-1234",
"facebook": "2342342331"
},
"affiliates": {
"apple": "q234ru22",
"amazon": [{
"tag": "big",
"countryCode": "us"
},{
"tag": "small",
"countryCode": "il"
}
]
},
"analytics": {
"google": "UA-238572-353"
},
"songName": "Name",
"albumName": "Name",
"socialIcons": {
"enabled": true,
"useArtistDefaults": false,
"socialLinks": {
"facebook": "https://facebook.com/pluf",
"instagram": "https://instagram.com/plupi",
"twitter": "https://twitter.com/twit",
"youtube": "https://youtube.com/yoyo",
"spotify": "https://open.spotify.com/artist/slus",
"soundcloud": "https://soundcloud.com/cluc",
"other": "https://www.other.com",
},
},
"socialEmbeds": {
"title": "soctit",
"description": "social media desc",
"image": "https://image.shutterstock.com/image-vector/cute-funny-hippo-450w-351867221.jpg",
}
}
Attribute | Type | Description |
---|---|---|
id | string | The Action Page id |
artistId | string | The artist id associated with the Action Page object |
createdAt | date | Timestamp of the Action Page creation |
status | string | The status of the Action Page. Valid options are: "ACTIVE", "ARCHIVED" |
shortId | string | Action Page short code |
domain | string | The domain specified for this Action Page. |
title | string | Action Page title |
image | string | Action Page image url |
previewUrl | string | Action Page preview link. Supported URLs: Spotify, Apple, Amazon, Deezer, YouTube, SoundCloud, .MP3 |
description | string | Action Page description |
localization | array <object> | List of customized locale display options |
actionButtons | array <object> | List of Action Page buttons |
songName | string | The song name associated with the Action Page (in case of track link) |
albumName | string | The album name associated with the Action Page (in case of album or track link) |
pixels | object | Re-targeting pixels object for ad re-targeting |
affiliates | object | Affiliates object representing your affiliate programs that are connected to your Action Page (such as Apple or Amazon) |
analytics | object | Analytics object representing your analytics programs that are connected to your Action Page (such as Google analytics) |
legal | object | Legal object, defines the Action Page privacy policy and terms of service URLs |
targeting | object | Targeting object, tags and artists that will be sent to your re-targeting programs |
socialIcons | object | Social links info |
socialEmbeds | object | Social Embeds info for social sharing |
ActionPage Localization Object Details
Attribute | Type | Description |
---|---|---|
locale | string | Locale code (ISO 3166-1 alpha-2 code) |
title | string | Locale page title |
image | string | Locale image url |
description | string | Locale page description |
previewUrl | string | Locale preview link. Supported URLs: Spotify, Apple, Amazon, Deezer, YouTube, SoundCloud, .MP3 |
actionButtons | array <object> | Locale specific buttons display settings |
ActionPage Object Details
Attribute | Type | Description |
---|---|---|
id | string | Button ID |
platformCode | string | Button platform code (currently only Spotify supported) |
actionCode | string | Button action code. Supported: pre_save, save, follow |
actionText | string | Button action text |
releaseDate | Date | Track release date |
releaseTime | string | The release time (HH:MM 24-hour) of the song / album, default 00:00 |
timezone | string | The release date's full timezone name (https://en.wikipedia.org/wiki/List_of_tz_database_time_zones#List) |
linkUrl | string | action button link (track/album/playlist) to save/follow |
saveSuccessfulMessage | string | Message to show after successful save/follow |
artistProfileUrl | string | Artist to follow after successful save/follow |
addEmail | Boolean | Indicates to collect user emails. |
The Action Page Summary Object
In some API endpoints, where we do not need all the Action Page object data, a summary object can be returned with a subset of the Action Page object information (useful listing ActionPages)
Action Page Summary Object Details
The below JSON is an example of a Action Page object:
{
"id": "5ad4a2b11e0000f94a1cf85b",
"createdAt": 1523884721506,
"artist": "599450031b0000a208fcbc85",
"status": "ACTIVE",
"domain": "https://ffm.to",
"shortId": "0b0rnrn",
"title": "Lenny Kravitz - Fly Away",
"image": "https://is1-ssl.mzstatic.com/image/thumb/Music6/v4/b2/e2/1b/b2e21bd2-e67e-ce9d-20dc-3f5faa5b8cb2/source/500x0w.jpg"
}
Attribute | Type | Description |
---|---|---|
id | string | The Action Page id |
createdAt | date | Timestamp of the Action Page creation |
artist | string | The artist id associated with the Action Page object |
status | string | The status of the Action Page. Valid options are: "ACTIVE", "ARCHIVED" |
domain | string | domain to be used for this Action Page |
shortId | string | Action Page short code |
title | string | Action Page page title |
image | string | Action Page image url |
Get Action Page
Retrieves the details of an existing Action Page. You need only supply the unique Action Page identifier that was returned upon Action Page creation.
curl -v -X GET -H "Content-Type: application/json" -H 'x-api-key: {YOUR_API_KEY}' 'APIDOMAIN/manage/v1/actionpage/:actionpageId'
Path Parameters
Parameter | Required | Description |
---|---|---|
actionpageId | true | The id of the Action Page to retrieve |
Get Action Page By ShortId and Domain
Retrieves the details of an existing Action Page by short id and domain. The domain parameter should not include the HTTP protocol.
curl -v -X GET -H "Content-Type: application/json" -H 'x-api-key: {YOUR_API_KEY}' 'APIDOMAIN/manage/v1/actionpage/shortid/:shortId?domain={domain}'
Path Parameters
Parameter | Required | Description |
---|---|---|
shortId | true | The short id of the Action Page to retrieve |
GET Parameters
Parameter | Required | Description |
---|---|---|
domain | true | The domain of the Action Page (e.g.: ffm.to) |
Returns
Returns a Action Page object if a valid identifier/s were provided.
Create Action Page
Creates a new Action Page ActionPage object.
curl -v -X POST -H "Content-Type: application/json" -H 'x-api-key: {YOUR_API_KEY}' -d '
{
"artistId": "599450031b0000a208fcbc85",
"shortId": "qby54qo",
"domain": "https://ffm.to",
"title": "Like I Do",
"image": "https://i.scdn.co/image/2e55b9c247cc6b0b713fbbce9db0527a932f8748",
"previewUrl": "https://open.spotify.com/track/6RnkFd8Fqqgk1Uni8RgqCQ",
"description": "Choose your preferred music service",
"localization": [{
"locale": "US",
"title": "Like I Do",
"image": "https://i.scdn.co/image/2e55b9c247cc6b0b713fbbce9db0527a932f8748",
"previewUrl": "https://open.spotify.com/track/6RnkFd8Fqqgk1Uni8RgqCQ",
"description": "Choose your preferred music service",
"actionButtons": [{
"platformCode": "spotify",
"actionCode": "pre_save",
"actionText": "Pre-Save on Spotify",
"releaseDate": "2020-05-21",
"linkUrl": "https://open.spotify.com/track/6RnkFd8Fqqgk1Uni8RgqCQ",
"saveSuccessfulMessage": "Your music library will update automatically on release day!",
"artistProfileUrl": "https://open.spotify.com/artist/1Cs0zKBU1kc0i8ypK3B9ai",
"addEmail": true
}]
}],
"actionButtons": [
{
"platformCode": "spotify",
"actionCode": "pre_save",
"actionText": "Pre-Save on Spotify",
"releaseDate": "2020-05-21",
"linkUrl": "https://open.spotify.com/track/6RnkFd8Fqqgk1Uni8RgqCQ",
"saveSuccessfulMessage": "Your music library will update automatically on release day!",
"artistProfileUrl": "https://open.spotify.com/artist/1Cs0zKBU1kc0i8ypK3B9ai",
"addEmail": true
},
{
"platformCode": "spotify",
"actionCode": "save",
"actionText": "Save on Spotify",
"linkUrl": "https://open.spotify.com/track/6RnkFd8Fqqgk1Uni8RgqCQ",
"saveSuccessfulMessage": "Thanks for saving! Your music library has been updated",
"artistProfileUrl": "https://open.spotify.com/artist/1Cs0zKBU1kc0i8ypK3B9ai",
"addEmail": true
},
{
"platformCode": "spotify",
"actionCode": "follow",
"actionText": "Follow on Spotify",
"linkUrl": "https://open.spotify.com/artist/1Cs0zKBU1kc0i8ypK3B9ai",
"saveSuccessfulMessage": "Thanks for following!",
"artistProfileUrl": "https://open.spotify.com/artist/1Cs0zKBU1kc0i8ypK3B9ai",
"addEmail": true
}
],
"targeting": {
"tags": [
"bosanova"
],
"artists": [
"David Guetta"
]
},
"legal": {
"privacyPolicyUrl": "https://www.sonymusic.com/privacy-policy/",
"termsOfServiceUrl": "https://www.sonymusic.com/terms-and-conditions/"
},
"pixels": {
"google": "2394872331",
"googleTagManager": "GTM-1234",
"facebook": "2342342331"
},
"affiliates": {
"apple": "q234ru22",
"amazon": [{
"tag": "big",
"countryCode": "us"
},{
"tag": "small",
"countryCode": "il"
}
]
},
"analytics": {
"google": "UA-238572-353"
},
"songName": "Name",
"albumName": "Name"
}' 'APIDOMAIN/manage/v1/actionpage'
POST Parameters
Attribute | Type | Description |
---|---|---|
id | string | The Action Page id (Required) |
artistId | string | The artist id associated with the Action Page object (Required) |
transactionId | uuid | provide a valid GUID identifying this specific transaction. If connection lost you can use the same body with the transactionId and retrieve the original response (Optioanl) |
shortId | string | Action Page short code (Required) |
domain | string | The domain specified for this Action Page (Required) |
title | string | Action Page title (Requited) |
image | string | Action Page image url (Required) |
previewUrl | string | Action Page preview link. Supported URLs: Spotify, Apple, Amazon, Deezer, YouTube, SoundCloud, .MP3 (Optional) |
description | string | Action Page description (Optional) |
localization | array <object> | List of customized locale display options (Optional) |
actionButtons | array <object> | List of Action Page buttons (Required) |
songName | string | The song name associated with the Action Page (Optioanl) |
albumName | string | The album name associated with the Action Page (Optioanl) |
pixels | object | Re-targeting pixels object for ad re-targeting (Optioanl) |
affiliates | object | Affiliates object representing your affiliate programs that are connected to your Action Page (such as Apple or Amazon) (Optioanl) |
analytics | object | Analytics object representing your analytics programs that are connected to your Action Page (such as Google analytics) (Optional) |
legal | object | Legal object, defines the Action Page privacy policy and terms of service URLs (Optional) |
targeting | object | Targeting object, tags and artists that will be sent to your re-targeting programs (Optional) |
socialIcons | object | Social links info |
socialEmbeds | object | Social Embeds info for social sharing |
Returns
If success, Returns the ActionPage object, otherwise, returns error code.
Update ActionPage
curl -v -X PUT -H "Content-Type: application/json" -H 'x-api-key: {YOUR_API_KEY}' -d '
{
"id": "5b02c896260000b596db4837",
"shortId": "qby54qo",
"domain": "https://ffm.to",
"title": "Like I Do",
"image": "https://i.scdn.co/image/2e55b9c247cc6b0b713fbbce9db0527a932f8748",
"previewUrl": "https://open.spotify.com/track/6RnkFd8Fqqgk1Uni8RgqCQ",
"description": "Choose your preferred music service",
"localization": [],
"actionButtons": [
{
"id": "9de244ec-5d62-48b9-9c09-e863ae882b13",
"platformCode": "spotify",
"actionCode": "pre_save",
"actionText": "Pre-Save on Spotify",
"releaseDate": "2020-05-21",
"linkUrl": "https://open.spotify.com/track/6RnkFd8Fqqgk1Uni8RgqCQ",
"saveSuccessfulMessage": "Your music library will update automatically on release day!",
"artistProfileUrl": "https://open.spotify.com/artist/1Cs0zKBU1kc0i8ypK3B9ai",
"addEmail": true
},
{
"id": "ddd4bcf9-de70-496b-9114-61d431125678",
"platformCode": "spotify",
"actionCode": "save",
"actionText": "Save on Spotify",
"linkUrl": "https://open.spotify.com/track/6RnkFd8Fqqgk1Uni8RgqCQ",
"saveSuccessfulMessage": "Thanks for saving! Your music library has been updated",
"artistProfileUrl": "https://open.spotify.com/artist/1Cs0zKBU1kc0i8ypK3B9ai",
"addEmail": true
},
{
"id": "f61a0610-9f5d-4d70-b20d-1bec31447b7a",
"platformCode": "spotify",
"actionCode": "follow",
"actionText": "Follow on Spotify",
"linkUrl": "https://open.spotify.com/artist/1Cs0zKBU1kc0i8ypK3B9ai",
"saveSuccessfulMessage": "Thanks for following!",
"artistProfileUrl": "https://open.spotify.com/artist/1Cs0zKBU1kc0i8ypK3B9ai",
"addEmail": true
}
],
"targeting": {
"tags": [
"bosanova"
],
"artists": [
"David Guetta"
]
},
"legal": {
"privacyPolicyUrl": "https://www.sonymusic.com/privacy-policy/",
"termsOfServiceUrl": "https://www.sonymusic.com/terms-and-conditions/"
},
"pixels": {
"google": "2394872331",
"googleTagManager": "GTM-1234",
"facebook": "2342342331"
},
"affiliates": {
"apple": "q234ru22",
"amazon": [{
"tag": "big",
"countryCode": "us"
},{
"tag": "small",
"countryCode": "il"
}
]
},
"analytics": {
"google": "UA-238572-353"
},
"songName": "Name",
"albumName": "Name"
}' 'APIDOMAIN/manage/v1/actionpage/:actionpageId'
Path Parameters
Parameter | Required | Description |
---|---|---|
actionpageId | true | The id of the Action Page |
PUT Parameters
Attribute | Type | Description |
---|---|---|
id | string | The Action Page id (Required) |
shortId | string | Action Page short code (Required) |
domain | string | The domain specified for this Action Page (Required) |
title | string | Action Page title (Requited) |
image | string | Action Page image url (Required) |
previewUrl | string | Action Page preview link. Supported URLs: Spotify, Apple, Amazon, Deezer, YouTube, SoundCloud, .MP3 (Optional) |
description | string | Action Page description (Optional) |
localization | array <object> | List of customized locale display options (Optional) |
actionButtons | array <object> | List of Action Page buttons (Required) |
songName | string | The song name associated with the Action Page (Optioanl) |
albumName | string | The album name associated with the Action Page (Optioanl) |
pixels | object | Re-targeting pixels object for ad re-targeting (Optioanl) |
affiliates | object | Affiliates object representing your affiliate programs that are connected to your Action Page (such as Apple or Amazon) (Optioanl) |
analytics | object | Analytics object representing your analytics programs that are connected to your Action Page (such as Google analytics) (Optional) |
legal | object | Legal object, defines the Action Page privacy policy and terms of service URLs (Optional) |
targeting | object | Targeting object, tags and artists that will be sent to your re-targeting programs (Optional) |
socialIcons | object | Social links info |
socialEmbeds | object | Social Embeds info for social sharing |
Returns
If success, Returns the ActionPage object, otherwise, returns error code.
Archive Action Page
curl -v -X DELETE -H "Content-Type: application/json" -H 'x-api-key: {YOUR_API_KEY}' 'APIDOMAIN/manage/v1/actionpage/:actionpageId'
Path Parameters
Parameter | Required | Description |
---|---|---|
actionpageId | true | The id of the Action Page to archive |
Returns
If success, Returns an empty JSON, otherwise, returns error code.
Restore Action Page
curl -v -X POST -H "Content-Type: application/json" -H 'x-api-key: {YOUR_API_KEY}' 'APIDOMAIN/manage/v1/actionpage/:actionpageId/restore'
Path Parameters
Parameter | Required | Description |
---|---|---|
actionpageId | true | The id of the ActionPage to restore |
Returns
If success, Returns the ActionPage object, otherwise, returns error code.
List ActionPages
Returns a list of ActionPages associated to a specific artist
curl -v -X GET -H "Content-Type: application/json" -H 'x-api-key: {YOUR_API_KEY}' 'APIDOMAIN/manage/v1/artist/:artistId/actionpages?page=1&search=faded&limit=1'
Path Parameters
Parameter | Required | Description |
---|---|---|
artistId | true | The id of the artist folder to search in |
GET Parameters
Parameter | Required | Description |
---|---|---|
search | string | Search term (Optional). If not specified, all actionpages are included. |
page | number | Page number (Optional, Default 1) |
limit | number | Number of result per page (Optional, Default 10. Max 100) |
The above command returns JSON structured like this:
[
{
"id": "5adf52c71b0000e303332e17",
"title": "Faded Love",
"domain": "https://ffm.to",
"shortId": "nk2bx8y",
"artist": "599450031b0000a208fcbc85",
"artistName": "My Artist",
"createdAt": 1524585159263,
"image": "https://i.scdn.co/image/9e48265689d8896cb562fc49bcdd506bb2e1f018",
}
]
Returns
Attribute | Required | Description |
---|---|---|
data | array | array of ActionPage summary object |
Search ActionPage (New)
Returns a list of actionpages associated to a specific api_key for a given search term
curl -v -X GET -H "Content-Type: application/json" -H 'x-api-key: {YOUR_API_KEY}' 'APIDOMAIN/manage/v1/actionpage?search=faded&page=1&limit=1'
GET Parameters
Parameter | Required | Description |
---|---|---|
search | string | Search term (Optional). If not specified, all actionpages are included. |
page | number | Page number (Optional, Default 1) |
limit | number | Number of result per page (Optional, Default 10. Max 100) |
Returns
The above command returns JSON structured like this:
[
{
"id": "5adf52c71b0000e303332e17",
"title": "Faded Love",
"domain": "https://ffm.to",
"shortId": "nk2bx8y",
"artist": "599450031b0000a208fcbc85",
"artistName": "My Artist",
"createdAt": 1524585159263,
"image": "https://i.scdn.co/image/9e48265689d8896cb562fc49bcdd506bb2e1f018",
}
]
Attribute | Required | Description |
---|---|---|
data | array | array of Actionpage summary object |
Query Analytics & Audience
Returns Action Page Analytics
curl -v -X GET -H "Content-Type: application/json" -H 'x-api-key: {YOUR_API_KEY}' "APIDOMAIN/manage/v1/actionpage/:actionpageId/analytics?start=2018-04-21&end=2018-04-29&timeZoneOffset=180"
The above command returns JSON structured like this:
{
"totals": {
"clicks": 17,
"uniqueUsers": 4,
"clicksToService": 3
},
"timeline": [{
"date": "2018-03-18",
"clicks": 16,
"clicksToService": 3
},{
"date": "2018-03-19",
"clicks": 1,
"clicksToService": 0
}],
"channels": [{
"name": "Original",
"clicks": 17,
"clicksToService": 3
}],
"channelTypes": [{
"name": "Organic",
"clicks": 17,
"clicksToService": 3
}],
"referrals": [{
"name": "direct",
"clicks": 17,
"clicksToService": 3
}],
"actions": [{
"name": "follow",
"clicksToService": 2
},{
"name": "stream",
"clicksToService": 1
}],
"locations": [{
"code": "US",
"clicks": 17,
"clicksToService": 3
}],
"audience": [{
"service": "spotify",
"service_user_id": "zohar.aharoni",
"userData": {
"displayName": "zohar.aharoni",
"webUrl": "https://open.spotify.com/user/zohar.aharoni",
"email": "zohar.aharoni@gmail.com",
"image": "https://profile-images.scdn.co/images/userprofile/default/0319a3cde14b70dc6bc0c953636eff77326d3e02",
"profileFollowers": 3,
"country": "US",
"birthdate": "1980-10-01",
"playlistsFollowers": null,
"subscriptionType": "free"
}
}]
}
Returns
Attribute | Required | Description |
---|---|---|
totals | object | Total analytics summary |
timeline | object | Total analytics grouped by timeline |
channels | object | Total analytics grouped by channels |
channelTypes | object | Total analytics grouped by channel types (Organic/Paid) |
referrals | object | Total analytics grouped by referrals source |
actions | object | Total analytics grouped by actions |
locations | object | Total analytics grouped by locations |
audience | object | Shows data for users who Pre-Saved/Saved/Followed the link and agreed to share their contact. |
Artist Future Save Configuration
The Future Save feature allows fans to subscribe to receive all future pre-saves from an artist by opting-in just once. This means that fans who join the Future Save will be automatically set to receive the artist's next Pre-Save on Feature.fm. Fans can opt-in after successfully completing a Pre-Save, where they will be prompted to receive all future releases from the artist. This feature works only with the supported services mentioned below. The user needs to be subscribed to the Future Save feature. Once subscribed, they can enable/disable this feature per artist they create. Also, the user will need to provide information for each music service, including the service name, the link to the artist page in that service, and if the feature is enabled for that specific service for that artist.
Supported Services
- Spotify
- Apple
- Tidal
- Deezer
- Amazon
- Audiomack
Set Future-Save Settings For Artist
curl --location --request PUT 'APIDOMAIN/manage/v1/artist/:artistId/future' \
--header 'x-api-key: {YOUR_API_KEY}' \
--header 'Content-Type: application/json' \
--data '{
"enabled": true,
"services": [
{
"service": "spotify",
"link": "https://open.spotify.com/artist/1lhaaKpTyXOnjp79M3xYBl"
}
]
}'
The above command returns JSON structured like this:
{
"id": "674dc4141d00005800c4d659",
"artistId": "6681425f1c00001234604031",
"artist": {
"id": "6681425f1c00001234604031",
"alias": "lennykravitz",
"name": "Lenny Kravitz",
"accountId": "564b038e4321006330ee3676"
},
"shortId": "vp7qymr",
"type": "future_save",
"createdAt": 1733149716813,
"enabled": true,
"services": [
{
"id": "e3kohxpw0",
"service": "spotify",
"link": "https://open.spotify.com/track/0XcR8kUxhai3H7wqB0R2eE",
"toggle": true
}
]
}
Path Parameters
Parameter | Required | Description |
---|---|---|
artistId | true | The id of the artist |
PUT Parameters
Attribute | Type | Required | Description |
---|---|---|---|
enabled | boolean | true | A boolean value that determines whether Future-Save is enabled for the artist |
services | array <object> | true | An array of objects, where each object represents a artist profile url in a service |
Returns
If success, returns the Future-Save Settings for the artist, otherwise - returns error code.
Disable Future-Save Settings For Artist
curl --location --request DELETE 'APIDOMAIN/manage/v1/artist/:artistId/future' \
--header 'x-api-key: {YOUR_API_KEY}'
Path Parameters
Parameter | Required | Description |
---|---|---|
artistId | true | The id of the artist |
Returns
Will return the future-save settings with "enabled" field set to false
Restore Future-Save Settings For Artist
curl --location --request POST 'APIDOMAIN/manage/v1/artist/:artistId/future/enable' \
--header 'x-api-key: {YOUR_API_KEY}'
Path Parameters
Parameter | Required | Description |
---|---|---|
artistId | true | The id of the artist |
Returns
Will return the future-save settings with "enabled" field set to true
Get Future-Save Settings For Artist
curl --location --request GET 'APIDOMAIN/manage/v1/artist/:artistId/future' \
--header 'x-api-key: {YOUR_API_KEY}'
Path Parameters
Parameter | Required | Description |
---|---|---|
artistId | true | The id of the artist |
Returns
Will return the future-save settings for the artist
The Future-Save Service Object
Attribute | Type | Required | Description |
---|---|---|---|
service | string | true | The name of the music service (e.g., "spotify") |
link | string | true | The URL to the artist's page on the respective music service |
Best Practice for Adding Services to Artist Future-Save Settings via API
When adding new services to Future-Save settings, you have two options:
Option 1: Complete Update - Call the update API endpoint with the complete list of services, including both previously configured services and your new additions - This approach requires knowledge of all existing service configurations
Option 2: Fetch-Then-Update - If you don't have access to previously configured service URLs, first call GET to retrieve current settings - Add your new service information to the existing services list in the response - Use the combined data as the request body for your update call - Note: The GET response contains extended information fields that are ignored during update operations, so you can safely include them in your update request
Channels
channels refer to the different avenues or platforms where artists can share their Feature.fm smart links to track and understand where their audience is coming from. These channels can be either organic (e.g., social media posts, email newsletters) or paid (e.g., advertising campaigns).
Custom channels extend this functionality by allowing you to create personalized tracking parameters beyond the pre-set options.
List Channels
GET /v1/channel
Returns a list of all channels for the authenticated user.
Request
- No parameters.
Response
200 OK
— Array of channel objects.
Example cURL
curl -X GET "APIDOMAIN/manage/v1/channel" \
-H "x-api-key: {YOUR_API_KEY}"
Create Custom Channel
POST /v1/channel
Creates a new custom channel.
Request Body
{
"name": "My Channel",
"isOrganic": true
}
Field | Type | Required | Description |
---|---|---|---|
name | string | Yes | Name of the channel |
isOrganic | boolean | No | Whether the channel is organic (default: true) |
Response
201 Created
— The created channel object.400 Bad Request
— If validation fails.
Example cURL
curl -X POST "APIDOMAIN/manage/v1/channel" \
-H "x-api-key: {YOUR_API_KEY}" \
-H "Content-Type: application/json" \
-d '{
"name": "My Channel",
"isOrganic": true
}'
Delete Custom Channel
DELETE /v1/channel/:channelId
Deletes a custom channel by its ID.
Path Parameters
Parameter | Type | Description |
---|---|---|
channelId | string | The ID of the channel to delete |
Response
204 No Content
— Channel deleted successfully.404 Not Found
— Channel not found.
Example cURL
curl -X DELETE "APIDOMAIN/manage/v1/channel/1234567890" \
-H "x-api-key: {YOUR_API_KEY}"
Audience Segments
What are Segments?
A Segment is a saved audience filter—a set of rules that defines a group of fans based on their attributes or behaviors (e.g., country, platform, engagement, etc.). Segments allow you to target, analyze, or message specific subsets of your audience. Segments can be managed at the user level (for the whole account) or at the artist/folder level.
You can create, read, update, and delete segments, and then use them to query your audience or for other marketing actions.
Segment Object
{
"id": "123e4567-e89b-12d3-a456-426614174000",
"name": "US Spotify Fans",
"filter": {
"locations": { "condition": "includes", "value": ["us"] },
"platforms": { "condition": "includes", "value": ["spotify"] }
}
}
Attribute | Type | Description |
---|---|---|
id | string | Optional. Unique identifier for the segment. Can be a UUID v4 or a string containing only letters, numbers, underscores, or hyphens. |
name | string | Required. Name of the segment. Max 40 characters. |
filter | object | Required. Object defining the segment’s filter rules. See Filter Fields for details. |
Filter Fields
{
"locations": { "condition": "includes", "value": ["us", "gb"] },
"platforms": { "condition": "includes", "value": ["spotify", "apple"] }
}
Each segment’s filter
is an object where each key is a category (e.g., locations
, platforms
) and the value is an object with:
condition
: The type of filter (e.g.,"includes"
,"between"
,"greater than"
)value
: The value(s) for the filter
Category | Condition(s) | Value Type | Description/Restrictions |
---|---|---|---|
platforms | includes | array of strings | Must be valid platform IDs. At least one required. No duplicates. |
subscriptions | includes | array of strings | Allowed: "paid", "free", "na". At least one required. |
smartlinks | includes | string | Must be a valid smartlink id (24 hex chars). |
email_marketing | includes | array of strings | Only "subscribed" allowed. At least one required. |
folders | includes | array of strings | Must be a valid artist id (24 hex chars). Not allowed in artist segments. |
locations | includes | array of strings | Valid country codes (ISO 3166-1 alpha-2). At least one required. |
last_seen | between | object | { start: ISODate, end: ISODate } . Start must be <= end. |
artist_tags | includes | array of strings | At least one required. |
engagements | greater than | number | Must be a number. |
followers | greater than | number | Must be a number. |
registration_types | includes | array of strings | Allowed: "one-time", "forever". At least one required. |
Filter Field Example
"filter": {
"locations": { "condition": "includes", "value": ["us", "gb"] },
"platforms": { "condition": "includes", "value": ["spotify", "apple"] },
"last_seen": { "condition": "between", "value": { "start": "2023-01-01", "end": "2023-12-31" } }
}
Filter Conditions
Platforms
- Condition:
includes
- Values: Array of streaming platforms (
spotify
,apple
,youtube
, etc.) - Note: Duplicate platforms are not allowed
Subscriptions
- Condition:
includes
- Values: Array of subscription types (
paid
,free
,na
)
Locations
- Condition:
includes
- Values: Array of valid country codes (e.g.,
us
,gb
,jp
)
Smartlinks
- Condition:
includes
- Values: Valid smartlink id
Email Marketing
- Condition:
includes
- Values: Array containing
subscribed
Folders (User Segments Only)
- Condition:
includes
- Values: Array of valid artist ids
Last Seen
- Condition:
between
- Values: Object with
start
andend
dates in ISO format (YYYY-MM-DD) - Note: Start date must be earlier than or equal to end date
Artist Tags
- Condition:
includes
- Values: Array of tag strings
- Note: At least one tag must be provided
Engagements
- Condition:
greater than
- Values: Number
Followers
- Condition:
greater than
- Values: Number
Registration Types
- Condition:
includes
- Values: Array of registration types (
one-time
,forever
)
Validation Rules
- Segment name must not exceed 40 characters
- At least one filter condition is required
- Artist segments cannot include folder filters
- All dates must be in ISO format (YYYY-MM-DD)
- smartlink and artist/folder ids must be valid 24-character hexadecimal strings
- Country codes must be valid ISO-3166-1 alpha-2 and lowercase
- Platform values must be valid streaming platforms
- Subscription types must be valid: "paid", "free" or "na"
- Registration types must be either "one-time" or "forever"
Pre-defined Segments
The following audience segments are available out-of-the-box. Each segment is identified by an id
, has a user-friendly name
, and is defined by one or more filters.
Segment ID | Name | Filters Used |
---|---|---|
everyone |
Everyone | None (includes all users) |
spotify-fans |
Spotify Fans | platforms : Spotify |
youtube-subscribers |
YouTube Subscribers | platforms : YouTube, YouTube Music |
apple-fans |
Apple Music Fans | platforms : Apple |
influencers |
Influencers | followers : 1000 |
recent-fans |
Recent Fans | last_seen : Last 90 days |
repeat-fans |
Repeat Fans | engagements : users who have engaged more than once |
top-fans |
Top Fans | engagements : users who have engaged at least 5 times |
slipping-away |
Slipping away | last_seen : Not seen in the last 30 days |
past-fans |
Past Fans | last_seen : Not seen in the last 90 days |
premium-streamers |
Premium Streamers | subscriptions : Paidengagements : engaged at least 3 times |
forever-fans |
Future Save Fans | registration_types : Forever |
Example:
- The "Top Fans" segment (
top-fans
) includes users who have engaged at least 5 times (engagements > 4
). - The "Slipping away" segment (
slipping-away
) includes users who have not been seen in the last 30 days (last_seen
filter).
You can use these segment IDs when querying the API to quickly target common audience groups.
Create a User Segment
curl -X POST "APIDOMAIN/manage/v1/audience/segments" \
-H "x-api-key: {YOUR_API_KEY}" \
-H "Content-Type: application/json" \
-d '{
"name": "My Fans in US",
"filter": {
"platforms": {
"condition": "includes",
"value": ["spotify", "apple", "youtube"]
},
"subscriptions": {
"condition": "includes",
"value": ["paid", "free", "na"]
},
"locations": {
"condition": "includes",
"value": ["us", "gb", "jp"]
},
"smartlinks": {
"condition": "includes",
"value": "507f1f77bcf86cd799439011"
},
"email_marketing": {
"condition": "includes",
"value": ["subscribed"]
},
"folders": {
"condition": "includes",
"value": ["507f1f77bcf86cd799439011"]
},
"last_seen": {
"condition": "between",
"value": {
"start": "2024-01-01",
"end": "2024-12-31"
}
},
"artist_tags": {
"condition": "includes",
"value": ["rock", "pop", "jazz"]
},
"engagements": {
"condition": "greater than",
"value": 1000
},
"followers": {
"condition": "greater than",
"value": 5000
},
"registration_types": {
"condition": "includes",
"value": ["one-time", "forever"]
}
}
}'
POST /manage/v1/audience/segments
Creates a new audience segment for the user.
Input
Attribute | Type | Description |
---|---|---|
name | string | Name of the segment (required, max 40 characters) |
filter | object | Filter object defining the segment (required). See Filter Fields below. |
List User Segments
curl -X GET "APIDOMAIN/manage/v1/audience/segments" -H 'x-api-key: {YOUR_API_KEY}'
GET /manage/v1/audience/segments
Returns all segments for the current user.
Input
No input parameters.
Get a User Segment
curl -X GET "APIDOMAIN/manage/v1/audience/segments/SEGMENT_UUID" -H 'x-api-key: {YOUR_API_KEY}'
GET /manage/v1/audience/segments/:segmentId
Returns a specific segment by its ID.
Input
Attribute | Type | Description |
---|---|---|
segmentId | string | Segment UUID (required) |
Update a User Segment
curl -X PUT "APIDOMAIN/manage/v1/audience/segments/SEGMENT_UUID" \
-H "x-api-key: {YOUR_API_KEY}" \
-H "Content-Type: application/json" \
-d '{
"name": "Updated Segment Name",
"filter": {
"platforms": { "condition": "includes", "value": ["spotify"] }
}
}'
PUT /manage/v1/audience/segments/:segmentId
Updates an existing segment.
Input
Attribute | Type | Description |
---|---|---|
segmentId | string | Segment UUID (required, in URL) |
name | string | Name of the segment (required, max 40 characters) |
filter | object | Filter object defining the segment (required). See Filter Fields below. |
Delete a User Segment
curl -X DELETE "APIDOMAIN/manage/v1/audience/segments/SEGMENT_UUID" -H 'x-api-key: {YOUR_API_KEY}'
DELETE /manage/v1/audience/segments/:segmentId
Deletes a segment.
Input
Attribute | Type | Description |
---|---|---|
segmentId | string | Segment UUID (required) |
Artist/Folder Segments
All the above operations are also available for artist/folder-level segments, using the following endpoints:
- List:
GET /manage/v1/audience/artists/:artistId/segments
- Get:
GET /manage/v1/audience/artists/:artistId/segments/:segmentId
- Create:
POST /manage/v1/audience/artists/:artistId/segments
- Update:
PUT /manage/v1/audience/artists/:artistId/segments/:segmentId
- Delete:
DELETE /manage/v1/audience/artists/:artistId/segments/:segmentId
Example: Create Artist Segment
curl -X POST "APIDOMAIN/manage/v1/audience/artists/:artistId/segments" \
-H "x-api-key: {YOUR_API_KEY}" \
-H "Content-Type: application/json" \
-d '{
"name": "My Artist Fans",
"filter": {
"locations": { "condition": "includes", "value": ["us"] }
}
}'
Input
Path Parameters
Parameter | Required | Description |
---|---|---|
artistId | string | Artist ID (required, 24-char hex, in URL) |
Body Parameters
Attribute | Type | Description |
---|---|---|
name | string | Name of the segment (required, max 40 characters) |
filter | object | Filter object defining the segment (required). See Filter Fields below. |
Advanced Audience Query
What is Audience Query?
Audience Query allows you to fetch a list of fans matching a segment. You can query by referencing a saved segment or by providing an inline filter (without saving it as a segment). Queries can be performed at the user level or for a specific artist/folder.
User Audience Query
POST /manage/v1/audience/query
Query your audience using either a saved segment or an inline filter.
cURL Example (using segmentId vs inline filter)
curl -X POST "APIDOMAIN/manage/v1/audience/query" \
-H "x-api-key: {YOUR_API_KEY}" \
-H "Content-Type: application/json" \
-d '{
"segmentId": "SEGMENT_UUID"
}'
curl -X POST "APIDOMAIN/manage/v1/audience/query" \
-H "x-api-key: {YOUR_API_KEY}" \
-H "Content-Type: application/json" \
-d '{
"filter": {
"locations": { "condition": "includes", "value": ["us"] }
}
}'
Input
Query Parameters
Attribute | Type | Description |
---|---|---|
page | number | Page number (optional, default: 1) |
pageSize | number | Page size (optional, default: 10) |
Body Parameters
Attribute | Type | Description |
---|---|---|
segmentId | string | Segment UUID. Required if filter is not provided. |
filter | object | Inline filter object. Required if segmentId is not provided. See Filter Fields. |
Note: You must provide either segmentId
or filter
, not both.
Artist/Folder Audience Query
POST /manage/v1/audience/artists/:artistId/query
Query the audience for a specific artist/folder.
cURL Example
curl -X POST "APIDOMAIN/manage/v1/audience/artists/:artistId/query" \
-H "x-api-key: {YOUR_API_KEY}" \
-H "Content-Type: application/json" \
-d '{
"segmentId": "SEGMENT_UUID"
}'
Input
Path Parameters
Attribute | Type | Description |
---|---|---|
artistId | string | Artist ID (required, 24-char hex, in URL) |
Query Parameters
Attribute | Type | Description |
---|---|---|
page | number | Page number (optional, default: 1) |
pageSize | number | Page size (optional, default: 10) |
Body Parameters
Attribute | Type | Description |
---|---|---|
segmentId | string | Segment UUID. Required if filter is not provided. |
filter | object | Inline filter object. Required if segmentId is not provided. See Filter Fields. |
Note: You must provide either segmentId
or filter
, not both.
General
Validate Available Id
Test if the given ID is available for use with a smartlink or an action page
curl -v -X Get -H "Content-Type: application/json" -H 'x-api-key: {YOUR_API_KEY}' 'APIDOMAIN/manage/v1/system/shortid-available/:shortId?domain={domain}'
Path Parameters
Parameter | Required | Description |
---|---|---|
shortId | true | The short id to check for availability |
The above command returns JSON structured like this:
{
"available": true
}
Parameter | Required | Description |
---|---|---|
id | string | ID to test |
domain | string | Domain to test against |
Returns
If success, returns available is true, otherwise, returns available is false.
Upload Artwork
Upload an image directly to Feature.fm, get a public link and use it for your links artworks. Image size can be up to 10MB. Image can be uploaded from URL or base64. Sending both values or none will respond with 404 error.
Prior to upload the image goes through format and size verification
- Validate it's one of known types - jpeg, png, tiff,..., and converted to jpeg.
- Only if bigger than 3000X3000, will be resized to max 3000X3000 (keeping original scale)
curl -v -X POST -H "Content-Type: application/json" -H 'x-api-key: {YOUR_API_KEY}' 'APIDOMAIN/manage/v1/system/upload-image{?url="http://"}'
{
"base64": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg=="
}
The above command returns JSON structured like this:
{
"imageUrl": "https://advertiser-api-uploads.s3.us-west-2.amazonaws.com/test/img-a4215c20-e1b5-11e8-bc3d-e786aa8d82de.jpg"
}
Parameter | Required | Description |
---|---|---|
url | string | url to the image to upload (Optional if base64 is given) |
base64 | string | base64 encoded data of the image (Optional if url is given) |
Returns
If success, returns the image public url, otherwise, returns error.
Conversion API
A conversion is an action that a person takes on your website/app such as checking out, registering, downloading, or viewing a particular page.
Feature.fm allows you to report these actions, so we can store it internally and report back to the campaign's marketer.
Feature.fm conversion SDK/API will report data back if and only if the user has been referred by a SmartLink campaign.
When a fan is redirected to your page from a SmartLink campaign, a token is passed along as a URL parameter (ffm=
When the fan completes an action, API/SDK track function/endpoint must be invoked with some data about the product (more below). If the transaction contains more than one product, the function can be called multiple times
To start using conversion data, the implementation should follow these two steps
- Initialize the session based on the given token (ffm=
) - Invoke ffmTrack with product data
If one or both of these criteria are not met, the conversion script will not work.
In order to start using the conversion SDK/API, please contact us so we will enable it for you. Usually done in 24 hours.
Initialize session
SDK
Add the SDK script (see below) to the following pages
- Every page that the user might be directed to (i.e. album page, song page, ticket page, etc...)
- The page when the transaction is done (sale/download/listen/etc...)
<script type="text/javascript" src="https://assets.ffm.to/js/ffmTrack.js"></script>
Its recommented to add the script right before your closing body tag.
API
If you choose to use direct calls to our API, it is in your responsibilty to parse the unique_id token from the page query string and store it on the user session/workflow.
Execute transaction
SDK
When the user completes a transaction (sale/download/listen/etc...), reporting back to Feature.fm is done by calling window._ffmTrack
which receives the following parameters:
- reference_id (string): An internal identifier for the product.
- reference_type (string): An internal identifier for the product type, such as album/track/playlist/user (optional)
- reference_name (string): The name of the product. (optional)
- operation (string): sale/download/listen
- value (number): The order value of the product. (optional and relevant only for sale operation)
- currency (string): The currency of the order value (optional and relevant only for sale operation)
ffmTrack
function sends automatically the token which was stored when the fan was redirected to the service
<script type="text/javascript">
window._ffmTrack('B01BDKNLZG', 'track', 'Rihanna - Anti (Standard Edition)', 'sale', 12.99, 'GBP');
</script>
API
If you choose to use direct calls to our API, when the user completes a transaction (sale/download/listen/etc...), reporting back to feature.fm is done by calling "POST" to https//api.ffm.to/conversion/operation
curl -X "POST" https://api.ffm.to/conversion/operation
{
reference: 'B01BDKNLZG',
type: 'track',
name: 'Rihanna - Anti (Standard Edition)',
operation: 'sale',
value: 12.99,
currency: 'GBP',
ffmHash: ....
}
ffmHash
is mandatory and must be filled with the user Feature.fm token
Periodic Report
If you would like to upload a daily/hourly aggregated conversion data in CSV/JSON rather than using the API for every transaction, we do support it as well!
For further information please do not hesitate to contact us.
Errors
The Feature.fm API uses the following error codes:
Error Code | Meaning |
---|---|
400 | Bad Request -- Something is wrong with your request |
401 | Unauthorized -- Your API key is wrong |
403 | Forbidden -- The object requested is hidden for administrators only |
404 | Not Found -- The specified object could not be found |
405 | Method Not Allowed -- You tried to access a object with an invalid method |
406 | Not Acceptable -- You requested a format that isn't json |
410 | Gone -- The object requested has been removed from our servers |
429 | Too Many Requests -- You're requesting too many objects! Slown down! |
500 | Internal Server Error -- We had a problem with our server. Try again later. |
503 | Service Unavailable -- We're temporarially offline for maintanance. Please try again later. |