# How do I get Instagram hashtag posts past the 30 hashtag limit?

Instagram. Checked September 2026.

Call the Openhandle hashtag posts endpoint with the hashtag name. Pick `sort=recent` or `sort=top`. Each request returns one page of public posts with a cursor for the next page. There is no weekly cap on how many different hashtags you query.

The 30 hashtag limit belongs to the Instagram Graph API. It counts unique hashtags per business account per rolling 7 days. A public data API reads what the hashtag page shows and does not carry that rule.

## GET /v1/instagram/hashtags/{name}/posts?sort=recent

```bash
curl "https://api.openhandle.dev/v1/instagram/hashtags/syntheticvolume/posts?sort=recent" \
  -H "Authorization: Bearer $OPENHANDLE_API_KEY"
```

```ts
import { OpenHandle } from '@openhandle/sdk';

const openhandle = new OpenHandle({ apiKey: process.env.OPENHANDLE_API_KEY! });
let page = await openhandle.instagram.hashtag('syntheticvolume').posts.list({ sort: 'recent' });

while (page) {
    for (const post of page.data) console.log(post.author.handle, post.metrics.likes);
    page = await page.next();
}
```

200 OK:

```json
{
  "platform": "instagram",
  "resource": "post",
  "capturedAt": "2026-09-18T10:11:05Z",
  "source": "live",
  "data": [
    {
      "id": "910100000001",
      "createdAt": "2026-08-09T15:30:00Z",
      "author": { "id": "910000000001", "handle": "northstar_forge_test" },
      "hashtags": ["syntheticvolume"],
      "metrics": { "likes": 840, "comments": 5, "views": 12000 }
    }
  ],
  "meta": { "cursors": { "next": "b3BhcXVlLWN1cnNvcg" } }
}
```

Trimmed to one post and the fields this question needs. The example is a Test hashtag with paginated posts, so you can test paging on a free Test key.

## Where the 30 hashtag limit comes from

The Graph API hashtag search needs a business or creator account, an app review, and a hashtag ID lookup first. Each account may look up 30 unique hashtags in a rolling 7-day window. Tools that promise unlimited hashtag feeds either pool many business accounts or read the public hashtag page. Openhandle does the second, on request, without pooling accounts.

## Recent or top

- **recent.** Newest public posts first. Use it for campaign tracking and UGC collection on a schedule.
- **top.** The posts Instagram ranks highest for the hashtag. Use it for a snapshot of what people see.
- **Hashtag metadata.** Call `GET /v1/instagram/hashtags/{name}` for the hashtag itself: name, avatar, and whether Instagram marks it trending.

## Collect UGC on a schedule

Run `sort=recent` on a schedule, store each post `id`, and skip IDs you already have. Media URLs in the response are served from our CDN and keep working after Instagram’s links expire. Store `capturedAt` with each post so a rights request can point at the exact read.

## When this does not work

Empty is an answer. A cursor from another request is a mistake.

| Situation | Status | Code |
|---|---|---|
| The hashtag has no public posts or Instagram hides it | 200 | `empty data` |
| The cursor came from another hashtag, sort, or freshness | 400 | `CURSOR_MISMATCH` |
| The hashtag name is malformed | 400 | `INVALID_IDENTIFIER` |

```json
{
  "error": {
    "code": "CURSOR_MISMATCH",
    "message": "The cursor does not belong to this request.",
    "requestId": "req_01j8…",
    "retryable": false
  }
}
```

An empty page bills as an answered request. Every new workspace starts with 100 free live requests, no card needed.

## Related

- [Instagram API](https://openhandle.dev/apis/instagram): Every Instagram endpoint, including hashtags, locations, and search.
- [Pagination](https://openhandle.dev/docs/concepts/pagination): Opaque cursors, one page per request, and what CURSOR_MISMATCH means.
- [UGC use case](https://openhandle.dev/use-cases/ugc): Collect and license user content with a record of every read.
