Base URLs
All requests are made over HTTPS. Two servers are available:
Public storefront reads resolve the company from the request subdomain, so a catalog request looks like
https://acme.fluid.app/api/v202604/products. Company endpoints work against the global host with your token, for example https://api.fluid.app/api/v202604/company/products.
API versioning
The current, canonical surface is v2026-04. Its URL paths use the non-hyphenated form/api/v202604/...:
A small number of related surfaces carry their own date version in the path. Each endpoint’s reference entry shows its exact path, so always copy the version from there. For token types, scopes, and how to pass credentials, see Authentication.
Authentication
Company endpoints require a bearer token in theAuthorization header:
/api/v202604/{resource} and /api/v202604/{resource}/{slug}) require no authentication — the company is resolved from the subdomain. Company endpoints (/api/v202604/company/...) require a company-admin bearer token with storefront.view for reads and storefront.update for writes. See the Authentication guide for token types, scopes, and management.
Request format
Send request bodies as JSON and set theContent-Type header:
true or false, and numbers must not be quoted.
Response format
Every successful response carries a top-level integerstatus, a meta object, and the resource under its own key. List endpoints return the resource under a plural key (for example products) and add a pagination object to meta:
product or category) and omit pagination:
meta.request_id is a per-request identifier (it may be null) — include it when contacting support so a request can be traced.
Errors
Validation (422) and not-found (404) responses use a wrapped error envelope that mirrors the success shape — an error object, a top-level status, and meta:
Pagination
List endpoints use opaque cursor pagination. Two query parameters control it:
Each list response reports pagination under
meta.pagination:
next_cursor as page[cursor] on the next request and repeat until next_cursor comes back null. Cursors are opaque strings — pass them back verbatim and do not attempt to decode or construct them. Pagination is count-free by design: there are no total_count or total_pages fields.
Localization
Every storefront resource can carry its translated text — title, description, and image — in more than one language. Reads render a locale with thelang query parameter (falling back to the store default on the public surface); writes add a translation with a company PATCH carrying lang. Writing a translation is always a company update, never a public read, and never a separate translations endpoint. See Translate a resource for the full model and a per-resource reference.
What’s available
The v2026-04 storefront surface covers categories, collections, products, pages, posts, media, playlists, and enrollment packs — each with a public (unauthenticated) read surface and a company (token-authenticated) management surface. Browse every endpoint, with request and response schemas, in the auto-generated Endpoints reference.Authentication
Token types, scopes, and how to pass and manage credentials.
Find and create categories and collections
Browse the public catalog and manage rows with the company API.
Work with the category hierarchy
Nest categories and traverse parents and children.
Control country availability
Set, read, and filter the countries a row is available in.
Rename, publish, and schedule
Rename a row and control when it goes live.
Translate a resource
Write and read translations for any storefront resource with
lang.