# Instagram comments API

Platform: Instagram.

Call `GET /v1/instagram/posts/{id}/comments` with the post ID. Each request returns one page of comments and a cursor for the next page. Replies to a comment have their own endpoint.

The post can belong to any public account. You do not need to own it, and you do not need Graph API access.

## GET /v1/instagram/posts/{id}/comments

```bash
curl "https://api.openhandle.dev/v1/instagram/posts/910100000001/comments" \
  -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.post('910100000001').comments.list();

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

200 OK:

```json
{
  "platform": "instagram",
  "resource": "comment",
  "capturedAt": "2026-09-18T09:20:41Z",
  "source": "live",
  "data": [
    {
      "id": "910200000001",
      "postId": "910100000001",
      "text": "This fictional kit is excellent.",
      "createdAt": "2026-08-10T10:00:00Z",
      "author": { "id": "910000000020", "handle": "copperfield_notes_test" },
      "metrics": { "likes": 12, "replies": 20 }
    }
  ],
  "meta": { "cursors": { "next": "b3BhcXVlLWN1cnNvcg" } }
}
```

Trimmed to one comment and the fields most apps need. The example post is a Test fixture with 24 comments over several pages, so you can test paging on a free Test key.

## What you get

- **Comments.** Each comment has `id`, `text`, `createdAt`, and the `author` with ID and handle.
- **Counts.** Likes and replies sit in `metrics`. When Instagram hides a like count, `likes` is `null`.
- **Replies.** A comment with `metrics.replies` above zero has a thread. Read it with `GET /v1/instagram/posts/{id}/comments/{commentId}/replies`.
- **Start from a URL.** Pass a post URL to `POST /v1/urls/fetch`. It returns the post with its `id`.

## Price

- **Per request.** $0.0025 per live request. $0.002 per request after 100,000 requests in a month. One page of results is one request.
- **Older data costs less.** Set `freshness` to say how old the data may be. Data up to 24 hours old: $0.0005. Data up to 7 days old: $0.0001. Data up to 30 days old: free.
- **Failed means free.** Errors and invalid requests are never billed. You pay for answers, and a confirmed not-found is an answer.
- **Free to start.** Every new workspace starts with 100 free live requests, no card needed. Test keys are never charged.

## When this does not work

These answers are definitive. Store them, do not retry them.

| Situation | Status | Code |
|---|---|---|
| The post is deleted or never existed | 404 | `POST_NOT_FOUND` |
| The account went private | 403 | `PROFILE_PRIVATE` |
| The cursor came from another request | 400 | `CURSOR_MISMATCH` |
| The identifier is malformed | 400 | `INVALID_IDENTIFIER` |

```json
{
  "error": {
    "code": "POST_NOT_FOUND",
    "message": "This post was not found.",
    "requestId": "req_01j8…",
    "retryable": false
  }
}
```

An account can go private while you page. Handle `PROFILE_PRIVATE` on any page, not only the first.

## Related

- [Instagram API](https://openhandle.dev/apis/instagram): Every Instagram endpoint with examples.
- [List post comments](https://openhandle.dev/docs/api-reference/instagram-post-comments-list): The endpoint reference with every parameter and SDK.
- [How do I get comments on an Instagram post that is not mine?](https://openhandle.dev/questions/how-do-i-get-comments-on-an-instagram-post-that-is-not-mine): Why the official API cannot, and how to page through every comment.
