# Instagram Hashtag Scraper (No Login) (`sfoln/instagram-hashtag-posts`)

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.

- Family: Social media data
- Categories: Social media, Lead generation, Automation
- Availability: on request (private on Apify). Email contact@sfoln.com with subject "Access request: Instagram Hashtag Scraper (No Login) (sfoln/instagram-hashtag-posts)" before calling; calls fail until it is public.
- JSON: https://www.sfoln.com/actors/instagram-hashtag-posts.json
- MCP: https://mcp.apify.com?tools=sfoln/instagram-hashtag-posts
- REST (sync): POST https://api.apify.com/v2/actors/sfoln~instagram-hashtag-posts/run-sync-get-dataset-items
- REST (async): POST https://api.apify.com/v2/actors/sfoln~instagram-hashtag-posts/runs

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 per delivered record

| Event | Price | Per 1,000 | Charged for |
| --- | --- | --- | --- |
| Instagram hashtag post (`instagram-hashtag-post`) | $0.0006 | $0.60 / 1,000 | Charged 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,000 | Charged 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). |

Pay-per-event, USD, billed by Apify; no platform usage charge. Only records with status `ok` are charged. Cap a run with `maxTotalChargeUsd`. Apify free plan: up to 10 per run.

## Run

```bash
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 client configuration:

```json
{
  "mcpServers": {
    "apify": {
      "type": "http",
      "url": "https://mcp.apify.com?tools=sfoln/instagram-hashtag-posts"
    }
  }
}
```

Example prompt: Find the 30 most recent public Instagram posts tagged #makeup and summarize which creators and products appear most often.

## Input

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

| Field | Type | Default | Meaning |
| --- | --- | --- | --- |
| `hashtags` (required) | array | — | Hashtags: 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. |
| `maxPostsPerHashtag` | integer | `30` | Max 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. |
| `datePosted` | string | — | 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"`. |
| `mediaType` | string | `"all"` | Media type: all = posts and reels, reels = reels only. One of `"all"`, `"reels"`. |
| `maxHashtags` | integer | `100` | Max hashtags: Safety cap on the number of hashtags processed in this run. |
| `concurrency` | integer | `4` | Concurrency: How many hashtags are fetched in parallel (1–8). |
| `itemTimeoutSecs` | integer | `600` | Time limit per input (seconds): Pagination for one hashtag stops cleanly shortly before this limit (60–3600). Raise it for very large per-input limits. |
| `includeRaw` | boolean | `false` | Include raw upstream response: Attach the unmodified provider object to each result record. |

Example input:

```json
{
  "hashtags": [
    "makeup"
  ],
  "maxPostsPerHashtag": 10
}
```

## Output

One record per input item with `status` (`ok` is charged; `not_found`, `error`, `skipped_*` are free) and `charged`. The run stores an `OUTPUT` summary record.

| Field | Type | Meaning |
| --- | --- | --- |
| `input` | string | object | Input: The hashtag as provided. |
| `recordType` | string | Record type: post (one per delivered post, charged) \| hashtag (one summary per hashtag, never charged) |
| `position` | integer | Position: 1-based position of the post within its input |
| `hashtag` | string | null | Hashtag: Lower-cased, without #. |
| `hashtagUrl` | string | Hashtag URL: Summary records only. |
| `datePosted` | string | null | Date filter: Summary records only. |
| `mediaType` | string | Media type filter: Summary records only. |
| `postId` | string | null | Post ID |
| `shortcode` | string | null | Shortcode |
| `url` | string | null | Post URL |
| `type` | string | null | Type: image \| video \| carousel \| reel |
| `caption` | string | null | Caption |
| `takenAt` | string | null | Posted at: ISO 8601 UTC |
| `likes` | number | null | Likes |
| `comments` | number | null | Comments |
| `views` | number | null | Views: Video/reel plays when exposed; null for images |
| `durationSecs` | number | null | Duration (s) |
| `thumbnailUrl` | string | null | Thumbnail URL |
| `videoUrl` | string | null | Video URL: Temporary CDN link |
| `hashtags` | array | Hashtags |
| `mentions` | array | Mentions |
| `isPaidPartnership` | boolean | null | Paid partnership |
| `locationName` | string | null | Location |
| `ownerHandle` | string | null | Owner handle |
| `ownerId` | string | null | Owner ID |
| `ownerFullName` | string | null | Owner name |
| `ownerIsVerified` | boolean | null | Owner verified |
| `ownerFollowers` | number | null | Owner followers |
| `rowsDelivered` | integer | Posts delivered: Summary records only. |
| `pagesFetched` | integer | Pages fetched: Summary records only. |
| `pagesCharged` | integer | Pages charged: Summary records only. |
| `reachedEnd` | boolean | Reached end: Summary records only: the upstream reported no further pages. |
| `stopReason` | string | Stop reason: Summary records only: limit \| end \| budget \| max_pages \| deadline \| empty_pages \| error |
| `status` | string | Status: ok \| not_found \| error \| skipped_invalid \| skipped_budget \| skipped_free_plan |
| `charged` | boolean | Charged |
| `chargedEvent` | string | Charged event |
| `error` | object | Error |
| `warnings` | array | Warnings |
| `source` | string | Source |
| `fetchedAt` | string | Fetched at |

Example record:

```json
{
  "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"
}
```

## Related

- [Instagram Posts Scraper (No Login)](https://www.sfoln.com/actors/instagram-user-posts.md) (`sfoln/instagram-user-posts`)
- [Instagram Comments Scraper (No Login)](https://www.sfoln.com/actors/instagram-post-comments.md) (`sfoln/instagram-post-comments`)
- [Instagram Engagement Rate & Audit](https://www.sfoln.com/actors/instagram-account-audit.md) (`sfoln/instagram-account-audit`)

Publisher: SFOLN LLC, contact@sfoln.com. Catalogue: https://www.sfoln.com/catalog.json. Agent guide: https://www.sfoln.com/agents.md.
