Skip to main content
Synq gives you two independent taxonomy systems for organizing your catalog: categories and brands. Categories are hierarchical — you can nest them to any depth using a parentId — and are ideal for powering storefront navigation trees, faceted search filters, and merchandising rules. Brands represent the manufacturer or label behind a product, complete with a logo URL, and are scoped per tenant so each of your clients maintains their own brand registry. Both resources live under the /api/v1/pim prefix and follow the same create-and-list pattern.
All requests require the standard headers: Authorization: Bearer <token>, X-Tenant-ID, and X-Org-ID.

Categories

List categories

Retrieve all active categories for your tenant, ordered alphabetically by name.
GET /api/v1/pim/categories
curl https://api.synq.com/api/v1/pim/categories \
  -H "Authorization: Bearer $TOKEN" \
  -H "X-Tenant-ID: $TENANT_ID" \
  -H "X-Org-ID: $ORG_ID"
Response 200 OK
[
  {
    "id": "a1b2c3d4-0001-7890-abcd-ef1234567890",
    "org_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "tenant_id": "f9e8d7c6-b5a4-3210-fedc-ba9876543210",
    "parent_id": null,
    "name": "Clothing",
    "slug": "clothing",
    "description": "All apparel and wearable goods.",
    "created_at": "2024-10-01T09:00:00Z",
    "updated_at": "2024-10-01T09:00:00Z"
  },
  {
    "id": "a1b2c3d4-0002-7890-abcd-ef1234567890",
    "org_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "tenant_id": "f9e8d7c6-b5a4-3210-fedc-ba9876543210",
    "parent_id": "a1b2c3d4-0001-7890-abcd-ef1234567890",
    "name": "Knitwear",
    "slug": "knitwear",
    "description": "Sweaters, cardigans, and knit accessories.",
    "created_at": "2024-10-01T09:05:00Z",
    "updated_at": "2024-10-01T09:05:00Z"
  }
]
parent_id
string | null
UUID of the parent category, or null for top-level categories. Use this to reconstruct the tree client-side.
slug
string
A URL-safe identifier for this category (e.g., knitwear). Must be unique within your tenant.

Create a category

POST /api/v1/pim/categories
Request body
name
string
required
Display name for the category (e.g., "Knitwear").
slug
string
required
URL-safe unique identifier (e.g., "knitwear"). Lowercase letters, numbers, and hyphens only.
description
string
A short description of what belongs in this category.
parentId
string
UUID of the parent category. Omit or leave empty to create a root-level category.
curl -X POST https://api.synq.com/api/v1/pim/categories \
  -H "Authorization: Bearer $TOKEN" \
  -H "X-Tenant-ID: $TENANT_ID" \
  -H "X-Org-ID: $ORG_ID" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Clothing",
    "slug": "clothing",
    "description": "All apparel and wearable goods."
  }'
Response 200 OK
{
  "id": "a1b2c3d4-0002-7890-abcd-ef1234567890",
  "org_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "tenant_id": "f9e8d7c6-b5a4-3210-fedc-ba9876543210",
  "parent_id": "a1b2c3d4-0001-7890-abcd-ef1234567890",
  "name": "Knitwear",
  "slug": "knitwear",
  "description": "Sweaters, cardigans, and knit accessories.",
  "created_at": "2024-11-15T12:00:00Z",
  "updated_at": "2024-11-15T12:00:00Z"
}

Brands

List brands

Retrieve all active brands for your tenant, ordered alphabetically by name.
GET /api/v1/pim/brands
curl https://api.synq.com/api/v1/pim/brands \
  -H "Authorization: Bearer $TOKEN" \
  -H "X-Tenant-ID: $TENANT_ID" \
  -H "X-Org-ID: $ORG_ID"
Response 200 OK
[
  {
    "id": "b1b2c3d4-0001-7890-abcd-ef1234567890",
    "org_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "tenant_id": "f9e8d7c6-b5a4-3210-fedc-ba9876543210",
    "name": "NordicThread",
    "description": "Scandinavian-inspired knitwear and outerwear.",
    "logo_url": "https://cdn.example.com/brands/nordicthread-logo.svg",
    "created_at": "2024-10-01T09:00:00Z",
    "updated_at": "2024-10-01T09:00:00Z"
  }
]

Create a brand

POST /api/v1/pim/brands
Request body
name
string
required
The brand’s display name (e.g., "NordicThread").
description
string
A short description of the brand’s identity or product range.
logoUrl
string
A fully qualified URL to the brand’s logo image.
curl -X POST https://api.synq.com/api/v1/pim/brands \
  -H "Authorization: Bearer $TOKEN" \
  -H "X-Tenant-ID: $TENANT_ID" \
  -H "X-Org-ID: $ORG_ID" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "NordicThread",
    "description": "Scandinavian-inspired knitwear and outerwear.",
    "logoUrl": "https://cdn.example.com/brands/nordicthread-logo.svg"
  }'
Response 200 OK
{
  "id": "b1b2c3d4-0001-7890-abcd-ef1234567890",
  "org_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "tenant_id": "f9e8d7c6-b5a4-3210-fedc-ba9876543210",
  "name": "NordicThread",
  "description": "Scandinavian-inspired knitwear and outerwear.",
  "logo_url": "https://cdn.example.com/brands/nordicthread-logo.svg",
  "created_at": "2024-11-15T12:30:00Z",
  "updated_at": "2024-11-15T12:30:00Z"
}
logo_url
string
The stored URL of the brand’s logo. Note that the request field is logoUrl (camelCase) and the response field is logo_url (snake_case).

Associate a product with a category or brand

When you create or update a product, pass the category field as a free-text label. To associate a product with a structured category or brand record using their UUIDs, include category_id and brand_id in your update payload.
PUT /api/v1/pim/products/{id}
{
  "title": "Merino Wool Crew Neck Sweater",
  "category": "Knitwear"
}
The category (text) and category_id (UUID reference) fields coexist on the product. Using category_id links to a structured category record and is preferred when you need to power hierarchical navigation or merchandising rules. The category text field is useful for quick imports where full taxonomy isn’t yet defined.
Deleting a category or brand does not cascade to products. Products that reference a deleted category or brand by ID will retain the stale reference. Audit and re-associate products before removing taxonomy records.