Instagram Downloader API
Pricing
from $4.50 / 1,000 instagram medias
Instagram Downloader API
Download media URLs from public Instagram posts, reels, TV links, or usernames. Export direct media links, thumbnails, captions, engagement counts, source URLs, and publication times.
Pricing
from $4.50 / 1,000 instagram medias
Rating
0.0
(0)
Developer
Maxime Dupré
Maintained by CommunityActor stats
1
Bookmarked
63
Total users
15
Monthly active users
4 days ago
Last modified
Categories
Share
📥 Collect public Instagram media links
Instagram Downloader API helps creators, researchers, and developers collect direct media links from known public Instagram posts, reels, TV pages, or usernames. It saves one structured dataset row for each eligible media item, with source links and public post details, so you can review, archive, or process the links later.
Use public pages without Instagram cookies, a login, or an Instagram API key. For a shorter first run, use one or two URLs or set a small recent-post count.
Use it for content review, research, reporting, archiving, social media operations, or an API workflow.
Try these task examples
- Collect media from up to 100 known public URLs in one run with Instagram Bulk Downloader.
- Save each exposed carousel item as a separate dataset row with Instagram Carousel Downloader.
- Get a source-hosted link for a public photo post with Instagram Photo Downloader.
- Get a source-hosted link and post details from a public reel with Instagram Reel Downloader.
- Get a source-hosted link and post details from a public post with Instagram Post Downloader.
📦 Public media rows
What you get
Each saved row is one eligible public Instagram media item. A true carousel post can create one row for each media item Instagram exposes. An ordinary single-media post has carousel_count set to null. media_index and carousel_count keep carousel rows tied to the parent post. Public values that Instagram does not expose are saved as null or empty arrays.
▶️ Run from URLs or usernames
Run steps
- Choose Post, reel, or TV URLs to process known links, or choose Instagram usernames to find recent public posts.
- In URL mode, add 1 to 100 public Instagram post, reel, or TV URLs.
- In username mode, add one or more usernames without
@. You can set Recent posts per username to a positive number. Leave it empty to return all available results until the source is exhausted. - Start the Actor, open the dataset, and use
download_urlfor the source-hosted media link orsource_urlto trace the row to Instagram.
For a small first run, keep the prefilled public Instagram reel URL.
⚙️ Input
Input fields
| Field | Type | What it does |
|---|---|---|
discoveryMethod | string | Selects urls for known public post, reel, or TV links, or usernames for recent public post discovery. |
urls | array of strings | Adds 1 to 100 public Instagram post, reel, or TV URLs. Used in URL mode and ignored in username mode. |
usernames | array of strings | Adds one or more Instagram usernames without @. Used in username mode and ignored in URL mode. |
recentPostsPerUsername | integer | Sets the positive number of recent public posts to collect per username. Leave it empty to return all available results until the source is exhausted. Used in username mode and ignored in URL mode. |
Public URL forms include https://www.instagram.com/p/SHORTCODE/ and https://www.instagram.com/username/reel/SHORTCODE/.
Example input
This is the public input from a successful hosted run:
{"discoveryMethod": "urls","urls": ["https://www.instagram.com/kyliejenner/reel/DRP7Cajkpn9/","https://www.instagram.com/reel/DXhdA58CMDa/","https://www.instagram.com/reel/DYIYFhOSzis/","https://www.instagram.com/reel/CAErDMyHnMO/","https://www.instagram.com/reel/DTY8VWgkuzK/"]}
Access limits
The Actor works with public Instagram post, reel, and TV pages, plus recent public posts found from supplied usernames. Private, deleted, or login-only pages, stories, highlights, hashtag and keyword searches, location pages, follower or following lists, comment-only pages, and arbitrary non-Instagram pages are outside its scope.
🧾 Output
The output link opens the default dataset. Every dataset row has the same shape for a photo, video, or carousel media item. A direct media link is source-hosted, so it can expire or change after the run.
Output fields
| Field | Type | What it does |
|---|---|---|
results | string | Opens the saved dataset for this run. |
input_url | string | The Instagram URL submitted for this row. |
source_url | string | The public Instagram post URL for this row. |
shortcode | string | The shortcode of the Instagram post that contains this media. |
raw_media_id | string or null | The source media ID when Instagram exposes it. |
media_type | string | The media type, either photo or video. |
media_index | integer | The zero-based position of this media in its post. |
carousel_count | integer or null | The number of media items when the post is a true carousel. It is null for an ordinary single-media post. |
download_url | string | The source-hosted URL for the media file. |
thumbnail_url | string or null | The source-hosted thumbnail URL when Instagram exposes one. |
username | string or null | The username of the account that posted this media when exposed. |
caption | string or null | The post caption when Instagram exposes it. |
like_count | integer or null | The public number of likes when Instagram exposes it. |
comment_count | integer or null | The public number of comments when Instagram exposes it. |
view_count | integer or null | The public number of views or plays when Instagram exposes it. |
taken_at | string or null | The post publication time when Instagram exposes it. |
width | integer or null | The media width in pixels when Instagram exposes it. |
height | integer or null | The media height in pixels when Instagram exposes it. |
file_extension | string or null | The media file extension when available. |
comments_preview | array of objects | A short list of public comment previews when Instagram exposes them. |
comments_preview[].text | string | The text of a public comment preview. |
comments_preview[].username | string or null | The username that wrote the comment when exposed. |
file_size_bytes | integer or null | The media file size in bytes when available. |
duration_seconds | number or null | The media duration in seconds when available. |
frame_rate | number or null | The video frame rate when available. |
codec | string or null | The media codec when available. |
bitrate_bps | integer or null | The media bitrate in bits per second when available. |
Example single-media row
This genuine row is from a successful hosted run and is shown in full.
{"input_url": "https://www.instagram.com/kyliejenner/reel/DRP7Cajkpn9/","source_url": "https://www.instagram.com/p/DRP7Cajkpn9/","shortcode": "DRP7Cajkpn9","raw_media_id": "3769491063829600765","media_type": "video","media_index": 0,"carousel_count": null,"download_url": "https://scontent-arn2-1.cdninstagram.com/o1/v/t2/f2/m86/AQNowtAuMfosQvXvM_U0z2-qJynbz0TdQmG1U8QeDl0LUhFcrfsgp3ewj4Ztk7KTFX0bm6Qu4AVGuLBNqo6txtvwHuT_fEBGoxGR0fg.mp4?_nc_cat=111&_nc_sid=5e9851&_nc_ht=scontent-arn2-1.cdninstagram.com&_nc_ohc=KLZfV6-5E9wQ7kNvwGlaNGt&efg=eyJ2ZW5jb2RlX3RhZyI6Inhwdl9wcm9ncmVzc2l2ZS5JTlNUQUdSQU0uQ0xJUFMuQzMuNzIwLmRhc2hfYmFzZWxpbmVfMV92MSIsInhwdl9hc3NldF9pZCI6MTUzODcwNDkzMDQ5OTIyMCwiYXNzZXRfYWdlX2RheXMiOjI4OCwidmlfdXNlY2FzZV9pZCI6MTAwOTksImR1cmF0aW9uX3MiOjg2LCJ1cmxnZW5fc291cmNlIjoid3d3In0%3D&ccb=17-1&vs=1a8a9f296cc734e0&_nc_vs=HBksFQIYUmlnX3hwdl9yZWVsc19wZXJtYW5lbnRfc3JfcHJvZC83MDQzRjg1NEQ1RkVGMjI0RDJCODFDRTAwMjg1NzJBN192aWRlb19kYXNoaW5pdC5tcDQVAALIARIAFQIYR2lnX3hwdl9yZWVsc19wZXJtYW5lbnRfc3JfcHJvZC8yMTI2OTIzNTkxMTczNjgxXzMzMDcyMTQxNDA5NTc5ODA1NDkubXA0FQICyAESACgAGAAbAogHdXNlX29pbAExEnByb2dyZXNzaXZlX3JlY2lwZQExFQAAJqiq34y13LsFFQIoAkMzLBdAVYIcrAgxJxgSZGFzaF9iYXNlbGluZV8xX3YxEQB1_gdl5p0BAA&_nc_gid=PKssW5r7KYd7HURM69qRzg&_nc_ss=73689&_nc_zt=28&oh=00_AQJa3ZPL8Ii6nFXGcgFLPwRfk5fcjFrSHGX2Ctb1Do9anA&oe=6A9B8D2C","thumbnail_url": "https://scontent-arn2-1.cdninstagram.com/v/t51.71878-15/582080440_1374751327366750_1331460171701662848_n.jpg?stp=dst-jpg_e15_tt6&_nc_cat=109&ig_cache_key=Mzc2OTQ5MTA2MzgyOTYwMDc2NTE1Mzg3MDU2NjA0OTkxNDc%3D.3-ccb7-5&ccb=7-5&_nc_sid=58cdad&efg=eyJ2ZW5jb2RlX3RhZyI6IkNMSVBTLnhwaWRzLjY0MC5zZHIudmlkZW9fbmZyYW1lX2NvdmVyX2ZyYW1lLkMzIn0%3D&_nc_ohc=iYifU2J-HM4Q7kNvwHI8cGt&_nc_oc=AdpQrqAaEIgpm-lGJ99i7U72CKgzkFS-DRJvRqpHg6RjcYCF8NzLvrbKZsgrqrM9WSA&_nc_zt=23&_nc_ht=scontent-arn2-1.cdninstagram.com&_nc_gid=PKssW5r7KYd7HURM69qRzg&_nc_ss=73689&oh=00_AQL7s3mDPH7thBoL67NIFAcH5WPoxUoySNRNZy25OfVNzA&oe=6A9F9D9A","username": "kyliejenner","caption": "obsessed @smashkitchen","like_count": 860731,"comment_count": 7237,"view_count": null,"taken_at": "2025-11-19T18:54:29.000Z","width": 640,"height": 1136,"file_extension": "mp4","comments_preview": [{"text": "3","username": "mark24709033"},{"text": "🖤❤️","username": "jasonlomboleni"},{"text": "😍😍😍","username": "timo.rl26"},{"text": "Doing faithfully 😍with love 💕😘","username": "ralph.wendling"},{"text": "😭","username": "c3xa_"},{"text": "King Kong","username": "simwickk2"},{"text": "@kyliejenner Look how fun to see I wrote your name in small 😂😂","username": "simwickk2"},{"text": "Idk What youre talking about im just here to look @ you 😂","username": "simwickk2"},{"text": "Fun ✨🩷💚💚🩷🥕","username": "scottiedwaynecolombiano_"},{"text": "🧘🏿♂️🤯","username": "scottiedwaynecolombiano_"}],"file_size_bytes": 14827671,"duration_seconds": 86.03333333333333,"frame_rate": 30,"codec": "avc1","bitrate_bps": 1378784}
Example carousel row
This genuine row is from a successful hosted carousel run and is shown in full.
{"input_url": "https://www.instagram.com/p/CQdSTP1CJ5z/","source_url": "https://www.instagram.com/p/CQdSTP1CJ5z/","shortcode": "CQdSTP1CJ5z","raw_media_id": "2602316638158678060","media_type": "photo","media_index": 0,"carousel_count": 5,"download_url": "https://scontent-ord5-1.cdninstagram.com/v/t51.82787-15/656867347_18116750920568962_1668093009637522885_n.jpg?stp=dst-jpg_e35_tt6&_nc_cat=111&ig_cache_key=MjYwMjMxNjYzODE1ODY3ODA2MA%3D%3D.3-ccb7-5&ccb=7-5&_nc_sid=58cdad&efg=eyJ2ZW5jb2RlX3RhZyI6IkNBUk9VU0VMX0lURU0ueHBpZHMuMTA4MC5zZHIucmVndWxhcl9waG90by5DMyJ9&_nc_ohc=irxk11fRqf0Q7kNvwHogPQR&_nc_oc=Adr4BliGR4WD_tTpkrr4L3oDxc5pIHwyINBxyVTirzNVB9cK0ykcfXG-F_oxlWaj6e4&_nc_zt=23&_nc_ht=scontent-ord5-1.cdninstagram.com&_nc_gid=mZA8SRhz2KOf__5ad3OSYg&_nc_ss=73689&oh=00_AQKDA25jnkTFmUiiE571YJ0DtKvq2FZZx3d_2aXxxifJGA&oe=6A9F9A8F","thumbnail_url": "https://scontent-ord5-1.cdninstagram.com/v/t51.82787-15/656867347_18116750920568962_1668093009637522885_n.jpg?stp=dst-jpg_e35_tt6&_nc_cat=111&ig_cache_key=MjYwMjMxNjYzODE1ODY3ODA2MA%3D%3D.3-ccb7-5&ccb=7-5&_nc_sid=58cdad&efg=eyJ2ZW5jb2RlX3RhZyI6IkNBUk9VU0VMX0lURU0ueHBpZHMuMTA4MC5zZHIucmVndWxhcl9waG90by5DMyJ9&_nc_ohc=irxk11fRqf0Q7kNvwHogPQR&_nc_oc=Adr4BliGR4WD_tTpkrr4L3oDxc5pIHwyINBxyVTirzNVB9cK0ykcfXG-F_oxlWaj6e4&_nc_zt=23&_nc_ht=scontent-ord5-1.cdninstagram.com&_nc_gid=mZA8SRhz2KOf__5ad3OSYg&_nc_ss=73689&oh=00_AQKDA25jnkTFmUiiE571YJ0DtKvq2FZZx3d_2aXxxifJGA&oe=6A9F9A8F","username": "gencat","caption": "«La nit de Sant Joan és nit d’alegria.» Aquesta revetlla, amb responsabilitat:\n\n👨👩👧👧 Celebra-la en grups reduïts i mantén les mesures de protecció.\n🌳 Prioritza espais a l'aire lliure o ben ventilats.\n🧨 El gel hidroalcohòlic i la pirotècnia són del tot incompatibles.\n🚘 0,0 és l'única taxa segura. Es faran controls d'alcohol i drogues.\n🚉 La xarxa de metro i TRAM ofereix servei ininterromput, i FGC, fins a les 2h.\n\nBona revetlla! 🎉\n\n#SantJoan #revetlla #cultura #petards #fogueres #gencat","like_count": 446,"comment_count": 3,"view_count": null,"taken_at": "2021-06-23T09:25:40.000Z","width": null,"height": null,"file_extension": "jpg","comments_preview": [{"text": "No serveixen de res aquests consells. A tot arreu es segueixen tirant petards, sense tenir en compte la distància als habitatges ni vehicles. Les persones amb problemes de salut mental i els animals pateixen molt i l'angoixa dura un grapat d'hores.","username": "carmequeralto"},{"text": "No serveixen de res aquests consells. A tot arreu es segueixen tirant petards, sense tenir en compte la distància als habitatges ni vehicles. Les persones amb problemes de salut mental i els animals pateixen molt i l'angoixa dura un grapat d'hores.","username": "carmequeralto"}],"file_size_bytes": null,"duration_seconds": null,"frame_rate": null,"codec": null,"bitrate_bps": null}
💳 Pricing
This Actor uses pay-per-event pricing. The primary event covers each public media link saved to the dataset. A separate run-start event is charged once when the Actor run starts. Apify shows the price for your plan before you start.
🔌 Integrations
Open or export the dataset as JSON, CSV, Excel, XML, RSS, or HTML, or read it through the Apify API. You can also schedule runs or connect the dataset to Apify webhooks.
❓ FAQ
What does one saved row represent?
One row represents one eligible public Instagram media item. A carousel can create several rows, with media_index and carousel_count showing each item's place in the post.
Can I use username mode instead of URLs?
Yes. Choose Instagram usernames, add names without @, and optionally set Recent posts per username. Leave that limit empty to return all available results until the source is exhausted.
Can I use this for Instagram reels?
Yes. Add a public reel URL in URL mode. The row includes a source-hosted download_url when Instagram exposes one.
What happens when a URL is private, deleted, or unavailable?
Those pages may be unavailable to the Actor. The run continues with rows already saved and can finish with zero or partial rows. Check the run log for warnings and saved counts, then open the dataset link. Missing public values are not guessed.
Are the media links permanent?
No. download_url and thumbnail_url point to URLs hosted by Instagram. They can expire or change, so use or store them soon after the run.
Does the Actor store the media files?
No. It returns source-hosted media links and structured metadata in the dataset. It does not mirror the files in Actor storage.
Do I need an Instagram login or API key?
No. Submit public Instagram URLs or usernames without buyer-supplied Instagram cookies, a login, or an Instagram API key.
Can I call the Actor through the Apify API?
Yes. The run returns a standard Apify dataset that you can read through the Apify API or export in common formats.
Can I use Instaloader Python instead?
Instaloader Python is a separate tool that you run yourself. This Instagram downloader API runs in Apify and saves structured rows from public URLs or usernames.
📝 Changelog
v1.0
- Add recent public-post discovery by Instagram username alongside direct URLs.
- Show running saved-media counts in progress logs and include richer media details in the dataset.
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 🫡
🔗 Related Actors
- Instagram Reels Audio Downloader - Extract audio links from public Instagram Reels when you need sound instead of video.
- Instagram Profile Stats Scraper - Collect public profile stats and recent post previews before choosing media URLs.
- TikTok Video Downloader - Get direct media links and public metadata from known TikTok video URLs.
- Facebook Media Downloader - Get direct source-hosted links from public Facebook videos, reels, and photos.
- Telegram Media Downloader - Get direct links to photos, videos, or audio from public Telegram posts.
Made with ❤️ by Maxime Dupré