> ## 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, 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. The merchant must open the emailed sign-in link and create an API token before authenticated calls are possible.
> 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 where a spec documents it — in practice the unversioned company-v0 admin surface; every versioned surface uses cursor pagination.
> Navigation menu management is documented in themes/navigation-menus. These unversioned admin endpoints (/api/menus and nested menu_items) are verified against the implementation but are not yet in the synced OpenAPI specs. Use that reference for menu payloads and its flat page/per_page pagination; missing spec coverage does not make these endpoints unavailable.
> 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 — 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.

# API Tokens

> Create API tokens and public tokens for your integrations, copy each one when it's created, and delete the tokens you no longer use.

Use the **API Tokens** screen to create and revoke the tokens that authenticate API and storefront requests for your company. For how developers send a token with their requests, see [Authentication](/api/authentication).

## Where to find it

In the admin, click the **Settings** gear in the top bar. In the Settings sidebar, under **System**, select **API Tokens**.

If you don't see **API Tokens**, your role doesn't have access to **Developer**. To open the screen, your role needs at least **View only** for **Developer**, in the **Settings** card on the role's **Permissions** tab. See [Roles](/help/admin/settings/roles).

If your role has **View only** for **Developer**, the **Generate Token** and **Create Public Token** buttons and each token's actions menu are hidden. **Full access** shows them.

To choose a role when you create an API token, your role also needs at least **View only** for **Roles**, in the same **Settings** card. To create a role from the panel, it needs **Full access** for **Roles**.

## What's on the screen

The screen has two cards: **API Tokens** and **Public Tokens**. Each card lists your company's tokens of that kind and has a search box that finds tokens by label or name.

### API Tokens card

The card reminds you that a token is shown only once, when you create it. Click **Generate Token** to create one.

The list has these columns:

* **Token Label**: the name you gave the token. You can rename it from the list. See [Edit an API token](#edit-an-api-token).
* **Role**: the role that determines the token's permissions. You can change it from the list.
* **API Token**: a masked version of the token, with a lock icon. The full token isn't shown here.
* **Created**: the date the token was created.
* **Expires**: the date the token expires, or **Never expires**. Once the date has passed, it shows in red with **(Expired)**.

Each token's actions menu has **Delete**.

### Public Tokens card

Public tokens are client-side tokens for front-end integrations, such as the [DAM Picker SDK](/guides/dam-picker). Each one has the scopes and optional domain allowlist you choose when you create it. Click **Create Public Token** to create one.

The list has these columns:

* **Name**: the name you gave the token.
* **Token**: a masked version of the token, with a lock icon.
* **Scopes**: what the token can access, such as `dam:browse`.
* **Domain Allowlist**: the domains you added to the token, or **All domains** if you didn't add any.
* **Expires**: the date the token expires, or **Never expires**. Once the date has passed, it shows in red with **(Expired)**.
* **Created**: the date the token was created.

Each token's actions menu has **Delete**. You can't change a public token after you create it. To use different settings, create a new public token and delete the old one.

### The Create API Token panel

The panel opens on the right when you click **Generate Token**.

* **Token Label**: a descriptive name to help you identify the token later. It's required and must be unique.
* **Role**: the role determines what permissions the token has. It's required. Search for or select one of your company's roles, or choose **+ Create new role...** to create one. After you select a role, click **Role Permissions** to see its permissions.
* **Expiration Date**: the date the token should expire. Leave it empty for a token that never expires.

**Create Token** becomes available once you enter a label and select a role.

### The Create Public Token panel

The panel opens on the right when you click **Create Public Token**.

* **Name**: a descriptive name to identify the token. It's required and must be unique.
* **Scopes**: what the token can access. All scopes are selected when the panel opens. Clear the ones the token doesn't need, or use **Select All** or **Deselect All**. Keep at least one selected.
* **Domain Allowlist**: optional. Type a domain, such as `shop.example.com`, then click **Add** or press Enter. To remove a domain, click the **×** next to it. Leave the list empty to allow all domains.
* **Expiration**: when the token expires, counted from when you create it: **1 hour**, **24 hours**, **7 days**, **30 days** or **Never expires**. **1 hour** is selected when the panel opens. A token set to **Never expires** needs at least one domain in **Domain Allowlist**.

**Create Token** becomes available once you enter a name and select at least one scope.

These are the scopes you can choose, and how the **Scopes** column shows each one:

| Scope | What it allows | Shown in the list as |
| - | - | - |
| **DAM Upload** | Upload files to the company DAM | `dam:upload` |
| **DAM Browse** | Browse and search existing assets | `dam:browse` |
| **DAM Unsplash** | Search Unsplash photos | `dam:unsplash` |
| **DAM AI Generate** | Generate images with AI | `dam:ai_generate` |
| **Media Read** | Read, index, and search media | `media:read` |
| **Products Read** | Read, index, and search products | `products:read` |
| **Enrollments Read** | Read, index, and search enrollments | `enrollments:read` |
| **Playlists Read** | Read, index, and search playlists | `playlists:read` |
| **Forms Read** | Read, index, and search forms | `forms:read` |

### After you create a token

Once the token is created, the panel changes to **Token Created** for an API token, or **Public Token Created** for a public token. It shows the full token under **Your API Token** or **Your Public Token**. This is the only time you can see it.

* Click **Copy** to copy the token. The button changes to **Copied**.
* For an API token, the **How to use this token** box shows the **Base URL** and **Header** your developer needs, with a **View the API reference** link.
* The **Next Steps** box suggests what to do with the token.
* Click **Done** to close the panel.

<Warning>
  Copy the token before you close the panel. You can't see it again.
</Warning>

## Create an API token

<Steps>
  <Step title="Open the panel">
    On the **API Tokens** card, click **Generate Token**. The **Create API Token** panel opens.
  </Step>

  <Step title="Name the token">
    In **Token Label**, enter a name that helps you identify the token later.
  </Step>

  <Step title="Choose a role">
    In **Role**, select the role whose permissions the token should have. To create a role for it, choose **+ Create new role...**, enter the role's name and permissions in the **Create Role** panel, and click **Save**. The new role is then selected.
  </Step>

  <Step title="Set an expiration date">
    To have the token expire, select a date in **Expiration Date**. Leave it empty for a token that never expires.
  </Step>

  <Step title="Create and copy the token">
    Click **Create Token**. In the **Token Created** panel, click **Copy**, then click **Done**. Store the token in a secure location, such as your application's environment variables, and never commit it to version control.
  </Step>
</Steps>

## Create a public token

<Steps>
  <Step title="Open the panel">
    On the **Public Tokens** card, click **Create Public Token**. The **Create Public Token** panel opens.
  </Step>

  <Step title="Name the token">
    In **Name**, enter a name that identifies the token.
  </Step>

  <Step title="Choose the scopes">
    Under **Scopes**, clear each scope the token doesn't need. Keep at least one selected.
  </Step>

  <Step title="Add domains">
    Type each domain under **Domain Allowlist** and click **Add**. You can leave the list empty.
  </Step>

  <Step title="Choose an expiration">
    In **Expiration**, choose when the token expires. If you choose **Never expires**, add at least one domain in the previous step.
  </Step>

  <Step title="Create and copy the token">
    Click **Create Token**. In the **Public Token Created** panel, click **Copy**, then click **Done**.
  </Step>
</Steps>

## Edit an API token

You can rename an API token from the list. Renaming a token or changing its role needs **Full access** for **Developer**.

<Steps>
  <Step title="Start editing the label">
    In the **Token Label** column, click the token's label or the pencil icon next to it.
  </Step>

  <Step title="Save the new label">
    Type the new label, then press Enter or click outside the field. If the label is empty or another API token already uses it, an error appears and the old label stays.
  </Step>
</Steps>

To change a token's role, select a different role in its **Role** column. The change saves right away.

You can't change a token's expiration date on this screen. To use a different one, create a new token and delete the old one.

## Delete a token

To revoke a token, delete it.

<Steps>
  <Step title="Check the token isn't in use">
    Make sure no app or integration still uses the token.
  </Step>

  <Step title="Delete the token">
    On the **API Tokens** or **Public Tokens** card, open the token's actions menu and choose **Delete**. **Delete** takes effect right away, without asking you to confirm. The token disappears from the list, and you can't undo this.
  </Step>
</Steps>

<Tip>
  To replace a token, for example one you lost, create a new token, switch your app to it, then delete the old one.
</Tip>

## Frequently asked questions

<AccordionGroup>
  <Accordion title="Can I see a token again after I close the panel?" id="see-token-again">
    No. The full token appears only once, right after you create it. The lists show only a masked version. If you lose a token, create a new one and delete the old one.
  </Accordion>

  <Accordion title="Why can't I click Create Token?" id="create-token-unavailable">
    In the **Create API Token** panel, enter a **Token Label** and select a **Role**. In the **Create Public Token** panel, enter a **Name** and select at least one scope.

    If an error appears when you click it, check that no other token of the same kind already uses the label or name. For a public token set to **Never expires**, also check that you added at least one domain.
  </Accordion>

  <Accordion title="What's the difference between API tokens and public tokens?" id="api-vs-public-tokens">
    An API token has the permissions of the role you choose. Store it in a secure location and never commit it to version control. A public token is designed for client-side use, such as front-end integrations. When you create one, choose only the scopes the integration needs. For how developers send a token with their requests, see [Authentication](/api/authentication).
  </Accordion>
</AccordionGroup>

## Related pages

* [Settings](/help/admin/settings)
* [Roles](/help/admin/settings/roles)
* [Developer](/help/admin/settings/developer)
* [Webhooks](/help/admin/settings/webhooks)
* [Authentication](/api/authentication)
* [DAM Picker SDK](/guides/dam-picker)


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