
TikTok Shop Scraper
scrape.ly/store/shelfbright/tiktok-shop-scraperE-commerceSocial media
1 monthly user

Scrape public Instagram profiles, posts, reels, comments, mentions, stories, hashtags, and places. Get captions, likes, comments, media URLs, and owner details without logging in.
Turn public Instagram profile, post, reel, and hashtag URLs into a clean dataset. Paste one URL or a long list. The run keeps going.
For social teams and data pipelines that need public posts, profile details, reels, and comments without a logged-in session.
directUrls is what gets scraped. A search string is used only when the URL list is empty.search with searchType hashtag returns public tag matches. searchType user is the same path as profile.private_profile item and that URL stops. There is no session-cookie input.OUTPUT record (failedInputs).false or 0 stays. likesCount is -1 when Instagram has hidden like and view counts.{
"directUrls": [
"https://www.instagram.com/humansofny/"
],
"resultsLimit": 20,
"resultsType": "posts",
"searchLimit": 10,
"searchType": "hashtag"
}
One item from a real run of the example input, shortened. Long text is cut and lists show their first entries.
{
"id": "3741054891297971261",
"type": "Video",
"typename": "XDTMediaDict",
"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…",
"hashtags": [],
"mentions": [],
"url": "https://www.instagram.com/p/DPq5ZpJDZw9/",
"commentsCount": 976,
"firstComment": "Mobile rn 🔥",
"latestComments": [
{
"id": "18114464492027801",
"text": "Mobile rn 🔥",
"typename": "XIGComment",
"isCovered": false,
"timestamp": "2026-10-11T15:17:28.000Z",
"ownerUsername": "officialsnackyartss",
"ownerIsUnpublished": false,
"ownerProfilePicUrl": "https://scontent-fra5-1.cdninstagram.com/…",
"owner": {
"id": "…",
"username": "…",
"is_verified": "…"
},
"likesCount": 0
},
{
"id": "18079015328373197",
"text": "👏🏻",
"typename": "XIGComment",
"isCovered": false,
"timestamp": "2026-10-02T06:28:56.000Z",
"ownerUsername": "xinglan072",
"ownerIsUnpublished": false,
"ownerProfilePicUrl": "https://scontent-fra5-1.cdninstagram.com/…",
"owner": {
"id": "…",
"username": "…",
"is_verified": "…"
},
"likesCount": 0
}
],
"dimensionsHeight": 1920,
"dimensionsWidth": 1080,
"originalHeight": 1920,
"originalWidth": 1080,
"displayUrl": "https://scontent-fra5-1.cdninstagram.com/…",
"images": [
"https://scontent-fra5-1.cdninstagram.com/…"
],
"videoUrl": "https://scontent-fra5-1.cdninstagram.com/…",
"alt": "Video by Humans of New York on October 11, 2025.",
"likesCount": 107882,
"fbLikeCount": 51,
"timestamp": "2025-10-11T13:27:07.000Z",
"childPosts": [],
"ownerFullName": "Humans of New York",
"ownerUsername": "humansofny"
}
resultsType is posts, details, comments, or reels. directUrls is the list of public URLs. resultsLimit caps items per URL. onlyPostsNewerThan drops older posts. skipPinnedPosts skips pinned profile posts.
search, searchType (hashtag, profile, place, or user), and searchLimit run only when directUrls is empty. user is an alias of profile search.
addParentData attaches a small parent object. isNewestComments asks for newest-first comments. addProfileStatistics adds the profile counters the page returned. proxyConfiguration is the Scrapely Proxy input. Leave it on residential.
includeNestedComments is on the form. Nested replies and a second comment page have come back empty, so do not plan a pipeline on them.
Posts and reels include, when Instagram sent them: id, type, shortCode, url, caption, ownerUsername, likesCount, commentsCount, timestamp, productType, inputUrl, and displayUrl. Hashtag details include name, postsCount, url, id, and searchSource. Profile details include username, fullName, biography, followersCount, followsCount, postsCount, verified, private, profilePicUrl, and url.
Comments include id, text, ownerUsername, likesCount, repliesCount, timestamp, commentUrl, postUrl, and inputUrl.
searchSource is instagram on search rows. Failed inputs (a private profile, a URL that does not fit the selected resultsType, a blocked request) are not saved as rows. They are listed in the run's status message and in the OUTPUT key-value record as failedInputs: [{input, reason}]; the reason is an error code plus a status code or exception name, never the response body.
carouselMediaCount, hasUpcomingEvent, and audioUrl are not filled. Stories, mentions, guest business email, comment page 2, and nested replies have stayed empty, so they are not part of this output contract.
You pay $0.002 per saved result ($2 per 1,000 results), plus the platform usage of the run (compute and residential proxy traffic). A result is one saved row: a post, reel, comment, profile, hashtag or place. Failed inputs are never saved and never charged.
Worked example: 1,000 posts ≈ $2.00 in result fees plus platform usage. In our tests at the default 512 MB, a 100-post profile run used about $0.01 of platform usage and a 20-post run about $0.008, so 1,000 posts come to roughly $2.10 in total.
Set a maximum charge for the run and the scraper stops cleanly when it is reached, keeping every result 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.
resultsTypeenumOptionaldefault "posts"Content to scrape
One results type per run. Posts returns a feed. Details returns the metadata object for the URL. Comments only work with post or reel URLs. Stories is accepted but hidden in the console.
directUrlsarrayOptionalInstagram URLs based on content type
Instagram URLs. When this list is not empty, search is ignored.
searchstringOptionalSearch query
Used only when directUrls is empty. Comma-separate multiple terms. Hashtags may include #.
resultsLimitintegerOptionaldefault 20Results limit per URL
How many posts, reels, comments, or mentions to return per URL.
Narrow down which posts are returned.
onlyPostsNewerThanstringOptionalFilter by date
UTC cutoff. Absolute YYYY-MM-DD or ISO timestamp, or a relative value such as 1 day, 2 days, 3 hours, or 1 week. Posts at or after the cutoff are kept.
skipPinnedPostsbooleanOptionaldefault falseSkip pinned posts
Drop pinned posts. When this is off, pinned posts stay in the feed even if they are older than the date filter.
Apply to the search query only.
searchTypeenumOptionaldefault "hashtag"Search type
Hashtag, profile, or place search against Instagram. user is a hidden alias of profile. Results set searchSource to instagram.
searchLimitintegerOptionaldefault 10Search results limit
How many hashtags, profiles, or places to return from search.
Apply when scraping comments.
isNewestCommentsbooleanOptionaldefault falseNewest comments first
Reverse each comment page so newer comments come first.
includeNestedCommentsbooleanOptionaldefault falseInclude comment replies
Best-effort replies. If Instagram requires a login for a thread, the parent comment is kept and that thread stops.
addProfileStatisticsbooleanOptionaldefault falseAdd profile statistics
Include extra public counters already present on the profile payload. Does not call a login-walled stats API.
proxyConfigurationobjectOptionaldefault {"useScrapelyProxy":true}Proxy configuration
Residential proxy is required. Logged-out datacenter IPs are rate-limited (HTTP 429). With Scrapely Proxy on and no group chosen, the run uses the residential group. You pay for proxy traffic per GB plus platform compute. This private actor has no pay-per-event pricing.
addParentDatabooleanOptionaldefault falseOn feed items, add metaData describing the profile, hashtag, place, or post the item came from.
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 | |
| type | string | null | |
| shortCode | string | null | |
| caption | string | null | |
| hashtags | array | |
| mentions | array | |
| url | string | null | |
| commentsCount | number | null | |
| firstComment | string | null | |
| latestComments | array | |
| dimensionsHeight | number | null | |
| dimensionsWidth | number | null | |
| displayUrl | string | null | |
| images | array | |
| videoUrl | string | null | |
| likesCount | number | null | |
| videoViewCount | number | null | |
| videoPlayCount | number | null | |
| timestamp | string | null | |
| childPosts | array | |
| ownerUsername | string | null | |
| ownerId | string | null | |
| ownerFullName | string | null | |
| isPinned | boolean | null | |
| productType | string | null | |
| username | string | null | |
| fullName | string | null | |
| biography | string | null | |
| followersCount | number | null | |
| followsCount | number | null | |
| postsCount | number | null | |
| verified | boolean | null | |
| private | boolean | null | |
| text | string | null | |
| postUrl | string | null | |
| commentUrl | string | null | |
| repliesCount | number | null | |
| name | string | null | |
| location_id | string | null | |
| lat | number | null | |
| lng | number | null | |
| address | string | null | |
| related | array | |
| inputUrl | string | null | |
| searchTerm | string | null | |
| searchSource | string | null | |
| metaData | object | null |
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 |
|---|---|---|
| Result | One saved Instagram result: a post, reel, comment, profile, hashtag or place. | $0.002 |
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-scraper').call({
"directUrls": [
"https://www.instagram.com/natgeo/"
],
"resultsType": "posts",
"resultsLimit": 20
})
// 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-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-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 for Instagram profile links.
Comments from an Instagram post link.
Reels from a profile link.
Posts found through a hashtag search.
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.