Skip to content

Instagram Scraper

Try for free

Scrape public Instagram profiles, posts, reels, comments, mentions, stories, hashtags, and places. Get captions, likes, comments, media URLs, and owner details without logging in.

✨ Instagram Scraper

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.

✨ Features

  • 🔗 URLs first. directUrls is what gets scraped. A search string is used only when the URL list is empty.
  • 👤 Profiles and posts. Profile details, the profile feed, single posts, and hashtag feeds from a public URL.
  • 🎬 Reels. Profile clips and reel URLs, kept when the media is a clip.
  • 💬 Comments. The comments Instagram returns on the first page of a post or reel, newest-first when you ask.
  • #️⃣ Hashtag search. search with searchType hashtag returns public tag matches. searchType user is the same path as profile.
  • 🔒 Public only. A private profile becomes a private_profile item and that URL stops. There is no session-cookie input.

🚀 Why teams use this

  • Request-based. Chrome TLS impersonation, a warm public page, then the web and mobile JSON that page already calls. No browser.
  • One bad URL does not stop the run: it is skipped, never saved as a row, and listed with the reason in the status message and the OUTPUT record (failedInputs).
  • Up to eight requests are in flight. A 429, a 401, or a checkpoint page rotates the session and retries a thin document once.
  • Empty values stay off the item. A real false or 0 stays. likesCount is -1 when Instagram has hidden like and view counts.

💡 Use cases

  • Collect posts, reels, and comments from public profiles for social listening.
  • Benchmark creators and brands by follower counts and engagement.
  • Pull posts for a hashtag or place to study a trend or campaign.

🧪 Example input

{
  "directUrls": [
    "https://www.instagram.com/humansofny/"
  ],
  "resultsLimit": 20,
  "resultsType": "posts",
  "searchLimit": 10,
  "searchType": "hashtag"
}

🧾 Sample output

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"
}

📥 Input

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.

📤 Output

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.

💰 Pricing

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.

Related actors

G2
4.7/5
Excellent
Trustpilot

The internet is full of data.
Start owning yours.

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.

No credit card. No setup calls.