Udio Scraper - Prompts, Lyrics, Tags, Audio
Pricing
from $1.00 / 1,000 track results
Udio Scraper - Prompts, Lyrics, Tags, Audio
Collect public Udio tracks with the complete generation prompt, full lyrics, style tags, like and play counts, duration, artwork and a direct audio link. Search the catalogue by keyword and ordering, read a list of track addresses, or pull a public playlist in its original order.
Pricing
from $1.00 / 1,000 track results
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
Udio Scraper
Collect public tracks from Udio together with the text that made them: the complete generation prompt, the full lyrics, and the style tags. Those three fields are kept exactly as the creator wrote them, because they are usually the whole point of collecting Udio tracks and they are the first thing a lossy export drops.
Every row also carries the artwork, a direct audio link, like and play counts, duration, timestamps and the creator handle.
What you can collect
| Mode | What it does | What you supply |
|---|---|---|
| Search the catalogue | Finds public tracks by keyword, in the order you choose | A keyword (optional) and an ordering |
| Specific tracks | Reads a list of tracks you already know | Track page addresses, or bare identifiers |
| Playlist | Reads every track in one or more public playlists, in playlist order | Playlist page addresses, or bare identifiers |
Input
| Field | Type | Default | Notes |
|---|---|---|---|
mode | select | search | search, songIds or playlist |
searchTerm | text | empty | Matched against titles, prompts and tags. Empty browses everything |
sortBy | select | newest | newest, mostLiked or mostPlayed |
trackIds | list | empty | One track per line, address or identifier |
playlistIds | list | empty | One playlist per line, address or identifier |
maxItems | number | 20 | Stop after this many tracks. 0 collects everything available |
resumeFromRunId | text | empty | Continue one interrupted run without returning what it already saved |
incrementalMode | checkbox | off | Return only what changed since the last run of the same selection |
emitUnchanged | checkbox | off | Also return unchanged tracks, marked UNCHANGED (billed) |
emitExpired | checkbox | off | Also return tracks that are gone, marked EXPIRED (billed) |
stateKey | text | empty | Name a monitoring campaign, or share one across runs |
mcpConnectors | list | empty | Optional MCP connectors to also send the results to. Empty skips the export |
notionParentPageUrl | text | empty | Notion connector only: the page under which track pages are created |
maxNotifyListings | number | 50 | How many tracks each connector receives. Does not affect the dataset |
proxyConfiguration | proxy | Apify Proxy | The default works on every plan |
Both list fields accept either shape, so you can paste addresses straight from your browser or feed in bare identifiers from an earlier run.
Resume and recurring updates
These are two different things.
Resume finishes ONE interrupted collection. Paste that run's ID (or its
dataset ID) into resumeFromRunId and the tracks it already saved are skipped.
Incremental mode is for running the same selection again and again, daily
say, to watch a playlist gain and lose tracks. The actor remembers the previous
run of that selection and, from the second run on, returns only what changed.
Each row then carries changeType, changedFields, firstSeenAt and
lastSeenAt. Memory is kept per selection (mode, keyword, ordering and lookup
list); set stateKey to name a campaign or to deliberately share one.
EXPIRED rows are only produced when a run scanned the whole selection. A run
stopped by maxItems, a keyword search that hit the 200-track ceiling, a
collection that could not be read, and a resumed run all skip that step and say
so in the log: a partial scan must never report a live track as gone.
Output
| Field | Description |
|---|---|
trackId | Stable identifier for the track |
url | Track page address |
title | Track title |
artist | Creator handle shown on the track |
artistImageUrl | Creator avatar image |
creatorId | Stable identifier for the creator |
prompt | The full generation prompt, kept verbatim |
lyrics | The complete lyrics, kept verbatim, with section markers intact |
tags | Style tags attached to the track |
userTags | Tags added by the creator |
description | Free text description |
attribution | Attribution text, when the creator set one |
likeCount | Number of likes |
playCount | Number of plays |
durationSeconds | Length in seconds |
createdAt | When the track was generated |
publishedAt | When the track was made public |
audioUrl | Direct link to the audio file |
videoUrl | Direct link to the video, when one exists |
artworkUrl | Cover artwork image |
styleId | Identifier of the style used |
styleSourceType | Where the style came from |
styleSourceTrackId | Track the style was taken from, when applicable |
parentTrackId | Track this one extends or remixes, when applicable |
generationId | Identifier of the generation batch |
generationStatus | Status reported for the generation |
isFinished | Whether generation completed |
isPublishable | Whether the track may be shared |
collectionId | Playlist identifier, in playlist mode |
collectionName | Playlist name, in playlist mode |
collectionUrl | Playlist page address, in playlist mode |
positionInCollection | Place in the playlist, in playlist mode |
sourceMode | Which mode produced the row |
scrapedAt | When the row was collected |
raw | Every field exactly as the site supplied it, so nothing is lost |
changeType | Incremental mode only: NEW, UPDATED, UNCHANGED, REAPPEARED or EXPIRED |
changedFields | Incremental mode only: which columns moved since the last run |
firstSeenAt | Incremental mode only: when this track was first collected |
lastSeenAt | Incremental mode only: when it was last collected |
Sample output
{"trackId": "00000000-0000-4000-8000-000000000000","url": "https://www.udio.com/songs/00000000-0000-4000-8000-000000000000","title": "Midnight Coffee Loop","artist": "Jane Doe","creatorId": "00000000-0000-4000-8000-000000000001","prompt": "lofi, jazzy chill cafe vibes, warm tape saturation","lyrics": "[Verse 1]\nRain on the window, cups going cold\n\n[Chorus]\nStay for one more song","tags": ["chill", "jazz", "downtempo", "instrumental"],"userTags": ["study"],"description": "","likeCount": 128,"playCount": 4210,"durationSeconds": 131.2,"createdAt": "2026-01-05T09:12:44+00:00","publishedAt": "2026-01-05T09:15:02+00:00","audioUrl": "https://example.com/audio/sample.mp3","artworkUrl": "https://example.com/art/sample.png","isFinished": true,"isPublishable": true,"sourceMode": "search","scrapedAt": "2026-01-06T11:00:00+00:00"}
Send results into your apps (MCP connectors)
Results can optionally be piped into apps you already use, through Model Context
Protocol connectors, as a delivery step after the collection. Authorize a
connector under Apify, Settings, API and Integrations, then select it in the
mcpConnectors field of the input. For Notion, also set notionParentPageUrl
to the page under which track pages should be created; maxNotifyListings caps
how many tracks are written to each connector.
What arrives in the connector is a condensed, human readable summary per track:
a title plus the key fields flattened to plain text. Nested objects collapse to
their main value and long lists are trimmed to a few entries, so the prompt and
lyrics may be shortened there. The complete record always stays in the Apify
dataset, which this step never changes. Leaving mcpConnectors empty skips the
export entirely.
Good to know
- A single catalogue search reaches at most 200 tracks, because that is as far
as the site's own search view goes. To collect more, run several searches
with narrower keywords instead of raising
maxItems. - Playlist mode uses the playlist's own track list, so it returns every member of the playlist rather than the shorter preview the site shows elsewhere.
- Tracks that have been removed or made private are reported in the run log and simply skipped, so a short result is never silent.
- A very rare or very long keyword can make the site's own search time out rather than answer. The run stops with a clear message when that happens, so it is never reported as a successful empty result. Try a broader keyword.
maxItemsdefaults to20to keep a first run quick and cheap. Set it to0when you want everything.
Support
Found a track that does not come back correctly, or a field you need that is missing? Open an issue from the Actor page and include the input you used.