Skip to content

Instagram Hashtag Scraper

Try for free

Scrape public Instagram posts and reels for one or more hashtags. Get captions, likes, comment counts, media URLs, timestamps, and author details for trend and campaign tracking.

📸 Instagram Hashtag Scraper

Collect public Instagram posts and reels for the hashtags your team tracks, and land them in a Scrapely dataset ready to export.

Social, content, and research teams use it to turn a list of hashtags into captions, creators, media, and engagement from the public grid. No session cookie.

✨ Features

  • 🏷️ Run one hashtag or a list. A leading # is optional. Each entry is its own search. Spaces in one entry are merged into a single hashtag.
  • 🖼️ posts opens the public tag page in headless Chrome. It saves image and sidecar posts on that page, and image and sidecar posts from the public profiles of accounts that page shows when the caption includes the hashtag.
  • 🎬 reels stays on HTTP. It prefers items Instagram marks as clips (productType clips). When that feed is closed, it keeps videos from the public grid.
  • 🔢 resultsLimit caps how many items are saved per hashtag.
  • 🧵 A bad entry, a blocked tag, or a tag with no public items is skipped and listed in the status message and the OUTPUT record. It is never saved as a row, and the rest of the list still runs.
  • 🏠 Each run uses Scrapely residential proxy. Public Instagram blocks datacenter addresses.

🚀 Why teams use this

  • Schedule it, call it from the Scrapely API, and export the dataset from the run.
  • One rejected hashtag does not abort the others, so a production list can contain a dead tag and still return the rest.
  • The actor writes a field only when the public payload has it. A real 0 or false stays. A missing count is left off the item.
  • When Instagram disables like and view counts, likesCount is -1. That value is the hidden-count flag, not a guessed total.
  • You do not paste a password or a session cookie. The actor reads the logged-out page.

The public grid is the logged-out hashtag page, not a promise of every post ever tagged. In production runs that page was one batch of about a dozen posts. The sections feed answered that a login was required, so a higher resultsLimit does not add a second page.

💡 Use cases

  • Follow a campaign or branded hashtag and collect every new public post.
  • Find creators who post about a topic for influencer outreach.
  • Measure engagement on a hashtag over time.

🧪 Example input

{
  "hashtags": [
    "natgeo"
  ],
  "resultsLimit": 20,
  "resultsType": "posts"
}

🧾 Sample output

One item from a real run of the example input, shortened. Long text is cut and lists show their first entries.

{
  "id": "3000000000000000000",
  "type": "Sidecar",
  "shortCode": "EXAMPLE1234",
  "caption": "Cuál fue tu favorita? 😍 #natgeo #sony #bealpha #natgeo animals",
  "hashtags": [
    "natgeo",
    "sony"
  ],
  "url": "https://www.instagram.com/p/EXAMPLE1234/",
  "displayUrl": "https://scontent.cdninstagram.com/…",
  "alt": "Photo by Andrés Clausen on October 09, 2026.",
  "ownerUsername": "example_creator",
  "ownerId": "1234567890",
  "productType": "carousel_container",
  "inputUrl": "https://www.instagram.com/explore/tags/natgeo/",
  "searchTerm": "natgeo"
}

📥 Input

FieldRequiredWhat you send
hashtagsYesList of hashtags. One entry, one search.
resultsTypeNoposts (default) or reels.
resultsLimitNoMaximum saved items per hashtag. Default 20. Minimum 1.
{
  "hashtags": ["natgeo"],
  "resultsType": "posts",
  "resultsLimit": 20
}

travel photography is searched as travelphotography.

📤 Output

A saved post includes only the fields Instagram sent. These are the names the dataset can contain:

id, type, shortCode, caption, hashtags, mentions, url, commentsCount, firstComment, latestComments, dimensionsHeight, dimensionsWidth, originalHeight, originalWidth, displayUrl, images, videoUrl, audioUrl, alt, likesCount, videoViewCount, videoPlayCount, igPlayCount, fbLikeCount, fbPlayCount, reshareCount, timestamp, childPosts, locationName, locationId, ownerFullName, ownerUsername, ownerId, productType, videoDuration, paidPartnership, affiliate, sponsors, taggedUsers, isPinned, musicInfo, coauthorProducers, isCommentsDisabled, facebookPage, threadsNetProfile, inputUrl, searchTerm.

inputUrl is the hashtag page that produced the row. searchTerm is the entry you submitted. url is the public post URL. images and childPosts are present for carousels when the payload includes the slides. musicInfo and audioUrl are present when the clip payload includes that audio. latestComments is the preview on the post, up to five, not a full comment thread and not nested replies. fbLikeCount and fbPlayCount appear only when the payload includes those counts.

Every dataset row is a post or reel. Hashtags that are invalid, blocked or empty are listed in the run's status message and in the OUTPUT record of the run's key-value store:

{
  "saved": 10,
  "failedInputs": [
    {"input": "example", "reason": "No public reels or videos for this hashtag."}
  ]
}

reason is a short code and status, or an exception type name. It does not include a response body. A run that finds nothing saves no rows and ends with a status message that starts with No results:. The run fails only when no hashtag is valid or Instagram blocked every hashtag after retries.

💰 Pricing

You pay $0.0005 per saved post or reel ($0.50 per 1,000 results), plus the platform usage of the run: compute, residential proxy traffic and, for posts, the hosted browser that opens the tag page. Hashtags that fail or come back empty are never saved and never charged.

Worked example: 1,000 results ≈ $0.50 in result fees plus platform usage. In our tests at the default 1,024 MB, platform usage was about $0.066 for 100 posts from one hashtag, about $0.09 for a 20-post run, and about $0.003 for a 12-reel run. Most of the usage is the browser and the proxy traffic, so it depends on how many tag pages and profiles the run opens rather than on the number of results.

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.