# UGC galleries

Collect what people post about your brand, and put it on your site. Watch hashtags and mentions across Instagram and TikTok. Publish approved posts with media links that never expire.

For teams like TINT, Yotpo, Bazaarvoice, Flowbox, Foursixty.

## Why teams use Openhandle.

A gallery is only as good as the day it was built. Links rotate, posts vanish, rights need a paper trail.

### Example: Product page gallery · #summerdrop · Friday

**Basic scraper**

| Post | Author | Media link | On site |
|---|---|---|---|
| Post · Aug 30 | @mira.edits | cdn.platform/…/a81f.jpg | Showing |
| Reel · Aug 30 | @kofi.cuts | cdn.platform/…/c22e.mp4 | Showing |
| Post · Aug 31 | @juno.reels | expired | Broken tile |

The platform rotated its media URLs on Thursday. Three tiles on the product page are broken images, and a customer noticed before you did.

**Openhandle**

| Post | Author | Media link | On site |
|---|---|---|---|
| Post · Aug 30 | @mira.edits | media.openhandle.dev/m_8f3k2… | Showing |
| Reel · Aug 30 | @kofi.cuts | media.openhandle.dev/m_2c9df… | Showing |
| Post · Aug 31 | @juno.reels | media.openhandle.dev/m_71ab0… | Showing |

Same posts. Stable media links served from our CDN, so the gallery renders the same on Friday. A deleted post returns not-found and leaves the wall on the next refresh.

| Without Openhandle | With Openhandle |
|---|---|
| **Hashtag feeds show the top posts.** The tag page surfaces a handful of top posts. The customer photo from Tuesday never makes it into the pool. | **Search hashtag posts, newest first.** Page through recent hashtag posts. You can also find mentions in comments under your posts. |
| **Platform media links expire in days.** The image URL you saved on Monday is a broken tile on your product page by Friday. | **Media links that never expire.** We serve requested media from our CDN. Your gallery stays intact when platform links expire. |
| **Rights requests need the post and the author.** A screenshot and a handle typed from memory is not a rights record anyone would defend. | **Post ID, author, and posting time on every post.** Ask for permission from the row itself and store the consent next to it. The gallery and the rights log come from one record. |
| **Galleries go stale or cost a fortune.** Either the wall shows a post the creator deleted last month, or you re-crawl everything daily at full price. | **Daily refresh from cache, live check before publishing.** Refresh the pool from the 24-hour cache. Re-read a post live before it goes on the site. A deleted post comes back as not-found and drops off. |

## How a gallery stays alive.

1. **Watch tags and mentions.** Read the posts under your hashtags newest-first, and the comments under your own posts for mentions. Daily, from cache.
2. **Ask for rights, keep the receipt.** Every post carries its author, ID, and posting time. Request permission from that record and store the consent next to it.
3. **Publish on stable media, refresh daily.** Use the media links from the response. Re-read a post live before it goes up. If it comes back not-found, it comes down.

Posts under your hashtag:

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

```json
{
  "platform": "instagram",
  "resource": "posts",
  "capturedAt": "2026-09-01T06:00:09Z",
  "source": "cache",
  "data": [
    {
      "id": "DL8ma11pR2k",
      "author": { "id": "25025320", "handle": "mira.edits" },
      "createdAt": "2026-08-30T18:41:12Z",
      "media": [{ "type": "image", "url": "https://media.openhandle.dev/m_8f3k2…" }],
      "metrics": { "likes": 18211, "comments": 402 }
    },
    …
  ],
  "nextCursor": "eyJvZmZzZXQiOjI0fQ"
}
```

Each post carries its author, its posting time, and stable media links served from our CDN. The gallery tile and the rights request come from one row.

## Keep every gallery post tied to its source.

- **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

- [Instagram hashtag posts](https://openhandle.dev/docs/api-reference/instagram-hashtag-posts-list)
- [TikTok hashtag posts](https://openhandle.dev/docs/api-reference/tiktok-hashtag-posts-list)
- [Private and deleted accounts](https://openhandle.dev/docs/guides/private-and-deleted-accounts)
