YouTube Shorts Downloader avatar

YouTube Shorts Downloader

Pricing

$2.65 / 1,000 short downloads

Go to Apify Store
YouTube Shorts Downloader

YouTube Shorts Downloader

Turn known public YouTube Shorts URLs into source media links and metadata. See the requested and available quality, formats, thumbnails, duration, channel data, and source pages.

Pricing

$2.65 / 1,000 short downloads

Rating

0.0

(0)

Developer

Maxime Dupré

Maxime Dupré

Maintained by Community

Actor stats

0

Bookmarked

102

Total users

12

Monthly active users

3 days ago

Last modified

Share

YouTube Shorts Downloader is for creators, developers, and teams that already have public Shorts links. Submit those links to get source media URLs, requested and available quality, format details, thumbnails, duration, channel data, and watch pages in a structured dataset. This gives you rows to review, catalog, or pass into another workflow. Source media links can expire or stop working, so use them soon after the run.

This Actor does not search YouTube or crawl channels. It does not handle regular long videos, private videos, transcripts, comments, MP3 conversion, or media storage.

Saved rows

Each saved row represents one resolved public Short. If the same video ID appears more than once, the first eligible match is saved and later matches are ignored. The row describes that first saved match.

Rows include the video ID, watch page, title and channel details, duration, thumbnail, requested quality, selected format, source media links, download type, and link-check details. Fields can be null when YouTube does not expose them. Source media links may expire or stop working after the run.

🚀 Resolve known YouTube Shorts

  1. Open the Actor input.
  2. Add one or more public YouTube Shorts URLs or video IDs in shortUrls.
  3. Choose the highest video quality to try in preferredResolution.
  4. Start the run.
  5. Open the dataset and use bestDownloadUrl for the main link.

You can also start runs with the Apify API, schedules, or webhooks.

⚙️ Input

Input fields

FieldTypeWhat it does
shortUrlsarray of objectsAdds public YouTube Shorts URLs or 11-character video IDs. Shorts, watch, youtu.be, embed, and live URLs work when they identify a Short. Each object uses a url field.
shortUrls[].urlstringGives one public YouTube URL or 11-character video ID to resolve.
preferredResolutionstringRequests the highest quality to try: 8k, 4k, 2k, 1080p, 720p, 480p, or 360p. The saved row shows the quality that was available.

The Actor supports batches of unique Shorts in one run. A bad or unavailable input does not stop the other inputs.

Default input

This is the public input used by a successful current-beta default run:

{
"shortUrls": [
{
"url": "https://www.youtube.com/shorts/8Zk5XzLJSAw"
}
],
"preferredResolution": "2k"
}

🧾 Output

Run output

The results link opens the dataset overview. It shows one row for each saved Short and its source media links.

Saved row fields

Each saved row has the same public field set. Every row includes videoId, watchUrl, requestedQuality, downloadType, bestDownloadUrl, bestFormat, and availability. The downloadType value is playable, separate_video_audio, or video_only. A playable row has one combined media link. A separate-stream row has video and audio links. A video-only row can have only a video link. Fields marked as nullable can be null.

FieldTypeWhat it does
videoIdstringGives the stable YouTube video ID for the Short.
watchUrlstringGives the YouTube page for the Short.
titlestring or nullGives the Short title when available.
channelNamestring or nullGives the channel name when available.
channelIdstring or nullGives the YouTube channel ID when available.
channelUrlstring or nullGives the channel page when available.
durationSecondsnumber or nullGives the Short length in seconds when available.
thumbnailUrlstring or nullGives the thumbnail image URL when available.
publishedAtstring or nullGives the Short publication date and time when available.
likeCountinteger or nullGives the public like count when available.
commentCountinteger or nullGives the public comment count when available.
requestedQualitystringGives the quality requested in the input. It can be 8k, 4k, 2k, 1080p, 720p, 480p, or 360p.
downloadTypestringSays whether the main link is playable, uses separate_video_audio streams, or is video_only.
bestDownloadUrlstringGives the main source media link for the selected format.
videoDownloadUrlstring or nullGives the selected video-only stream link when available.
audioDownloadUrlstring or nullGives the selected audio-only stream link when available.
bestFormatobjectDescribes the selected main media format.
bestFormat.formatIdstring or nullGives the source format ID for the selected media.
bestFormat.qualitystring or nullGives the quality label for the selected media when available.
bestFormat.resolutionstring or nullGives the selected media resolution when available.
bestFormat.extensionstring or nullGives the file extension when available.
bestFormat.videoCodecstring or nullGives the video codec when available.
bestFormat.audioCodecstring or nullGives the audio codec when available.
bestFormat.filesizeBytesinteger or nullGives the selected media size in bytes when available.
videoFormatobject or nullDescribes the selected video-only stream when available.
videoFormat.formatIdstring or nullGives the source format ID for the video stream.
videoFormat.qualitystring or nullGives the video stream quality when available.
videoFormat.resolutionstring or nullGives the video stream resolution when available.
videoFormat.extensionstring or nullGives the video stream file extension when available.
videoFormat.videoCodecstring or nullGives the video stream codec when available.
videoFormat.audioCodecstring or nullGives the video stream audio codec when available.
videoFormat.filesizeBytesinteger or nullGives the video stream size in bytes when available.
audioFormatobject or nullDescribes the selected audio-only stream when available.
audioFormat.formatIdstring or nullGives the source format ID for the audio stream.
audioFormat.qualitystring or nullGives the audio stream quality when available.
audioFormat.resolutionstring or nullGives the audio stream resolution value when available.
audioFormat.extensionstring or nullGives the audio stream file extension when available.
audioFormat.videoCodecstring or nullGives the audio stream video codec when available.
audioFormat.audioCodecstring or nullGives the audio stream codec when available.
audioFormat.filesizeBytesinteger or nullGives the audio stream size in bytes when available.
mediaobjectHolds details for the selected media.
media.mimeTypestring or nullGives the selected media MIME type when available.
availabilityobjectHolds the result of checking the main media link before the row was saved.
availability.downloadLinkStatusinteger or nullGives the HTTP status from the main link check.
availability.downloadContentTypestring or nullGives the content type from the main link check.

Playable row

This is a genuine row from a successful current-beta run:

{
"videoId": "4WReoZebUSc",
"watchUrl": "https://www.youtube.com/watch?v=4WReoZebUSc",
"title": "⬛ No Copyright Silent Background Video (No Sound) – Black Screen | #shorts",
"channelName": "RankiSh Encyclopedia",
"channelId": "UCDrEg3RzV9xOGsUzAi5JLtg",
"channelUrl": "https://www.youtube.com/channel/UCDrEg3RzV9xOGsUzAi5JLtg",
"durationSeconds": 6,
"thumbnailUrl": "https://i.ytimg.com/vi/4WReoZebUSc/hqdefault.jpg",
"publishedAt": "2025-04-26T06:00:07-07:00",
"likeCount": 2278,
"commentCount": 111,
"requestedQuality": "360p",
"downloadType": "playable",
"bestDownloadUrl": "https://rr9---sn-cxaaj5o5q5-tt1ey.googlevideo.com/videoplayback?expire=1788156697&ei=ucaUauv4N4HzybgP97TW0Qc&ip=66.7.95.69&id=o-AKzTnlG0D2c_z2xhEG4P6WX0LF9r3dYpca6I9JGR04u-&itag=18&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&cps=282&met=1788135097%2C&mh=PH&mm=31%2C26&mn=sn-cxaaj5o5q5-tt1ey%2Csn-vgqskn67&ms=au%2Conr&mv=m&mvi=9&pl=24&rms=au%2Cau&initcwndbps=3978750&bui=AR3QkAlsQY4ywZaLxB8W_1flrYWFt-S0jJC_iupSZvsYIKzoNiEP307xrKf8f11ObvhGepz6crO0Gts8&spc=KBGBck4QBap7OzPPSNU5c-tujuf4tytGdZ4jQQB_iKlwoRPtIg&vprv=1&svpuc=1&mime=video%2Fmp4&rqh=1&gir=yes&clen=151747&ratebypass=yes&dur=6.058&lmt=1780163666858137&mt=1788134691&fvip=3&fexp=51565115%2C52135441&c=ANDROID_VR&txp=5430534&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cspc%2Cvprv%2Csvpuc%2Cmime%2Crqh%2Cgir%2Cclen%2Cratebypass%2Cdur%2Clmt&sig=AE0s2JYwRAIgeIFPp2mqm_pWKqeWIXiaAalRfqecoj3E_xs_4zHD5ZECIG9u29CyFQvk8-NY8duuEpAXql_8hoKDBio_U1_sCKmH&lsparams=cps%2Cmet%2Cmh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Crms%2Cinitcwndbps&lsig=APaTxxMwRQIhAOkPpfmMkqw3cwRiVW25QfZpneqxTsWHnfzIMYdD2VMvAiB_HUCkWhO7x94hmCOYvLQ32KztDHVoqoMBcI0u1zgDbA%3D%3D",
"videoDownloadUrl": null,
"audioDownloadUrl": null,
"bestFormat": {
"formatId": "18",
"quality": "360p",
"resolution": "360x640",
"extension": "mp4",
"videoCodec": "avc1.42001E",
"audioCodec": "mp4a.40.2",
"filesizeBytes": 151747
},
"videoFormat": null,
"audioFormat": null,
"media": {
"mimeType": "video/mp4; codecs=\"avc1.42001E, mp4a.40.2\""
},
"availability": {
"downloadLinkStatus": 206,
"downloadContentType": "video/mp4"
}
}

Separate video and audio row

This genuine row is shortened. The three long source links are shown as "..." to keep the example short.

{
"videoId": "8Zk5XzLJSAw",
"watchUrl": "https://www.youtube.com/watch?v=8Zk5XzLJSAw",
"title": "wax cracking is even more satisfying when you DIY it #soundon #wax #DIY",
"channelName": "YouTube",
"channelId": "UCBR8-60-B28hp2BmDPdntcQ",
"channelUrl": "https://www.youtube.com/channel/UCBR8-60-B28hp2BmDPdntcQ",
"durationSeconds": 25,
"thumbnailUrl": "https://i.ytimg.com/vi/8Zk5XzLJSAw/hqdefault.jpg",
"publishedAt": "2026-06-10T22:00:38-07:00",
"likeCount": 1484,
"commentCount": 146,
"requestedQuality": "2k",
"downloadType": "separate_video_audio",
"bestDownloadUrl": "...",
"videoDownloadUrl": "...",
"audioDownloadUrl": "...",
"bestFormat": {
"formatId": "137",
"quality": "1080p",
"resolution": "1080x1920",
"extension": "mp4",
"videoCodec": "avc1.640028",
"audioCodec": null,
"filesizeBytes": 5814217
},
"videoFormat": {
"formatId": "137",
"quality": "1080p",
"resolution": "1080x1920",
"extension": "mp4",
"videoCodec": "avc1.640028",
"audioCodec": null,
"filesizeBytes": 5814217
},
"audioFormat": {
"formatId": "140",
"quality": "tiny",
"resolution": null,
"extension": "mp4",
"videoCodec": null,
"audioCodec": "mp4a.40.2",
"filesizeBytes": 402514
},
"media": {
"mimeType": "video/mp4; codecs=\"avc1.640028\""
},
"availability": {
"downloadLinkStatus": 206,
"downloadContentType": "video/mp4"
}
}

Video-only rows

A video_only row has a video stream in videoDownloadUrl and can leave audioDownloadUrl and audioFormat as null. It uses the same fields as the table above.

💳 Pricing

This Actor uses pay-per-event pricing. You pay for each Short row saved with a download link and metadata. Inputs that do not save a row do not create this event. See the Pricing tab for the current event price.

🔌 Integrations

Use the Apify API to start runs with shortUrls and preferredResolution. You can schedule runs, export datasets, or send completed run data through webhooks.

❓ FAQ

Use Shorts, watch, youtu.be, embed, or live URLs that identify a Short. You can also submit its 11-character video ID.

What happens if I submit the same Short twice?

The first eligible occurrence is saved. Later URLs or IDs for the same video are ignored, so the row describes the first saved match.

Why is the saved quality lower than the quality I requested?

preferredResolution is the highest quality to try. YouTube may not expose that quality, so compare requestedQuality with bestFormat.quality to see what was available.

What does separate_video_audio mean?

It means the saved Short has separate video and audio source links. A playable row has one combined link. A video_only row has only a video stream.

Yes. YouTube controls these source links, and they can expire or return an error later. The Actor checks the main link before saving the row and returns its status and content type in availability.

Can I submit many Shorts in one run?

Yes. The Actor supports a list of unique Shorts in one run. An invalid or unavailable input does not stop the other inputs.

Do I need cookies, a login, or a YouTube API key?

No. The input accepts public Shorts URLs or video IDs. The Actor does not ask for cookies, a YouTube login, or an API key.

Does it search YouTube or download regular videos?

No. Submit Shorts you already know. The Actor does not search YouTube, crawl channels or playlists, or handle regular long videos.

Does it create MP3 files or store media files?

No. It returns source-hosted media links and format details. It does not convert, merge, or store the media files.

Can I use the results in an automated workflow?

Yes. Start runs with the Apify API, schedules, or webhooks. You can also export the dataset as JSON, CSV, Excel, XML, RSS, or HTML.

📝 Changelog

v1.1 (05-09-2026)

  • Reject regular long videos without saving a Short row or charging the Short event.
  • Keep valid Shorts in the same run and report the number of saved rows accurately.
  • Add the publication date, like count, and comment count when YouTube provides them.

v1.0

  • Process batches of Shorts and keep successful rows with direct media links, quality, and metadata.

v0.2

  • Improved default runs for more reliable first results.

v0.1

  • Initial release.

🆘 Support

For issues, questions, or feature requests, file a ticket and I'll fix or implement it in less than 24h 🫡

Made with ❤️ by Maxime Dupré