
Instagram Reel Scraper
scrape.ly/store/echofield/instagram-reel-scraperSocial mediaVideos
1 monthly user

Scrape public Instagram profile details from usernames, IDs, or URLs: bio, follower and following counts, posts count, verification, business category, external links, and recent posts.
Public Instagram profiles, ready for a dataset: name, bio, follower counts, links, related accounts, and the latest posts.
Built for growth, research, and competitor teams who need profile records they can join to the rest of their pipeline. Pass usernames, profile ids, or profile URLs. Each successful input becomes one item.
/stories/{user}/, /{user}/reels/, and /_u/{user}/.id, username, url, fullName, biography, followersCount, followsCount, postsCount, private, verified, isBusinessAccount, and businessCategoryName.externalUrl, externalUrlShimmed, and externalUrls (title, url, lynx url, link type) when those values are in the response.profilePicUrl and profilePicUrlHD when a high-resolution file is actually returned.relatedProfiles (id, username, full_name, is_private, is_verified, profile_pic_url).latestPosts, with caption, hashtags, mentions, counts, media URLs, carousel children, tagged users, and video fields when the post payload includes them. likesCount is -1 when likes are hidden or the post has no like count.igtvVideoCount and up to 12 latestIgtvVideos when the guest profile includes IGTV.false or 0 stays.OUTPUT record, and does not stop the other inputs. It is never saved as a row or charged.includeAboutSection adds an about object only when the profile payload already contains a country, join date, verification date, or former-username count. This actor does not look those up on a separate call.
Request-based scraping. No browser startup. The run stays on the public page and the same JSON those pages already load, so a batch of profiles finishes as HTTP calls instead of a rendered session per account.
Production shape. One item per input, field names aligned with the public Instagram Profile Scraper dataset, and empty keys left off so exports stay small.
A failed URL does not kill the run. The rest of the list is still scraped and saved. Failed inputs are listed in the status message and in OUTPUT as failedInputs: [{input, reason}]. The run is marked failed only when no profile could be saved.
{
"usernames": [
"humansofny"
]
}
One item from a real run of the example input, shortened. Long text is cut and lists show their first entries.
{
"inputUrl": "humansofny",
"id": "242598499",
"username": "humansofny",
"url": "https://www.instagram.com/humansofny",
"fullName": "Humans of New York",
"biography": "New York City, one story at a time.\nCreated by Brandon Stanton\nInquiries/Collabs: honybrandon@gmail.com\nGet a copy of Dear New York below:",
"externalUrl": "https://bit.ly/dearnewyorkbook",
"externalUrlShimmed": "https://l.instagram.com/?u=https%3A%2F%2Fbit.ly%2Fdearnewyorkbook&e=AUD4Civ5zNXuVP5_JhwLakPiaX0iFUh0kbqM1ug5ieM-dIVzJzHXUZMcZ5E048rcGdYSRNv__emYxoyrhg5J9Wm3v…",
"externalUrls": [
{
"title": "Dear New York Book",
"lynx_url": "https://l.instagram.com/?u=https%3A%2F%2Fbit.ly%2Fdearnewyorkbook&e=AUA4W3F1OSFU015FS7nNX8UdfbXIHMzQkfBaRkPz-yV5O52EgUzjoJNJmsUAyD4YgMr8LfL7H8TUW3ecFJS3uEZUd…",
"url": "https://bit.ly/dearnewyorkbook",
"link_type": "external"
}
],
"followersCount": 12647340,
"followsCount": 755,
"hasChannel": false,
"highlightReelCount": 1,
"isBusinessAccount": false,
"joinedRecently": false,
"private": false,
"verified": true,
"profilePicUrl": "https://scontent-lim1-1.cdninstagram.com/…",
"profilePicUrlHD": "https://scontent-lim1-1.cdninstagram.com/…",
"postsCount": 5876,
"latestPosts": [
{
"id": "3741054891297971261",
"type": "Video",
"shortCode": "DPq5ZpJDZw9",
"caption": "Dear New York closes on October 19th. It’s been the honor and joy of my life to see this take flight. It’s been a magical six days of community and connectio…",
"url": "https://www.instagram.com/p/DPq5ZpJDZw9/",
"commentsCount": 976,
"dimensionsHeight": 1920,
"dimensionsWidth": 1080,
"displayUrl": "https://scontent-lim1-1.cdninstagram.com/…",
"likesCount": 107882,
"timestamp": "2025-10-11T13:27:07.000Z",
"ownerUsername": "humansofny",
"ownerId": "242598499",
"productType": "clips",
"videoUrl": "https://scontent-lim1-1.cdninstagram.com/…",
"videoDuration": 45.416668
},
{
"id": "3742534382104984578",
"type": "Sidecar",
"shortCode": "DPwJzEVDbwC",
"caption": "A few years ago I received a DM from @zohrankmamdani. Only recently did I discover its existence. It was a very unusual DM—especially coming from a local ass…",
"mentions": [
"zohrankmamdani."
],
"url": "https://www.instagram.com/p/DPwJzEVDbwC/",
"commentsCount": 3980,
"dimensionsHeight": 960,
"dimensionsWidth": 1440,
"displayUrl": "https://scontent-lim1-1.cdninstagram.com/…",
"images": [
"https://scontent-lim1-1.cdninstagram.com/…",
"https://scontent-lim1-1.cdninstagram.com/…"
],
"likesCount": 257585,
"timestamp": "2025-10-13T14:14:46.000Z",
"childPosts": [
{
"id": "…",
"type": "…",
"dimensionsHeight": "…"
},
{
"id": "…",
"type": "…",
"dimensionsHeight": "…"
}
],
"ownerUsername": "humansofny",
"ownerId": "242598499",
"productType": "carousel_container",
"taggedUsers": [
{
"full_name": "…",
"id": "…",
"is_verified": "…"
}
]
}
],
"fbid": "17841401154973790",
"threadsNetProfile": {
"username": "humansofny"
}
}
| Field | Type | What to pass |
|---|---|---|
usernames | string array, required | One or more Instagram usernames, numeric profile ids, or profile URLs. |
includeAboutSection | boolean, default false | When true, copy an about block if the profile response already has it. |
{
"usernames": ["humansofny"]
}
One dataset item per input. A profile URL has no trailing slash. inputUrl is the value you passed in.
Present when Instagram sent them:
id, username, url, fullName, biography, externalUrl, externalUrlShimmed, externalUrls, followersCount, followsCount, hasChannel, highlightReelCount, isBusinessAccount, joinedRecently, businessCategoryName, private, verified, profilePicUrl, profilePicUrlHD, facebookPage, igtvVideoCount, relatedProfiles, latestIgtvVideos, postsCount, latestPosts, hasPublicStory, isRestrictedProfile, restrictionReason, businessAddress, fbid, threadsNetProfile, inputUrl.
about is added only with includeAboutSection and only from fields already on the payload.
A profile that could not be read is not saved. It is listed in the OUTPUT record of the run's key-value store:
{
"saved": 1,
"failedInputs": [
{"input": "zzqq9850notarealuser", "reason": "not_found: Instagram returned 404 (not_found)."}
]
}
A value that is not a username, a numeric profile id, or a profile URL is invalid_input: ValueError. The reason is a status and code, or an exception type name.
You pay $0.001 per saved profile ($1 per 1,000 profiles), plus the platform usage of the run (compute and residential proxy traffic). Profiles that fail are never saved and never charged. includeAboutSection has no extra charge.
Worked example: 1,000 profiles ≈ $1.00 in profile fees plus platform usage. In our tests at the default 512 MB, a 10-profile run used about $0.009 to $0.011 of platform usage, so 1,000 profiles come to roughly $2 in total. A single-profile run costs about $0.004 of usage because start-up dominates, so batch usernames into one run.
Set a maximum charge for the run and the scraper stops cleanly when it is reached, keeping every profile it already saved.
Every field below can be set in the run form, passed through the API, or saved as a task. Unset fields fall back to the defaults shown.
usernamesarrayRequiredInstagram username(s)
Provide one or several Instagram user names you want to scrape the posts from. The actor will also handle user name IDs.
includeAboutSectionbooleanOptionaldefault falseInclude about-account information
Add the account's About information: date joined, country (only when the user filled it in) and channel details.
Every run writes its results to a dataset. Preview it in the dashboard, then export it or read it through the API.
| Field | Type | Description |
|---|---|---|
| id | string | null | Unique Instagram user ID |
| username | string | null | Instagram username of the profile |
| url | string | null | URL of the Instagram profile |
| fullName | string | null | Full display name of the user |
| biography | string | null | Profile biography text |
| externalUrl | string | null | External URL linked in the profile bio |
| externalUrlShimmed | string | null | Shimmed (tracked) version of the external URL |
| externalUrls | array | null | All bio links added to the profile |
| followersCount | number | null | Number of followers the profile has |
| followsCount | number | null | Number of accounts the profile follows |
| hasChannel | boolean | null | Whether the profile has an Instagram broadcast channel |
| highlightReelCount | number | null | Number of highlight reels on the profile |
| isBusinessAccount | boolean | null | Whether the account is a business account |
| joinedRecently | boolean | null | Whether the account joined Instagram recently |
| businessCategoryName | string | null | Business category of the account |
| private | boolean | null | Whether the profile is private |
| verified | boolean | null | Whether the profile has a verified badge |
| profilePicUrl | string | null | URL of the profile picture |
| profilePicUrlHD | string | null | URL of the high-resolution profile picture |
| facebookPage | string | null | Connected Facebook page name |
| igtvVideoCount | number | null | Number of IGTV videos on the profile |
| relatedProfiles | array | null | Related Instagram profiles suggested by Instagram |
| latestIgtvVideos | array | null | Most recent IGTV videos from the profile |
| postsCount | number | null | Total number of posts on the profile |
| latestPosts | array | null | Most recent posts from the profile |
| hasPublicStory | boolean | null | Whether the profile currently has a public story |
| isRestrictedProfile | boolean | null | Whether the profile is restricted (e.g. age-gated) |
| restrictionReason | string | null | Reason the profile is restricted, if applicable |
| businessAddress | object | null | Business address associated with the profile |
| fbid | string | null | Facebook ID linked to the Instagram profile |
| searchTerm | string | null | Search term used to find this profile |
| searchSource | string | null | Source of the search that found this profile |
| threadsNetProfile | object | null | Threads.net profile linked to this account |
| inputUrl | string | null | Original input URL that was used to find this profile |
| error | string | null | Error code if the profile could not be fully scraped |
| errorDescription | string | null | Human-readable description of the error |
| requestErrorMessages | array | null | Array of error messages encountered during scraping |
You pay for the events the actor reports, such as each result or page it produces. Platform usage is included in the event prices.
| Event | Charged when | Price |
|---|---|---|
| Profile | One saved public Instagram profile. | $0.001 |
Run this actor from your own code. Swap in your API token and the examples work as-is.
import { ScrapelyClient } from 'scrapely-client'
const client = new ScrapelyClient({ token: process.env.SCRAPELY_TOKEN })
// Start the actor and wait for the run to finish.
const run = await client.actor('echofield/instagram-profile-scraper').call({
"usernames": [
"humansofny"
]
})
// Read the dataset the run produced.
const { items } = await client.dataset(run.defaultDatasetId).listItems()
console.log(items)Tokens live in your account settings. Keep them server-side: a token carries the full permissions of your account.
Connect the Scrape.ly MCP server once and your agent can run this actor as a tool. Pick your tool:
Fetch scrape.ly/agents.md and run echofield/instagram-profile-scraperPaste into Claude Code, Codex, Cursor or any AI agent. It signs you in once in the browser.
{
"mcpServers": {
"scrapely": {
"url": "https://api.scrape.ly/mcp?tools=actors,runs,storage,docs&actors=echofield/instagram-profile-scraper"
}
}
}No key in the file: your client opens the browser to sign you in the first time it connects.
Inputs the developer prepared for common jobs. Open one to see its input, then copy it to your account to run it as-is or adjust it.
Profile details such as followers, bio and posts.
Profile details plus the About this account section.
Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.