> ## 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.
> To host a small project on Fluid (a landing page, event page, calculator or dashboard), follow /sites/quickstart: npm create @fluid-app/fluid-site my-site (or npx @fluid-app/create-fluid-site my-site), fluid login, then fluid deploy prints the public URL. Launch a Site unless the project needs a custom domain, server rendering or heavy server code, which make it an App (a Mist app); /sites/site-or-app has the rule, and POST /api/company/v2026-10/project-launch-recommendations applies it. With only the Fluid MCP server (its Site write tools are limited to Fluid root admins today; see /sites/deploy-from-claude), use site_create, then site_deploy (from a chat with no shell, in one call with the files inline: site_template_get for a starter, then site_deploy with each path's content; or a built folder in two calls: send the manifest, PUT the listed uploads, call again with the bundle_id to get the url), then, only after the person confirms they want it public, site_visibility_set. site_logs, site_traffic, site_env_list/set/unset, site_seo_get/set and the site_branch tools cover logs, traffic, env vars, SEO and preview branches; a member builds their own Sites with the my_site_* tools. The MCP site_deploy tool publishes server functions sent inline that import nothing; publish functions with imports, and convert a Site to an App, with the fluid sites CLI. A Site can serve light server code: each functions/<name>.ts, declared in config/functions.json with access public, signed_in or key (and an optional UTC cron schedule), answers at /api/<name> on the Site's own host; publish it with fluid deploy, or inline through the MCP site_deploy tool when it imports nothing. See /sites/functions and /sites/rest-api.
> 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.

# Passport, sign-in and the storefront around a Site

> What the storefront draws around a Site: the Passport account menu, the cart and lead-capture buttons, and the sign-in a Site shares with the storefront. Hide the floating buttons, open the Passport from your own button, and see what the storefront loads.

A Site opens inside your storefront's page. The storefront keeps the parts that need its own sign-in, cart and credit, and draws them around your Site. This page covers those parts, what each one gives your Site, and what you can change.

## What the storefront adds around your Site

| Part | What it is | Who sees it |
| - | - | - |
| **The Passport** | The storefront's account menu: a round button in a corner that opens the member's account, orders, subscriptions, their sites menu and sign-out | A signed-in member |
| **Lead capture** | FairShare's button that asks a guest for their details for the member who shared the link | A guest |
| **The cart button** | FairShare's floating cart, when your company shows one | Everyone |
| **Cart drawer and checkout** | The storefront's own cart and checkout, which `fluid.cart` opens | Everyone |

A signed-in member sees the Passport and never the lead-capture button. A guest sees the lead-capture button and never the Passport. When the visitor signs in or out, the two swap in place.

## The Passport

The Passport is the storefront's account menu. On a Site it does three jobs for you:

* **It's the visitor's account.** The member's account, such as their orders and subscriptions, opens from it, so your Site doesn't build any of them.
* **It lists the member's Sites.** Its sites menu lists the Sites the member can open, including any your company pinned for them. See [Show a Site to members](https://docs.fluid.app/sites/overview.md#show-a-site-to-members).
* **It holds the sign-out.** A Site can't sign anyone out. The visitor signs out in the Passport, and confirms it there.

## Sign-in carries over from the storefront

A member who is signed in on your storefront is already signed in on every Site there. There's no second login and no sign-in screen of your own to build.

```ts theme={null}
import { fluid } from "@fluid-app/sites";

const me = await fluid.auth.me();
if (me.viewer) {
  greeting.textContent = `Welcome back, ${me.viewer.name}`;
}
```

`fluid.auth.me()` gives your Site the visitor's name, avatar, user and member ids, their relation to the Site (`owner`, `admin` or `member`), and only the member fields your Site declares in `config/access.json`. See [Read who is here](https://docs.fluid.app/sites/sdk.md#read-who-is-here) and [Fluid data the site uses](https://docs.fluid.app/sites/declarations.md#fluid-data-the-site-uses).

### How it stays secure

Your Site's code runs on its own host under `sites.fluid.app`, in a sandboxed frame on the storefront's page. Because that host is a different origin from your storefront:

* **Your Site never receives the visitor's Fluid credentials.** It can't read the storefront's sign-in cookie or any Fluid token, and neither can a script you add to your Site.
* **The storefront hands your Site a short-lived session.** It's scoped to that one Site and that visitor, and the SDK renews it while the page is open. The SDK sends it only to your Site's own host.
* **Every call acts as the visitor.** `fluid.api` and `ctx.fluid.api` reach only that visitor's own data, within the scopes your Site declares. A guest's call goes as a guest.
* **A private Site's files stay private.** Its pages, scripts and functions aren't served to someone the Site doesn't admit, even when they open its host directly.
* **Sign-in takes a click.** `fluid.auth.signIn()` sends the visitor to the storefront's own sign-in only from a click, so a Site can't redirect visitors to it on load.

## Hide the floating cart and lead-capture buttons

To hide FairShare's floating cart and lead-capture buttons, such as when your Site draws its own controls in that corner, add `config/shell.json` to your Site and publish it:

```json config/shell.json theme={null}
{ "fairshare": "hidden" }
```

Only the floating buttons go. `fluid.cart`, the cart drawer, checkout and the visit's credit keep working, so give visitors your own cart button with `fluid.cart.open()` and guests your own sign-in with `fluid.auth.signIn()`. Publish the file with Sites plugin 0.1.379 or later. See [The storefront around the Site](https://docs.fluid.app/sites/declarations.md#the-storefront-around-the-site).

> [!NOTE]
>
> `"fairshare": "hidden"` doesn't hide the Passport. A signed-in member always sees the Passport's button, because it holds their sign-out. A guest never sees it.

## Open the Passport from your own button

To open the Passport from a button of your own, such as an avatar in your Site's header, call `fluid.auth.signOut()` from the click:

```tsx theme={null}
import { fluid } from "@fluid-app/sites";

function AccountButton({ signedIn }: { signedIn: boolean }) {
  return signedIn ? (
    <button type="button" onClick={() => fluid.auth.signOut()}>
      My account
    </button>
  ) : (
    <button type="button" onClick={() => fluid.auth.signIn()}>
      Sign in
    </button>
  );
}
```

* **`signOut()` signs nobody out.** It opens the Passport, where the visitor can sign out and confirm it.
* **It needs a signed-in visitor.** A guest has no Passport, so the call does nothing for a guest. Send a guest to `fluid.auth.signIn()` instead, as above.
* **It needs the storefront.** Outside a storefront, such as on the Site's own host, it does nothing and logs a warning.

## What the storefront loads, and what it costs your Site

The storefront page around your Site loads the Passport, FairShare (the cart, lead capture and the visit's credit) and a small script that connects your Site to them. Each one loads as a deferred module script, so none of them blocks the page. Scripts your company adds to the storefront for Sites load as the company wrote them.

* **Your Site paints on its own.** It loads in its own frame, in parallel with the storefront's scripts. If the storefront's scripts are slow or fail, your Site still opens and works. Only the parts they draw, such as the Passport and the cart, are missing.
* **The SDK is yours to load.** The storefront doesn't add anything to your Site's own pages. Import `@fluid-app/sites` in your build, or load `/_fluid/sdk/v1/sites.js` from your Site's own host as the [plain HTML guide](https://docs.fluid.app/sites/frameworks/html.md) shows. Load it as a module, so it never blocks your first paint.
* **A call waits for the sign-in, briefly.** A call made before the SDK has connected to the storefront waits for it, for up to three seconds, then goes as a guest.


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