Download OpenAPI specification:Download
Base URL: https://api.epidemicsound.com
If you're using the old base URL (https://partner-content-api.epidemicsound.com),
it will keep working for /v0 endpoints, but we encourage you to switch to the new
subdomain. You can make the switch without additional changes to your integration.
Request a Partner Token
Token request
| accessKeyId required | string |
| accessKeySecret required | string |
{- "accessKeyId": "string",
- "accessKeySecret": "string"
}{- "accessToken": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiJwYXJ0bmVyIiwiaXNzIjoiRXBpZGVtaWMgU291bmQiLCJwYXJ0bmVySWQiOiJlcGlkZW1pY3NvdW5kIiwiZXhwIjoxNjIwMTA4OTg0fQ"
}Request a User Token. This endpoint requires a Partner Token for authentication.
Token request
| userId required | string End user id. UUID, numeric or matching ^[a-zA-Z0-9_-]+$ |
{- "userId": "ee11cbb1-9052-340b-87aa-c0ca060c23ee"
}{- "accessToken": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJ1c2VyVGllciI6ImJhc2VfdGllciIsImF1ZCI6ImVuZC11c2VyIiwiaXNzIjoiRXBpZGVtaWMgU291bmQiLCJwYXJ0bmVySWQiOiJlcGlkZW1pY3NvdW5kIiwiZXhwIjoxNjIwMTA5MDkyLCJ1c2VySWQiOiJ1c2VyX2lkIn0"
}These endpoints will allow you to explore the Epidemic Sound library. You can display tracks grouped in curated playlists, moods or genres or use search to get tracks by any term.
The collections endpoint returns playlists curated by our team of in-house experts.
We offer collections for any occasion: from holidays like "Día de Muertos" to content types like "Real Estate" or "Badass ads".
You can manage the order and which collections are part or your applications' free tier via the developer portal. As default, we return the collections included in your free tier first, followed by all collections in the Epidemic Sound library.
Collections have attributes like title and cover art. In the few cases where we do not have cover art for a collection we return a default image.
You can choose to return collections with or without tracks. The response will include a maximum of 20 tracks per collection. If a collection contains more than 20 tracks use endpoint '/collections/{collectionId}' to get all tracks.
| excludeField | string Value: "tracks" Add parameter if tracks should be excluded in the response |
| limit | integer <int32> Max number of entries returned in the response, default 10 and max 20 |
| offset | integer <int32> Index of the entry track in the response |
{- "collections": [
- {
- "id": "4caef099-43bd-4653-8203-3086fa01d3b7",
- "name": "Happy",
- "tracks": [
- {
- "id": "6rUPerw2po",
- "mainArtists": [
- "Main Artist"
], - "featuredArtists": [
- "Featured Artist"
], - "title": "Happy Song",
- "bpm": 135,
- "length": 3123,
- "moods": [
- {
- "id": "happy",
- "name": "Happy"
}, - {
- "id": "eccentric",
- "name": "Eccentric"
}
], - "genres": [
- {
- "id": "beats",
- "name": "Beats",
- "parent": {
- "id": "parent",
- "name": "Parent Beats"
}
}, - {
- "id": "trap",
- "name": "Trap"
}
], - "images": {
}, - "isExplicit": false,
- "hasVocals": true,
- "added": "2020-10-10",
- "isPreviewOnly": true,
- "availableStems": [ ]
}
], - "availableTracks": 1,
- "images": {
}
}, - {
- "id": "9917d694-511b-4b66-ab8a-c553660399e4",
- "name": "Sad",
- "tracks": [
- {
- "id": "0dZCtol3bs",
- "mainArtists": [
- "Main Artist"
], - "featuredArtists": [
- "Featured Artist"
], - "title": "Sad Song",
- "bpm": 97,
- "length": 2976,
- "moods": [
- {
- "id": "happy",
- "name": "Happy"
}, - {
- "id": "eccentric",
- "name": "Eccentric"
}
], - "genres": [
- {
- "id": "beats",
- "name": "Beats",
- "parent": {
- "id": "parent",
- "name": "Parent Beats"
}
}, - {
- "id": "trap",
- "name": "Trap"
}
], - "images": {
}, - "isExplicit": false,
- "hasVocals": true,
- "added": "2020-10-10",
- "isPreviewOnly": true,
- "availableStems": [ ]
}
], - "availableTracks": 1,
- "images": {
}
}
], - "pagination": {
- "limit": 20,
- "offset": 40,
- "page": 3
}, - "links": {
- "next": "/v0/collections?limit=20&offset=60",
- "prev": "/v0/collections?limit=20&offset=20"
}
}The collections endpoint allows you to list all the tracks in a specific collection.
| collectionId required | string Collection id |
| limit | integer <int32> Max number of entries returned in the response, default 50 and max 100 |
| offset | integer <int32> Index of the entry track in the response |
{- "id": "f10e65eb-9998-4c41-9777-ac9183ab85dd",
- "name": "Happy",
- "tracks": [
- {
- "id": "6rUPerw2po",
- "mainArtists": [
- "Main Artist"
], - "featuredArtists": [
- "Featured Artist"
], - "title": "Happy Song",
- "bpm": 135,
- "length": 3123,
- "moods": [
- {
- "id": "happy",
- "name": "Happy"
}, - {
- "id": "eccentric",
- "name": "Eccentric"
}
], - "genres": [
- {
- "id": "beats",
- "name": "Beats",
- "parent": {
- "id": "parent",
- "name": "Parent Beats"
}
}, - {
- "id": "trap",
- "name": "Trap"
}
], - "images": {
}, - "isExplicit": false,
- "hasVocals": true,
- "added": "2020-10-10",
- "isPreviewOnly": true,
- "availableStems": [ ]
}
], - "availableTracks": 1,
- "pagination": {
- "limit": 20,
- "offset": 60,
- "page": 4
}, - "links": {
- "next": "/v0/collections/f10e65eb-9998-4c41-9777-ac9183ab85dd?limit=20&offset=80",
- "prev": "/v0/collections/f10e65eb-9998-4c41-9777-ac9183ab85dd?limit=20&offset=40"
}, - "images": {
}
}The search endpoint allows your users to search the entire Epidemic Sound library. Search indexes track attributes such as moods, genres, artist, song title and bpm.
You can also pass a Spotify track link or URI as the term (e.g.
https://open.spotify.com/track/{id} or spotify:track:{id}) to find similar Epidemic Sound
tracks. The first time a given Spotify track is searched it may not have been analysed yet. In that
case the endpoint responds 503 Service Unavailable with a Retry-After header (in seconds)
indicating how long to wait before retrying. Repeat the same request after that delay until it
succeeds. Analysis of a first-seen track can take from a few seconds up to a couple of minutes, so
poll gently and honour Retry-After rather than retrying aggressively.
| offset | integer <int32> Index of the entry track in the response |
| limit | any Max number of entries returned in the response, default 50 and max 60 |
| term | string Term for search |
| genre | Array of strings Id for genre |
| mood | Array of strings Id for mood |
| bpmMin | integer <int32> BPM Min |
| bpmMax | integer <int32> BPM Max |
| vocalType | Array of strings Items Enum: "LEAD" "PRESENCE" "NONE" Filter by vocal classification: LEAD (sung lead vocals), PRESENCE (vocal chops/samples/ad-libs/textures) or NONE (instrumental). Repeat the parameter to pass multiple values, which are OR-combined. |
| filterBehaviour | string Enum: "allOf" "anyOf" Control how the API combines several values of the same filter, such as two moods or two genres.
The vocalType filter always combines its values with |
| sort | string Default: "Relevance" Enum: "Title" "Relevance" "Date" "Popularity" "Duration" "BPM" Sort for search |
| order | string Default: "asc" Enum: "asc" "desc" Order |
{- "tracks": [
- {
- "id": "6rUPerw2po",
- "mainArtists": [
- "Main Artist"
], - "featuredArtists": [
- "Featured Artist"
], - "title": "Happy Song",
- "bpm": 135,
- "length": 3123,
- "moods": [
- {
- "id": "happy",
- "name": "Happy"
}, - {
- "id": "eccentric",
- "name": "Eccentric"
}
], - "genres": [
- {
- "id": "beats",
- "name": "Beats",
- "parent": {
- "id": "parent",
- "name": "Parent Beats"
}
}, - {
- "id": "trap",
- "name": "Trap"
}
], - "images": {
}, - "isExplicit": false,
- "hasVocals": true,
- "added": "2020-10-10",
- "isPreviewOnly": true,
- "isrc": "SE5Q52401263",
- "vocalType": "LEAD",
- "availableStems": [ ]
}, - {
- "id": "0dZCtol3bs",
- "mainArtists": [
- "Main Artist"
], - "featuredArtists": [
- "Featured Artist"
], - "title": "Sad Song",
- "bpm": 97,
- "length": 2976,
- "moods": [
- {
- "id": "happy",
- "name": "Happy"
}, - {
- "id": "eccentric",
- "name": "Eccentric"
}
], - "genres": [
- {
- "id": "beats",
- "name": "Beats",
- "parent": {
- "id": "parent",
- "name": "Parent Beats"
}
}, - {
- "id": "trap",
- "name": "Trap"
}
], - "images": {
}, - "isExplicit": false,
- "hasVocals": true,
- "added": "2020-10-10",
- "isPreviewOnly": true,
- "isrc": "SE5Q52401264",
- "vocalType": "PRESENCE",
- "availableStems": [ ]
}
], - "pagination": {
- "limit": 25,
- "offset": 25,
- "page": 2
}, - "links": {
- "next": "/tracks/search?limit=25&offset=50",
- "prev": "/tracks/search?limit=25&offset=0"
}, - "aggregations": {
- "moods": [
- {
- "id": "energetic",
- "name": "Energetic",
- "count": 1
}
], - "genres": [
- {
- "id": "rock",
- "name": "Rock",
- "count": 1
}
]
}
}The search suggestions endpoint allows your users to get autocomplete suggestions for Epidemic Sound music or external provider music search.
Returns:
Usage: When a user selects a suggestion, use the 'value' field as the 'term' parameter when calling /tracks/search to get matching tracks.
| term | string Term for search |
{- "suggestions": [
- {
- "value": "rock",
- "title": "rock",
- "type": "TEXT"
}, - {
- "value": "rocker",
- "title": "rocker",
- "type": "TEXT"
},
]
}The moods endpoint allows your users to browse the music catalog based on moods like happy, epic or relaxing. Moods have cover art that you can show in your interface.
By specifying the "type" of moods you want to display, you can choose to show all moods in the Epidemic Sound library, only the moods that are featured on epidemicsound.com or only the moods that are available for your free tier tracks.
| sort | string Default: "relevance" Enum: "alphabetic" "relevance" Sorting options. Available values: alphabetic, relevance |
| order | string Default: "asc" Enum: "asc" "desc" Order options. Available values: asc, desc |
| type | string Default: "all" Enum: "all" "featured" "partner-tier" Types to filter by:
|
| limit | integer <int32> Max number of entries returned in the response, default 20 and max 20 |
| offset | integer <int32> Index of the entry track in the response |
{- "moods": [
- {
- "id": "energetic",
- "name": "Epic",
- "images": {
}
}, - {
- "id": "happy",
- "name": "Happy",
- "images": {
}
}
], - "pagination": {
- "limit": 20,
- "offset": 0,
- "page": 1
}, - "links": { }
}Get mood details
| moodId required | string Mood id |
| expand | string Value: "tracks" Add parameter if tracks should be included in the response |
| limit | integer <int32> Max number of entries returned in the response, default 50 and max 100 |
| offset | integer <int32> Index of the entry track in the response |
{- "id": "happy",
- "name": "Happy",
- "images": {
}
}The genres endpoint allows your users to browse the music catalog based on genres like rock, hiphop or acoustic.
Genres are nested and both parent and child genres are returned in the response. Parent genres have cover art that you can show in your interface.
By specifying the "type" of genres you want to display, you can choose to show all genres in the Epidemic Sound library, only the genres that are featured on epidemicsound.com or only the genres that are available for your free tier tracks.
| sort | string Default: "relevance" Enum: "alphabetic" "relevance" Sorting options. Available values: alphabetic, relevance |
| order | string Default: "asc" Enum: "asc" "desc" Order options. Available values: asc, desc |
| type | string Default: "all" Enum: "all" "featured" "partner-tier" Types to filter by:
|
| limit | integer <int32> Max number of entries returned in the response, default 20 and max 20 |
| offset | integer <int32> Index of the entry track in the response |
{- "genres": [
- {
- "id": "beats",
- "name": "Beats",
- "images": {
}
}
], - "pagination": {
- "limit": 20,
- "offset": 0,
- "page": 1
}, - "links": { }
}This endpoint gives you the parent and child relationships of a specific genre as well as all tracks that belong to it.
| genreId required | string Genre id |
| expand | string Value: "tracks" Add parameter if tracks should be included in the response |
| limit | integer <int32> Max number of entries returned in the response, default 50 and max 100 |
| offset | integer <int32> Index of the entry track in the response |
{- "id": "parent-beats",
- "name": "Parent Beats",
- "children": [
- {
- "id": "true-beats",
- "name": "True Beats",
- "parent": {
- "id": "parent-beats",
- "name": "Parent Beats"
}
}
], - "tracks": {
- "tracks": [
- {
- "id": "6rUPerw2po",
- "mainArtists": [
- "Main Artist"
], - "featuredArtists": [
- "Featured Artist"
], - "title": "Happy Song",
- "bpm": 135,
- "length": 3123,
- "moods": [
- {
- "id": "happy",
- "name": "Happy"
}, - {
- "id": "eccentric",
- "name": "Eccentric"
}
], - "genres": [
- {
- "id": "parent-beats",
- "name": "Beats",
- "parent": {
- "id": "parent",
- "name": "Parent Beats"
}
}, - {
- "id": "trap",
- "name": "Trap"
}
], - "images": {
}, - "isExplicit": false,
- "hasVocals": true,
- "added": "2020-10-10",
- "isPreviewOnly": true,
- "availableStems": [ ]
}
], - "pagination": {
- "limit": 25,
- "offset": 25,
- "page": 2
}, - "links": {
- "next": "v0/genres/{genreId}?limit=25&offset=50",
- "prev": "v0/genres/{genreId}?limit=25&offset=0"
}
}
}The tracks endpoint allows you to list all tracks based on a specified mood, genre or BPM.
| genre | Array of strings Id for genre |
| mood | Array of strings Id for mood |
| bpmMin | integer <int32> BPM Min |
| bpmMax | integer <int32> BPM Max |
| vocalType | Array of strings Items Enum: "LEAD" "PRESENCE" "NONE" Filter by vocal classification: LEAD (sung lead vocals), PRESENCE (vocal chops/samples/ad-libs/textures) or NONE (instrumental). Repeat the parameter to pass multiple values, which are OR-combined. |
| filterBehaviour | string Enum: "allOf" "anyOf" Control how the API combines several values of the same filter, such as two moods or two genres.
The vocalType filter always combines its values with |
| limit | integer <int32> Max number of entries returned in the response, default 50 and max 100 |
| offset | integer <int32> Index of the entry track in the response |
{- "tracks": [
- {
- "id": "6rUPerw2po",
- "mainArtists": [
- "Main Artist"
], - "featuredArtists": [
- "Featured Artist"
], - "title": "Happy Song",
- "bpm": 135,
- "length": 3123,
- "moods": [
- {
- "id": "happy",
- "name": "Happy"
}, - {
- "id": "eccentric",
- "name": "Eccentric"
}
], - "genres": [
- {
- "id": "beats",
- "name": "Beats",
- "parent": {
- "id": "parent",
- "name": "Parent Beats"
}
}, - {
- "id": "trap",
- "name": "Trap"
}
], - "images": {
}, - "isExplicit": false,
- "hasVocals": true,
- "added": "2020-10-10",
- "isPreviewOnly": true,
- "isrc": "SE5Q52401263",
- "vocalType": "LEAD",
- "availableStems": [ ]
}, - {
- "id": "0dZCtol3bs",
- "mainArtists": [
- "Main Artist"
], - "featuredArtists": [
- "Featured Artist"
], - "title": "Sad Song",
- "bpm": 97,
- "length": 2976,
- "moods": [
- {
- "id": "happy",
- "name": "Happy"
}, - {
- "id": "eccentric",
- "name": "Eccentric"
}
], - "genres": [
- {
- "id": "beats",
- "name": "Beats",
- "parent": {
- "id": "parent",
- "name": "Parent Beats"
}
}, - {
- "id": "trap",
- "name": "Trap"
}
], - "images": {
}, - "isExplicit": false,
- "hasVocals": true,
- "added": "2020-10-10",
- "isPreviewOnly": true,
- "isrc": "SE5Q52401264",
- "vocalType": "PRESENCE",
- "availableStems": [ ]
}
], - "pagination": {
- "limit": 20,
- "offset": 60,
- "page": 4
}, - "links": {
- "next": "/v0/tracks?limit=20&offset=80",
- "prev": "/v0/tracks?limit=20&offset=40"
}
}The metadata endpoint returns metadata for a list of tracks.
Identify each track by either its track id or its International Standard Recording Code (ISRC), and mix both kinds of value in the same request. The response de-duplicates a track that you request by both its track id and its ISRC.
If a value matches no track, the response omits that track instead of returning an error.
| trackId required | Array of strings List of track identifiers. Each value is either a track id or an ISRC, such as |
[- {
- "id": "6rUPerw2po",
- "mainArtists": [
- "Main Artist"
], - "featuredArtists": [
- "Featured Artist"
], - "title": "Happy Song",
- "bpm": 135,
- "length": 3123,
- "moods": [
- {
- "id": "happy",
- "name": "Happy"
}, - {
- "id": "eccentric",
- "name": "Eccentric"
}
], - "genres": [
- {
- "id": "beats",
- "name": "Beats",
- "parent": {
- "id": "parent",
- "name": "Parent Beats"
}
}, - {
- "id": "trap",
- "name": "Trap"
}
], - "images": {
}, - "isExplicit": false,
- "hasVocals": true,
- "added": "2020-10-10",
- "isPreviewOnly": true,
- "availableStems": [ ]
}, - {
- "id": "0dZCtol3bs",
- "mainArtists": [
- "Main Artist"
], - "featuredArtists": [
- "Featured Artist"
], - "title": "Sad Song",
- "bpm": 97,
- "length": 2976,
- "moods": [
- {
- "id": "happy",
- "name": "Happy"
}, - {
- "id": "eccentric",
- "name": "Eccentric"
}
], - "genres": [
- {
- "id": "beats",
- "name": "Beats",
- "parent": {
- "id": "parent",
- "name": "Parent Beats"
}
}, - {
- "id": "trap",
- "name": "Trap"
}
], - "images": {
}, - "isExplicit": false,
- "hasVocals": true,
- "added": "2020-10-10",
- "isPreviewOnly": true,
- "availableStems": [ ]
}
]Get a list of possible track query parameters
{- "genres": [
- {
- "id": "rock",
- "name": "Rock",
- "parent": {
- "id": "rock-parent",
- "name": "Rock Parent"
}
}, - {
- "id": "rock-parent",
- "name": "Rock Parent"
}, - {
- "id": "skate-punk",
- "name": "Skate-Punk"
}
], - "moods": [
- {
- "id": "energetic",
- "name": "Energetic"
}, - {
- "id": "happy",
- "name": "Happy"
}
]
}The download endpoint allows you to download an MP3 file of the track.
We offer MP3 files in two qualities; normal (128kbps) and high (320kbps).
The high quality files can be used in content when needed, but normal quality is sufficient for most use cases.
The download links expire after 24 hours (normal quality) or 1 hour (high quality files). The expiration time is stated in the response.
All users can download the tracks that are part of the free tier. Only connected users with an active Epidemic Sound subscription can download tracks that are part of the premium library. If a user does not have access to download a track, you will get an error response. You can proactively mark premium tracks in your UI by using the track attribute isPreviewOnly (see track attributes).
Use expand=stems to also get download links for the track's stems (e.g. drums, bass, melody), in the same quality as the track. Which stems exist depends on the track; each stem type appears at most once, and stems is an empty list when the track has none. Identify stems by their type rather than their position in the list. Stem links expire at the same time as the track link. Downloading a track with its stems counts as a single download.
| trackId required | string Track id |
| format | string Value: "mp3" Track format |
| quality | string Default: "normal" Enum: "normal" "high" Track quality, normal is used as the default if not specified |
| expand | string Value: "stems" Use |
{- "expires": "2022-12-22T11:01:48Z",
- "stems": [
- {
- "type": "drums",
}, - {
- "type": "bass",
}
]
}Returns the lyrics for a track when available. The response contains a single lyrics field as a plain string with newline-separated lines.
Returns lyrics: null for instrumental tracks (hasVocals: false) and for vocal tracks whose lyrics have not been registered yet. A hasVocals: true value on the track response does not guarantee that lyrics are available, so always handle the null case before rendering.
| trackId required | string Track id |
{- "lyrics": "Verse 1\nLine one\nLine two\n\nChorus\n..."
}We recommend using HLS to allow users to play/preview a track. The main benefits of this compared to MP3 are smaller file transfers and alternate qualities, allowing the HLS client library to switch to a lower quality when necessary.
The audio is encoded using the AAC coding standard, which results in a smaller footprint for a similar quality compared to MP3. The primary manifest refers to two variant quality streams. HLS client libraries typically choose the optimal quality automatically, based on download speed.
The format consists of audio files split into smaller chunks and manifests that refer to these audio files. Since the format is made up of multiple files, access to these are controlled using cookies.
We provide an example app for iOS that plays HLS streams. Users do not need to connect their account or have an active Epidemic Sound subscription to play any track using HLS streaming. That allows your users to listen to all tracks before they connect their account.
| trackId required | string Track id |
{- "cookie": {
- "name": "Cloud-CDN-Cookie",
- "domain": "hls-storage.epidemicsite.com",
- "path": "/",
- "value": "URLPrefix=aHR0cHM6Ly9obHMtaW52ZXN0aWdhdGlvbi5lcGlkZW1pY3NpdGUuY29tL2hscy92MS9xNE1JbUtXNDdEL2RhZWZlY2QyMDVjMDE0OTZiNDJhZTY5NTBjNDQ2YzZlLw==:Expires=1638185196:KeyName=KeyName:Signature=S0QZ20ijEWKA-w9B9MycB0yTca0=",
- "expires": "2021-11-29T11:26:36Z"
}
}The similar tracks endpoint allows developers to retrieve a list of tracks that are similar to a given reference track. This feature is designed to help users discover tracks that share similar characteristics, such as genre, mood, tempo, and more. This endpoint helps your users replace tracks that don't fit perfectly or discover multiple alternatives to a track they enjoy.
| trackId required | string Track id |
| offset | integer <int32> Index of the entry track in the response |
| limit | any Max number of entries returned in the response, default 50 and max 60 |
{- "tracks": [
- {
- "id": "6rUPerw2po",
- "mainArtists": [
- "Main Artist"
], - "featuredArtists": [
- "Featured Artist"
], - "title": "Happy Song",
- "bpm": 135,
- "length": 3123,
- "moods": [
- {
- "id": "happy",
- "name": "Happy"
}, - {
- "id": "eccentric",
- "name": "Eccentric"
}
], - "genres": [
- {
- "id": "beats",
- "name": "Beats",
- "parent": {
- "id": "parent",
- "name": "Parent Beats"
}
}, - {
- "id": "trap",
- "name": "Trap"
}
], - "images": {
}, - "isExplicit": false,
- "hasVocals": true,
- "added": "2020-10-10",
- "isPreviewOnly": true,
- "availableStems": [ ]
}, - {
- "id": "0dZCtol3bs",
- "mainArtists": [
- "Main Artist"
], - "featuredArtists": [
- "Featured Artist"
], - "title": "Sad Song",
- "bpm": 97,
- "length": 2976,
- "moods": [
- {
- "id": "happy",
- "name": "Happy"
}, - {
- "id": "eccentric",
- "name": "Eccentric"
}
], - "genres": [
- {
- "id": "beats",
- "name": "Beats",
- "parent": {
- "id": "parent",
- "name": "Parent Beats"
}
}, - {
- "id": "trap",
- "name": "Trap"
}
], - "images": {
}, - "isExplicit": false,
- "hasVocals": true,
- "added": "2020-10-10",
- "isPreviewOnly": true,
- "availableStems": [ ]
}
], - "pagination": {
- "limit": 20,
- "offset": 60,
- "page": 4
}, - "links": {
- "next": "/v0/tracks?limit=20&offset=80",
- "prev": "/v0/tracks?limit=20&offset=40"
}
}Returns a list of track sections that are matched to the provided audio file id.
| audioUploadId required | string <uuid> Reference to the uploaded audio file |
| start required | integer <int32> Start of the section in milliseconds |
| end required | integer <int32> End of the section in milliseconds |
| offset | integer <int32> Index of the entry track in the response |
| limit | integer <int32> Max number of entries returned in the response, default 50 and max 100 |
{- "trackSections": [
- {
- "track": {
- "id": "0dZCtol3bs",
- "mainArtists": [
- "Main Artist"
], - "featuredArtists": [
- "Featured Artist"
], - "title": "Sad Song",
- "bpm": 97,
- "length": 2976,
- "moods": [
- {
- "id": "happy",
- "name": "Happy"
}, - {
- "id": "eccentric",
- "name": "Eccentric"
}
], - "genres": [
- {
- "id": "beats",
- "name": "Beats",
- "parent": {
- "id": "parent",
- "name": "Parent Beats"
}
}, - {
- "id": "trap",
- "name": "Trap"
}
], - "images": {
}, - "isExplicit": false,
- "hasVocals": true,
- "added": "2020-10-10",
- "isPreviewOnly": true,
- "availableStems": [ ]
}, - "start": 0,
- "end": 10000
}
], - "pagination": {
- "limit": 20,
- "offset": 60,
- "page": 4
}, - "links": {
- "next": "/v0/tracks/similar-sections?audioUploadId=4f3f6b63-8521-3b2c-b238-5d00b47d2eaa&limit=20&offset=80&start=0&end=10000",
- "prev": "/v0/tracks/similar-sections?audioUploadId=4f3f6b63-8521-3b2c-b238-5d00b47d2eaa&limit=20&offset=40&start=0&end=10000"
}
}The similar segments endpoint allows developers to use part of a track as a reference to search for music segments in the Epidemic Sound catalog that sound similar.
The feature utilizes the Epidemic Audio Reference (EAR) technology to provide users with the ability to quickly find alternative segments of music.
Usage Scenarios:
| trackId required | string Track id |
| start required | integer <int32> Start of the section in milliseconds |
| end required | integer <int32> End of the section in milliseconds |
| offset | integer <int32> Index of the entry track in the response |
| limit | integer <int32> Max number of entries returned in the response, default 50 and max 100 |
{- "trackSections": [
- {
- "track": {
- "id": "0dZCtol3bs",
- "mainArtists": [
- "Main Artist"
], - "featuredArtists": [
- "Featured Artist"
], - "title": "Sad Song",
- "bpm": 97,
- "length": 2976,
- "moods": [
- {
- "id": "happy",
- "name": "Happy"
}, - {
- "id": "eccentric",
- "name": "Eccentric"
}
], - "genres": [
- {
- "id": "beats",
- "name": "Beats",
- "parent": {
- "id": "parent",
- "name": "Parent Beats"
}
}, - {
- "id": "trap",
- "name": "Trap"
}
], - "images": {
}, - "isExplicit": false,
- "hasVocals": true,
- "added": "2020-10-10",
- "isPreviewOnly": true,
- "availableStems": [ ]
}, - "start": 0,
- "end": 10000
}
], - "pagination": {
- "limit": 20,
- "offset": 60,
- "page": 4
}, - "links": {
- "next": "/v0/tracks/trackId/similar-sections?limit=20&offset=80&start=0&end=10000",
- "prev": "/v0/tracks/trackId/similar-sections?limit=20&offset=40&start=0&end=10000"
}
}We recommend using HLS to allow users to play/preview a track. The main benefits of this compared to MP3 are smaller file transfers and alternate qualities, allowing the HLS client library to switch to a lower quality when necessary.
The audio is encoded using the AAC coding standard, which results in a smaller footprint for a similar quality compared to MP3. The primary manifest refers to two variant quality streams. HLS client libraries typically choose the optimal quality automatically, based on download speed.
The format consists of audio files split into smaller chunks and manifests that refer to these audio files.
We provide an example app for iOS that plays HLS streams. Users do not need to connect their account or have an active Epidemic Sound subscription to play any track using HLS streaming. That allows your users to listen to all tracks before they connect their account.
| trackId required | string Track id |
{- "expires": "2022-12-22T11:01:48Z"
}Powered by our 2 billion daily streams on YouTube, the popular segments endpoint uses machine learning to recommend the best time section.
You can use popular segments to start playing the track from the right millisecond, or recommend the right part of the track for shorter content.
The popular segments endpoint provides start and stop timestamps in milliseconds. The default duration is 30 seconds.
The endpoint accepts up to 5 different durations per request where each duration must be at least 5 seconds and at most 60 seconds.
| trackId required | string Track id |
| duration | Array of integers <int32> [ items <int32 > ] The highlight duration in seconds |
{- "highlights": [
- {
- "from": 9000,
- "to": 39000,
- "duration": 30
}
]
}Upload an image from the user's video to get recommendations of tracks in the Epidemic Sound library that would work for the video. Use ImageID retrieved from the Upload Image endpoint to fetch the recommended tracks.
| imageId required | string Image id |
| offset | integer <int32> Index of the entry track in the response |
| limit | integer <int32> Max number of entries returned in the response, default 50 and max 100 |
| genre | Array of strings Id for genre |
| mood | Array of strings Id for mood |
| filterBehaviour | string Enum: "allOf" "anyOf" Control how the API combines several values of the same filter, such as two moods or two genres.
The vocalType filter always combines its values with |
{- "tracks": [
- {
- "id": "6rUPerw2po",
- "mainArtists": [
- "Main Artist"
], - "featuredArtists": [
- "Featured Artist"
], - "title": "Happy Song",
- "bpm": 135,
- "length": 3123,
- "moods": [
- {
- "id": "happy",
- "name": "Happy"
}, - {
- "id": "eccentric",
- "name": "Eccentric"
}
], - "genres": [
- {
- "id": "beats",
- "name": "Beats",
- "parent": {
- "id": "parent",
- "name": "Parent Beats"
}
}, - {
- "id": "trap",
- "name": "Trap"
}
], - "images": {
}, - "isExplicit": false,
- "hasVocals": true,
- "added": "2020-10-10",
- "isPreviewOnly": true,
- "availableStems": [ ]
}, - {
- "id": "0dZCtol3bs",
- "mainArtists": [
- "Main Artist"
], - "featuredArtists": [
- "Featured Artist"
], - "title": "Sad Song",
- "bpm": 97,
- "length": 2976,
- "moods": [
- {
- "id": "happy",
- "name": "Happy"
}, - {
- "id": "eccentric",
- "name": "Eccentric"
}
], - "genres": [
- {
- "id": "beats",
- "name": "Beats",
- "parent": {
- "id": "parent",
- "name": "Parent Beats"
}
}, - {
- "id": "trap",
- "name": "Trap"
}
], - "images": {
}, - "isExplicit": false,
- "hasVocals": true,
- "added": "2020-10-10",
- "isPreviewOnly": true,
- "availableStems": [ ]
}
], - "pagination": {
- "limit": 25,
- "offset": 25,
- "page": 2
}, - "links": {
- "next": "/tracks/search?limit=25&offset=50",
- "prev": "/tracks/search?limit=25&offset=0"
}, - "aggregations": {
- "moods": [
- {
- "id": "energetic",
- "name": "Energetic",
- "count": 1
}
], - "genres": [
- {
- "id": "rock",
- "name": "Rock",
- "count": 1
}
]
}
}Endpoints to get sound effect specific information. These endpoints allow you to build a UI to browse and search for sound effects.
Returns the sound-effect collections active for your application.
Sound-effect collections are managed via the developer portal: an admin imports an EMS playlist into a collection, and end users see only Active collections through this endpoint.
Every application has access to every sound effect, so there is no per-tier cap and no
paid/free distinction. Up to 20 sound effects per collection are included by default;
pass excludeField=soundEffects to omit them, or paginate the full set via
/sound-effects/collections/{collectionId}.
| excludeField | string Value: "soundEffects" Pass |
| limit | integer <int32> Max number of collections returned in the response, default 10 and max 20 |
| offset | integer <int32> Index of the entry track in the response |
{- "collections": [
- {
- "id": "4caef099-43bd-4653-8203-3086fa01d3b7",
- "name": "Crowd & Applause",
- "soundEffects": [
- {
- "id": "5bce703b-11c4-3403-a78a-ac62191e8304",
- "title": "Applause",
- "added": "2020-10-10T09:30:00Z",
- "length": 10,
- "images": {
}
}
], - "availableSoundEffects": 1
}
], - "pagination": {
- "limit": 10,
- "offset": 0,
- "page": 1
}, - "links": {
- "next": "/v0/sound-effects/collections?limit=10&offset=10"
}
}Returns a single sound-effect collection along with a paginated set of its sound effects. Use limit and offset to page through the collection.
| collectionId required | string Collection id |
| limit | integer <int32> Max number of entries returned in the response, default 50 and max 100 |
| offset | integer <int32> Index of the entry track in the response |
{- "id": "f10e65eb-9998-4c41-9777-ac9183ab85dd",
- "name": "Crowd & Applause",
- "soundEffects": [
- {
- "id": "5bce703b-11c4-3403-a78a-ac62191e8304",
- "title": "Applause",
- "added": "2020-10-10T09:30:00Z",
- "length": 10,
- "images": {
}
}
], - "availableSoundEffects": 1,
- "pagination": {
- "limit": 50,
- "offset": 0,
- "page": 1
}, - "links": { }
}The sound effects categories endpoint allows you to get a list of all sound effects categories.
You can then browse the sound effects catalog based on categories like "Applause" or "Crowds".
Some sound effect categories have cover art that you can use in your interface. You can choose to display all categories, or choose type "featured" to only show the categories that are chosen by our curation team.
| type | string Default: "all" Enum: "all" "featured" Category type |
| offset | integer <int32> Index of the entry track in the response |
| limit | any Max number of entries returned in the response, default 50 |
{- "categories": [
- {
- "id": "5e6d24c3-f6b1-39b9-bba2-f338ce87b08c",
- "name": "Applause",
- "images": {
}, - "parent": {
- "id": "791d844a-1c69-3d49-804e-0f60297ec5a4",
- "name": "Crowds"
}
}
], - "pagination": {
- "limit": 10,
- "offset": 10,
- "page": 2
}, - "links": {
- "next": "/sound-effects/categories?limit=10&offset=20",
- "prev": "/sound-effects/categories?limit=10&offset=0"
}
}The category details endpoint contains info on the requested sound effects category.
The purpose of this endpoint is to be able to validate that an individual object exists in the API if it was cached by the client.
| categoryId required | string <uuid> Category id |
{- "id": "5e6d24c3-f6b1-39b9-bba2-f338ce87b08c",
- "name": "Applause",
- "images": {
}, - "parent": {
- "id": "791d844a-1c69-3d49-804e-0f60297ec5a4",
- "name": "Crowds"
}, - "children": [
- {
- "id": "a082bad4-6aef-3bd8-80c2-6c05f23b4a59",
- "name": "Claps"
}
]
}Use the sound effects details endpoint to display all sound effects for a given category.
| categoryId required | string <uuid> Category id |
| offset | integer <int32> Index of the entry track in the response |
| limit | integer <int32> Max number of entries returned in the response, default 50 and max 100 |
| sort | string Default: "newest" Enum: "title" "newest" "length" Sort |
| order | string Default: "asc" Enum: "asc" "desc" Order |
| includeExplicit | boolean Default: false Whether to include sound effects tagged as explicit in the results. Defaults to false, meaning explicit content is excluded by default. |
{- "soundEffects": [
- {
- "id": "5bce703b-11c4-3403-a78a-ac62191e8304",
- "title": "Applause",
- "added": "2020-10-10T09:30:00Z",
- "length": 10,
- "images": {
}
}
], - "pagination": {
- "limit": 10,
- "offset": 10,
- "page": 2
}, - "links": {
- "next": "/sound-effects/categories?limit=10&offset=20",
- "prev": "/sound-effects/categories?limit=10&offset=0"
}
}The download endpoint allows you to download an MP3 file of the sound effect.
We offer MP3 files in two qualities; normal (128kbps) and high (320kbps).
The high quality files can be used in content when needed, but normal quality is sufficient for most use cases.
The download links expire after 24 hours (normal quality) or 1 hour (high quality files). The expiration time is stated in the response.
| trackId required | string Track id |
| format | string Value: "mp3" Track format |
| quality | string Default: "normal" Enum: "normal" "high" Track quality, normal is used as the default if not specified |
{- "expires": "2022-12-22T11:01:48Z"
}Use the sound effects search endpoint to allow users to search within the sound effects library.
| offset | integer <int32> Index of the entry track in the response |
| limit | any Max number of entries returned in the response, default 50 and max 60 |
| term | string Term for search |
| sort | string Default: "best-match" Enum: "best-match" "newest" "popular" "length" "title" Sort for search |
| order | string Default: "asc" Enum: "asc" "desc" Order |
| includeExplicit | boolean Default: false Whether to include sound effects tagged as explicit in the results. Defaults to false, meaning explicit content is excluded by default. |
{- "soundEffects": [
- {
- "id": "5bce703b-11c4-3403-a78a-ac62191e8304",
- "title": "Applause",
- "added": "2020-10-10T09:30:00Z",
- "length": 10,
- "images": {
}
}
], - "pagination": {
- "limit": 10,
- "offset": 10,
- "page": 2
}, - "links": {
- "next": "/sound-effects/categories?limit=10&offset=20",
- "prev": "/sound-effects/categories?limit=10&offset=0"
}
}This endpoint should be used when you want to bulk report events to Epidemic Sound. We currently support the following events: trackPreviewed, trackDownloaded and tracksExported. Note that the limit for number of events per request is limited to 100. Also note that for events containing the field trackIds, the limit for number of trackIds per event is 50. Events may not contain a timestamp older than 7 days ago.
Analytics report
required | Array of objects (Partner_Content_API_AnalyticsReportEvent) | ||||||||
Array
| |||||||||
{- "events": [
- {
- "userId": "123",
- "timestamp": "2020-10-10T09:18:00Z",
- "userConnected": false,
- "analyticsEvent": {
- "trackId": "12345",
- "type": "trackPreviewed"
}
}, - {
- "userId": "456",
- "timestamp": "2020-10-10T09:25:00Z",
- "userConnected": true,
- "analyticsEvent": {
- "format": "mp3",
- "quality": "normal",
- "trackId": "12345",
- "type": "trackDownloaded"
}
}, - {
- "userId": "456",
- "timestamp": "2020-10-10T09:30:00Z",
- "analyticsEvent": {
- "platform": "YOUTUBE",
- "trackIds": [
- "12345"
], - "type": "tracksExported"
}
}
]
}{- "batchId": "12345",
- "eventsCount": 10
}The usage endpoint lets you report when a user exports their content to social media or downloads the content file to their device.
You can specify which platform (YouTube, Twitch, Instagram, Facebook, TikTok, Twitter or Other) they export the file to. Use the platform local if the user downloads the content to their device.
This data is used for attribution and analytics purposes as well as to improve personalization.
Usage report
| eventType | string Value: "EXPORTED" |
| platform required | string Enum: "YOUTUBE" "TWITTER" "TWITCH" "FACEBOOK" "INSTAGRAM" "TIKTOK" "OTHER" "LOCAL" |
| trackIds required | Array of strings |
| other | string or null |
{- "eventType": "EXPORTED",
- "platform": "OTHER",
- "trackIds": [
- "trackid1",
- "trackid2"
], - "other": "OptionalValueForWhenNoMatchingPlatformEnum"
}{- "message": "Ok"
}Get user details of the authenticated user.
{- "userId": "ee11cbb1-9052-340b-87aa-c0ca060c23ee",
- "esConnect": false,
- "hasActiveSubscription": null,
- "email": null
}The liked tracks endpoint lets you list the liked tracks of a connected user. Users can add new tracks to their list on epidemicsound.com or via the Epidemic Sound app, giving them a smooth cross-device experience.
| offset | integer <int32> Offset for the pagination. For this endpoint the number of results is fixed at 25, so the offset needs to be evenly divisible by 25. |
{- "tracks": [
- {
- "id": "6rUPerw2po",
- "mainArtists": [
- "Main Artist"
], - "featuredArtists": [
- "Featured Artist"
], - "title": "Happy Song",
- "bpm": 135,
- "length": 3123,
- "moods": [
- {
- "id": "happy",
- "name": "Happy"
}, - {
- "id": "eccentric",
- "name": "Eccentric"
}
], - "genres": [
- {
- "id": "beats",
- "name": "Beats",
- "parent": {
- "id": "parent",
- "name": "Parent Beats"
}
}, - {
- "id": "trap",
- "name": "Trap"
}
], - "images": {
}, - "isExplicit": false,
- "hasVocals": true,
- "added": "2020-10-10",
- "isPreviewOnly": true,
- "availableStems": [ ]
}, - {
- "id": "0dZCtol3bs",
- "mainArtists": [
- "Main Artist"
], - "featuredArtists": [
- "Featured Artist"
], - "title": "Sad Song",
- "bpm": 97,
- "length": 2976,
- "moods": [
- {
- "id": "happy",
- "name": "Happy"
}, - {
- "id": "eccentric",
- "name": "Eccentric"
}
], - "genres": [
- {
- "id": "beats",
- "name": "Beats",
- "parent": {
- "id": "parent",
- "name": "Parent Beats"
}
}, - {
- "id": "trap",
- "name": "Trap"
}
], - "images": {
}, - "isExplicit": false,
- "hasVocals": true,
- "added": "2020-10-10",
- "isPreviewOnly": true,
- "availableStems": [ ]
}
], - "pagination": {
- "limit": 25,
- "offset": 25,
- "page": 2
}, - "links": {
- "next": "/users/me/liked/tracks?limit=25&offset=50",
- "prev": "/users/me/liked/tracks?limit=25&offset=0"
}
}Will return the audio id of an audio file uploaded by the partner, matched by checksum. Should be used to avoid duplicate uploads
| checksum required | string File checksum |
{- "audioUploadId": "4f3f6b63-8521-3b2c-b238-5d00b47d2eaa",
- "length": 10,
- "expires": "2020-11-09T09:30:00Z"
}Use the delete audio endpoint to delete an audio file.
| audioIdOrChecksum required | string Audio upload id or checksum of audio file |
{- "audioFilesRemoved": [
- "4f3f6b63-8521-3b2c-b238-5d00b47d2eaa"
]
}Upload an audio file to get recommendations of similar tracks in the Epidemic Sound library. When you post the audio file to this endpoint, you will receive an AudioID in return. Use this AudioID in a request to the similar tracks endpoint to get track recommendations.
We currently support the formats: mp3, mpeg, ogg and vorbis. Maximum file size is 3.5MB. You can only upload music with the partner token, since we currently do not allow end users to use this feature.
| file | string <binary> |
{- "imageId": "78805a22-1a98-3e79-af3f-42d7c5bfd418",
- "expirationDate": "2020-10-11T09:30:00Z"
}Use the delete image endpoint to delete a single image uploaded by a user
| imageId required | string Image id |
{- "message": "Bad request"
}Upload an image from the user's video to get recommendations of tracks in the Epidemic Sound library that would work for the video. When you post the image to this endpoint, you will receive an ImageID in return. Use this ImageID in a request to the matching image endpoint to get track recommendations.
We currently support jpeg format and maximum file size is 2MB.
| file | string <binary> |
{- "imageId": "78805a22-1a98-3e79-af3f-42d7c5bfd418",
- "expirationDate": "2020-10-11T09:30:00Z"
}The beats endpoint provides information about the timestamps of beats in a track. You can use this endpoint to simplify the process to cut the video in sync with the music.
Unlike BPM which is a single number for the entire track, beats can change dynamically across a music piece. This is particularly valuable for capturing variations in tempo, such as a slower intro, a build-up with faster beats, or changes in rhythm throughout the composition.
The response includes two types of metadata: time and value.
time represents the timestamp of the beat in seconds. value indicates the beat's position in a bar (or measure in the US), where 1 corresponds to the first beat (downbeat).
Examples:
Most pop songs have four beats in a bar. For example, if we looked at the beats data for Coolio's 1, 2, 3, 4 it would look something like: 1-2-3-4, 1-2-3-4
However, a waltz has three beats in a bar, and the data would look something like: 1-2-3, 1-2-3
Usage Scenarios:
Automatically cut a video in sync with the beat
Adding snap markers aligned with beat timestamps in the UI.
| trackId required | string Track id |
{- "beats": [
- {
- "time": 0,
- "value": 1
}, - {
- "time": 0.62,
- "value": 2
}, - {
- "time": 1.2,
- "value": 3
}, - {
- "time": 1.8,
- "value": 4
}
]
}This endpoint allows you to start a job to generate edited versions of a track. The job will be processed asynchronously and you can check the status using the GET /tracks/versions/{jobId} endpoint. Note that the url expires in 24 hours.
Duration limits:
Track edit request configuration
| durationMs required | integer <int32> |
| trackId required | string <uuid> |
{- "durationMs": 0,
- "trackId": "fcc44b18-493c-4040-a803-8be99a8f81ac"
}{- "status": "PENDING",
- "results": [ ],
- "message": "Job is still processing",
- "jobId": "c2a89a00-967e-37fb-8d2a-34958c91e357"
}This endpoint allows you to check the status of a track versions job. When the job is complete, it will return the URLs to the generated tracks.
Waveform Data:
expand=waveform to include waveform data in the response| jobId required | any The ID of the job to check |
| expand | any Include additional data in response. Use 'waveform' to include waveform data. |
{- "status": "COMPLETED",
- "results": [
- {
}
], - "message": "Job completed successfully",
- "jobId": "c2a89a00-967e-37fb-8d2a-34958c91e357"
}Endpoints for managing safelisting licenses. Allows partners to create, list, update, and delete licenses for channels and videos on behalf of their end users.
Expires all active licenses for the specified end user within the workspace. Intended for end-user churn scenarios (e.g. when a user cancels their subscription). Returns 204 regardless of whether the user had any active licenses.
| X-Partner-User-Id required | any The partner's end user identifier. Used to scope licenses per end user. |
{- "message": "Invalid credentials"
}List safelisting licenses for the specified end user. Supports filtering by asset type, platform, and status, with pagination and sorting.
| assetType required | string Enum: "channel" "video" Filter by asset type |
| platform | string Enum: "youtube" "instagram" "facebook" "twitch" "tiktok" "podcast" "website" Filter by platform |
| status | string Value: "active" Filter by status. Currently only |
| sortBy | string Default: "expiresAt" Enum: "createdAt" "expiresAt" Field to sort results by |
| sortOrder | string Default: "desc" Enum: "asc" "desc" Sort direction |
| page | integer <int32> Default: 1 Page number (1-based) |
| pageSize | integer <int32> Default: 25 Number of results per page |
| X-Partner-User-Id required | any The partner's end user identifier. Used to scope licenses per end user. |
{- "page": 1,
- "pageSize": 25,
- "totalItems": 1,
- "data": [
- {
- "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
- "createdAt": "2024-06-01T10:00:00Z",
- "expiresAt": "2026-12-31T23:59:59Z",
- "asset": {
- "id": "UCxxxxxxxxxxxxxxxxxx",
- "type": "channel",
- "platform": "youtube",
}
}
]
}Create a new safelisting license for a channel or video. The X-Partner-User-Id header is required to scope the license to a specific end user.
| X-Partner-User-Id required | any The partner's end user identifier. Used to scope licenses per end user. |
License creation request
required | object (Partner_Content_API_SafelistingAssetRequest) |
| expiresAt | string |
{- "expiresAt": "2026-12-31T23:59:59Z"
}{- "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
- "createdAt": "2024-06-01T10:00:00Z",
- "expiresAt": "2026-12-31T23:59:59Z",
- "asset": {
- "id": "UCxxxxxxxxxxxxxxxxxx",
- "type": "channel",
- "platform": "youtube",
}
}Expire a safelisting license by ID. The license is soft-deleted and will no longer appear in active license listings.
| licenseId required | any License ID |
| X-Partner-User-Id required | any The partner's end user identifier. Used to scope licenses per end user. |
{- "message": "Invalid credentials"
}Retrieve a single safelisting license by ID. Returns 404 if the license does not exist or does not belong to the specified end user.
| licenseId required | any License ID |
| X-Partner-User-Id required | any The partner's end user identifier. Used to scope licenses per end user. |
{- "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
- "createdAt": "2024-06-01T10:00:00Z",
- "expiresAt": "2026-12-31T23:59:59Z",
- "asset": {
- "id": "UCxxxxxxxxxxxxxxxxxx",
- "type": "channel",
- "platform": "youtube",
}
}Update a safelisting license. Currently only the expiration date can be modified.
| licenseId required | any License ID |
| X-Partner-User-Id required | any The partner's end user identifier. Used to scope licenses per end user. |
License update request
| expiresAt required | string |
{- "expiresAt": "2027-12-31T23:59:59Z"
}{- "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
- "createdAt": "2024-06-01T10:00:00Z",
- "expiresAt": "2027-12-31T23:59:59Z",
- "asset": {
- "id": "UCxxxxxxxxxxxxxxxxxx",
- "type": "channel",
- "platform": "youtube",
}
}Send your API key as a bearer token in the Authorization header on every
request:
Authorization: Bearer <API key>
Applies to /v1 and later endpoints. /v0 endpoints work differently.
Each app has a daily request limit, which resets at midnight UTC. You can find your app's limit in the developer portal.
We also enforce a burst request limit on a one-second window. It allows about five times the average rate of your daily limit.
Responses include two rate limit headers, in the format of the IETF RateLimit header fields draft:
RateLimit-Policy: "burst";q=290;w=1, "daily";q=5000000;w=86400
RateLimit: "burst";r=41;t=1, "daily";r=4913204;t=48213
RateLimit-Policy names your limits, with the quota (q) and the window in
seconds (w) of each. It changes only when your limits do. RateLimit
says what is left of each, as the remaining requests (r) and the seconds
until that limit resets (t).
Note that in some rare cases, these headers may be missing, for instance if rate limiting temporarily fails, or on certain error responses.
A request over either limit returns a 429 response and a Retry-After
header stating the number of seconds to wait before you try again. Read
the RateLimit header to keep under your limits instead of waiting for
the 429.
In some exceptional cases, or when documented specifically for an endpoint,
responses other than 429 may include a Retry-After header. Always honor
it when present.
Send Accept-Encoding: gzip to have the response body compressed. The
response then carries Content-Encoding: gzip. Leave the header out to
receive the body unencoded.
Applies to /v1 and later endpoints. /v0 endpoints work differently.
An error is answered with Content-Type: application/problem+json and a
problem document:
type identifies the error, for example /problems/not-found. It is the
member to branch on.title explains it in English, for a developer to read.errors, when present, lists the fields that failed validation.Some error responses, such as a 503 or 504, may include a Retry-After header
with the number of seconds to wait before you try again. Always honor it when
present.
Nearly every response, including successful ones, carries an X-Correlation-Id
header that identifies the request. Quote it when you report a problem to us.
Score a video with library music in one call.
The call does not carry the video. It answers 202 with a job and an upload URL: send the whole video to that URL in a single PUT. The upload starts the job. Then poll GET /v1/soundtracking/jobs/{jobId} until the status is COMPLETED or FAILED, no more often than every 5 seconds.
Videos must be four minutes or shorter. The length is not known until the video arrives, so this call accepts a longer one and the job then fails with VIDEO_TOO_LONG.
Scoring a video costs credits. This call answers 402 when the workspace cannot cover it. The credits are taken when the upload finishes, not here.
Idempotency-Key is optional and the value is yours to choose. Send one when you retry this call: a retry without it creates a second job and leaves the first unused.
Undeclared fields in the body are ignored. A misspelled field name is dropped without a warning and the request still returns a success, so check the names against this specification.
| Accept-Encoding | string <= 128 characters Example: gzip The content encodings the client accepts. Ask for |
| Idempotency-Key | string [ 1 .. 255 ] characters Example: 4f6d1b6e-2c8f-4a9a-9f3a-2b6f1c0d5e21 A key you choose that makes a create safe to retry. A second call carrying a key already used in your workspace returns what the first call created, instead of creating another one. Send one when you retry a call whose answer you never saw. The key identifies the request on its own: the body is not compared, so use a different key for different parameters. |
The video to score, and how to score it.
| filename required | string [ 1 .. 512 ] characters Name of the video file. It is what the stored file is named after, so keep the extension. |
| contentType required | string [ 1 .. 128 ] characters Media type of the video, which has to be a |
| sizeBytes required | integer <int64> [ 1 .. 629145600 ] Size of the video in bytes, at most 600 MB. It is declared to storage when the upload is prepared, so an upload that does not match it is refused as it happens rather than stored and rejected afterwards. A size over the limit is refused by this call, before any bytes move. |
| audioTypes | Array of strings (public-api-gateway_SoundtrackAudioType) non-empty unique Items Value: "MUSIC" What the run adds to the video. Omit it to score the video with music, which is the same as sending |
| brief | string [ 1 .. 2000 ] characters Creative direction for the run: mood, genre, references. It guides the whole video rather than one section. Omit it to let the run decide from the video alone. The brief is a prompt, not a filter. It cannot guarantee a specific piece of music. |
| outputFormat | string (public-api-gateway_SoundtrackOutputFormat) Enum: "MP4" "MP3" "WAV" What you receive. |
| sourceAudio | string (public-api-gateway_SoundtrackSourceAudio) Enum: "MUTED" "UNMUTED" What happens to the audio already on the video you upload. |
{- "filename": "interview-final.mp4",
- "contentType": "video/mp4",
- "sizeBytes": 52428800,
- "audioTypes": [
- "MUSIC"
], - "brief": "Warm indie folk, builds towards the end",
- "outputFormat": "MP4",
- "sourceAudio": "MUTED"
}{- "job": {
- "id": "123e4567-e89b-12d3-a456-426614174000",
- "status": "FAILED",
- "createdAt": "2026-09-22T12:30:00Z",
- "updatedAt": "2026-09-22T12:34:00Z",
- "brief": "Warm indie folk, builds towards the end",
- "audioTypes": [
- "MUSIC"
], - "outputFormat": "MP4",
- "sourceAudio": "MUTED",
- "error": {
- "code": "VIDEO_TOO_LONG",
- "retriable": false
}
}, - "upload": {
- "expiresAt": "2026-09-22T13:30:00Z"
}
}Get the current state of one soundtrack job. The result is 404 if the job does not exist, or if it belongs to a different workspace.
Poll no more often than every 5 seconds.
The URL in result.output is signed and expires. Polling a completed job returns a fresh one.
| jobId required | string <uuid> (public-api-gateway_SoundtrackJobId) Example: 123e4567-e89b-12d3-a456-426614174000 Unique identifier of the soundtrack job. |
| Accept-Encoding | string <= 128 characters Example: gzip The content encodings the client accepts. Ask for |
{- "id": "123e4567-e89b-12d3-a456-426614174000",
- "status": "FAILED",
- "createdAt": "2026-09-22T12:30:00Z",
- "updatedAt": "2026-09-22T12:34:00Z",
- "brief": "Warm indie folk, builds towards the end",
- "audioTypes": [
- "MUSIC"
], - "outputFormat": "MP4",
- "sourceAudio": "MUTED",
- "error": {
- "code": "VIDEO_TOO_LONG",
- "retriable": false
}
}