> ## Documentation Index
> Fetch the complete documentation index at: https://docs.cevoid.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Custom UGC experiences

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

Use the [Storefront API](../storefront-rendering-api) 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](../storefront-rendering-api/storefront-ugc/list-posts) with your market and publishable key. For a product page, pass its product reference:

```bash theme={"system"}
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](./analytics/track-events) for custom event tracking.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.