> **For coding agents and LLMs:** This is one Social Fetch marketing page (markdown export). For API orientation start with [`/llms.txt`](https://www.socialfetch.dev/llms.txt); for auth and crawl rules use [`/agents.txt`](https://www.socialfetch.dev/agents.txt); for every operation use [`/llms-endpoints.txt`](https://www.socialfetch.dev/llms-endpoints.txt).

## This page

- **On-site (HTML):** <https://www.socialfetch.dev/platforms/ko-fi/profiles-handle-shop>
- **Markdown (.mdx) URL:** <https://www.socialfetch.dev/platforms/ko-fi/profiles-handle-shop.mdx>

---

# Ko-fi Shop API

A creator's public shop items with prices, stock, images and audience, filtered by category or search term.

`GET /v1/ko-fi/profiles/{handle}/shop` returns `data.items`, up to 20 per page, with the creator's `id`, canonical `handle`, `name` and `currency`. Each item has `id`, `alias`, `url`, `name`, `descriptionPreview`, `price`, `currency`, `images`, `soldOut`, `stockRemaining`, `soldCount`, `payWhatYouWant`, `requiresShipping`, `access`, `discountPercent` and `categoryIds`. `access` is `public`, `members` or `supporters`.

Use `query` to search within the shop, `category` to keep one category id from `categoryIds`, and `limit` from 1 to 20 (default 12). Continue with `page.nextCursor` while `page.hasMore` is true. A creator with no shop returns `found`, `currency: null` and `items: []`. A missing creator returns `not_found` with null identity fields.

## Request

- **Endpoint:** `GET /v1/ko-fi/profiles/{handle}/shop`
- **Credits:** 1 credit
Failed requests are free
- **Input:** by handle, category or search
- **Full reference:** [docs](https://www.socialfetch.dev/docs/api/v1/ko-fi/profiles/handle/shop/get)
- **Platform page:** [/platforms/ko-fi](https://www.socialfetch.dev/platforms/ko-fi)

## FAQ

### How does hasMore know there is another page?

hasMore is false when the page ends exactly at the limit, so a shop with 12 items at limit 12 reports hasMore false and does not send you to an empty page.

### How do I filter by category?

Read categoryIds from any item and pass one of those numbers as category. The filter is applied by the shop itself, so the page counts refer to the filtered list.

### What is the difference between price and payWhatYouWant?

price is the listed amount, which can be 0 for a free item. payWhatYouWant is true when the buyer chooses the amount. Always read both fields instead of treating price 0 as a missing price.

### How many credits does a shop page cost?

Pricing is documented on the operation in the API registry (shown on this page). Confirm on every response with meta.creditsCharged: that field is the billing source of truth. Each paginated page is a separate billed request.
