Export Every Image and Caption From Instagram Carousel Posts
Export every slide image link, slide type and caption from Instagram carousel posts to a CSV, by profile or by post link, with Instagram Post Scraper.
The actor referenced in this article. Pay only for results delivered.
Carousels are where brands and publishers put their most worked-on content: step-by-step explainers, product lineups, photo essays. Design teams keep the good ones in a swipe file, and researchers want the slides as image files with the caption attached. Instagram lets you swipe through a carousel, not export it, so saving a 20 slide post by hand means 20 screenshots plus a copied caption.
Try it live: Instagram Post Scraper: Photos, Carousels, Likes, No Login. Pay per result delivered. Failed and empty results are never charged.
The Instagram Post Scraper returns each carousel as one row, with an images list holding every slide’s image link in order and a childPosts list with each slide’s type, size and video link. You can filter a profile’s grid down to carousels only, paste the links of the carousels you want, or do both in one run.
What you get and who it is for
| Field | What it holds |
|---|---|
images | Every slide’s image link, in slide order; for a video slide, its cover frame |
childPosts | Per slide: type, id, displayUrl, videoUrl for a video slide, width, height, taggedUsers |
carouselCount | Number of slides |
caption, hashtags, mentions | The post’s caption, one per carousel |
alt | Instagram’s automatic description of the image |
likesCount, commentsCount, timestamp | How the carousel did and when it went up |
ownerUsername, coauthorProducers | Who posted it and who coauthored it |
It suits designers building a swipe file, content marketers studying how competitors structure their carousels, and researchers who need images with captions and engagement attached.
The input
{
"usernames": ["nasa", "natgeo"],
"postTypes": ["carousel"],
"maxPostsPerProfile": 30,
"postUrls": ["https://www.instagram.com/p/DdHyaYAifb6/"]
}
postTypesset tocarousel(shown in the form as Carousel, several photos or videos) keeps only carousels from the profiles. With a type filter the actor reads up to three times more of each grid to find matches, and you pay only for the posts it returns, so an account that rarely posts carousels can come back with fewer than 30.maxPostsPerProfileis the number of posts to return per profile, from 10 to 300.postUrlstakes up to 1,000 links to single posts. The type filter applies to profiles only, so each link returns its full row whatever it is; the script below skips any link that turns out not to be a carousel.- A carousel that comes back both from a profile and from a link is delivered and charged once.
What the output looks like
{
"inputUrl": "nasa",
"source": "profile",
"shortCode": "DeKe6teEpya",
"url": "https://www.instagram.com/p/DeKe6teEpya/",
"type": "Sidecar",
"productType": "carousel_container",
"caption": "Warning: These slides may cause existential wonder...",
"hashtags": ["GoogleDoodle"],
"alt": "Photo by Google on October 06, 2026. May be an image of text.",
"likesCount": 124733,
"commentsCount": 638,
"timestamp": "2026-10-06T18:59:05.000Z",
"ownerUsername": "google",
"ownerFullName": "Google",
"carouselCount": 20,
"childPosts": [
{ "type": "Video", "id": "4002147050057771603", "width": 1080, "height": 1440, "taggedUsers": ["nasa", "nasawebb"] },
{ "type": "Image", "id": "4002147004007844113", "width": 1440, "height": 1920, "taggedUsers": [] }
],
"coauthorProducers": ["nasawebb", "nasa"]
}
This row is from our run on natgeo and nasa on October 7, 2026, with all three post types on. The 20 slide carousel was posted by Google with nasa and nasawebb as coauthors, which is why it appeared on nasa’s grid. Its first slide is a video: the childPosts entry carries a videoUrl, and images holds that slide’s cover frame, so the real row has 20 image links for 20 slides. We dropped those links and each slide’s displayUrl from the sample because every signed link runs to several hundred characters. Across our five runs, 15 different carousels came back with 108 slides between them, from 2 to 20 slides each.
Run it in Apify Console
- Open https://apify.com/themineworks/instagram-post-scraper and click Try for free.
- In Instagram profiles, enter the accounts whose carousels you want.
- In Post types, keep only Carousel and remove Single photo and Video or reel. Set Max posts per profile to 30.
- In Post links, paste any single carousel links you also want.
- Click Start and check the Output tab when the run finishes.
- Click Export and download JSON, CSV or Excel. JSON keeps
imagesandchildPostsas lists; for one row per slide, use the script below.
Run it from Python
Install the client with pip install apify-client. The script writes one CSV row per slide, with the post’s caption and likes repeated on each slide row.
import csv
from apify_client import ApifyClient
FIELDS = ["shortCode", "post_url", "owner", "posted", "slide", "slides_total",
"slide_type", "width", "height", "image_url", "video_url",
"likes", "caption", "alt"]
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("themineworks/instagram-post-scraper").call(run_input={
"usernames": ["nasa", "natgeo"],
"postTypes": ["carousel"],
"maxPostsPerProfile": 30,
"postUrls": ["https://www.instagram.com/p/DdHyaYAifb6/"],
})
slides = []
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
if item.get("_type") == "info":
continue # the run summary row, never billed
if item.get("type") != "Sidecar":
continue # a pasted link that is a single photo or a video
images = item.get("images") or []
children = item.get("childPosts") or []
for n, image_url in enumerate(images, start=1):
child = children[n-1] if n <= len(children) else {}
slides.append({
"shortCode": item["shortCode"],
"post_url": item["url"],
"owner": item["ownerUsername"],
"posted": item["timestamp"][:10],
"slide": n,
"slides_total": item.get("carouselCount", len(images)),
"slide_type": child.get("type", ""),
"width": child.get("width", ""),
"height": child.get("height", ""),
"image_url": image_url,
"video_url": child.get("videoUrl", ""),
"likes": item.get("likesCount"),
"caption": item.get("caption", ""),
"alt": item.get("alt", ""),
})
with open("carousel_slides.csv", "w", newline="", encoding="utf-8") as f:
writer = csv.DictWriter(f, fieldnames=FIELDS)
writer.writeheader()
writer.writerows(slides)
carousels = {s["shortCode"] for s in slides}
print(f"{len(slides)} slides from {len(carousels)} carousels written to carousel_slides.csv")
On the Google carousel above, that gives 20 rows: one video slide at 1080 by 1440 and 19 image slides at 1440 by 1920, each with the same caption. If you need the image files, fetch the image_url values right after the run, since the links expire within a few days. Designers who would rather ask than script can run the same actor as a tool inside Claude or Cursor.
Collect new carousels every week
In Apify Console, save the input as a task with Only posts newer than set to 7 days, open Schedules, create a schedule with the cron expression 0 7 * * 1 (every Monday at 07:00) and add the task. The schema has no “only new posts” option; the date window does that job, and reading a profile stops at the first older post. Because the image links expire, a weekly run is also the simplest way to keep fresh links for the newest carousels.
For delivery, Apify’s Google Sheets integration can send each run’s dataset to a sheet for the design team, Make, Zapier or n8n can post new carousels to a Slack channel, and a webhook can trigger your own service to download the images as soon as the run succeeds.
What it costs
The price is $1.49 per 1,000 posts on the Bronze plan, $1.29 on Silver, and $0.99 on Gold, Platinum and Diamond, plus a flat $0.005 run start fee per run. A carousel is one post whatever its slide count, and posts filtered out by type are not charged.
Three accounts at 30 carousels each is 90 posts: about $0.13 on Bronze, $0.12 on Silver and $0.09 on Gold, plus $0.005 to start the run. At the 7.2 slides per carousel we saw in our sample, that is roughly 650 image links.
Limits worth knowing
- One caption and one
altper carousel. There is no per slide caption, because Instagram does not store one. - Image and video links are signed by Instagram and expire after a few days.
postTypesfilters profiles only. Pasted links always return their row, so checktypeforSidecar.- Up to 300 posts per profile and 1,000 post links per run. Hashtag and keyword search need a login, which this actor never uses.
- Private accounts return no posts. They are listed in the run’s
OUTPUTrecord and not charged.
Related
Explore the scraper referenced in this article: inputs, outputs, and pricing, then run it on Apify.
Frequently asked questions
Does each carousel slide have its own caption? +
No. Instagram stores one caption per carousel, and the actor returns it on the post row. The alt field, Instagram's automatic description of the image, is also one per post.
What do I get for a video slide? +
Its childPosts entry has type Video and a videoUrl for the MP4 file, and the images list holds the slide's cover frame, so images has one link per slide.
Does a 20 slide carousel cost more than a single photo? +
No. Pricing is per post, so every slide, image link and video link in a carousel is included in that one post's price.
How long do the image links work? +
Instagram signs its media links and they expire after a few days. Download the images you want to keep soon after the run, or run it again for fresh links.
Find Paid Partnership Posts on Any Instagram Profile
List the paid partnership and branded posts on any public Instagram profile, and the brands behind them, using Instagram Post Scraper and Python.
Export a Creator's Instagram Reels With Play Counts to a Spreadsheet
Export one creator's reels with plays, likes, comments, length and audio to a CSV, then compute median plays to vet them, with Instagram Reel Scraper.
Export a YouTube Video's Comments and Replies to CSV
Pull a YouTube video's comments and their replies into one CSV with YouTube Comments Scraper, each thread rebuilt from parent_comment_id.
Track Competitor Instagram Reels Weekly With View Counts
Log every new reel your competitors post each week, with plays, likes and audio, using Instagram Reel Scraper on a weekly Apify schedule.