Spotify Web API - discover music and podcasts, manage your library, and control playback.
Bring your own key. This API needs your own Spotify key - get one from the provider, add it once below, and the proxy injects it on every call. Your OmniStream plan covers the unified SDK, key storage, and proxy - the provider's own rate limits still apply to your key.
This is a community listing. If you own this API, you can request ownership.
npm install omnistream-sdkimport { OmniClient } from "omnistream-sdk";
const omni = new OmniClient({ token: process.env.OMNI_KEY! });
// One key reaches every API on the marketplace.
const data = await omni.call("spotify/get-multiple-albums");One install, one key - the same client calls every API on the marketplace.
Get Several Albums
Get Album
Get Album Tracks
Get Several Artists
Get Artist
Get Artist's Albums
/**
* Spotify - generated by OmniStream from Spotify's OpenAPI spec.
* One typed method per endpoint. A single Omni key reaches the API.
*/
const DEFAULT_BASE = "https://grid.skinvaults.online/v1/proxy/spotify";
export class SpotifyError extends Error {
status: number;
code?: string;
constructor(status: number, code: string | undefined, message?: string) {
super(message || `Spotify error ${status}`);
this.name = "SpotifyError";
this.status = status;
this.code = code;
}
}
export interface SpotifyOptions {
baseUrl?: string;
fetch?: typeof fetch;
timeoutMs?: number;
}
export class Spotify {
/** @param token Your OmniStream key (one key for every API). */
constructor(private token: string, private opts: SpotifyOptions = {}) {
if (!token) throw new Error("Spotify: token is required");
}
rateLimit: { remainingMinute?: number; remainingDay?: number } | null = null;
private async _request(method: string, path: string, { params, body }: { params?: Record<string, unknown>; body?: unknown } = {}): Promise<any> {
const f = this.opts.fetch ?? globalThis.fetch;
const url = new URL((this.opts.baseUrl ?? DEFAULT_BASE).replace(/\/+$/, "") + path);
if (params) for (const [k, v] of Object.entries(params)) if (v != null) url.searchParams.set(k, String(v));
const headers: Record<string, string> = { "x-omni-key": this.token };
if (body !== undefined) headers["content-type"] = "application/json";
const res = await f(url, { method, headers, body: body !== undefined ? JSON.stringify(body) : undefined });
this.rateLimit = {
remainingMinute: Number(res.headers.get("x-ratelimit-remaining-minute")) || undefined,
remainingDay: Number(res.headers.get("x-ratelimit-remaining-day")) || undefined,
};
const data = await res.json().catch(() => ({}));
if (!res.ok) throw new SpotifyError(res.status, data?.error?.code, data?.error?.message);
return data.data ?? data;
}
/** Get Several Albums
*/
getMultipleAlbums(params: { "ids": string; "market"?: string }): Promise<any> {
return this._request("GET", "/albums", { params });
}
/** Get Album
*/
getAnAlbum(params: { "id": string; "market"?: string }): Promise<any> {
return this._request("GET", "/albums/{id}", { params });
}
/** Get Album Tracks
*/
getAnAlbumsTracks(params: { "id": string; "market"?: string; "limit"?: number; "offset"?: number }): Promise<any> {
return this._request("GET", "/albums/{id}/tracks", { params });
}
/** Get Several Artists
*/
getMultipleArtists(params: { "ids": string }): Promise<any> {
return this._request("GET", "/artists", { params });
}
/** Get Artist
*/
getAnArtist(params: { "id": string }): Promise<any> {
return this._request("GET", "/artists/{id}", { params });
}
/** Get Artist's Albums
*/
getAnArtistsAlbums(params: { "id": string; "include_groups"?: string; "market"?: string; "limit"?: number; "offset"?: number }): Promise<any> {
return this._request("GET", "/artists/{id}/albums", { params });
}
/** Get Artist's Related Artists
*/
getAnArtistsRelatedArtists(params: { "id": string }): Promise<any> {
return this._request("GET", "/artists/{id}/related-artists", { params });
}
/** Get Artist's Top Tracks
*/
getAnArtistsTopTracks(params: { "id": string; "market"?: string }): Promise<any> {
return this._request("GET", "/artists/{id}/top-tracks", { params });
}
/** Get Track's Audio Analysis
*/
getAudioAnalysis(params: { "id": string }): Promise<any> {
return this._request("GET", "/audio-analysis/{id}", { params });
}
/** Get Tracks' Audio Features
*/
getSeveralAudioFeatures(params: { "ids": string }): Promise<any> {
return this._request("GET", "/audio-features", { params });
}
/** Get Track's Audio Features
*/
getAudioFeatures(params: { "id": string }): Promise<any> {
return this._request("GET", "/audio-features/{id}", { params });
}
/** Get Several Audiobooks
*/
getMultipleAudiobooks(params: { "ids": string; "market"?: string }): Promise<any> {
return this._request("GET", "/audiobooks", { params });
}
/** Get an Audiobook
*/
getAnAudiobook(params: { "id": string; "market"?: string }): Promise<any> {
return this._request("GET", "/audiobooks/{id}", { params });
}
/** Get Audiobook Chapters
*/
getAudiobookChapters(params: { "id": string; "market"?: string; "limit"?: number; "offset"?: number }): Promise<any> {
return this._request("GET", "/audiobooks/{id}/chapters", { params });
}
/** Get Several Browse Categories
*/
getCategories(params: { "country"?: string; "locale"?: string; "limit"?: number; "offset"?: number }): Promise<any> {
return this._request("GET", "/browse/categories", { params });
}
/** Get Single Browse Category
*/
getACategory(params: { "category_id": string; "country"?: string; "locale"?: string }): Promise<any> {
return this._request("GET", "/browse/categories/{category_id}", { params });
}
/** Get Category's Playlists
*/
getACategoriesPlaylists(params: { "category_id": string; "country"?: string; "limit"?: number; "offset"?: number }): Promise<any> {
return this._request("GET", "/browse/categories/{category_id}/playlists", { params });
}
/** Get Featured Playlists
*/
getFeaturedPlaylists(params: { "country"?: string; "locale"?: string; "timestamp"?: string; "limit"?: number; "offset"?: number }): Promise<any> {
return this._request("GET", "/browse/featured-playlists", { params });
}
/** Get New Releases
*/
getNewReleases(params: { "country"?: string; "limit"?: number; "offset"?: number }): Promise<any> {
return this._request("GET", "/browse/new-releases", { params });
}
/** Get Several Chapters
*/
getSeveralChapters(params: { "ids": string; "market"?: string }): Promise<any> {
return this._request("GET", "/chapters", { params });
}
/** Get a Chapter
*/
getAChapter(params: { "id": string; "market"?: string }): Promise<any> {
return this._request("GET", "/chapters/{id}", { params });
}
/** Get Several Episodes
*/
getMultipleEpisodes(params: { "ids": string; "market"?: string }): Promise<any> {
return this._request("GET", "/episodes", { params });
}
/** Get Episode
*/
getAnEpisode(params: { "id": string; "market"?: string }): Promise<any> {
return this._request("GET", "/episodes/{id}", { params });
}
/** Get Available Markets
*/
getAvailableMarkets(): Promise<any> {
return this._request("GET", "/markets", {});
}
/** Get Current User's Profile
*/
getCurrentUsersProfile(): Promise<any> {
return this._request("GET", "/me", {});
}
/** Get User's Saved Albums
*/
getUsersSavedAlbums(params: { "limit"?: number; "offset"?: number; "market"?: string }): Promise<any> {
return this._request("GET", "/me/albums", { params });
}
/** Save Albums for Current User
*/
saveAlbumsUser(body: unknown, params: { "ids": string }): Promise<any> {
return this._request("PUT", "/me/albums", { body, params });
}
/** Remove Users' Saved Albums
*/
removeAlbumsUser(params: { "ids": string }): Promise<any> {
return this._request("DELETE", "/me/albums", { params });
}
/** Check User's Saved Albums
*/
checkUsersSavedAlbums(params: { "ids": string }): Promise<any> {
return this._request("GET", "/me/albums/contains", { params });
}
/** Get User's Saved Audiobooks
*/
getUsersSavedAudiobooks(params: { "limit"?: number; "offset"?: number }): Promise<any> {
return this._request("GET", "/me/audiobooks", { params });
}
/** Save Audiobooks for Current User
*/
saveAudiobooksUser(params: { "ids": string }): Promise<any> {
return this._request("PUT", "/me/audiobooks", { params });
}
/** Remove User's Saved Audiobooks
*/
removeAudiobooksUser(params: { "ids": string }): Promise<any> {
return this._request("DELETE", "/me/audiobooks", { params });
}
/** Check User's Saved Audiobooks
*/
checkUsersSavedAudiobooks(params: { "ids": string }): Promise<any> {
return this._request("GET", "/me/audiobooks/contains", { params });
}
/** Get User's Saved Episodes
*/
getUsersSavedEpisodes(params: { "market"?: string; "limit"?: number; "offset"?: number }): Promise<any> {
return this._request("GET", "/me/episodes", { params });
}
/** Save Episodes for Current User
*/
saveEpisodesUser(body: unknown, params: { "ids": string }): Promise<any> {
return this._request("PUT", "/me/episodes", { body, params });
}
/** Remove User's Saved Episodes
*/
removeEpisodesUser(params: { "ids": string }): Promise<any> {
return this._request("DELETE", "/me/episodes", { params });
}
/** Check User's Saved Episodes
*/
checkUsersSavedEpisodes(params: { "ids": string }): Promise<any> {
return this._request("GET", "/me/episodes/contains", { params });
}
/** Get Followed Artists
*/
getFollowed(params: { "type": string; "after"?: string; "limit"?: number }): Promise<any> {
return this._request("GET", "/me/following", { params });
}
/** Follow Artists or Users
*/
followArtistsUsers(body: unknown, params: { "type": string; "ids": string }): Promise<any> {
return this._request("PUT", "/me/following", { body, params });
}
/** Unfollow Artists or Users
*/
unfollowArtistsUsers(params: { "type": string; "ids": string }): Promise<any> {
return this._request("DELETE", "/me/following", { params });
}
/** Check If User Follows Artists or Users
*/
checkCurrentUserFollows(params: { "type": string; "ids": string }): Promise<any> {
return this._request("GET", "/me/following/contains", { params });
}
/** Get Playback State
*/
getInformationAboutTheUsersCurrentPlayback(params: { "market"?: string; "additional_types"?: string }): Promise<any> {
return this._request("GET", "/me/player", { params });
}
/** Transfer Playback
*/
transferAUsersPlayback(body: unknown): Promise<any> {
return this._request("PUT", "/me/player", { body });
}
/** Get Currently Playing Track
*/
getTheUsersCurrentlyPlayingTrack(params: { "market"?: string; "additional_types"?: string }): Promise<any> {
return this._request("GET", "/me/player/currently-playing", { params });
}
/** Get Available Devices
*/
getAUsersAvailableDevices(): Promise<any> {
return this._request("GET", "/me/player/devices", {});
}
/** Skip To Next
*/
skipUsersPlaybackToNextTrack(params: { "device_id"?: string }): Promise<any> {
return this._request("POST", "/me/player/next", { params });
}
/** Pause Playback
*/
pauseAUsersPlayback(params: { "device_id"?: string }): Promise<any> {
return this._request("PUT", "/me/player/pause", { params });
}
/** Start/Resume Playback
*/
startAUsersPlayback(body: unknown, params: { "device_id"?: string }): Promise<any> {
return this._request("PUT", "/me/player/play", { body, params });
}
/** Skip To Previous
*/
skipUsersPlaybackToPreviousTrack(params: { "device_id"?: string }): Promise<any> {
return this._request("POST", "/me/player/previous", { params });
}
/** Get the User's Queue
*/
getQueue(): Promise<any> {
return this._request("GET", "/me/player/queue", {});
}
/** Add Item to Playback Queue
*/
addToQueue(params: { "uri": string; "device_id"?: string }): Promise<any> {
return this._request("POST", "/me/player/queue", { params });
}
/** Get Recently Played Tracks
*/
getRecentlyPlayed(params: { "limit"?: number; "after"?: number; "before"?: number }): Promise<any> {
return this._request("GET", "/me/player/recently-played", { params });
}
/** Set Repeat Mode
*/
setRepeatModeOnUsersPlayback(params: { "state": string; "device_id"?: string }): Promise<any> {
return this._request("PUT", "/me/player/repeat", { params });
}
/** Seek To Position
*/
seekToPositionInCurrentlyPlayingTrack(params: { "position_ms": number; "device_id"?: string }): Promise<any> {
return this._request("PUT", "/me/player/seek", { params });
}
/** Toggle Playback Shuffle
*/
toggleShuffleForUsersPlayback(params: { "state": boolean; "device_id"?: string }): Promise<any> {
return this._request("PUT", "/me/player/shuffle", { params });
}
/** Set Playback Volume
*/
setVolumeForUsersPlayback(params: { "volume_percent": number; "device_id"?: string }): Promise<any> {
return this._request("PUT", "/me/player/volume", { params });
}
/** Get Current User's Playlists
*/
getAListOfCurrentUsersPlaylists(params: { "limit"?: number; "offset"?: number }): Promise<any> {
return this._request("GET", "/me/playlists", { params });
}
/** Get User's Saved Shows
*/
getUsersSavedShows(params: { "limit"?: number; "offset"?: number }): Promise<any> {
return this._request("GET", "/me/shows", { params });
}
/** Save Shows for Current User
*/
saveShowsUser(body: unknown, params: { "ids": string }): Promise<any> {
return this._request("PUT", "/me/shows", { body, params });
}
/** Remove User's Saved Shows
*/
removeShowsUser(params: { "ids": string; "market"?: string }): Promise<any> {
return this._request("DELETE", "/me/shows", { params });
}
/** Check User's Saved Shows
*/
checkUsersSavedShows(params: { "ids": string }): Promise<any> {
return this._request("GET", "/me/shows/contains", { params });
}
/** Get User's Top Artists
*/
getUsersTopArtists(params: { "time_range"?: string; "limit"?: number; "offset"?: number }): Promise<any> {
return this._request("GET", "/me/top/artists", { params });
}
/** Get User's Top Tracks
*/
getUsersTopTracks(params: { "time_range"?: string; "limit"?: number; "offset"?: number }): Promise<any> {
return this._request("GET", "/me/top/tracks", { params });
}
/** Get User's Saved Tracks
*/
getUsersSavedTracks(params: { "market"?: string; "limit"?: number; "offset"?: number }): Promise<any> {
return this._request("GET", "/me/tracks", { params });
}
/** Save Tracks for Current User
*/
saveTracksUser(body: unknown, params: { "ids": string }): Promise<any> {
return this._request("PUT", "/me/tracks", { body, params });
}
/** Remove User's Saved Tracks
*/
removeTracksUser(params: { "ids": string }): Promise<any> {
return this._request("DELETE", "/me/tracks", { params });
}
/** Check User's Saved Tracks
*/
checkUsersSavedTracks(params: { "ids": string }): Promise<any> {
return this._request("GET", "/me/tracks/contains", { params });
}
/** Get Playlist
*/
getPlaylist(params: { "playlist_id": string; "market"?: string; "fields"?: string; "additional_types"?: string }): Promise<any> {
return this._request("GET", "/playlists/{playlist_id}", { params });
}
/** Change Playlist Details
*/
changePlaylistDetails(body: unknown, params: { "playlist_id": string }): Promise<any> {
return this._request("PUT", "/playlists/{playlist_id}", { body, params });
}
/** Follow Playlist
*/
followPlaylist(body: unknown, params: { "playlist_id": string }): Promise<any> {
return this._request("PUT", "/playlists/{playlist_id}/followers", { body, params });
}
/** Unfollow Playlist
*/
unfollowPlaylist(params: { "playlist_id": string }): Promise<any> {
return this._request("DELETE", "/playlists/{playlist_id}/followers", { params });
}
/** Check if Users Follow Playlist
*/
checkIfUserFollowsPlaylist(params: { "playlist_id": string; "ids": string }): Promise<any> {
return this._request("GET", "/playlists/{playlist_id}/followers/contains", { params });
}
/** Get Playlist Cover Image
*/
getPlaylistCover(params: { "playlist_id": string }): Promise<any> {
return this._request("GET", "/playlists/{playlist_id}/images", { params });
}
/** Add Custom Playlist Cover Image
*/
uploadCustomPlaylistCover(params: { "playlist_id": string }): Promise<any> {
return this._request("PUT", "/playlists/{playlist_id}/images", { params });
}
/** Get Playlist Items
*/
getPlaylistsTracks(params: { "playlist_id": string; "market"?: string; "fields"?: string; "limit"?: number; "offset"?: number; "additional_types"?: string }): Promise<any> {
return this._request("GET", "/playlists/{playlist_id}/tracks", { params });
}
/** Add Items to Playlist
*/
addTracksToPlaylist(body: unknown, params: { "playlist_id": string; "position"?: number; "uris"?: string }): Promise<any> {
return this._request("POST", "/playlists/{playlist_id}/tracks", { body, params });
}
/** Update Playlist Items
*/
reorderOrReplacePlaylistsTracks(body: unknown, params: { "playlist_id": string; "uris"?: string }): Promise<any> {
return this._request("PUT", "/playlists/{playlist_id}/tracks", { body, params });
}
/** Remove Playlist Items
*/
removeTracksPlaylist(params: { "playlist_id": string }): Promise<any> {
return this._request("DELETE", "/playlists/{playlist_id}/tracks", { params });
}
/** Get Recommendations
*/
getRecommendations(params: { "limit"?: number; "market"?: string; "seed_artists"?: string; "seed_genres"?: string; "seed_tracks"?: string; "min_acousticness"?: number; "max_acousticness"?: number; "target_acousticness"?: number; "min_danceability"?: number; "max_danceability"?: number; "target_danceability"?: number; "min_duration_ms"?: number; "max_duration_ms"?: number; "target_duration_ms"?: number; "min_energy"?: number; "max_energy"?: number; "target_energy"?: number; "min_instrumentalness"?: number; "max_instrumentalness"?: number; "target_instrumentalness"?: number; "min_key"?: number; "max_key"?: number; "target_key"?: number; "min_liveness"?: number; "max_liveness"?: number; "target_liveness"?: number; "min_loudness"?: number; "max_loudness"?: number; "target_loudness"?: number; "min_mode"?: number; "max_mode"?: number; "target_mode"?: number; "min_popularity"?: number; "max_popularity"?: number; "target_popularity"?: number; "min_speechiness"?: number; "max_speechiness"?: number; "target_speechiness"?: number; "min_tempo"?: number; "max_tempo"?: number; "target_tempo"?: number; "min_time_signature"?: number; "max_time_signature"?: number; "target_time_signature"?: number; "min_valence"?: number; "max_valence"?: number; "target_valence"?: number }): Promise<any> {
return this._request("GET", "/recommendations", { params });
}
/** Get Available Genre Seeds
*/
getRecommendationGenres(): Promise<any> {
return this._request("GET", "/recommendations/available-genre-seeds", {});
}
/** Search for Item
*/
search(params: { "q": string; "type": unknown[]; "market"?: string; "limit"?: number; "offset"?: number; "include_external"?: string }): Promise<any> {
return this._request("GET", "/search", { params });
}
/** Get Several Shows
*/
getMultipleShows(params: { "ids": string; "market"?: string }): Promise<any> {
return this._request("GET", "/shows", { params });
}
/** Get Show
*/
getAShow(params: { "id": string; "market"?: string }): Promise<any> {
return this._request("GET", "/shows/{id}", { params });
}
/** Get Show Episodes
*/
getAShowsEpisodes(params: { "id": string; "market"?: string; "limit"?: number; "offset"?: number }): Promise<any> {
return this._request("GET", "/shows/{id}/episodes", { params });
}
/** Get Several Tracks
*/
getSeveralTracks(params: { "ids": string; "market"?: string }): Promise<any> {
return this._request("GET", "/tracks", { params });
}
/** Get Track
*/
getTrack(params: { "id": string; "market"?: string }): Promise<any> {
return this._request("GET", "/tracks/{id}", { params });
}
/** Get User's Profile
*/
getUsersProfile(params: { "user_id": string }): Promise<any> {
return this._request("GET", "/users/{user_id}", { params });
}
/** Get User's Playlists
*/
getListUsersPlaylists(params: { "user_id": string; "limit"?: number; "offset"?: number }): Promise<any> {
return this._request("GET", "/users/{user_id}/playlists", { params });
}
/** Create Playlist
*/
createPlaylist(body: unknown, params: { "user_id": string }): Promise<any> {
return this._request("POST", "/users/{user_id}/playlists", { body, params });
}
}
export default Spotify;
No reviews yet. Be the first to rate this API.
Yes. Spotify uses bearer authentication, so you bring your own key from the provider. You store it once on OmniStream and the proxy injects it into every call, so your code only ever sends your Omni key.
Spotify Web API - discover music and podcasts, manage your library, and control playback. It exposes 89 endpoints over GET, PUT, DELETE, POST, including GET /albums, GET /albums/{id}, GET /albums/{id}/tracks.
Install the OmniStream SDK for your language and call Spotify through it. The client is generated from this API's OpenAPI spec, so parameters and responses are fully typed, and the same client also calls every other API in the marketplace.
You can start on the free plan. OmniStream charges for the unified SDK, key storage and proxy rather than for Spotify itself, and Spotify's own rate limits still apply to your provider key.
Flat API: The Flat API allows you to easily extend the abilities of the Flat Platform, with a wide range of use cases including the following: Creating and importing new …
Get Artist's Related Artists
Get Artist's Top Tracks
Get Track's Audio Analysis
Get Tracks' Audio Features
Get Track's Audio Features
Get Several Audiobooks
Get an Audiobook
Get Audiobook Chapters
Get Several Browse Categories
Get Single Browse Category
Get Category's Playlists
Get Featured Playlists
Get New Releases
Get Several Chapters
Get a Chapter
Get Several Episodes
Get Episode
Get Available Markets
Get Current User's Profile
Get User's Saved Albums
Save Albums for Current User
Remove Users' Saved Albums
Check User's Saved Albums
Get User's Saved Audiobooks
Save Audiobooks for Current User
Remove User's Saved Audiobooks
Check User's Saved Audiobooks
Get User's Saved Episodes
Save Episodes for Current User
Remove User's Saved Episodes
Check User's Saved Episodes
Get Followed Artists
Follow Artists or Users
Unfollow Artists or Users
Check If User Follows Artists or Users
Get Playback State
Transfer Playback
Get Currently Playing Track
Get Available Devices
Skip To Next
Pause Playback
Start/Resume Playback
Skip To Previous
Get the User's Queue
Add Item to Playback Queue
Get Recently Played Tracks
Set Repeat Mode
Seek To Position
Toggle Playback Shuffle
Set Playback Volume
Get Current User's Playlists
Get User's Saved Shows
Save Shows for Current User
Remove User's Saved Shows
Check User's Saved Shows
Get User's Top Artists
Get User's Top Tracks
Get User's Saved Tracks
Save Tracks for Current User
Remove User's Saved Tracks
Check User's Saved Tracks
Get Playlist
Change Playlist Details
Follow Playlist
Unfollow Playlist
Check if Users Follow Playlist
Get Playlist Cover Image
Add Custom Playlist Cover Image
Get Playlist Items
Add Items to Playlist
Update Playlist Items
Remove Playlist Items
Get Recommendations
Get Available Genre Seeds
Search for Item
Get Several Shows
Get Show
Get Show Episodes
Get Several Tracks
Get Track
Get User's Profile
Get User's Playlists
Create Playlist