Company Categories index
Token-authenticated. Returns EVERY Category for the calling company regardless of lifecycle (draft / scheduled / archived rows included), so admins can manage non-public rows.
Supports the same cursor pagination / filter / sort / q
contract as the public catalog — filter[source_type] and
filter[parent_id] behave identically here (one shared
ListParams). Adds filter[status] and filter[active],
which are accepted on both surfaces but only take effect here.
curl --request GET \
--url https://api.fluid.app/api/v202604/company/categories \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.fluid.app/api/v202604/company/categories"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.fluid.app/api/v202604/company/categories', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.fluid.app/api/v202604/company/categories",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.fluid.app/api/v202604/company/categories"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.fluid.app/api/v202604/company/categories")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/v202604/company/categories")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"status": 200,
"meta": {
"request_id": "c4a1e2f7-3b9d-4e58-a0c6-7d2f91b84e13",
"timestamp": "2026-09-14T15:42:08Z",
"pagination": {
"cursor": null,
"limit": 25,
"prev_cursor": null,
"next_cursor": "eyJpZCI6MzExMiwicG9zaXRpb24iOjJ9"
}
},
"categories": [
{
"id": 3107,
"slug": "office-essentials",
"title": "Office Essentials",
"description": "Paper, desk supplies, and everything else a branch office runs on.",
"image_url": "https://ik.imagekit.io/fluidapp/dunder-mifflin/categories/office-essentials.png",
"canonical_url": "https://shop.dundermifflin.com/home/categories/office-essentials",
"images": {
"thumb": {
"url": "https://ik.imagekit.io/fluidapp/tr:w-200,c-at_max,f-auto,q-70/dunder-mifflin/categories/office-essentials.png",
"width": 200
},
"medium": {
"url": "https://ik.imagekit.io/fluidapp/tr:w-600,c-at_max,f-auto,q-75/dunder-mifflin/categories/office-essentials.png",
"width": 600
},
"large": {
"url": "https://ik.imagekit.io/fluidapp/tr:w-1200,c-at_max,f-auto,q-80/dunder-mifflin/categories/office-essentials.png",
"width": 1200
}
},
"active": true,
"status": "published",
"publish_at": null,
"created_at": "2026-09-01T10:15:00Z",
"updated_at": "2026-09-08T12:30:45Z",
"seo": {
"title": "Office Essentials",
"description": "Paper, desk supplies, and everything else a branch office runs on.",
"image_url": "https://ik.imagekit.io/fluidapp/tr:w-1200,h-630,c-maintain_ratio,fo-auto,f-auto,q-80/dunder-mifflin/categories/office-essentials.png",
"indexable": true,
"id": 14402
},
"metafields": [],
"languages": [
"en",
"es"
],
"parent_id": null,
"position": 1,
"source_type": "product",
"has_children": true,
"countries": [],
"custom_slug": true
},
{
"id": 3108,
"slug": "paper",
"title": "Paper",
"description": "Copy, printer, and cardstock paper, sold by the ream and by the case.",
"image_url": "https://ik.imagekit.io/fluidapp/dunder-mifflin/categories/paper.png",
"canonical_url": "https://shop.dundermifflin.com/home/categories/paper",
"images": {
"thumb": {
"url": "https://ik.imagekit.io/fluidapp/tr:w-200,c-at_max,f-auto,q-70/dunder-mifflin/categories/paper.png",
"width": 200
},
"medium": {
"url": "https://ik.imagekit.io/fluidapp/tr:w-600,c-at_max,f-auto,q-75/dunder-mifflin/categories/paper.png",
"width": 600
},
"large": {
"url": "https://ik.imagekit.io/fluidapp/tr:w-1200,c-at_max,f-auto,q-80/dunder-mifflin/categories/paper.png",
"width": 1200
}
},
"active": true,
"status": "published",
"publish_at": null,
"created_at": "2026-09-01T10:17:22Z",
"updated_at": "2026-09-11T09:02:18Z",
"seo": {
"title": "Paper",
"description": "Copy, printer, and cardstock paper, sold by the ream and by the case.",
"image_url": "https://ik.imagekit.io/fluidapp/tr:w-1200,h-630,c-maintain_ratio,fo-auto,f-auto,q-80/dunder-mifflin/categories/paper.png",
"indexable": true,
"id": null
},
"metafields": [],
"languages": [
"en"
],
"parent_id": 3107,
"position": 1,
"source_type": "product",
"has_children": false,
"countries": [],
"custom_slug": false
},
{
"id": 3112,
"slug": "merch",
"title": "Merch",
"description": "Scranton Branch mugs, apparel, and other Dunder Mifflin swag.",
"image_url": "https://ik.imagekit.io/fluidapp/dunder-mifflin/categories/merch.png",
"canonical_url": "https://shop.dundermifflin.com/home/categories/merch",
"images": {
"thumb": {
"url": "https://ik.imagekit.io/fluidapp/tr:w-200,c-at_max,f-auto,q-70/dunder-mifflin/categories/merch.png",
"width": 200
},
"medium": {
"url": "https://ik.imagekit.io/fluidapp/tr:w-600,c-at_max,f-auto,q-75/dunder-mifflin/categories/merch.png",
"width": 600
},
"large": {
"url": "https://ik.imagekit.io/fluidapp/tr:w-1200,c-at_max,f-auto,q-80/dunder-mifflin/categories/merch.png",
"width": 1200
}
},
"active": false,
"status": "draft",
"publish_at": null,
"created_at": "2026-09-06T16:44:03Z",
"updated_at": "2026-09-06T16:44:03Z",
"seo": {
"title": "Merch",
"description": "Scranton Branch mugs, apparel, and other Dunder Mifflin swag.",
"image_url": "https://ik.imagekit.io/fluidapp/tr:w-1200,h-630,c-maintain_ratio,fo-auto,f-auto,q-80/dunder-mifflin/categories/merch.png",
"indexable": false,
"id": null
},
"metafields": [],
"languages": [
"en"
],
"parent_id": null,
"position": 2,
"source_type": "product",
"has_children": false,
"countries": [],
"custom_slug": false
}
]
}{
"message": "Invalid credentials."
}{
"error": "Not authorized."
}{
"error": {
"message": "<string>",
"details": {}
},
"status": 123,
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"pagination": {
"cursor": "<string>",
"limit": 25,
"prev_cursor": "<string>",
"next_cursor": "<string>"
}
}
}Authorizations
Bearer token authentication. Accepts company-admin tokens with
storefront.view for read operations and storefront.update
for writes and scan triggers (legacy per-resource grants like
categories.update / products.view / etc. are still accepted
during the migration), required on every company operation.
Storefront public operations under /api/v202604/{resource} and
/api/v202604/{resource}/{slug} are unauthenticated
(security: []).
Query Parameters
Response locale. ISO code (e.g. fr, de). When omitted,
responds in the company's default locale. On reads an
unsupported or unknown locale is ignored — the response comes
back in the default locale, never a 422. Any translated field
with no value in the requested locale falls back to its en
value.
"fr"
Free-text search over
translation-aware title and description fields, plus slug.
On /products it additionally matches the product-level sku and
every variant SKU.
On /products the match is TIERED: the term is matched first against
the fields that NAME a product — title in every locale, slug, sku
and every variant SKU — and description / metafields answer only when
no name match survives the other filters on the request. A bundle's copy
lists the products it contains, so matching name and copy in one pass
returned every pack that merely mentions a product ahead of the product
itself.
Substring-aware (word_middle), so partial terms match. Results are
returned in the requested sort order, not by relevance — search
resolves to an id set that the ordinary paginated query then filters,
and that id set is capped at 1000 matches per request.
Opaque cursor returned in meta.pagination.next_cursor (or
prev_cursor). Omit on the first page.
Page size. Default 25. Max 100. Requests above 100 return 422.
1 <= x <= 100ISO-2 country code. Restricts the catalog to resources available
in that country — combining the with_country_iso scope's
OR-empty semantics: unrestricted resources (no access_countries
rows) match every country.
"GB"
ISO locale. Restricts the catalog to resources translated in that locale.
"fr"
One source type: product, medium, page, library, or promotion.
Categories only — the collection catalog does not accept this filter.
product, medium, page, library, promotion A category id as a string, or the literal "root" for top-level
categories only. Selects a single level of the tree. Categories
only — collections have no hierarchy. Honored on both the public
catalog and the company index, which share one query contract.
"root"
One of draft, scheduled, published, or archived. Restricts the
index to a single lifecycle state. Company-surface only. Matches the
STORED status column, not the read-time-resolved status: a past-due
scheduled row (its publish_at has passed, so it renders as
published) is matched by filter[status]=scheduled, NOT by
filter[status]=published.
draft, scheduled, published, archived Company-surface only. "true" / "false" restrict to active /
inactive rows; a blank value (filter[active]=) means "no
filter" — it is NOT where(active: nil).
, true, false Single sort key. Prefix with - for descending. Default
position then id.
position, -position, title, -title, created_at, -created_at, updated_at, -updated_at Response
A page of categories.
Shared success envelope for list / show / create / update
responses: the resource payload is returned alongside a top-level
integer status and meta. Composed onto each resource response
via allOf.
curl --request GET \
--url https://api.fluid.app/api/v202604/company/categories \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.fluid.app/api/v202604/company/categories"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.fluid.app/api/v202604/company/categories', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.fluid.app/api/v202604/company/categories",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.fluid.app/api/v202604/company/categories"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.fluid.app/api/v202604/company/categories")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/v202604/company/categories")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"status": 200,
"meta": {
"request_id": "c4a1e2f7-3b9d-4e58-a0c6-7d2f91b84e13",
"timestamp": "2026-09-14T15:42:08Z",
"pagination": {
"cursor": null,
"limit": 25,
"prev_cursor": null,
"next_cursor": "eyJpZCI6MzExMiwicG9zaXRpb24iOjJ9"
}
},
"categories": [
{
"id": 3107,
"slug": "office-essentials",
"title": "Office Essentials",
"description": "Paper, desk supplies, and everything else a branch office runs on.",
"image_url": "https://ik.imagekit.io/fluidapp/dunder-mifflin/categories/office-essentials.png",
"canonical_url": "https://shop.dundermifflin.com/home/categories/office-essentials",
"images": {
"thumb": {
"url": "https://ik.imagekit.io/fluidapp/tr:w-200,c-at_max,f-auto,q-70/dunder-mifflin/categories/office-essentials.png",
"width": 200
},
"medium": {
"url": "https://ik.imagekit.io/fluidapp/tr:w-600,c-at_max,f-auto,q-75/dunder-mifflin/categories/office-essentials.png",
"width": 600
},
"large": {
"url": "https://ik.imagekit.io/fluidapp/tr:w-1200,c-at_max,f-auto,q-80/dunder-mifflin/categories/office-essentials.png",
"width": 1200
}
},
"active": true,
"status": "published",
"publish_at": null,
"created_at": "2026-09-01T10:15:00Z",
"updated_at": "2026-09-08T12:30:45Z",
"seo": {
"title": "Office Essentials",
"description": "Paper, desk supplies, and everything else a branch office runs on.",
"image_url": "https://ik.imagekit.io/fluidapp/tr:w-1200,h-630,c-maintain_ratio,fo-auto,f-auto,q-80/dunder-mifflin/categories/office-essentials.png",
"indexable": true,
"id": 14402
},
"metafields": [],
"languages": [
"en",
"es"
],
"parent_id": null,
"position": 1,
"source_type": "product",
"has_children": true,
"countries": [],
"custom_slug": true
},
{
"id": 3108,
"slug": "paper",
"title": "Paper",
"description": "Copy, printer, and cardstock paper, sold by the ream and by the case.",
"image_url": "https://ik.imagekit.io/fluidapp/dunder-mifflin/categories/paper.png",
"canonical_url": "https://shop.dundermifflin.com/home/categories/paper",
"images": {
"thumb": {
"url": "https://ik.imagekit.io/fluidapp/tr:w-200,c-at_max,f-auto,q-70/dunder-mifflin/categories/paper.png",
"width": 200
},
"medium": {
"url": "https://ik.imagekit.io/fluidapp/tr:w-600,c-at_max,f-auto,q-75/dunder-mifflin/categories/paper.png",
"width": 600
},
"large": {
"url": "https://ik.imagekit.io/fluidapp/tr:w-1200,c-at_max,f-auto,q-80/dunder-mifflin/categories/paper.png",
"width": 1200
}
},
"active": true,
"status": "published",
"publish_at": null,
"created_at": "2026-09-01T10:17:22Z",
"updated_at": "2026-09-11T09:02:18Z",
"seo": {
"title": "Paper",
"description": "Copy, printer, and cardstock paper, sold by the ream and by the case.",
"image_url": "https://ik.imagekit.io/fluidapp/tr:w-1200,h-630,c-maintain_ratio,fo-auto,f-auto,q-80/dunder-mifflin/categories/paper.png",
"indexable": true,
"id": null
},
"metafields": [],
"languages": [
"en"
],
"parent_id": 3107,
"position": 1,
"source_type": "product",
"has_children": false,
"countries": [],
"custom_slug": false
},
{
"id": 3112,
"slug": "merch",
"title": "Merch",
"description": "Scranton Branch mugs, apparel, and other Dunder Mifflin swag.",
"image_url": "https://ik.imagekit.io/fluidapp/dunder-mifflin/categories/merch.png",
"canonical_url": "https://shop.dundermifflin.com/home/categories/merch",
"images": {
"thumb": {
"url": "https://ik.imagekit.io/fluidapp/tr:w-200,c-at_max,f-auto,q-70/dunder-mifflin/categories/merch.png",
"width": 200
},
"medium": {
"url": "https://ik.imagekit.io/fluidapp/tr:w-600,c-at_max,f-auto,q-75/dunder-mifflin/categories/merch.png",
"width": 600
},
"large": {
"url": "https://ik.imagekit.io/fluidapp/tr:w-1200,c-at_max,f-auto,q-80/dunder-mifflin/categories/merch.png",
"width": 1200
}
},
"active": false,
"status": "draft",
"publish_at": null,
"created_at": "2026-09-06T16:44:03Z",
"updated_at": "2026-09-06T16:44:03Z",
"seo": {
"title": "Merch",
"description": "Scranton Branch mugs, apparel, and other Dunder Mifflin swag.",
"image_url": "https://ik.imagekit.io/fluidapp/tr:w-1200,h-630,c-maintain_ratio,fo-auto,f-auto,q-80/dunder-mifflin/categories/merch.png",
"indexable": false,
"id": null
},
"metafields": [],
"languages": [
"en"
],
"parent_id": null,
"position": 2,
"source_type": "product",
"has_children": false,
"countries": [],
"custom_slug": false
}
]
}{
"message": "Invalid credentials."
}{
"error": "Not authorized."
}{
"error": {
"message": "<string>",
"details": {}
},
"status": 123,
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"pagination": {
"cursor": "<string>",
"limit": 25,
"prev_cursor": "<string>",
"next_cursor": "<string>"
}
}
}