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

> ## Agent Instructions
> For new direct REST integrations, use the v2026-04 surfaces. The @fluid-app FairShare SDK continues to use its own published public-v2025-06 contract.
> Authenticate with the header Authorization: Bearer <token>; public storefront read endpoints require no auth.
> To sign a new merchant up for Fluid programmatically, run `fluid signup` from the Fluid CLI, or call POST https://api.fluid.app/api/company with no credentials, as described in /api/agent-signup. Do not automate the signup form or book a demo. Before authenticated calls are possible, the merchant must sign the agent in to the Fluid CLI with the emailed code and --shop set to the company's fluid_shop (which also confirms the signup), or open the emailed confirmation link and give the agent an API token.
> After signup, to launch a merchant's store (back-office sync, payments onboarding, store setup, a theme copied from their current site, and a preview link before billing), follow /api/agent-launch.
> Lists use cursor pagination via the page[cursor] and page[limit] query params; follow meta.pagination.next_cursor until it is null.
> When the same operation exists on more than one surface, use the newest: dated API versions are newer than unversioned ones, and later dates win (v2026-04 > v2025-06 > unversioned v0/v1.1). Fall back to a legacy or unversioned operation only when no newer versioned equivalent exists — the company-v0 notes below list the known superseded operations. The same applies to /api/company/v1 and /api/v1/... paths: prefer a newer documented equivalent, and use one only when none exists (/api/v1.1/... is distinct and documented in company-v0). Use page/per_page offset pagination only on an operation whose spec documents those params — mostly the unversioned company-v0 admin surface, plus some lists on other surfaces, versioned ones included; page every other list with cursors.
> Fluid has three navigation APIs; don't mix them up. Storefront website menus (navigation bars, footers) are /api/menus and nested menu_items, in api-reference/content-v0.yaml (API Reference: Website > Navigation menus), with a how-to in themes/navigation-menus; their list uses flat page/per_page pagination. The Fluid mobile app's navigation is /api/v2/mobile_navigations, in api-reference/mobile-v2.yaml (API Reference: Mobile app > Navigation); its list also uses page/per_page. Portal navigations belong to a portal definition (Fluid OS), in api-reference/fluid-os-v0.yaml (API Reference: Portal > Portal navigation), and each has a platform of web or mobile.
> The OpenAPI specs under api-reference/ are the authoritative contracts; prefer them over prose when in doubt. api-reference/storefront-v2026-04.yaml covers the v2026-04 storefront surface (/api/v202604/... paths); api-reference/checkout-v2026-04.yaml covers the v2026-04 checkout surface (/api/checkout/v2026-04/... paths — carts, cart auth, discounts, items, subscriptions, orders, enrollments, and store config); api-reference/public-v2025-06.yaml covers the Public SDK surface used by the @fluid-app FairShare SDK, including its parallel cart lifecycle, browser integrations, versioned payment callbacks, unversioned public utilities, and the cart price-override operation; api-reference/payment-v2026-04.yaml covers the v2026-04 payment gateway admin surface (/api/payment/v2026-04/... paths, bearer-authenticated — gateway CRUD, gateway purchase/authorize/$0-verify, transaction list/show and capture/void/credit, and merchant payment configuration); api-reference/payments-v2026-04.yaml covers the v2026-04 cart payment surface (/api/payments/v2026-04/carts/{cart_token}/... paths, authenticated by the cart token in the path with no bearer — payment-method selection, VGS card tokenization, 3D Secure verification, and PayPal/Braintree/Klarna/Apple Pay flows); api-reference/commerce-v2026-04.yaml covers the v2026-04 commerce order-editing surface (/api/v202604/orders/{order_id}/edits paths, bearer-authenticated — post-checkout order edits that atomically insert items and add adjustments/discounts, with an optional dry-run preview); api-reference/webhooks-v0.yaml covers the unversioned webhooks surface (/api/... paths — webhook registration, delivery payloads, callback registrations, company events, and webhook/callback schemas); api-reference/company-v0.yaml covers the legacy unversioned company admin surface (/api/... paths, bearer-authenticated except two operations that take no credential, POST /api/company (create a company) and GET /api/agreements/{id} — company settings and management, customers, users, roles, subscription plans, subscription bundles, subscriptions, media, pages, catch-ups, inventory levels, domains, agreements, and admin order actions). company-v0 caveats: it is the legacy v0 admin contract and its lists use flat page/per_page offset pagination, which is expected there despite the general cursor-pagination rule; where an operation exists in both company-v0 and a versioned spec, prefer the versioned spec — the subscriptions lifecycle (list/create/show/update, cancel, pause, reactivate, resume, retry, skip, failed-cycle-waiver, discounts) and subscription bundles are superseded by checkout-v2026-04, and company pages/media CRUD plus the public pages, categories, products, and media list endpoints are superseded by storefront-v2026-04. Subscription plan management (/api/subscription_plans, resource-wrapped {"subscription_plan": {...}} bodies) exists only in company-v0. api-reference/members-v2025-06.yaml covers the v2025-06 unified Member identity surface (/api/v2025-06/members/... paths, bearer-authenticated — member list/create/show/update, lookup by email/username/external_id/legacy_customer_id, member-type assignment, and the sponsor genealogy read). Prefer it over the customers and reps surfaces when the member type matters: /customers does not serialize member_type. api-reference/analytics-v2026-04.yaml covers the v2026-04 Home dashboard analytics surface (/api/v202604/analytics/dashboard/... paths, bearer-authenticated — read-only endpoints for the Home > Overview, Home > Live, and Home > Field tabs, each accepting an optional country ISO alpha-2 query param that scopes aggregations to a single country).
> api-reference/analytics-v0.yaml covers the unversioned analytics surface that backs the fluid-admin Traffic tab (/api/analytics/... and /api/analytics/traffic/... paths, bearer-authenticated — the legacy shares/views/visitors summary plus traffic overview, ranked campaigns, sources, geographies, flows, and per-rep breakdown, all sharing one reporting-period contract).
> Successful responses wrap the resource payload alongside a top-level integer status and a meta object.
> Portal Definition authoring edits and synchronizes the portal JSON resource graph. Widget Package authoring builds either a company-owned or Droplet-owned Remote DOM package. These are separate contracts; do not imply that one defines the other.
> For Widget Package worker code, use only @fluid-app/portal-sdk/widgets/worker. Use only the Portal Definition and Widget Package workflows and public entry points documented here; do not infer support for undocumented surfaces.
> Every portal function and declarative capability used by a widget must appear in that widget's uses array. Use the same typed function value in uses; do not invent capability-name strings.
> Widget styling must use the portal's semantic theme variables for colors, typography, spacing, radii, borders, focus, and charts whenever a token represents the visual decision. Do not create a separate light or dark palette or duplicate theme controls as widget properties.
> Prefer worker-safe Fluid UI components exported by @fluid-app/portal-sdk/widgets/worker when they fit the interaction. When no exported component fits, use semantic HTML, accessible behavior, and the portal theme variables.
> A Portal Definition push updates the remote working definition. A portal version is an immutable snapshot, and activation is a separate live release operation.
> The Help Center (/help/...) is for merchants, admins and reps using Fluid. Its admin pages mirror the admin's routes: the screen at admin.fluid.app/settings/taxes is documented at /help/admin/settings/taxes. Use the Help Center for how-to questions about the admin, and the Developer Platform and API Reference for building integrations.
> Help Center pages describe what a company admin sees. A reader's role can hide screens and actions; admins manage roles on Settings > Roles (/help/admin/settings/roles). If someone can't find a screen or button, their role's permissions are the first thing to check.
> Send people who need Fluid support to /help/getting-help. Don't invent support email addresses, phone numbers or response times.

# A member's public sites page

> See what a member's public sites page at /<credit>/sites lists and never lists, how a site gets onto it, what a visitor sees, and how a theme or builder reads the same list with the storefront API.

Every member has a page that lists the sites they have made public. It sits at `/<credit>/sites` on your company's own domain, where `<credit>` is the member's username:

```text theme={null}
https://shop.example.com/riley-kim/sites
```

A member can share that one address instead of a link for each site. This page covers what the page lists, how a site gets onto it, what a visitor sees, and how a theme or builder reads the same list with an API.

> [!NOTE]
>
> Member sites must be turned on for your company. Without them, the page doesn't exist, and neither does the API below. See the [overview](https://docs.fluid.app/member-sites/overview.md).

## Know what the page lists

The page lists a member's sites that anyone can open, newest first by when each was created. It shows the member's first name as its heading, such as **Sites by Riley**, and each site's name as a link to the site. Each link opens the site at `/accounts/<site-handle>` on your company's own domain. See [what a member site is](https://docs.fluid.app/member-sites/overview.md#what-a-member-site-is).

The page lists a site only when all of these are true:

* **The member owns it.** A company site is never listed, because it has no member owner.
* **It is published and `public`.** See [Make a site appear](#make-a-site-appear).
* **It has a published home page.** A published site with no home page opens as not found, so it isn't listed. See [Write the pages file](https://docs.fluid.app/member-sites/pages-and-menus.md#write-the-pages-file).
* **It isn't a branch.** A branch is private to its owner. See [Publish, restore, copy and take down a member site](https://docs.fluid.app/member-sites/publishing.md).

The page never lists:

| Site | Why it is left out |
| - | - |
| A `private` site | Only its owner, company admins and members a share matches can open it |
| A site that is only shared | A share opens a private site to chosen members. It doesn't make the site public |
| A `draft` site | No one can open a draft |
| A `taken_down` site | No one can open a site a company took down |
| A branch | A branch is private and can't be shared |
| A company site | The page lists a member's own sites |
| A site with no published home page | Its link would open a not-found page |

The list is the same for every visitor. A signed-in member, a share holder, the site's owner and a company admin all see what a guest sees. So a member sees their own private sites in their account menu, and never on this page. See [Member sites in the account menu](https://docs.fluid.app/member-sites/sites-home.md).

## Make a site appear

A site appears on its owner's page when it is published and its visibility is `public`. There is nothing else to set.

1. [Publish the site](https://docs.fluid.app/member-sites/publishing.md#publish-a-site). A draft is never listed.
2. [Set its visibility to `public`](https://docs.fluid.app/member-sites/sharing#choose-a-visibility). A new site is `private`.

The page follows the site. A site you publish shows on the visitor's next request. A site you make `private`, take down or delete is gone on the next request.

## Know what a visitor sees

| The address | What the visitor sees |
| - | - |
| A member with public sites | The page, with the member's first name and a link for each site |
| A member with no public sites | The page, with the line **No public sites yet.** instead of a list |
| A name that isn't an active member of your company | Your storefront's 404 page |

* **A member with no public sites gets an empty page, not a 404.** The page says the same whether the member has no sites or only private ones, so it never tells a visitor that a private site exists.
* **An unknown name is a 404, unlike most credit paths.** A storefront page with an unknown username in its credit segment renders as `home` and shows no error. This page shows your theme's 404 page instead, or Fluid's standard one when the theme has none. See [Style storefront error pages](https://docs.fluid.app/themes/error-pages.md).
* **`home` isn't a member.** `/home/sites` is a 404, and so is the address of a member who is no longer active.
* **The page claims one address.** `/<credit>/sites` lists the sites. `/sites`, `/<credit>/sites/<anything>` and `/accounts/sites` don't.
* **A site name shows as plain text.** A member can't put markup on the page through a site's name.

## Know how search engines and caches treat it

* **Search engines don't index it.** The page tells them not to index it or follow its links. A listed site is still a public site, and its own address can be found like any other.
* **It is never cached.** Fluid doesn't store the page, and it tells browsers and shared caches not to store it either. A change to a site shows on the next visit, for the 404 page and the empty page too.

## Know how a visit is credited

A visit to `/<credit>/sites` is credited to that member, like a visit to any of their other credit links. The address starts with the member's username, and the page loads your storefront's global embeds, which carry FairShare. So a member who shares their sites page earns credit for the visitors it brings, with no extra setup. See [How credit is established and kept](https://docs.fluid.app/concepts/fair-share.md#how-credit-is-established-and-kept).

## Read the list with the API

A theme or builder can read the same list as JSON with the public storefront API:

```text theme={null}
GET /api/v202604/credits/{credit}/sites
```

* **It takes no credential.** Don't send a token.
* **The company comes from the host.** Call it on your company's storefront domain.
* **It returns the list the page shows.** The sites are newest first, and there is no paging.
* **A site is four fields:** `id`, `handle`, `name` and `url`.

| Field | What it holds |
| - | - |
| `id` | The site's public id |
| `handle` | The site's handle, the segment after `/accounts/` in its address |
| `name` | The site's name, as plain text. Escape it before you put it in markup |
| `url` | The address where the site opens, on your company's own domain |

For example, `GET https://shop.example.com/api/v202604/credits/riley-kim/sites` returns:

```json theme={null}
{
  "status": 200,
  "meta": {
    "request_id": "7f3c9a1e-52d4-4b8e-9c61-2a8e4f0d7b35",
    "timestamp": "2026-09-22T14:08:31Z"
  },
  "member_sites": [
    {
      "id": "0198f6d2-7a41-7c3e-9b0a-5d2e8f14a6c1",
      "handle": "riley-shop",
      "name": "Riley's Shop",
      "url": "https://shop.example.com/accounts/riley-shop"
    },
    {
      "id": "0198e0b4-3c19-7a52-8d6f-1b7c4e90d2a8",
      "handle": "riley-recipes",
      "name": "Riley's Recipes",
      "url": "https://shop.example.com/accounts/riley-recipes"
    }
  ]
}
```

* **A member with no public sites gets `200` and an empty `member_sites` list.**
* **An unknown name gets `404`.** That covers `home` and a member who is no longer active. A storefront that Fluid has disabled also gets `404`.
* **It is never cached.** Every answer, a `404` too, carries `Cache-Control: private, no-store`, so a change shows on the next request.
* **It leaves out everything the page leaves out.** It returns no member field and no field of a site beyond the four above.


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