# Custom UGC experiences

> Build product carousels, community walls, and homepage sections with the Storefront API.

Breadcrumb: Storefront API › Custom UGC · Updated: 2026-10-18
Docs index: https://docs.cevoid.com/developers/llms.txt

Use the [Storefront API](https://docs.cevoid.com/developers/storefront-api.md) to build your own UGC display. It returns public posts with shoppable products and attribution for your market.

## Configure the feed

Save your publishable key and market ID in your storefront configuration. To discover market IDs, call `GET /v2/markets` from your server with a secret key that has `markets:read`.

For a curated feed, copy a published gallery ID from its Cevoid installation settings. There is no gallery discovery endpoint. Omit `gallery_id` for the workspace community feed. To discover curation labels, call `GET /v2/labels` from your server with `labels:read`.

## Fetch posts

Request [posts](https://docs.cevoid.com/developers/storefront-api/storefront-ugc/list-posts.md) with your market and publishable key. For a product page, pass its product reference:

```bash
curl "https://api.widget.cevoid.com/v1/posts?market=mar_sweden&product_ref=gid%3A%2F%2Fshopify%2FProduct%2F123" \
  -H "Authorization: Bearer ${CEVOID_PUBLISHABLE_KEY}"
```

For a community wall or homepage section, omit `product_ref`. You can add `gallery_id` or label filters for curation. See the endpoint parameters for matching rules and limits.

Append each page's `data`, then request `next_cursor` while `has_more` is true. Keep all other query parameters unchanged. Restart pagination after changing the market or filters.

## Render the content

- Render `IMAGE` posts as images and `VIDEO` posts as videos. Use `media.thumbnail_url` as the video poster, `alt` for accessible descriptions, and `video_captions` for WebVTT captions.
- Allow missing attribution, thumbnails, and captions. Hide captions when `hide_caption` is true.
- Render `tagged_products` as product cards and respect `availability`. Show a card even when it has no hotspot coordinates. Use `custom_link` for an editorial call to action.
- Hide empty sections. Keep the rest of the page usable if a request fails, and respect `Retry-After` on `429` responses.

Check the result with a tagged product, a video, and an empty feed. Confirm that product links and prices match the selected market.

## Add analytics

Fetching posts does not record impressions or clicks. Analytics requires a separate integration; see [Track events](https://docs.cevoid.com/developers/analytics-sdk/track-events.md) for custom event tracking.

---

Canonical: https://docs.cevoid.com/developers/storefront-api/custom-ugc
