Instagram Highlights Scraper avatar

Instagram Highlights Scraper

Pricing

from $2.99 / 1,000 results

Go to Apify Store
Instagram Highlights Scraper

Instagram Highlights Scraper

Instagram Highlights Scraper — Extract Instagram Highlight data including titles, cover images, story URLs, media, timestamps, usernames, and profile details. Useful for content research, competitor analysis, social media monitoring, and audience insights.

Pricing

from $2.99 / 1,000 results

Rating

0.0

(0)

Developer

Social Data API

Social Data API

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

3 days ago

Last modified

Categories

Share

Instagram Highlights Scraper — Titles, Cover Images and Highlight IDs

Instagram Highlights Scraper pulls the story highlights from public Instagram profiles and returns each one as its own row. You get the highlight title, highlight ID, cover image link, a full-size cover image where Instagram provides one, the number of stories in each highlight, account ID, username and whether the account is private. Every response is structured JSON — ready to pass directly to an LLM, index into a vector store, or feed a brand monitoring pipeline. No Instagram account or cookies needed. Start with one brand you follow, then add every competitor to the same run.


What data can I extract with Instagram Highlights Scraper?

Using this Instagram Highlight API, you will be able to extract the following Instagram highlight data:

🔗 Profile URL👤 Username🆔 Account ID⭐ Highlight ID
📝 Highlight title📷 Cover image (150×150)🖼️ Full-size cover image🔢 Stories in highlight
🔒 Private account flag✅ Success flag
📶 Status (confirmed / partial / unconfirmed / private / not found)❗ Reason (when a profile has no highlights or fails)🕒 Time the row was saved

How to use Instagram Highlights Scraper

Marketers, analysts and AI builders use it to scrape Instagram highlights from any list of public profiles; one run returns every highlight on each profile you enter.

Copy to your AI assistant:

Instagram Highlights Scraper (Apify Actor ID: socialdataapi/instagram-highlights-scraper, https://apify.com/socialdataapi/instagram-highlights-scraper) is an Apify Actor that returns the story highlights shown on public Instagram profiles as structured JSON: profile URL, username, account ID, highlight ID, highlight title, cover image link, full-size cover image link (cover_media_full_res, null when Instagram provides no larger version), number of stories in the highlight (story_count, null when unavailable), private-account flag, status, success flag and reason. Use it whenever someone needs Instagram highlights without cookies, a login, or a browser - auditing how a brand organises its highlights, comparing competitors' highlight titles and covers, or keeping a dated archive of highlight covers. Inputs: startUrls (array of strings, required, Instagram profile URLs, @handles or usernames, no default) and proxyConfiguration (object, informational only — this actor always uses Apify RESIDENTIAL proxy, prefilled with {"useApifyProxy": true}). Each highlight is one row with success true, status "ok" and is billed as one row_result event; a profile with no confirmed highlights, a private profile or a profile that cannot be read returns one row with success false, empty highlight fields and a plain reason in error, and that row is not charged. The status field distinguishes a confirmed zero ("ok") from a profile Instagram blocked and that could not be confirmed either way ("unknown") or where some real highlights were recovered but there may be more ("partial") — it never reports a confirmed "no highlights" unless that is actually confirmed. Highlights of private profiles are not available because they need a logged-in follower, and cover_media is the small 150x150 version, with cover_media_full_res giving the largest version of the same image when Instagram provides one.

Instagram Highlights Scraper MCP Server: use these Actors from ChatGPT, Claude or Cursor

Point your AI assistant at the Apify MCP server with this Actor preloaded as a tool, and it can run it on its own. No glue code, no scraping logic in your prompts.

$claude mcp add --transport http apify "https://mcp.apify.com?tools=socialdataapi/instagram-highlights-scraper"

Step by step

  1. Create a free Apify account.
  2. Open Instagram Highlights Scraper in the Apify Store.
  3. Enter the Instagram profile URL, @handle or username (with or without @).
  4. Click Start (or send your API request).
  5. Download or stream your results in JSON, CSV or Excel.

How to scale Instagram Highlights Scraper to bulk

To collect bulk Instagram highlights, put every profile into the profile list: one URL, @handle or username per line, as many as you need in a single run. Profiles are read one after another, and each profile's highlights are saved as soon as that profile is done, so rows appear while the run is still going. Repeated usernames are removed automatically, whatever their capitalisation. For regular checks, save your input as a task and attach an Apify schedule, or start runs from your own code through the Apify API and loop over your lists.


✨ Features

Instagram Highlights Scraper fetches clean, structured highlights from Instagram ⚡. It works as an Instagram story highlights scraper for brand audits, competitor research, content planning and highlight archives.

It extracts, per highlight:

  • Highlight title – the name shown under the highlight circle on the profile
  • Highlight ID – the unique ID Instagram gives each highlight
  • Cover image – a link to the highlight's cover picture (150×150)
  • Username and account ID – the account that owns the highlight
  • Full-size cover image – the largest version of the same cover picture, when Instagram provides one (highlights with a separately uploaded custom cover only have the small version, so this is empty for them)
  • Stories in highlight – how many stories are saved in the highlight
  • Private account flag – whether the profile is private
  • Status and reason – a success flag, a status (confirmed zero, partial, unconfirmed, private, not found, failed), plus a plain reason for profiles without highlights or with errors

⚡ No Instagram account or cookies needed, and profiles without highlights or with errors still get a row (not charged) instead of disappearing. When Instagram blocks the highlights feed for a profile, the actor never guesses: it reports exactly what it could confirm — the real highlights it did recover (marked partial if there may be more), a confirmed zero, or an honest "could not confirm" instead of a false "no highlights."


Use cases 💡

  • Social media manager — review Instagram highlight covers across brand accounts for visual consistency.
  • Competitive analyst — compare Instagram highlight titles across competitors to spot campaign themes.
  • Agency account lead — flag client profiles that went private or lost their highlights.
  • Digital archivist — keep a dated record of highlight covers using each row's save time.
  • AI engineer — feed highlight titles into an LLM to summarise a brand's story strategy.

Building an AI agent? Connect Instagram Highlights Scraper over MCP and let it call the actor on its own.


Why choose this actor?

  • Every highlight on a profile, one row each. A recorded run read 4 profiles in 5.2 seconds and saved 6 highlights, plus one row for a profile without highlights and one for a missing account.
  • The details behind each highlight. A recorded highlight from Nike came back with its title "Just Do It", its highlight ID, a 150×150 cover image link and the account ID 13460080.
  • One list, any input style. This Instagram highlights extractor accepts profile URLs, @handles and plain usernames in the same list, and every row carries the same 13 fields.
  • Honest about what it could confirm. If Instagram blocks part of the highlights feed for a profile, the actor still returns every real highlight it did recover (marked partial) instead of silently reporting it as zero, and it never claims a confirmed "no highlights" when it could not actually check — it says so (unknown) instead.

⬇️ Input

The actor takes a list of Instagram profiles in startUrls (required). Each entry can be a profile URL, an @handle or a plain username, and you can mix them:

  • https://www.instagram.com/nasa/
  • instagram.com/nasa
  • @nasa
  • nasa
ParameterRequiredTypeDescriptionExample value
startUrlsYesarrayProfiles to read: profile URLs, @handles or usernames, one per line. No default; the form is prefilled with one example profile. A story link (instagram.com/stories/username/…) reads that user's highlights like a profile; links to single posts or reels are skipped.["https://www.instagram.com/nike/", "@nasa"]
proxyConfigurationNoobjectInformational only. This actor always uses Apify RESIDENTIAL proxy from the first request, with a fresh residential IP per profile and up to 3 more on a block; other proxy choices here are ignored.{"useApifyProxy": true}

Free plan limits

Users on the Apify free plan can fetch up to 20 highlights per run (all profiles together) and 200 highlights per month. When the limit is reached, the run finishes successfully with a status message explaining the limit. Upgrade to any paid Apify plan to remove these limits.

Example input

{
"startUrls": [
"https://www.instagram.com/nike/",
"@nasa",
"natgeo",
"thisuserdoesnotexist_zz9q71"
],
"proxyConfiguration": {
"useApifyProxy": true
}
}

⬆️ Output

Every highlight is one typed, normalized JSON item with the same 13 fields on every run, and you can export Instagram highlights to CSV, Excel or JSON (the default). A profile with no highlights, a private profile or a profile that cannot be read gets one extra item with the success flag set to false and a plain reason; those items are not charged. If Instagram blocks part of the highlights feed for a profile, you still get every real highlight recovered (status: "partial" on an extra info row) instead of that profile silently coming back empty.

Example output

[
{
"input_url": "https://www.instagram.com/mrbeast/",
"username": "mrbeast",
"user_id": "2278169415",
"id": "highlight:18009512485955420",
"title": "Cool Peeps",
"cover_media": "https://scontent.cdninstagram.com/v/t51.82787-15/560556591_18028473923529556_1805717050099827259_n.jpg?stp=c0.5x0.5f_dst-jpg_e35_p150x150_tt6_u&_nc_cat=1&ccb=7-5&_nc_sid=18de74&efg=eyJlZmdfdGFnIjoiU1RPUlkuYmVzdF9pbWFnZV91cmxnZW4uQzMifQ%3D%3D&_nc_ohc=JiuBClJInr4Q7kNvwHxKr_U&_nc_oc=Ado5tbFqrB7fGHoVntXYGASpUB3a5VR9ic9WmNkdsmkoJL0ZPCRlcTqRtyOBTl7kJmc&_nc_zt=23&_nc_ht=scontent.cdninstagram.com&_nc_gid=5P68MwIaYR1n26V-Bsbl-Q&_nc_ss=7b689&oh=00_AQOsktct-hAE7IV07lorSyBDsC79wH1qS8z44MSDGVKzYA&oe=6AD68DF0",
"cover_media_full_res": "https://instagram.fdac8-1.fna.fbcdn.net/v/t51.82787-15/560556591_18028473923529556_1805717050099827259_n.jpg?stp=dst-jpg_e35_tt6&_nc_cat=1&ig_cache_key=MzMwMDc2MzcxNTI4MDEyOTMxNw%3D%3D.3-ccb7-5&ccb=7-5&_nc_sid=58cdad&efg=eyJ2ZW5jb2RlX3RhZyI6IlNUT1JZLnhwaWRzLjEyODQuc2RyLnJlZ3VsYXJfcGhvdG8uQzMifQ%3D%3D&_nc_ohc=JiuBClJInr4Q7kNvwHxKr_U&_nc_oc=Ado5tbFqrB7fGHoVntXYGASpUB3a5VR9ic9WmNkdsmkoJL0ZPCRlcTqRtyOBTl7kJmc&_nc_ad=z-m&_nc_cid=0&_nc_zt=23&_nc_ht=instagram.fdac8-1.fna&_nc_gid=Ubn_p4etGmo-Wp3K5pXMbw&_nc_ss=7a22e&oh=00_AQNhTZ6llTzRnys0z747YtCf0E59xBs-mQcXed-a316-0g&oe=6AD68DF0",
"story_count": 37,
"is_private": false,
"status": "ok",
"success": true,
"error": null,
"timestamp": "2026-10-15T09:58:20.615497+00:00"
},
{
"input_url": "https://www.instagram.com/nike/",
"username": "nike",
"user_id": "13460080",
"id": "highlight:17975319242920589",
"title": "Just Do It",
"cover_media": "https://scontent.cdninstagram.com/v/t51.71878-15/544818894_2419507208428757_4822384952945732927_n.jpg?stp=dst-jpg_s150x150_tt6&_nc_cat=104&ccb=7-5&_nc_sid=acbce5&_nc_ohc=rJnUDMPumYMQ7kNvwHI4wGP&_nc_oc=AdqQHc8V1xIxrn2TjibqWrESROEoYBN2AnVdorOnR_jxaNI58hhuqhbfJhiHkq8ZgRk&_nc_zt=23&_nc_ht=scontent.cdninstagram.com&_nc_gid=qWWZs0ok2LRt3wGeivx2GQ&_nc_ss=7b689&oh=00_AQNitPuy-2NkKUissXe9ZxXUkTbrlFFWgIYNLzV2igvJrA&oe=6AD65E51",
"cover_media_full_res": null,
"story_count": 48,
"is_private": false,
"status": "ok",
"success": true,
"error": null,
"timestamp": "2026-10-15T09:58:12.313635+00:00"
},
{
"input_url": "https://www.instagram.com/cristiano/",
"username": "cristiano",
"user_id": "173560420",
"id": null,
"title": null,
"cover_media": null,
"cover_media_full_res": null,
"story_count": null,
"is_private": false,
"status": "ok",
"success": false,
"error": "Confirmed: this profile has no highlights.",
"timestamp": "2026-10-15T12:10:05.603922+00:00"
}
]

How does it work?

The actor reads the same public data the Instagram website loads for any logged-out visitor, using plain HTTP requests and no browser. For each profile it looks up the account, then collects the highlights Instagram itself shows a logged-out visitor on that profile. It always runs on Apify's residential proxy, starting from the first request, with each profile getting its own fresh residential IP and up to 3 more fresh IPs tried on most kinds of blocks. For the one specific block Instagram answers with on its full highlights feed (confirmed, with real residential proxy sessions from several different IPs, to repeat identically every time), the actor does not waste retries on it — it moves straight to recovering whatever real highlight data Instagram still shows a logged-out visitor, and marks the row accordingly. It returns only publicly visible data — what anyone sees without logging in — so highlights of private accounts are not included. Every row uses the same normalized fields, so your code keeps working when Instagram changes its pages. Profiles that have no highlights, are private, cannot be read, or could not be confirmed either way still get one row with a plain reason, so nothing goes missing without a trace and nothing is ever reported as a confirmed zero unless it genuinely is one.

Known limitation: profiles with many highlight categories may return only part of the list

Instagram shows a full, paginated highlights list only to a logged-in viewer; a logged-out visitor (which includes this actor, which never asks for a login) gets a smaller public preview. For most profiles the preview already shows everything. For profiles organizing their highlights into many separate categories, the actor returns the real highlights in that preview — never fabricated — and flags the row status: "partial" with a plain explanation when Instagram's own profile data suggests there may be more. This is a confirmed limit of logged-out access, verified by testing the full-list endpoint directly (it answers with Instagram's own "please log in" response on every attempt, from multiple different real IPs), not a bug this actor can retry its way around. If you need the complete list for every profile regardless of size, you currently need an Instagram login, which this actor intentionally does not use.


How do you integrate Instagram Highlights Scraper into your stack?

It works with what you already use: the REST API from any language, MCP for AI agents, and no-code tools, so you can treat it as an Instagram highlights API inside your own workflows.

MCP integration for AI agents

Add the Apify MCP server to your coding agent with one command:

$claude mcp add --transport http apify "https://mcp.apify.com?tools=socialdataapi/instagram-highlights-scraper"

This registers Instagram Highlights Scraper as a tool your agent can call directly. Once connected, the agent runs it with your list of profiles and reads the highlight rows back as JSON. It works in Claude Code, Cursor and Windsurf, and in other clients that support remote MCP servers.

No-code tools (n8n, Make, LangChain)

In n8n, add the Apify node and choose "Run an Actor", select this Actor and paste your profile list as the JSON input. You can also use the HTTP Request node pointed at the Actor's run-sync-get-dataset-items endpoint with your Apify token.

In Make, add the Apify app's "Run an Actor" module with the same JSON input, then a "Get Dataset Items" module to receive one bundle per highlight.

In LangChain, install langchain-apify and wrap the Actor with ApifyActorsTool using the Actor ID socialdataapi/instagram-highlights-scraper. An agent can then request highlights on its own and get typed JSON rows back.


Scraping public Instagram data is generally legal in most jurisdictions when you collect only what any visitor can see. This Actor returns only publicly available data: highlight titles, IDs and cover images from public profiles, never content behind a login. Usernames and account IDs can count as personal data, so GDPR and similar laws still apply: scraping public data is generally permissible, but storing and using it must comply with local data-protection law and Instagram's terms. Consult legal counsel if your use case involves bulk storage of personal data.


Frequently asked questions

What fields does Instagram Highlights Scraper return?

It returns the highlight title, highlight ID, cover image link, full-size cover image link (when Instagram provides one), number of stories, username and account ID for every highlight, plus the profile URL, a private-account flag, a status, a success flag, a reason and the time the row was saved. See the data fields section.

Does Instagram Highlights Scraper require an Instagram account or login?

No. It collects Instagram highlights without login, reading only what public profiles show. No credentials or cookies are needed.

How fast does Instagram Highlights Scraper run?

A recorded run read 4 profiles in 5.2 seconds and saved 8 rows: 6 highlights and 2 status rows. The highlights are read live at run time, not from a cache.

What happens if a profile is private or doesn't exist?

You still get one row for it, with the success flag set to false, a status and a plain reason: status: "not_found" ("account does not exist") for a missing account, status: "ok" ("Confirmed: this profile has no highlights.") when a public profile genuinely has none, status: "private" ("Profile is private; highlights require login.") for a private profile, and status: "unknown" when Instagram blocked the request and nothing could be confirmed either way — which is never worded as a confirmed "no highlights." These rows are not charged. In your code, filter on the success flag, and use status when you need to tell a confirmed zero apart from an unconfirmed one.

Will I always get every highlight on a profile?

Usually, yes. For profiles with many separate highlight categories, Instagram's own logged-out preview may show fewer than the full list; in that case you still get every real highlight in the preview, with the row's status set to "partial" and a plain explanation that more may exist. This is a confirmed limit of logged-out access (verified directly against the full-list endpoint, which answers with Instagram's own login requirement on every attempt), not a temporary error — see Known limitation.

Can I scrape multiple Instagram profiles at once?

Yes. Add as many profiles as you like to the list; they are read one after another in the same run, and repeated usernames are removed.

Does Instagram Highlights Scraper work with Claude, ChatGPT, and other AI agent tools?

Yes — Instagram Highlights Scraper is available as an MCP tool. Register the Apify MCP server in Claude Code, Cursor or Windsurf:

$claude mcp add --transport http apify "https://mcp.apify.com?tools=socialdataapi/instagram-highlights-scraper"

Any agent that can call an HTTP endpoint can also use the Apify API directly.

Does Instagram Highlights Scraper return data in a format LLMs can use directly?

Yes. Every row is typed, normalized JSON with the same 13 field names. No HTML parsing, no selectors. Pass it straight to an LLM, index it into a vector store, or feed it to an agent tool — no transformation step.

What happens when Instagram changes its layout or updates its anti-bot system?

The actor is maintained. When Instagram changes its pages or its blocking, the actor is updated, and your calls keep returning the same JSON fields with no changes on your end.

Can I use Instagram Highlights Scraper without managing proxies or browser infrastructure?

Yes. Retries and proxy switching run on the actor's side, and no browser is needed. You send one request and get structured JSON back. No proxy accounts, no headless browser setup, no maintenance.

Which Instagram highlight fields work best for AI training data and RAG indexing?

For RAG, index the highlight titles together with the username for attribution. For training data, use the private-account flag, the success flag and the save time. All fields are typed primitives — strings and booleans — no normalization needed.


Your feedback

Found a bug or missing a field? Let us know through the Issues tab on this Actor's page in Apify Console. The team reads every report and ships fixes.