Instagram Downloader API - Reels, Video & Photo avatar

Instagram Downloader API - Reels, Video & Photo

Pricing

from $0.30 / 1,000 results

Go to Apify Store
Instagram Downloader API - Reels, Video & Photo

Instagram Downloader API - Reels, Video & Photo

Download Instagram photos, videos, Reels and carousel posts from post links or usernames, up to 100 of each per run. Public posts and profiles need no login; add your own cookies for age-restricted posts and private accounts you follow. Each file gets a download link, size, resolution and length.

Pricing

from $0.30 / 1,000 results

Rating

0.0

(0)

Developer

Dataspryva

Dataspryva

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Features

Limited permissions

Share

Save the actual image and video files behind Instagram posts, Reels, IGTV videos and carousels. Paste post links, list a few usernames, or do both, and each file is stored in your run's key-value store with a ready-to-use download link. The dataset adds a record for every file with its source post, owner, file type, dimensions, size and, for videos, length, frame rate and bitrate. It is built for people who need a clean local copy of public Instagram media together with the details needed to catalogue it.

What this actor does

  • Downloads from post links: accepts /p/, /reel/, /reels/ and /tv/ URLs, with or without the username in the path
  • Downloads from usernames: finds the most recent posts and Reels on each profile (up to 100 per profile) and downloads them
  • Splits carousels: every photo or clip in a multi-item post becomes its own file and its own record
  • Describes every file: width, height, aspect ratio, extension and size, plus duration, frame rate, codec and bitrate for videos
  • Gives you a download link: each file is saved under a stable key with a public URL you can open or fetch from your own tools

Authentication

Public posts are downloaded without signing in, and so are the posts of any public profile, however many you ask for: they are listed the way Instagram lists them for a visitor who is not signed in. A profile is always read that way first, even when you give cookies. Only a signed-in view can open posts behind an age check and private accounts your account follows; for those, paste your own Instagram cookies into the optional cookies field (see Using your own cookies below). Without cookies those cases are reported with their status. The actor does not sign in with any account of its own.

Output per media file

One dataset record is created per downloaded file. A carousel with 5 items produces 5 records. A post that could not be downloaded produces one short record with only its post_url and a status that names the cause. The explanation, which post it was and what you can do about it, is in the run log, one line per post, followed by a closing Done: summary. While the run is going, the status message of the run shows a live count such as Downloaded 12/20 posts - 2 need a sign-in.

  • status – success for a downloaded file, otherwise the reason it failed (see the status table below)
  • filename – saved file name including extension, named after the media ID (e.g. 3918833148741120108.jpg)
  • post_url – the Instagram post the file came from
  • username – Instagram handle of the post owner
  • type – image or video (unknown if the file format is not recognised)
  • download_status – finished once the file has been saved
  • downloaded_at – timestamp of the download
  • storage_key – key of the file in the key-value store
  • download_url – public link to the stored file
  • media_meta_data – technical details of the file:
    • width, height – size in pixels
    • aspect_ratio – width divided by height, rounded to 2 decimals
    • ext – file extension (jpg, mp4, ...)
    • filesize_bytes – size on disk in bytes
    • fps – frames per second (videos only)
    • duration – length in seconds (videos only)
    • video_codec – codec identifier such as avc1 (videos only)
    • total_bitrate_kbps – overall bitrate in kilobits per second (videos only)

Any technical detail that cannot be determined for a file is returned as null.

Status of a post or profile that gave no files. The record holds the post_url of the post (or, for a username, authorMeta with the username and profile_url) and one of these status values:

statusMeaning
post_age_restrictedThe post sits behind an age check; it opens only with cookies of an account that may view it
post_is_privateThe post is in a private account; it opens only with cookies of an account that follows it
post_not_foundThe post was deleted, never existed, or is visible only to signed-in users
profile_not_foundThe profile does not exist, or was deleted or suspended
profile_is_privateThe profile is private; it opens only with cookies of an account that follows it
profile_age_restrictedThe profile sits behind an age check ("You must be 18 years old or over"); it opens only with cookies of an account that is old enough
profile_restrictedInstagram hides the profile from visitors who are not signed in ("unavailable for certain audiences"); it may open with cookies
blockedInstagram kept refusing the request after several tries; run it again later
errorSomething unexpected went wrong; the log has the details
invalid_urlThe entry is not an Instagram post link
no_mediaThe post has no photo or video link
download_failedThe post was read but none of its files could be downloaded
no_postsA username you listed has no posts
cookies_unusableA private username needed your cookies and Instagram did not accept them or could not be reached to check them

Input

FieldTypeDefaultDescription
postUrlsarray–Instagram post, Reel or IGTV links to download, up to 10,000. Accepts /p/, /reel/, /reels/, /tv/ and username/p/shortcode formats. Duplicate links are merged into one record.
usernamesarray–Instagram usernames whose recent posts should be downloaded (up to 100). Each entry can be a username, @username or a profile link such as https://www.instagram.com/natgeo/
maxPosts_per_usernameinteger10How many recent posts to download for each username. Range 0–100; 0 downloads nothing from usernames. Posts left out by the two filters below do not count. Public profiles need no sign-in; a private profile needs your cookies
newerThanstring–Optional date (YYYY-MM-DD). Posts of a username published before it are skipped. Empty means no date filter. It must be from 2000-01-01 up to the day before the run, otherwise it is ignored with a warning in the log. Does not apply to links you give. The date is read from the post's id, so it can be off by up to a day
skipPinnedPostsbooleanfalseLeave out the posts a profile has pinned to the top of its grid. Does not apply to links you give. Instagram does not mark pinned posts for a visitor who is not signed in, so they are recognised by their place and date; a pinned post that is also the profile's newest post cannot be told apart and stays in
cookiesstring–Optional. Your own Instagram cookies as JSON, used for age-restricted posts and private accounts your account follows. It is a secret input, so the Apify Console hides and encrypts it

Provide at least one of postUrls or usernames. Posts listed in postUrls are always downloaded, regardless of maxPosts_per_username.

Example: back up one Reel and one photo post

{
"postUrls": [
"https://www.instagram.com/natgeo/reel/DYhkH24lf3j/",
"https://www.instagram.com/leomessi/p/DZifppZj_cB/"
]
}

Example: latest posts from a few official accounts

{
"usernames": ["natgeo", "nasa", "espnfc"],
"maxPosts_per_username": 5
}

Example: deep archive of one brand account

{
"usernames": ["nike"],
"maxPosts_per_username": 100
}
{
"postUrls": ["https://www.instagram.com/leomessi/p/DZifppZj_cB/"],
"usernames": ["natgeo"],
"maxPosts_per_username": 3
}

Using your own cookies

Cookies are optional and only used for what a signed-out visitor cannot see. To add them, export your instagram.com cookies as JSON from a browser where you are signed in, using any cookie-export browser extension, and paste the JSON into the cookies field. The field is a secret input, so the Apify Console hides and encrypts it, and the cookies are used only during your run. Before anything is downloaded with them, the actor asks Instagram whether it recognises the cookies; if they are invalid, expired or signed out, the run log says so and the affected posts are reported without a download. Only paste cookies from an account that belongs to you, and only collect what you are allowed to access. You are responsible for complying with Instagram's terms and applicable law, and a dedicated account is the safer choice.

The cookies field takes a JSON array of cookie objects, the format most cookie-export browser extensions call "JSON". Other export formats are not supported: a Netscape cookies.txt file or a raw Cookie: header string will be rejected. Each cookie needs at least name, value and domain, and the export must include the sessionid and ds_user_id cookies of the signed-in account. A cookie that has an expiry date (expirationDate, in seconds since 1970) must not be expired.

One cookie looks like this (the value shown is a placeholder, paste your own export unchanged):

[
{
"name": "sessionid",
"value": "<your sessionid value>",
"domain": ".instagram.com",
"hostOnly": false,
"path": "/",
"secure": true,
"httpOnly": true,
"sameSite": null,
"session": false,
"firstPartyDomain": "",
"partitionKey": null,
"expirationDate": 1893456000,
"storeId": null
}
]

Treat the cookies like a password: they give access to your Instagram account, so never share them or post them publicly.

Example output

{
"status": "success",
"filename": "3918833148741120108.jpg",
"post_url": "https://www.instagram.com/leomessi/p/DZifppZj_cB/",
"username": "leomessi",
"type": "image",
"download_status": "finished",
"downloaded_at": "2026-07-02T18:46:36.768000",
"storage_key": "3918833148741120108.jpg",
"download_url": "https://api.apify.com/v2/key-value-stores/abc123/records/3918833148741120108.jpg",
"media_meta_data": {
"width": 1080,
"height": 1350,
"ext": "jpg",
"filesize_bytes": 284672,
"aspect_ratio": 0.8
}
}

Known limitations

  • Private accounts need cookies: a private username or a post from a private account opens only with the cookies of an account that follows it. Without cookies, or with cookies of an account that does not follow it, you receive a record with the status post_is_private (a post) or profile_is_private (a username) instead.
  • No Stories: only permanent posts, Reels and IGTV videos are downloaded.
  • Stored files expire: files live in the run's key-value store and follow your Apify plan's data retention. Export anything you need to keep for the long term.
  • Profile depth: a profile yields at most 100 posts per run, and the number actually available depends on how many posts Instagram shows for that profile.

Use cases

  • Social media managers: keep an offline backup of your brand's own posts and Reels before editing or deleting them
  • Content and creative teams: collect user-generated photos and clips from a campaign for review and rights clearance
  • Digital archivists and librarians: preserve public cultural, news or institutional accounts together with file-level details
  • Academics and journalists: build a media sample from named public accounts for research or analysis
  • Video editors and agencies: pull reference footage and measure resolution, duration and bitrate before planning edits
  • Competitive analysts: review the visual style and format mix (photo, carousel, Reel) of rival accounts

Responsible use

Instagram posts that anyone can see can still show or identify real people, and the files this actor saves (faces, voices, locations, captions burned into images) are personal data in many cases. Before downloading, make sure you have a lawful basis (for example under the GDPR) for keeping and processing that media, limit what you keep to what you need, and honour requests from the people shown. Do not use downloaded media to profile, track or target minors, or to single out people by special categories of personal data such as health, religion, political opinion or sexual orientation.

Photos and videos downloaded by this actor belong to their creators. Make sure you have the rights or permission for any reuse.

FAQ

Do I need an Instagram account or cookies to use this actor?

No. Public posts need no sign-in, and neither do the posts of a public username. Only age-restricted posts and private accounts need cookies, and you can paste your own in the optional cookies field.

Do I need to set up a proxy?

No. The actor chooses a working connection to Instagram automatically. Just fill in the input and run it.

Can I download from private accounts?

Yes, with your own cookies from an account that follows the private account. This works for a username (its posts are listed in a signed-in browser) and for a post link. Without cookies, or with cookies of an account that does not follow it, the dataset gets a record with the status post_is_private or profile_is_private and no media.

Yes. Each photo or video in a carousel is downloaded separately and gets its own dataset record and its own key-value store entry, so a 5-item carousel gives you 5 files.

What happens if I set maxPosts_per_username to 0?

No posts are collected from the usernames. Links in postUrls are still downloaded. Use this when you only want to download specific posts.

Where do I find the downloaded files?

Open the run's key-value store: every file is saved there under the storage_key shown in its dataset record. The download_url field gives a direct link to the same file.

Why do some videos have empty technical details?

Fields such as codec or bitrate are measured from the saved file. If a value cannot be determined, it comes back as null while the file itself is still downloaded.

Can I download Stories or highlights?

No. Only posts, Reels and IGTV videos are supported.

How fresh is the data?

Every run reads the posts live, so files and details reflect each post as it is at the time of the run.

Is this affiliated with Instagram or Meta?

No. This is an independent tool and is not affiliated with, endorsed by or sponsored by Instagram or Meta Platforms, Inc.