SFOLN

Catalogue / Social media data

Instagram Hashtag Scraper (No Login)

sfoln/instagram-hashtag-posts · Social media, Lead generation, Automation On request

Scrape public Instagram posts and reels for any hashtag, no login needed: caption, date, likes, comments, video views, owner, hashtags, mentions and thumbnail, one row per post. $0.60 per 1,000 posts + $0.003 per results page.

About

What it does

Instagram Hashtag Scraper (No Login) gets public Instagram posts and reels for any hashtag, one normalized record per post: shortcode, URL, type (image, video, carousel, reel), caption, posting date, likes, comments, video duration, thumbnail, hashtags, mentions and the owner's handle, ID, name, verification and follower count. It's built for influencer discovery, campaign and UGC monitoring, trend research, dataset building and AI agents.

Price

Price per delivered record

EventPricePer 1,000Charged for
Instagram hashtag post
instagram-hashtag-post
$0.0006$0.60 / 1,000Charged once per Instagram post delivered as a dataset record. Hashtag summary records are never charged.
Hashtag results page
instagram-hashtag-query
$0.003$3 / 1,000Charged once per page of hashtag results that delivered at least one post. Covers the per-request upstream fee. Also charged for an empty page the upstream billed (when the budget covers it).

Apify free plan: up to 10 items per run. Paid plans have no per-run cap; set maxTotalChargeUsd to cap spend.

Run

Call it from code, an agent or the Console

This API is private on Apify for now. Email us and we will publish it for you, usually within two working days. The calls below work once it is public. contact@sfoln.com

curl · synchronous run, rows in the response
curl -X POST "https://api.apify.com/v2/actors/sfoln~instagram-hashtag-posts/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"hashtags":["makeup"],"maxPostsPerHashtag":10}'
mcp.json · hosted Apify MCP server
{
  "mcpServers": {
    "apify": {
      "type": "http",
      "url": "https://mcp.apify.com?tools=sfoln/instagram-hashtag-posts"
    }
  }
}
asynchronous run · for large batches
POST https://api.apify.com/v2/actors/sfoln~instagram-hashtag-posts/runs?maxTotalChargeUsd=1
GET  https://api.apify.com/v2/actor-runs/{runId}            # until status is SUCCEEDED
GET  https://api.apify.com/v2/datasets/{defaultDatasetId}/items?format=json

Authenticate with an Apify API token. MCP clients can instead sign in with OAuth when prompted. Example prompt for an agent: Find the 30 most recent public Instagram posts tagged #makeup and summarize which creators and products appear most often.

Input

Input fields

Enter hashtags. Each hashtag produces one dataset record per post plus one summary record per hashtag.

FieldTypeDefaultMeaning
hashtags *arrayrequiredHashtags
Hashtags with or without #, or instagram.com/explore/tags/… URLs. Duplicates are removed. Accounts on the Apify free plan can process up to 10 hashtags per run.
maxPostsPerHashtaginteger30Max posts per hashtag
How many posts to return per hashtag (1–300). Each delivered post is one charged event, plus one page event per results page. The upstream exposes at most 11 pages per hashtag. Range 1–300.
datePostedstring—Date posted
Only return posts that Google indexed within this window. Leave empty for any time. One of "last-hour", "last-day", "last-week", "last-month", "last-year".
mediaTypestring"all"Media type
all = posts and reels, reels = reels only. One of "all", "reels".
maxHashtagsinteger100Max hashtags
Safety cap on the number of hashtags processed in this run. Range 1–1000.
concurrencyinteger4Concurrency
How many hashtags are fetched in parallel (1–8). Range 1–8.
itemTimeoutSecsinteger600Time limit per input (seconds)
Pagination for one hashtag stops cleanly shortly before this limit (60–3600). Raise it for very large per-input limits. Range 60–3600.
includeRawbooleanfalseInclude raw upstream response
Attach the unmodified provider object to each result record.
Example input
{
  "hashtags": [
    "makeup"
  ],
  "maxPostsPerHashtag": 10
}

Output

One record per input item

Records land in the run's dataset; a synchronous call returns them directly. Each has a status (ok is charged; everything else is free) and a charged flag. The run's OUTPUT record totals items and charges.

FieldTypeMeaning
inputstring | objectInput
The hashtag as provided.
recordTypestringRecord type
post (one per delivered post, charged) | hashtag (one summary per hashtag, never charged) e.g. "post"
positionintegerPosition
1-based position of the post within its input
hashtagstring | nullHashtag
Lower-cased, without #.
hashtagUrlstringHashtag URL
Summary records only.
datePostedstring | nullDate filter
Summary records only.
mediaTypestringMedia type filter
Summary records only.
postIdstring | nullPost ID
shortcodestring | nullShortcode
urlstring | nullPost URL
typestring | nullType
image | video | carousel | reel
captionstring | nullCaption
takenAtstring | nullPosted at
ISO 8601 UTC
likesnumber | nullLikes
commentsnumber | nullComments
viewsnumber | nullViews
Video/reel plays when exposed; null for images
durationSecsnumber | nullDuration (s)
thumbnailUrlstring | nullThumbnail URL
videoUrlstring | nullVideo URL
Temporary CDN link
hashtagsarrayHashtags
mentionsarrayMentions
isPaidPartnershipboolean | nullPaid partnership
locationNamestring | nullLocation
ownerHandlestring | nullOwner handle
ownerIdstring | nullOwner ID
ownerFullNamestring | nullOwner name
ownerIsVerifiedboolean | nullOwner verified
ownerFollowersnumber | nullOwner followers
rowsDeliveredintegerPosts delivered
Summary records only.
pagesFetchedintegerPages fetched
Summary records only.
pagesChargedintegerPages charged
Summary records only.
reachedEndbooleanReached end
Summary records only: the upstream reported no further pages.
stopReasonstringStop reason
Summary records only: limit | end | budget | max_pages | deadline | empty_pages | error
statusstringStatus
ok | not_found | error | skipped_invalid | skipped_budget | skipped_free_plan e.g. "ok"
chargedbooleanCharged
chargedEventstringCharged event
errorobjectError
warningsarrayWarnings
sourcestringSource
fetchedAtstringFetched at
Example record
{
  "input": "#funnydogs",
  "recordType": "post",
  "position": 1,
  "hashtag": "funnydogs",
  "postId": "3714950709444987377",
  "shortcode": "DOOJ_zSjcnx",
  "url": "https://www.instagram.com/reel/DOOJ_zSjcnx/",
  "type": "reel",
  "caption": "Well we tried to be subtle…  #funnydogs #funny #whiteboxer #australianshepherd",
  "takenAt": "2025-09-05T12:51:42.000Z",
  "likes": 35854,
  "comments": 1263,
  "views": null,
  "durationSecs": 65.7,
  "thumbnailUrl": "https://scontent-ord5-2.cdninstagram.com/v/t51.82787-15/542212527_….jpg",
  "videoUrl": "https://scontent-ord5-2.cdninstagram.com/o1/v/t2/f2/m86/….mp4",
  "hashtags": [
    "funnydogs",
    "funny",
    "whiteboxer",
    "australianshepherd"
  ],
  "mentions": [],
  "isPaidPartnership": false,
  "locationName": null,
  "ownerHandle": "_layla_the_boxer",
  "ownerId": "13582495760",
  "ownerFullName": "Layla the Boxer",
  "ownerIsVerified": true,
  "ownerFollowers": 1369176,
  "status": "ok",
  "charged": true,
  "chargedEvent": "instagram-hashtag-post",
  "source": "scrapecreators",
  "fetchedAt": "2026-10-14T10:00:00.000Z"
}

Machine-readable

This page for agents