This is a Node.js wrapper for the Yandex.Music API that is used in mobile apps (iOS/Android).
npm install yamd2yarn add yamd2pnpm add yamd2bun add yamd2npm install github:Dirold2/yamd2#__dist__import { YMApi, WrappedYMApi, Types } from "yamd2";
// Basic API usage — methods are organized by domain
const api = new YMApi();
await api.init({ access_token: "EXAMPLE_TOKEN", uid: 0 });
const searchResult = await api.search.query("gorillaz", { type: "artist" });
const artist = searchResult.artists?.results?.[0];
const tracks = await api.artists.getArtistTracks(artist.id);
console.log(tracks);
// Enhanced API with additional features
const wrappedApi = new WrappedYMApi();
await wrappedApi.init({ access_token: "EXAMPLE_TOKEN", uid: 0 });
// Get track download info with codec support
const downloadInfo = await wrappedApi.getDownloadInfo("123456", {
codec: "flac",
quality: "lossless"
});
// Get best available download URL
const bestUrl = await wrappedApi.getBestDownloadUrl("123456");
// Support for URLs and IDs
const track = await wrappedApi.getTrack("https://music.yandex.ru/track/123456");Get token from here and uid from here.
Methods are organized into domain fields on the YMApi instance:
init(config)— Authenticate and initialize the API
getAccountStatus()— Get current user account statusgetFeed()— Get user feed (generated playlists, days)
getChart(chartType?)— Get chartgetNewReleases()— Get new album releasesgetNewPlaylists()— Get new playlistsgetPodcasts()— Get podcastsgetGenres()— Get list of music genres
query(q, options?)— Search across all or specific typeartists(q, options?)— Search artists onlytracks(q, options?)— Search tracks onlyalbums(q, options?)— Search albums onlyall(q, options?)— Search all types
getTrack(trackId)— Get track(s) by IDgetSingleTrack(trackId)— Get single trackgetTracks(trackIds)— Get multiple tracksgetTrackSupplement(trackId)— Get track supplementgetTrackLyrics(trackId, format?)— Get track lyricsgetTrackTrailer(trackId)— Get track trailergetTrackFullInfo(trackId)— Get full track info (including similar, supplement, etc.)getTrackDownloadInfo(trackId, quality?, canUseStreaming?)— Get download infogetTrackDownloadInfoNew(trackId, quality?, codecs?, transport?)— New API endpointgetTrackDirectLink(downloadUrl, short?)— Resolve direct download linkgetTrackDirectLinkNew(trackUrl)— Resolve new format direct linkgetTrackShareLink(track)— Generate share URLgetSimilarTracks(trackId)— Get similar tracks
getAlbum(albumId, withTracks?)— Get albumgetAlbums(albumIds)— Get multiple albumsgetAlbumWithTracks(albumId)— Get album with volumes/tracksgetAlbumSimilarEntities(albumId)— Get similar entities for albumgetAlbumTrailer(albumId)— Get album trailer
getArtist(artistId)— Get artist infogetArtists(artistIds)— Get multiple artistsgetArtistTracks(artistId, options?)— Get artist tracksgetArtistBriefInfo(artistId)— Get artist brief infogetArtistDirectAlbums(artistId, options?)— Get direct albumsgetArtistSimilar(artistId)— Get similar artistsgetArtistLinks(artistId)— Get artist linksgetArtistAlsoAlbums(artistId, options?)— Get also albumsgetArtistDiscographyAlbums(artistId, options?)— Get discography albumsgetArtistSafeDirectAlbums(artistId, options?)— Get safe direct albumsgetArtistTrackIds(artistId, options?)— Get artist track IDsgetArtistAbout(artistId)— Get artist about infogetArtistClips(artistId)— Get artist clipsgetArtistDonation(artistId)— Get artist donation infogetArtistInfo(artistId)— Get extended artist infogetArtistSkeleton(artistId, skeletonId?)— Get artist skeletongetArtistTrailer(artistId)— Get artist trailer
getPlaylist(playlistId, user?)— Get playlistgetPlaylistNew(playlistId)— Get playlist by string IDgetPlaylists(playlistIds, user?, options?)— Get multiple playlistsgetUserPlaylists(userId)— Get user playlistsgetPlaylistRecommendations(kind, userId?)— Get playlist recommendationsgetPlaylistKinds(userId?)— Get user playlist kindsgetPlaylistTrailer(kind, userId?)— Get playlist trailergetPlaylistSimilarEntities(playlistUuid)— Get similar entitiescreatePlaylist(name, options?)— Create playlistremovePlaylist(playlistId)— Remove playlistrenamePlaylist(playlistId, name)— Rename playlistaddTracksToPlaylist(playlistId, tracks, revision, options?)— Add tracksremoveTracksFromPlaylist(playlistId, tracks, revision, options?)— Remove trackssetPlaylistVisibility(playlistId, visibility, userId?)— Set playlist visibilitysetPlaylistDescription(playlistId, description, userId?)— Set playlist descriptioncollectiveJoin(userId, token)— Join collective playlistgetUserSettings(userId?)— Get user settings
getAllStationsList(language?)— Get all stationsgetRecomendedStationsList()— Get recommended stationsgetStationTracks(stationId, queue?)— Get station tracksgetStationInfo(stationId)— Get station infocreateRotorSession(seeds, includeTracksInResponse?)— Create rotor sessionpostRotorSessionTracks(sessionId, options)— Get rotor session tracks
getLikedTracks(userId?)— Get liked trackslikeTracks(trackIds, userId?)— Like tracksunlikeTracks(trackIds, userId?)— Unlike tracksgetLikedAlbums(userId?)— Get liked albumslikeAlbums(albumIds, userId?)— Like albumsunlikeAlbums(albumIds, userId?)— Unlike albumsgetLikedArtists(userId?)— Get liked artistslikeArtists(artistIds, userId?)— Like artistsunlikeArtists(artistIds, userId?)— Unlike artistsgetLikedPlaylists(userId?)— Get liked playlistslikePlaylists(playlistIds, userId?)— Like playlistsunlikePlaylists(playlistIds, userId?)— Unlike playlistsgetLikedClips(userId?, page?, pageSize?)— Get liked clipslikeClip(clipId, userId?)— Like a clipunlikeClip(clipId, userId?)— Unlike a clipgetDislikedTracks(userId?)— Get disliked tracksdislikeTracks(trackIds, userId?)— Dislike tracksundislikeTracks(trackIds, userId?)— Undislike tracksgetDislikedArtists(userId?)— Get disliked artistsdislikeArtist(artistId, userId?)— Dislike artistundislikeArtist(artistId, userId?)— Undislike artist
getQueues()— Get all queuesgetQueue(queueId)— Get specific queue
getLabel(labelId)— Get label infogetLabelAlbums(labelId, options?)— Get label albumsgetLabelArtists(labelId, options?)— Get label artists
getTrackCredits(trackId)— Get track creditsgetClipCredits(clipId)— Get clip credits
getTrackDisclaimer(trackId)— Get track disclaimergetAlbumDisclaimer(albumId)— Get album disclaimergetArtistDisclaimer(artistId)— Get artist disclaimergetClipDisclaimer(clipId)— Get clip disclaimer
getMetatags()— Get all metatagsgetMetatag(metatagId, options?)— Get metatag with entitiesgetMetatagAlbums(metatagId, options?)— Get metatag albumsgetMetatagArtists(metatagId, options?)— Get metatag artistsgetMetatagPlaylists(metatagId, options?)— Get metatag playlists
getClips(clipIds)— Get clips by IDsgetClipsWillLike(page?, pageSize?)— Get clips the user will like
getPins()— Get all pinspinAlbum(albumId)— Pin albumunpinAlbum(albumId)— Unpin albumpinArtist(artistId)— Pin artistunpinArtist(artistId)— Unpin artistpinPlaylist(uid, kind)— Pin playlistunpinPlaylist(uid, kind)— Unpin playlistpinWave(seeds)— Pin waveunpinWave(seeds)— Unpin wave
getPresaves(options?)— Get presaved albumsaddPresave(albumId, options?)— Presave an albumremovePresave(albumId, options?)— Remove presave
getMusicHistory(fullModelsCount?)— Get music historygetMusicHistoryItems(items)— Get music history items by types
requestDeviceCode(options?)— Request device code from OAuthpollDeviceToken(deviceCode, options?)— Poll for OAuth tokendeviceAuth(onCode, options?)— Full device auth flow (polling loop)
getArtistConcerts(artistId)— Get concerts for artistgetConcertInfo(concertId)— Get concert infogetConcertSkeleton(concertId, skeletonId?)— Get concert skeletongetConcertsFeed(locations?)— Get concerts feedgetConcertsLocations()— Get concert locationsgetConcertsTabConfig()— Get concerts tab config
Enhanced API with additional features and convenience methods:
- getDownloadInfo - Get download information with codec support
- getDownloadUrl - Get direct download URL
- getBestDownloadUrl - Get best available URL by codec priority
- getDownloadUrlForFFmpeg - Get FFmpeg-compatible URL (RAW MP3)
- getMp3DownloadInfo - Get MP3 download info
- getMp3DownloadUrl - Get MP3 download URL
- getAacDownloadInfo - Get AAC download info
- getAacDownloadUrl - Get AAC download URL
- getFlacDownloadInfo - Get FLAC download info
- getFlacDownloadUrl - Get FLAC download URL
- getFlacMP4DownloadInfo - Get FLAC-MP4 download info
- getFlacMP4DownloadUrl - Get FLAC-MP4 download URL
- getTrack - Get track by ID or URL
- isEncryptedUrl - Check if URL is encrypted
- getPlaylist - Get playlist by ID or URL
- getAlbum - Get album by ID or URL
- getAlbumWithTracks - Get album with tracks by ID or URL
- getArtist - Get artist by ID or URL
- getShortenedLink - Get shortened link
The WrappedYMApi supports multiple audio codecs with automatic quality selection:
- FLAC - Lossless, high quality
- FLAC-MP4 - Lossless in MP4 container
- AAC - Standard compression
- AAC-MP4 - AAC in MP4 container
- HE-AAC - High efficiency
- HE-AAC-MP4 - HE-AAC in MP4 container
- MP3 - Wide compatibility
All methods accept both entity IDs and URLs:
// By ID
const track = await wrappedApi.getTrack(123456);
// By URL
const track = await wrappedApi.getTrack("https://music.yandex.ru/track/123456");Comprehensive error handling with specific error types:
import { YMApiError, ExtractionError, DownloadError } from "yamd2";
try {
const result = await wrappedApi.getDownloadUrl("invalid-url");
} catch (error) {
if (error instanceof ExtractionError) {
console.log(`Failed to extract ID from URL: ${error.input}`);
} else if (error instanceof DownloadError) {
console.log(
`URL not found for track ${error.trackId} with codec ${error.codec}`
);
}
}When using getBestDownloadUrl(), codecs are checked in priority order:
- FLAC-MP4
- FLAC
- AAC-MP4
- AAC
- HE-AAC-MP4
- HE-AAC
- MP3
api.tracks.streamTrack() yields direct-download response bytes without buffering the complete track in memory. Obtain a direct URL first, then consume its Uint8Array chunks:
const trackId = 14329703;
const downloadInfo = await api.tracks.getTrackDownloadInfo(trackId);
const source = downloadInfo[0];
if (!source) throw new Error("No download information available");
const directUrl = await api.tracks.getTrackDirectLink(source.downloadInfoUrl);
const controller = new AbortController();
for await (const chunk of api.tracks.streamTrack(directUrl, controller.signal)) {
// Persist or process chunk: Uint8Array
}The stream works in Bun and Node.js. Breaking out of the loop or aborting the signal cancels the underlying response body.
See the examples directory for detailed usage examples: