# Social listening

Every public conversation, in one shape, ready for analysis. Get public comments and replies from Instagram, TikTok, and X in one shape, ready for analysis.

For teams like Brandwatch, Sprinklr, Meltwater, Talkwalker, YouScan.

## Why teams use Openhandle.

Listening is a dataset problem. Coverage, shape, and cost per day decide whether it still runs in a year.

### Example: Daily sweep · 1 post · 1,240 comments

**Basic scraper**

| Sweep | Pages read | Comments | New |
|---|---|---|---|
| Mon | 62 | 1,240 | 1,240 |
| Tue | 62 | 1,243 | 1,243 |
| Wed | 63 | 1,251 | 1,251 |

Every sweep reads the whole thread again to find a handful of new comments. 187 pages for 11 comments that changed.

**Openhandle**

| Sweep | Pages read | Comments | New |
|---|---|---|---|
| Mon | 1 | 1,240 | 3 |
| Tue | 1 | 1,243 | 3 |
| Wed | 1 | 1,251 | 8 |

Same thread, same days. The since parameter stops at the last sweep. Three pages for the same 11 comments.

| Without Openhandle | With Openhandle |
|---|---|
| **Official APIs stop at your own accounts.** The Graph API and the TikTok Display API answer for accounts that authorized you. Listening is about everyone else. | **Public comments on any public post.** Comments, reply threads, and authors from any public post, on Instagram, TikTok, and X. |
| **Three platforms, three parsers.** Every platform returns comments differently. The normalizer is the part of the pipeline that breaks most and gets tested least. | **One comment shape for the model.** Text, author, likes, replies, and timestamps look the same on every platform. Feed it to sentiment, topics, or an LLM without per-platform code. |
| **Re-reading whole threads burns budget.** Reading a full comment section every day to find three new comments is how listening pipelines get switched off. | **Read only what changed.** The since parameter stops pagination at your last run. Daily sweeps come from the 24-hour cache. Escalations go live. |
| **Comment scrapers break weekly.** Every platform change kills a self-built collector, and the gap in the dataset is permanent. | **We handle platform changes.** We update Openhandle when platforms change. Your integration stays the same. |

## How a listening pipeline works.

1. **Build the watch list.** Posts from your accounts, competitors, hashtags, or search. Store the post IDs, not the URLs.
2. **Sweep incrementally.** Read new comments daily from the 24-hour cache. Each cache hit costs $0.0005, and pages stop at your window.
3. **Feed the pipeline.** Every comment arrives in the same shape with its own timestamp. Sentiment, topics, or an LLM read it as one stream.

New comments since the last sweep:

```bash
curl "https://api.openhandle.dev/v1/instagram/posts/DAbCdEfGhIj/comments?since=2026-09-01T00:00:00Z" \
  -H "Authorization: Bearer $OPENHANDLE_API_KEY"
```

```json
{
  "platform": "instagram",
  "resource": "comments",
  "capturedAt": "2026-09-02T06:00:14Z",
  "source": "live",
  "data": [
    {
      "id": "18021456321",
      "text": "the new firmware bricked mine too",
      "author": { "handle": "mvdberg", … },
      "metrics": { "likes": 41, "replies": 6 },
      "createdAt": "2026-09-01T21:18:40Z"
    },
    …
  ],
  "nextCursor": null
}
```

Only comments after your since timestamp, in the same shape on every platform. No cursor means the window is done, and the sweep cost one page.

## Run the same pipeline every day.

- **Proper invoicing.** Card payment, an invoice for every charge. Nothing prepaid, nothing that expires.
- **A person answers.** Chat directly with the people who build Openhandle through Crisp.

## Documentation

- [Pagination and cursors](https://openhandle.dev/docs/concepts/pagination)
- [Freshness and caching](https://openhandle.dev/docs/concepts/freshness-and-caching)
- [Instagram endpoints](https://openhandle.dev/docs/platforms/instagram)
