> **For coding agents and LLMs:** This is one Social Fetch marketing page (markdown export). For API orientation start with [`/llms.txt`](https://www.socialfetch.dev/llms.txt); for auth and crawl rules use [`/agents.txt`](https://www.socialfetch.dev/agents.txt); for every operation use [`/llms-endpoints.txt`](https://www.socialfetch.dev/llms-endpoints.txt).

## This page

- **On-site (HTML):** <https://www.socialfetch.dev/platforms/instagram/v2-instagram-hashtags-hashtag-media>
- **Markdown (.mdx) URL:** <https://www.socialfetch.dev/platforms/instagram/v2-instagram-hashtags-hashtag-media.mdx>

---

# Instagram Hashtag Media API

Page the posts and Reels under a hashtag as structured JSON: the top view, the newest posts, or Reels only, in the shared Social Fetch v2 envelope.

`GET /v2/instagram/hashtags/{hashtag}/media` takes the hashtag in the path, with or without a leading `#`, or an instagram.com `/explore/tags/<name>/` link. The optional `tab` query picks the view: `top` (default) for the posts and Reels Instagram ranks first, `recent` for the newest posts, or `reels` for Reels only. On a completed lookup, read `data.lookupStatus` (`found` or `not_found`), then `data.media` and `data.page` (`hasMore`, `nextCursor`).

Each item is the media object every v2 list returns: `id`, `shortcode`, `url`, `kind` (`post` or `reel`), `mediaType`, `caption`, `createdAt` (ISO-8601), the `owner`, `metrics` (`likeCount` is `null` and `likesHidden` `true` when the author hides likes), media URLs, `carousel`, `audio`, `coauthors`, `location` and `isPaidPartnership`. `taggedUsers` is a list on the `top` and `reels` views and `null` on `recent` items that don't carry tags. Every field is always present and `null` when Instagram doesn't say.

The views show what Instagram shows now, which reaches back days, not months, and there is no date filter: poll `tab=recent` and stop paging at the date you need. When `data.page.hasMore` is true, pass `data.page.nextCursor` as `cursor`; a cursor keeps the view it came from, so you can omit `tab` on later pages. Pages can overlap on Instagram's side, so repeated posts are dropped and the list ends when a page brings nothing new. Instagram CDN URLs expire. Bill from `meta.creditsCharged`, per page. For a tag's post count use `GET /v2/instagram/hashtags/{hashtag}`.

## Request

- **Endpoint:** `GET /v2/instagram/hashtags/{hashtag}/media`
- **Credits:** 1 credit
Failed requests are free
- **Input:** by hashtag
- **Full reference:** [docs](https://www.socialfetch.dev/docs/api/v2/instagram/hashtags/hashtag/media/get)
- **Platform page:** [/platforms/instagram](https://www.socialfetch.dev/platforms/instagram)

## FAQ

### How do I list posts under an Instagram hashtag via API?

Call `GET /v2/instagram/hashtags/{hashtag}/media` with your Social Fetch API key (`x-api-key`) and the hashtag in the path. Choose a view with `tab=top|recent|reels`. Read `data.lookupStatus`, `data.media` and `data.page` in the JSON response. See the API docs for parameters and examples.

### How much does the Instagram Hashtag Media API cost?

Pricing is documented on the operation in the API registry (shown on this page). Confirm on every response with meta.creditsCharged — that field is the billing source of truth. Each paginated page is a separate billed request.

### What is the difference between the top, recent and reels tabs?

`top` is Instagram's popular view for the tag, mixing posts and Reels. `recent` is the newest posts first, which is the view to poll for new content. `reels` is Reels only. Each tab pages on its own cursor, and the cursor remembers its tab.

### Can I filter hashtag posts by date?

There is no date filter, because Instagram has none. The views are live and reach back only a short time. Use `tab=recent` and stop paging when you reach the date you need.

### How does pagination work?

When `data.page.hasMore` is true, pass `data.page.nextCursor` as `cursor` on the next request. The cursor keeps the view, so you can leave `tab` out, but sending a different `tab`, or using the cursor for another hashtag, returns `400`. The list ends when `hasMore` is false, even if Instagram would keep serving pages, so a client never loops.

### What does not_found mean, and what if a hashtag returns nothing?

`not_found` means no public post uses the hashtag. `found` with an empty `media` list is the end of the list, or a hashtag whose posts Instagram doesn't show publicly, as with some sensitive tags. Both come back as a normal response, billed once.
