Hoppa till innehållet

Content pages

Editorial content in a channel: the home page, plus standing pages, blog posts and news. The last three are the same record told apart by pageType, built from the same sections and carrying the same SEO. Addressed by the pair (channelCode, slug). The home page is built from the same sections but lives on the channel: one per channel, no slug, no publish state, addressed by channel code alone. A page's body is its section list, which is replaced whole with PUT .../config; the metadata is patched separately. Products, categories and suppliers referenced inside a section are named by business key, not by internal id.

10 calls GET POST PATCH DELETE PUT Base URL https://api.fluit.cloud/preview

Authentication, error codes, rate limits, idempotency and pagination apply to every call and are documented once under Getting started.

GET /channels/{channelCode}/content-pages

List a channel's content pages

Returns the channel's editorial pages: standing pages, blog posts and news. All three are the same record told apart by pageType, so one call can fetch everything or be narrowed with ?pageType=.

Show the full description

Sorted by sort order, then slug. Each page carries its full section list under config, with products, categories and suppliers named by business key rather than internal id. publishDate may be in the future: the storefront hides such an article until it passes, but this endpoint returns it either way. Delta sync: ?modifiedSince= (ISO 8601 UTC datetime) returns records created or changed at or after that instant, and is the intended way to run an incremental sync. A change anywhere inside the record counts: editing a line moves the parent's modifiedDate too, so no change can hide below the resource level. Deletions are not visible here: a deleted record is really gone, so it simply stops appearing, which is indistinguishable from "unchanged". Poll GET /preview/deletions?deletedSince= alongside this endpoint to learn what was removed.

Path parameters

Field Type Description
channelCode Required string Code of the channel whose pages to list.

Query parameters

Field Type Description
pageType enum Filters on the kind of page: Page, BlogPost or NewsPost. Page BlogPost NewsPost Home
isPublished boolean Filters on whether the page is published.
search string Matches slug and title, case-insensitively and on partial words.
tag string Returns only pages carrying this tag, matched case-insensitively. Applied before paging, so totalCount counts the tagged pages and page 1 is never empty while later pages hold matches.
modifiedSince string(date-time) Returns only records created or changed at or after this instant (ISO 8601 UTC datetime). A change anywhere inside the record counts, including on its lines.
page integer Page to return, 1-based. Default 1.
pageSize integer Number of records per page. Default 50, max 200.

Responses

200 PagedResult_PublicContentPageResponse

Paginated response: the fields below sit in items[], wrapped in totalCount, page, pageSize, totalPages, hasPreviousPage and hasNextPage. Paginated

Field Type Description
authorName string · nullable Displayed author. Free text, not linked to a user.
channelCode Required string · nullable The channel the page belongs to.
config Required PageConfig A page built from sections: the layout plus the sections in order.
createdDate Required string(date-time) When the page was created (UTC).
excerpt string · nullable Short summary for list cards, RSS and meta. Articles only.
featuredImageUrl string · nullable Cover image for list cards and Open Graph. Articles only.
isPublished Required boolean Whether the page is published and visible in the storefront.
links Links Hypermedia links for a public API resource. Exposed as a computed `links` property on the public response DTOs so that create and read responses carry the same self-reference — the canonical URL is derived from the business key already present on the DTO and can never drift from the route it points at.
metaDescription string · nullable SEO meta description.
modifiedDate string(date-time) · nullable When the page was last changed (UTC), or null if never changed.
pageType Required enum What kind of content page this is. Mirrors `Domain.Ecom.ContentPageType`. Page BlogPost NewsPost Home
parentSlug string · nullable Slug of the parent page, for a hierarchy. Null at the top level.
publishDate string(date-time) · nullable Editorial publication date shown and sorted on. May be in the future: public storefront queries hide an article until it passes.
publishedAt string(date-time) · nullable When it was published (UTC), or null if it never has been.
showInNavigation Required boolean Whether the page appears in the navigation menu.
slug Required string · nullable URL slug, unique within the channel.
sortOrder Required integer Sort order in listings and navigation.
tags string[] · nullable Tags used for filtering and related articles.
title Required string · nullable Page title, used for the heading and as the SEO title.
400 ProblemDetails pageType got a value outside its list.
Field Type
detail string · nullable
instance string · nullable
status integer · nullable
title string · nullable
type string · nullable
404 ProblemDetails No channel with that code.
Field Type
detail string · nullable
instance string · nullable
status integer · nullable
title string · nullable
type string · nullable

Standard errors: 401 403 Errors

Examples

curl
curl "https://api.fluit.cloud/preview/channels/{channelCode}/content-pages"
Response 200
{
  "hasNextPage": true,
  "hasPreviousPage": true,
  "items": [
    {
      "authorName": "Acme AB",
      "channelCode": "STD",
      "config": {
        "fullWidth": true,
        "layout": "Standard",
        "sections": [
          {
            "alignment": "Left",
            "anchor": "string",
            "articleLinkText": "string",
            "articleType": "All",
            "bannerEndDate": "2026-06-11T09:24:13.418",
            "bannerImageUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
            "bannerLinkUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
            "bannerStartDate": "2026-06-11T09:24:13.418",
            "buttons": [],
            "cardColumns": 42,
            "cardVariant": "Icon",
            "categoryCode": "STD",
            "categoryCodes": [],
            "contact": {},
            "cssClass": "string",
            "custom": {},
            "eyebrow": "string",
            "faq": {},
            "featureCards": [],
            "form": {},
            "galleryImages": [],
            "heroCtaText": "string",
            "heroCtaUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
            "heroImageUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
            "heroTextColor": "Light",
            "heroVideoPosterUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
            "heroVideoUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
            "htmlContent": "string",
            "id": "0f8b2c1e-4d3a-4b7e-9f10-2a6c5d8e1b44",
            "isVisible": true,
            "itemGroupCode": "STD",
            "lead": "string",
            "logos": {},
            "maxBrands": 42,
            "maxProducts": 42,
            "mediaText": {},
            "narrowText": true,
            "parentCategoryCode": "STD",
            "productColumns": 42,
            "productNumbers": [],
            "productSort": "Manual",
            "productSpotlight": {},
            "sectionCollectionId": "0f8b2c1e-4d3a-4b7e-9f10-2a6c5d8e1b44",
            "sortOrder": 42,
            "spacing": "Normal",
            "subtitle": "string",
            "supplierNumbers": [],
            "testimonials": [],
            "timeline": {},
            "title": "string",
            "tone": "Default",
            "twoColumns": true,
            "type": "Hero",
            "videoUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg"
          }
        ]
      },
      "createdDate": "2026-06-11T09:24:13.418",
      "excerpt": "string",
      "featuredImageUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
      "isPublished": true,
      "links": {
        "self": "string"
      },
      "metaDescription": "string",
      "modifiedDate": "2026-06-11T09:24:13.418",
      "pageType": "Page",
      "parentSlug": "string",
      "publishDate": "2026-06-11T09:24:13.418",
      "publishedAt": "2026-06-11T09:24:13.418",
      "showInNavigation": true,
      "slug": "string",
      "sortOrder": 42,
      "tags": [
        "string"
      ],
      "title": "string"
    }
  ],
  "page": 1,
  "pageSize": 50,
  "totalCount": 137,
  "totalPages": 3
}

Base URL https://api.fluit.cloud/preview. The response example is generated from the schema: the shape is right, the values are made up.

POST /channels/{channelCode}/content-pages

Create a content page

Creates a standing page, a blog post or a news item, told apart by pageType. The page is created unpublished and with no sections; add the body with PUT /preview/channels/{channelCode}/content-pages/{slug}/config and make it visible with POST .../publish. publishDate may be in the future to schedule an article.

Show the full description

The response body is the same representation as GET on the page; the canonical URL is returned in the Location header and in links.self.

content-pages:write Requires Idempotency-Key

Path parameters

Field Type Description
channelCode Required string Code of the channel to create the page in.

Body required

Field Type Description
authorName string · nullable Displayed author. Free text.
excerpt string · nullable Short summary for list cards and RSS. Articles.
featuredImageUrl string · nullable Cover image for list cards and Open Graph. Articles.
metaDescription string · nullable SEO meta description.
pageType enum What kind of content page this is. Mirrors `Domain.Ecom.ContentPageType`. Page BlogPost NewsPost Home
parentSlug string · nullable Slug of the parent page, for a hierarchy.
publishDate string(date-time) · nullable Editorial publication date. May be in the future to schedule.
slug Required string URL slug, unique within the channel. Lowercase letters, digits and hyphens.
sortOrder integer Sort order in listings and navigation.
tags string[] · nullable Tags for filtering and related articles.
title Required string Page title. Required.

Responses

201 PublicContentPageResponse
  • Location — URL of the newly created resource.
Field Type Description
authorName string · nullable Displayed author. Free text, not linked to a user.
channelCode Required string · nullable The channel the page belongs to.
config Required PageConfig A page built from sections: the layout plus the sections in order.
createdDate Required string(date-time) When the page was created (UTC).
excerpt string · nullable Short summary for list cards, RSS and meta. Articles only.
featuredImageUrl string · nullable Cover image for list cards and Open Graph. Articles only.
isPublished Required boolean Whether the page is published and visible in the storefront.
links Links Hypermedia links for a public API resource. Exposed as a computed `links` property on the public response DTOs so that create and read responses carry the same self-reference — the canonical URL is derived from the business key already present on the DTO and can never drift from the route it points at.
metaDescription string · nullable SEO meta description.
modifiedDate string(date-time) · nullable When the page was last changed (UTC), or null if never changed.
pageType Required enum What kind of content page this is. Mirrors `Domain.Ecom.ContentPageType`. Page BlogPost NewsPost Home
parentSlug string · nullable Slug of the parent page, for a hierarchy. Null at the top level.
publishDate string(date-time) · nullable Editorial publication date shown and sorted on. May be in the future: public storefront queries hide an article until it passes.
publishedAt string(date-time) · nullable When it was published (UTC), or null if it never has been.
showInNavigation Required boolean Whether the page appears in the navigation menu.
slug Required string · nullable URL slug, unique within the channel.
sortOrder Required integer Sort order in listings and navigation.
tags string[] · nullable Tags used for filtering and related articles.
title Required string · nullable Page title, used for the heading and as the SEO title.
400 ProblemDetails A field failed validation, or parentSlug names a page that does not exist in this channel.
Field Type
detail string · nullable
instance string · nullable
status integer · nullable
title string · nullable
type string · nullable
404 ProblemDetails No channel with that code.
Field Type
detail string · nullable
instance string · nullable
status integer · nullable
title string · nullable
type string · nullable
409 ProblemDetails A page with that slug already exists in the channel.
Field Type
detail string · nullable
instance string · nullable
status integer · nullable
title string · nullable
type string · nullable

Standard errors: 401 403 Errors

Examples

curl
curl -X POST "https://api.fluit.cloud/preview/channels/{channelCode}/content-pages" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d @body.json
Full — a scheduled blog post
{
  "authorName": "Redaktionen",
  "excerpt": "Fyra modeller, samma DSP-plattform.",
  "featuredImageUrl": "https://cdn.fluit.cloud/media/hero/abc.jpg",
  "metaDescription": "Vi släpper en ny serie aktiva högtalare för konferensrum.",
  "pageType": "BlogPost",
  "publishDate": "2026-09-15T08:00:00Z",
  "slug": "nya-hogtalarserien",
  "tags": [
    "produktnyhet",
    "ljud"
  ],
  "title": "Nya högtalarserien är här"
}
Minimal — a standing page
{
  "slug": "om-oss",
  "title": "Om oss"
}
Response 201
{
  "authorName": "Acme AB",
  "channelCode": "STD",
  "config": {
    "fullWidth": true,
    "layout": "Standard",
    "sections": [
      {
        "alignment": "Left",
        "anchor": "string",
        "articleLinkText": "string",
        "articleType": "All",
        "bannerEndDate": "2026-06-11T09:24:13.418",
        "bannerImageUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
        "bannerLinkUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
        "bannerStartDate": "2026-06-11T09:24:13.418",
        "buttons": [
          {
            "label": "string",
            "openInNewTab": true,
            "pageSlug": "string",
            "url": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
            "variant": "Primary"
          }
        ],
        "cardColumns": 42,
        "cardVariant": "Icon",
        "categoryCode": "STD",
        "categoryCodes": [
          "STD"
        ],
        "contact": {
          "directionsUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
          "mapImageUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
          "showAddress": true,
          "showEmail": true,
          "showOpeningHours": true,
          "showPhone": true
        },
        "cssClass": "string",
        "custom": {
          "blockKey": "string",
          "values": null
        },
        "eyebrow": "string",
        "faq": {
          "items": [
            {}
          ]
        },
        "featureCards": [
          {
            "iconName": "Width",
            "imageAlt": "string",
            "imageUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
            "linkText": "string",
            "linkUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
            "text": "string",
            "title": "string"
          }
        ],
        "form": {
          "aside": "None",
          "asideHtml": "string",
          "formToken": "0f8b2c1e-4d3a-4b7e-9f10-2a6c5d8e1b44"
        },
        "galleryImages": [
          {
            "altText": "string",
            "caption": "string",
            "imageUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
            "linkUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg"
          }
        ],
        "heroCtaText": "string",
        "heroCtaUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
        "heroImageUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
        "heroTextColor": "Light",
        "heroVideoPosterUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
        "heroVideoUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
        "htmlContent": "string",
        "id": "0f8b2c1e-4d3a-4b7e-9f10-2a6c5d8e1b44",
        "isVisible": true,
        "itemGroupCode": "STD",
        "lead": "string",
        "logos": {
          "grayscale": true,
          "items": [
            {}
          ],
          "size": "Medium"
        },
        "maxBrands": 42,
        "maxProducts": 42,
        "mediaText": {
          "altText": "string",
          "bodyHtml": "string",
          "mediaAspect": "Original",
          "mediaPosition": "Left",
          "mediaUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
          "videoUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg"
        },
        "narrowText": true,
        "parentCategoryCode": "STD",
        "productColumns": 42,
        "productNumbers": [
          "ABC-001"
        ],
        "productSort": "Manual",
        "productSpotlight": {
          "altText": "string",
          "badge": "string",
          "bodyHtml": "string",
          "documentCategory": "Datasheet",
          "documentIds": [
            "0f8b2c1e-4d3a-4b7e-9f10-2a6c5d8e1b44"
          ],
          "documents": "None",
          "layout": "SideBySide",
          "mediaPosition": "Left",
          "mediaUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
          "productNumber": "ABC-001",
          "showAddToCart": true,
          "showKeySpecs": true,
          "showPrice": true,
          "showStock": true
        },
        "sectionCollectionId": "0f8b2c1e-4d3a-4b7e-9f10-2a6c5d8e1b44",
        "sortOrder": 42,
        "spacing": "Normal",
        "subtitle": "string",
        "supplierNumbers": [
          "SUP-001"
        ],
        "testimonials": [
          {
            "author": "string",
            "avatarUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
            "quote": "string",
            "rating": 42,
            "role": "string"
          }
        ],
        "timeline": {
          "marker": "Number",
          "steps": [
            {}
          ]
        },
        "title": "string",
        "tone": "Default",
        "twoColumns": true,
        "type": "Hero",
        "videoUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg"
      }
    ]
  },
  "createdDate": "2026-06-11T09:24:13.418",
  "excerpt": "string",
  "featuredImageUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
  "isPublished": true,
  "links": {
    "self": "string"
  },
  "metaDescription": "string",
  "modifiedDate": "2026-06-11T09:24:13.418",
  "pageType": "Page",
  "parentSlug": "string",
  "publishDate": "2026-06-11T09:24:13.418",
  "publishedAt": "2026-06-11T09:24:13.418",
  "showInNavigation": true,
  "slug": "string",
  "sortOrder": 42,
  "tags": [
    "string"
  ],
  "title": "string"
}

Base URL https://api.fluit.cloud/preview. The response example is generated from the schema: the shape is right, the values are made up.

GET /channels/{channelCode}/content-pages/{slug}

Get a content page by slug

Returns the page with its full section list. Products, categories and suppliers inside the sections are named by business key — item number, category code, supplier number — so the same body can be written back. Responses carry a weak ETag; pass it back in If-None-Match to get 304 Not Modified while the page is unchanged.

content-pages:read Supports ETag

Path parameters

Field Type Description
channelCode Required string Code of the channel the page belongs to.
slug Required string The page's slug within that channel.

Responses

200 PublicContentPageResponse
  • ETag — Weak validator for this representation. Pass it back in If-None-Match to get 304 Not Modified while the record is unchanged.
Field Type Description
authorName string · nullable Displayed author. Free text, not linked to a user.
channelCode Required string · nullable The channel the page belongs to.
config Required PageConfig A page built from sections: the layout plus the sections in order.
createdDate Required string(date-time) When the page was created (UTC).
excerpt string · nullable Short summary for list cards, RSS and meta. Articles only.
featuredImageUrl string · nullable Cover image for list cards and Open Graph. Articles only.
isPublished Required boolean Whether the page is published and visible in the storefront.
links Links Hypermedia links for a public API resource. Exposed as a computed `links` property on the public response DTOs so that create and read responses carry the same self-reference — the canonical URL is derived from the business key already present on the DTO and can never drift from the route it points at.
metaDescription string · nullable SEO meta description.
modifiedDate string(date-time) · nullable When the page was last changed (UTC), or null if never changed.
pageType Required enum What kind of content page this is. Mirrors `Domain.Ecom.ContentPageType`. Page BlogPost NewsPost Home
parentSlug string · nullable Slug of the parent page, for a hierarchy. Null at the top level.
publishDate string(date-time) · nullable Editorial publication date shown and sorted on. May be in the future: public storefront queries hide an article until it passes.
publishedAt string(date-time) · nullable When it was published (UTC), or null if it never has been.
showInNavigation Required boolean Whether the page appears in the navigation menu.
slug Required string · nullable URL slug, unique within the channel.
sortOrder Required integer Sort order in listings and navigation.
tags string[] · nullable Tags used for filtering and related articles.
title Required string · nullable Page title, used for the heading and as the SEO title.
304 Empty body.
  • ETag — Weak validator for this representation. Pass it back in If-None-Match to get 304 Not Modified while the record is unchanged.
404 ProblemDetails No channel with that code, or no page with that slug in it.
Field Type
detail string · nullable
instance string · nullable
status integer · nullable
title string · nullable
type string · nullable

Standard errors: 401 403 Errors

Examples

curl
curl "https://api.fluit.cloud/preview/channels/{channelCode}/content-pages/{slug}"
Response 200
{
  "authorName": "Acme AB",
  "channelCode": "STD",
  "config": {
    "fullWidth": true,
    "layout": "Standard",
    "sections": [
      {
        "alignment": "Left",
        "anchor": "string",
        "articleLinkText": "string",
        "articleType": "All",
        "bannerEndDate": "2026-06-11T09:24:13.418",
        "bannerImageUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
        "bannerLinkUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
        "bannerStartDate": "2026-06-11T09:24:13.418",
        "buttons": [
          {
            "label": "string",
            "openInNewTab": true,
            "pageSlug": "string",
            "url": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
            "variant": "Primary"
          }
        ],
        "cardColumns": 42,
        "cardVariant": "Icon",
        "categoryCode": "STD",
        "categoryCodes": [
          "STD"
        ],
        "contact": {
          "directionsUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
          "mapImageUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
          "showAddress": true,
          "showEmail": true,
          "showOpeningHours": true,
          "showPhone": true
        },
        "cssClass": "string",
        "custom": {
          "blockKey": "string",
          "values": null
        },
        "eyebrow": "string",
        "faq": {
          "items": [
            {}
          ]
        },
        "featureCards": [
          {
            "iconName": "Width",
            "imageAlt": "string",
            "imageUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
            "linkText": "string",
            "linkUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
            "text": "string",
            "title": "string"
          }
        ],
        "form": {
          "aside": "None",
          "asideHtml": "string",
          "formToken": "0f8b2c1e-4d3a-4b7e-9f10-2a6c5d8e1b44"
        },
        "galleryImages": [
          {
            "altText": "string",
            "caption": "string",
            "imageUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
            "linkUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg"
          }
        ],
        "heroCtaText": "string",
        "heroCtaUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
        "heroImageUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
        "heroTextColor": "Light",
        "heroVideoPosterUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
        "heroVideoUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
        "htmlContent": "string",
        "id": "0f8b2c1e-4d3a-4b7e-9f10-2a6c5d8e1b44",
        "isVisible": true,
        "itemGroupCode": "STD",
        "lead": "string",
        "logos": {
          "grayscale": true,
          "items": [
            {}
          ],
          "size": "Medium"
        },
        "maxBrands": 42,
        "maxProducts": 42,
        "mediaText": {
          "altText": "string",
          "bodyHtml": "string",
          "mediaAspect": "Original",
          "mediaPosition": "Left",
          "mediaUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
          "videoUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg"
        },
        "narrowText": true,
        "parentCategoryCode": "STD",
        "productColumns": 42,
        "productNumbers": [
          "ABC-001"
        ],
        "productSort": "Manual",
        "productSpotlight": {
          "altText": "string",
          "badge": "string",
          "bodyHtml": "string",
          "documentCategory": "Datasheet",
          "documentIds": [
            "0f8b2c1e-4d3a-4b7e-9f10-2a6c5d8e1b44"
          ],
          "documents": "None",
          "layout": "SideBySide",
          "mediaPosition": "Left",
          "mediaUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
          "productNumber": "ABC-001",
          "showAddToCart": true,
          "showKeySpecs": true,
          "showPrice": true,
          "showStock": true
        },
        "sectionCollectionId": "0f8b2c1e-4d3a-4b7e-9f10-2a6c5d8e1b44",
        "sortOrder": 42,
        "spacing": "Normal",
        "subtitle": "string",
        "supplierNumbers": [
          "SUP-001"
        ],
        "testimonials": [
          {
            "author": "string",
            "avatarUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
            "quote": "string",
            "rating": 42,
            "role": "string"
          }
        ],
        "timeline": {
          "marker": "Number",
          "steps": [
            {}
          ]
        },
        "title": "string",
        "tone": "Default",
        "twoColumns": true,
        "type": "Hero",
        "videoUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg"
      }
    ]
  },
  "createdDate": "2026-06-11T09:24:13.418",
  "excerpt": "string",
  "featuredImageUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
  "isPublished": true,
  "links": {
    "self": "string"
  },
  "metaDescription": "string",
  "modifiedDate": "2026-06-11T09:24:13.418",
  "pageType": "Page",
  "parentSlug": "string",
  "publishDate": "2026-06-11T09:24:13.418",
  "publishedAt": "2026-06-11T09:24:13.418",
  "showInNavigation": true,
  "slug": "string",
  "sortOrder": 42,
  "tags": [
    "string"
  ],
  "title": "string"
}

Base URL https://api.fluit.cloud/preview. The response example is generated from the schema: the shape is right, the values are made up.

PATCH /channels/{channelCode}/content-pages/{slug}

Update a content page's metadata

Partially updates the page's title, SEO, navigation and article fields. Only provided fields are updated (JSON Merge Patch semantics). Omitted fields are left unchanged. Pass null to clear a nullable field.

Show the full description

Unknown fields are rejected with 400, naming the field and listing the ones this endpoint accepts. tags replaces the whole list rather than merging into it. The sections are not touched here — use PUT .../config for the body. Renaming the slug with newSlug changes the page's public URL and automatically creates a 301 redirect from the old one, so incoming links and their ranking are preserved. Changing pageType does the same, because it moves the page between the /blog/... and /pages/... URL families.

content-pages:write

Path parameters

Field Type Description
channelCode Required string Code of the channel the page belongs to.
slug Required string The page's slug within that channel.

Body required

Field Type Description
authorName string · nullable Displayed author. Pass `null` to clear.
excerpt string · nullable Short summary for list cards and RSS. Pass `null` to clear.
featuredImageUrl string · nullable Cover image. Pass `null` to clear.
metaDescription string · nullable SEO meta description. Pass `null` to clear.
newSlug string · nullable Move the page to a different slug. A 301 from the old URL is created automatically, so incoming links and their ranking survive.
pageType enum What kind of content page this is. Mirrors `Domain.Ecom.ContentPageType`. Page BlogPost NewsPost Home
parentSlug string · nullable Slug of the parent page. Pass `null` to move it to the top level.
publishDate string(date-time) · nullable Editorial publication date. Pass `null` to clear.
showInNavigation boolean · nullable Whether the page appears in the navigation menu.
sortOrder integer · nullable Sort order in listings and navigation.
tags string[] · nullable Replaces the whole tag list. Pass `null` to clear.
title string · nullable Page title.

Responses

204 Empty body.
400 ProblemDetails The body is not a JSON object, contains a field this endpoint does not have, a field present in it failed validation, parentSlug names a page that does not exist in this channel, or one of newSlug, title, sortOrder, showInNavigation and pageType was sent as null.
Field Type
detail string · nullable
instance string · nullable
status integer · nullable
title string · nullable
type string · nullable
404 ProblemDetails No channel with that code, or no page with that slug in it.
Field Type
detail string · nullable
instance string · nullable
status integer · nullable
title string · nullable
type string · nullable
409 ProblemDetails newSlug is already taken by another page in the channel.
Field Type
detail string · nullable
instance string · nullable
status integer · nullable
title string · nullable
type string · nullable

Standard errors: 401 403 Errors

Examples

curl
curl -X PATCH "https://api.fluit.cloud/preview/channels/{channelCode}/content-pages/{slug}" \
  -H "Content-Type: application/json" \
  -d @body.json
Response 400
{
  "detail": "string",
  "instance": "string",
  "status": 42,
  "title": "string",
  "type": "string"
}

Base URL https://api.fluit.cloud/preview. The response example is generated from the schema: the shape is right, the values are made up.

DELETE /channels/{channelCode}/content-pages/{slug}

Delete a content page

Removes the page and its sections for good. To take a page down while keeping its content, use POST .../unpublish instead. A page with child pages cannot be deleted: move the children to another parent or delete them first.

Show the full description

The deletion is reported under GET /preview/deletions as the resource content-pages, with the business key {channelCode}/{slug}, so a client syncing on ?modifiedSince= learns the page is gone.

content-pages:write

Path parameters

Field Type Description
channelCode Required string Code of the channel the page belongs to.
slug Required string The page's slug within that channel.

Responses

204 Empty body.
404 ProblemDetails No channel with that code, or no page with that slug in it.
Field Type
detail string · nullable
instance string · nullable
status integer · nullable
title string · nullable
type string · nullable
409 ProblemDetails ContentPage.HasChildPages — the page still has child pages.
Field Type
detail string · nullable
instance string · nullable
status integer · nullable
title string · nullable
type string · nullable

Standard errors: 401 403 Errors

Examples

curl
curl -X DELETE "https://api.fluit.cloud/preview/channels/{channelCode}/content-pages/{slug}"
Response 404
{
  "detail": "string",
  "instance": "string",
  "status": 42,
  "title": "string",
  "type": "string"
}

Base URL https://api.fluit.cloud/preview. The response example is generated from the schema: the shape is right, the values are made up.

PUT /channels/{channelCode}/content-pages/{slug}/config

Replace a content page's sections

Replaces the page body: layout, full-width flag and the whole section list. This is a PUT and not a PATCH because the section list is positional — sending a subset would be ambiguous between "these are the sections now" and "merge these in".

Show the full description

Read the page, change what you need, send the whole config back. Keep each section's id when you do: an omitted id creates a new section, so dropping them would replace every section with a copy and lose their identity. This replaces the whole config, so send every field you want kept: an omitted layout or fullWidth falls back to its default rather than to the stored value. sections has no default and must be present — send [] to clear the body deliberately. Products, categories and suppliers are named by business key. An unknown key is rejected with 400 rather than dropped, so a section cannot silently lose half its products. Returns the whole page, the same representation as GET, so the caller sees the result without a second request. No Idempotency-Key is needed — the header is required on POST. Repeating the same body is safe as long as the sections carry their ids; sections sent without one are created afresh on every call.

content-pages:write

Path parameters

Field Type Description
channelCode Required string Code of the channel the page belongs to.
slug Required string The page's slug within that channel.

Body required

Field Type Description
fullWidth boolean True for a full-bleed page, false to keep the content inside the container width.
layout enum Page layout exposed via the Public API. Standard WithSidebar Magazine
sections Required PageSection[] · nullable The sections, in the order they are rendered. Required on the way in — send `[]` to clear the page.

Responses

200 PublicContentPageResponse
Field Type Description
authorName string · nullable Displayed author. Free text, not linked to a user.
channelCode Required string · nullable The channel the page belongs to.
config Required PageConfig A page built from sections: the layout plus the sections in order.
createdDate Required string(date-time) When the page was created (UTC).
excerpt string · nullable Short summary for list cards, RSS and meta. Articles only.
featuredImageUrl string · nullable Cover image for list cards and Open Graph. Articles only.
isPublished Required boolean Whether the page is published and visible in the storefront.
links Links Hypermedia links for a public API resource. Exposed as a computed `links` property on the public response DTOs so that create and read responses carry the same self-reference — the canonical URL is derived from the business key already present on the DTO and can never drift from the route it points at.
metaDescription string · nullable SEO meta description.
modifiedDate string(date-time) · nullable When the page was last changed (UTC), or null if never changed.
pageType Required enum What kind of content page this is. Mirrors `Domain.Ecom.ContentPageType`. Page BlogPost NewsPost Home
parentSlug string · nullable Slug of the parent page, for a hierarchy. Null at the top level.
publishDate string(date-time) · nullable Editorial publication date shown and sorted on. May be in the future: public storefront queries hide an article until it passes.
publishedAt string(date-time) · nullable When it was published (UTC), or null if it never has been.
showInNavigation Required boolean Whether the page appears in the navigation menu.
slug Required string · nullable URL slug, unique within the channel.
sortOrder Required integer Sort order in listings and navigation.
tags string[] · nullable Tags used for filtering and related articles.
title Required string · nullable Page title, used for the heading and as the SEO title.
400 ProblemDetails A section referenced an item number, category code or supplier number that does not exist. The error names the section and the field, e.g. sections[2].productNumbers[0]. Also when a section omitted a field its own type requires: a SharedSections section without sectionCollectionId is rejected as sections[{index}].sectionCollectionId.
Field Type
detail string · nullable
instance string · nullable
status integer · nullable
title string · nullable
type string · nullable
404 ProblemDetails No channel with that code, or no page with that slug in it.
Field Type
detail string · nullable
instance string · nullable
status integer · nullable
title string · nullable
type string · nullable

Standard errors: 401 403 Errors

Examples

curl
curl -X PUT "https://api.fluit.cloud/preview/channels/{channelCode}/content-pages/{slug}/config" \
  -H "Content-Type: application/json" \
  -d @body.json
Response 200
{
  "authorName": "Acme AB",
  "channelCode": "STD",
  "config": {
    "fullWidth": true,
    "layout": "Standard",
    "sections": [
      {
        "alignment": "Left",
        "anchor": "string",
        "articleLinkText": "string",
        "articleType": "All",
        "bannerEndDate": "2026-06-11T09:24:13.418",
        "bannerImageUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
        "bannerLinkUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
        "bannerStartDate": "2026-06-11T09:24:13.418",
        "buttons": [
          {
            "label": "string",
            "openInNewTab": true,
            "pageSlug": "string",
            "url": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
            "variant": "Primary"
          }
        ],
        "cardColumns": 42,
        "cardVariant": "Icon",
        "categoryCode": "STD",
        "categoryCodes": [
          "STD"
        ],
        "contact": {
          "directionsUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
          "mapImageUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
          "showAddress": true,
          "showEmail": true,
          "showOpeningHours": true,
          "showPhone": true
        },
        "cssClass": "string",
        "custom": {
          "blockKey": "string",
          "values": null
        },
        "eyebrow": "string",
        "faq": {
          "items": [
            {}
          ]
        },
        "featureCards": [
          {
            "iconName": "Width",
            "imageAlt": "string",
            "imageUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
            "linkText": "string",
            "linkUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
            "text": "string",
            "title": "string"
          }
        ],
        "form": {
          "aside": "None",
          "asideHtml": "string",
          "formToken": "0f8b2c1e-4d3a-4b7e-9f10-2a6c5d8e1b44"
        },
        "galleryImages": [
          {
            "altText": "string",
            "caption": "string",
            "imageUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
            "linkUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg"
          }
        ],
        "heroCtaText": "string",
        "heroCtaUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
        "heroImageUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
        "heroTextColor": "Light",
        "heroVideoPosterUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
        "heroVideoUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
        "htmlContent": "string",
        "id": "0f8b2c1e-4d3a-4b7e-9f10-2a6c5d8e1b44",
        "isVisible": true,
        "itemGroupCode": "STD",
        "lead": "string",
        "logos": {
          "grayscale": true,
          "items": [
            {}
          ],
          "size": "Medium"
        },
        "maxBrands": 42,
        "maxProducts": 42,
        "mediaText": {
          "altText": "string",
          "bodyHtml": "string",
          "mediaAspect": "Original",
          "mediaPosition": "Left",
          "mediaUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
          "videoUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg"
        },
        "narrowText": true,
        "parentCategoryCode": "STD",
        "productColumns": 42,
        "productNumbers": [
          "ABC-001"
        ],
        "productSort": "Manual",
        "productSpotlight": {
          "altText": "string",
          "badge": "string",
          "bodyHtml": "string",
          "documentCategory": "Datasheet",
          "documentIds": [
            "0f8b2c1e-4d3a-4b7e-9f10-2a6c5d8e1b44"
          ],
          "documents": "None",
          "layout": "SideBySide",
          "mediaPosition": "Left",
          "mediaUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
          "productNumber": "ABC-001",
          "showAddToCart": true,
          "showKeySpecs": true,
          "showPrice": true,
          "showStock": true
        },
        "sectionCollectionId": "0f8b2c1e-4d3a-4b7e-9f10-2a6c5d8e1b44",
        "sortOrder": 42,
        "spacing": "Normal",
        "subtitle": "string",
        "supplierNumbers": [
          "SUP-001"
        ],
        "testimonials": [
          {
            "author": "string",
            "avatarUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
            "quote": "string",
            "rating": 42,
            "role": "string"
          }
        ],
        "timeline": {
          "marker": "Number",
          "steps": [
            {}
          ]
        },
        "title": "string",
        "tone": "Default",
        "twoColumns": true,
        "type": "Hero",
        "videoUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg"
      }
    ]
  },
  "createdDate": "2026-06-11T09:24:13.418",
  "excerpt": "string",
  "featuredImageUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
  "isPublished": true,
  "links": {
    "self": "string"
  },
  "metaDescription": "string",
  "modifiedDate": "2026-06-11T09:24:13.418",
  "pageType": "Page",
  "parentSlug": "string",
  "publishDate": "2026-06-11T09:24:13.418",
  "publishedAt": "2026-06-11T09:24:13.418",
  "showInNavigation": true,
  "slug": "string",
  "sortOrder": 42,
  "tags": [
    "string"
  ],
  "title": "string"
}

Base URL https://api.fluit.cloud/preview. The response example is generated from the schema: the shape is right, the values are made up.

POST /channels/{channelCode}/content-pages/{slug}/publish

Publish a content page

Marks the page published and stamps publishedAt. Publishing an already published page is harmless and leaves the original publishedAt alone. An article whose publishDate is still in the future stays hidden in the storefront until that date passes, even once published here.

content-pages:write Requires Idempotency-Key

Path parameters

Field Type Description
channelCode Required string Code of the channel the page belongs to.
slug Required string The page's slug within that channel.

Responses

204 Empty body.
404 ProblemDetails No channel with that code, or no page with that slug in it.
Field Type
detail string · nullable
instance string · nullable
status integer · nullable
title string · nullable
type string · nullable

Standard errors: 401 403 Errors

Examples

curl
curl -X POST "https://api.fluit.cloud/preview/channels/{channelCode}/content-pages/{slug}/publish" \
  -H "Idempotency-Key: $(uuidgen)"
Response 404
{
  "detail": "string",
  "instance": "string",
  "status": 42,
  "title": "string",
  "type": "string"
}

Base URL https://api.fluit.cloud/preview. The response example is generated from the schema: the shape is right, the values are made up.

POST /channels/{channelCode}/content-pages/{slug}/unpublish

Unpublish a content page

Hides the page from the storefront without deleting it. The sections, SEO and slug are kept, so publishing it again restores exactly what was there. Use this rather than DELETE to take something down temporarily.

content-pages:write Requires Idempotency-Key

Path parameters

Field Type Description
channelCode Required string Code of the channel the page belongs to.
slug Required string The page's slug within that channel.

Responses

204 Empty body.
404 ProblemDetails No channel with that code, or no page with that slug in it.
Field Type
detail string · nullable
instance string · nullable
status integer · nullable
title string · nullable
type string · nullable

Standard errors: 401 403 Errors

Examples

curl
curl -X POST "https://api.fluit.cloud/preview/channels/{channelCode}/content-pages/{slug}/unpublish" \
  -H "Idempotency-Key: $(uuidgen)"
Response 404
{
  "detail": "string",
  "instance": "string",
  "status": 42,
  "title": "string",
  "type": "string"
}

Base URL https://api.fluit.cloud/preview. The response example is generated from the schema: the shape is right, the values are made up.

GET /channels/{channelCode}/home-page

Read a channel's home page

Returns the section list the storefront renders at the channel's root. The home page is not a content page: there is exactly one per channel, it has no slug, and it cannot be unpublished or deleted — which is why it is addressed by channel code alone.

Show the full description

The body is the same config a content page carries, with the same section types and the same business-key references, so one renderer covers both. Replace it with PUT on the same URL. Responses carry a weak ETag; pass it back in If-None-Match to get 304 Not Modified while the home page is unchanged.

content-pages:read Supports ETag

Path parameters

Field Type Description
channelCode Required string Code of the channel whose home page to read.

Responses

200 PublicChannelHomePageResponse
  • ETag — Weak validator for this representation. Pass it back in If-None-Match to get 304 Not Modified while the record is unchanged.
Field Type Description
channelCode Required string · nullable The channel whose home page this is.
config Required PageConfig A page built from sections: the layout plus the sections in order.
links Links Hypermedia links for a public API resource. Exposed as a computed `links` property on the public response DTOs so that create and read responses carry the same self-reference — the canonical URL is derived from the business key already present on the DTO and can never drift from the route it points at.
modifiedDate string(date-time) · nullable When the storefront configuration was last changed (UTC), or null if never.
304 Empty body.
  • ETag — Weak validator for this representation. Pass it back in If-None-Match to get 304 Not Modified while the record is unchanged.
404 ProblemDetails No channel with that code, or the channel has no storefront configuration yet (StorefrontConfig.NotFound).
Field Type
detail string · nullable
instance string · nullable
status integer · nullable
title string · nullable
type string · nullable

Standard errors: 401 403 Errors

Examples

curl
curl "https://api.fluit.cloud/preview/channels/{channelCode}/home-page"
Response 200
{
  "channelCode": "STD",
  "config": {
    "fullWidth": true,
    "layout": "Standard",
    "sections": [
      {
        "alignment": "Left",
        "anchor": "string",
        "articleLinkText": "string",
        "articleType": "All",
        "bannerEndDate": "2026-06-11T09:24:13.418",
        "bannerImageUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
        "bannerLinkUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
        "bannerStartDate": "2026-06-11T09:24:13.418",
        "buttons": [
          {
            "label": "string",
            "openInNewTab": true,
            "pageSlug": "string",
            "url": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
            "variant": "Primary"
          }
        ],
        "cardColumns": 42,
        "cardVariant": "Icon",
        "categoryCode": "STD",
        "categoryCodes": [
          "STD"
        ],
        "contact": {
          "directionsUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
          "mapImageUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
          "showAddress": true,
          "showEmail": true,
          "showOpeningHours": true,
          "showPhone": true
        },
        "cssClass": "string",
        "custom": {
          "blockKey": "string",
          "values": null
        },
        "eyebrow": "string",
        "faq": {
          "items": [
            {}
          ]
        },
        "featureCards": [
          {
            "iconName": "Width",
            "imageAlt": "string",
            "imageUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
            "linkText": "string",
            "linkUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
            "text": "string",
            "title": "string"
          }
        ],
        "form": {
          "aside": "None",
          "asideHtml": "string",
          "formToken": "0f8b2c1e-4d3a-4b7e-9f10-2a6c5d8e1b44"
        },
        "galleryImages": [
          {
            "altText": "string",
            "caption": "string",
            "imageUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
            "linkUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg"
          }
        ],
        "heroCtaText": "string",
        "heroCtaUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
        "heroImageUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
        "heroTextColor": "Light",
        "heroVideoPosterUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
        "heroVideoUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
        "htmlContent": "string",
        "id": "0f8b2c1e-4d3a-4b7e-9f10-2a6c5d8e1b44",
        "isVisible": true,
        "itemGroupCode": "STD",
        "lead": "string",
        "logos": {
          "grayscale": true,
          "items": [
            {}
          ],
          "size": "Medium"
        },
        "maxBrands": 42,
        "maxProducts": 42,
        "mediaText": {
          "altText": "string",
          "bodyHtml": "string",
          "mediaAspect": "Original",
          "mediaPosition": "Left",
          "mediaUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
          "videoUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg"
        },
        "narrowText": true,
        "parentCategoryCode": "STD",
        "productColumns": 42,
        "productNumbers": [
          "ABC-001"
        ],
        "productSort": "Manual",
        "productSpotlight": {
          "altText": "string",
          "badge": "string",
          "bodyHtml": "string",
          "documentCategory": "Datasheet",
          "documentIds": [
            "0f8b2c1e-4d3a-4b7e-9f10-2a6c5d8e1b44"
          ],
          "documents": "None",
          "layout": "SideBySide",
          "mediaPosition": "Left",
          "mediaUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
          "productNumber": "ABC-001",
          "showAddToCart": true,
          "showKeySpecs": true,
          "showPrice": true,
          "showStock": true
        },
        "sectionCollectionId": "0f8b2c1e-4d3a-4b7e-9f10-2a6c5d8e1b44",
        "sortOrder": 42,
        "spacing": "Normal",
        "subtitle": "string",
        "supplierNumbers": [
          "SUP-001"
        ],
        "testimonials": [
          {
            "author": "string",
            "avatarUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
            "quote": "string",
            "rating": 42,
            "role": "string"
          }
        ],
        "timeline": {
          "marker": "Number",
          "steps": [
            {}
          ]
        },
        "title": "string",
        "tone": "Default",
        "twoColumns": true,
        "type": "Hero",
        "videoUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg"
      }
    ]
  },
  "links": {
    "self": "string"
  },
  "modifiedDate": "2026-06-11T09:24:13.418"
}

Base URL https://api.fluit.cloud/preview. The response example is generated from the schema: the shape is right, the values are made up.

PUT /channels/{channelCode}/home-page

Replace a channel's home page

Replaces the home page: layout, full-width flag and the whole section list. This is a PUT and not a PATCH because the section list is positional — sending a subset would be ambiguous between "these are the sections now" and "merge these in".

Show the full description

Read the home page, change what you need, send the whole config back. Keep each section's id when you do: an omitted id creates a new section, so dropping them would replace every section with a copy and lose their identity. This replaces the whole config, so send every field you want kept: an omitted layout or fullWidth falls back to its default rather than to the stored value. sections has no default and must be present — send [] to clear the page deliberately, so that a body carrying only layout cannot wipe it by accident. Products, categories and suppliers are named by business key. An unknown key is rejected with 400 rather than dropped, so a section cannot silently lose half its products. Returns the whole home page, the same representation as GET, so the caller sees the result without a second request. No Idempotency-Key is needed — the header is required on POST. Repeating the same body is safe as long as the sections carry their ids; sections sent without one are created afresh on every call.

content-pages:write

Path parameters

Field Type Description
channelCode Required string Code of the channel whose home page to replace.

Body required

Field Type Description
fullWidth boolean True for a full-bleed page, false to keep the content inside the container width.
layout enum Page layout exposed via the Public API. Standard WithSidebar Magazine
sections Required PageSection[] · nullable The sections, in the order they are rendered. Required on the way in — send `[]` to clear the page.

Responses

200 PublicChannelHomePageResponse
Field Type Description
channelCode Required string · nullable The channel whose home page this is.
config Required PageConfig A page built from sections: the layout plus the sections in order.
links Links Hypermedia links for a public API resource. Exposed as a computed `links` property on the public response DTOs so that create and read responses carry the same self-reference — the canonical URL is derived from the business key already present on the DTO and can never drift from the route it points at.
modifiedDate string(date-time) · nullable When the storefront configuration was last changed (UTC), or null if never.
400 ProblemDetails A section referenced an item number, category code or supplier number that does not exist, or two sections carried the same id. The error names the section and the field, e.g. sections[2].productNumbers[0]. Also when a section omitted a field its own type requires: a SharedSections section without sectionCollectionId is rejected as sections[{index}].sectionCollectionId.
Field Type
detail string · nullable
instance string · nullable
status integer · nullable
title string · nullable
type string · nullable
404 ProblemDetails No channel with that code, or the channel has no storefront configuration yet (StorefrontConfig.NotFound).
Field Type
detail string · nullable
instance string · nullable
status integer · nullable
title string · nullable
type string · nullable

Standard errors: 401 403 Errors

Examples

curl
curl -X PUT "https://api.fluit.cloud/preview/channels/{channelCode}/home-page" \
  -H "Content-Type: application/json" \
  -d @body.json
Response 200
{
  "channelCode": "STD",
  "config": {
    "fullWidth": true,
    "layout": "Standard",
    "sections": [
      {
        "alignment": "Left",
        "anchor": "string",
        "articleLinkText": "string",
        "articleType": "All",
        "bannerEndDate": "2026-06-11T09:24:13.418",
        "bannerImageUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
        "bannerLinkUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
        "bannerStartDate": "2026-06-11T09:24:13.418",
        "buttons": [
          {
            "label": "string",
            "openInNewTab": true,
            "pageSlug": "string",
            "url": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
            "variant": "Primary"
          }
        ],
        "cardColumns": 42,
        "cardVariant": "Icon",
        "categoryCode": "STD",
        "categoryCodes": [
          "STD"
        ],
        "contact": {
          "directionsUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
          "mapImageUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
          "showAddress": true,
          "showEmail": true,
          "showOpeningHours": true,
          "showPhone": true
        },
        "cssClass": "string",
        "custom": {
          "blockKey": "string",
          "values": null
        },
        "eyebrow": "string",
        "faq": {
          "items": [
            {}
          ]
        },
        "featureCards": [
          {
            "iconName": "Width",
            "imageAlt": "string",
            "imageUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
            "linkText": "string",
            "linkUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
            "text": "string",
            "title": "string"
          }
        ],
        "form": {
          "aside": "None",
          "asideHtml": "string",
          "formToken": "0f8b2c1e-4d3a-4b7e-9f10-2a6c5d8e1b44"
        },
        "galleryImages": [
          {
            "altText": "string",
            "caption": "string",
            "imageUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
            "linkUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg"
          }
        ],
        "heroCtaText": "string",
        "heroCtaUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
        "heroImageUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
        "heroTextColor": "Light",
        "heroVideoPosterUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
        "heroVideoUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
        "htmlContent": "string",
        "id": "0f8b2c1e-4d3a-4b7e-9f10-2a6c5d8e1b44",
        "isVisible": true,
        "itemGroupCode": "STD",
        "lead": "string",
        "logos": {
          "grayscale": true,
          "items": [
            {}
          ],
          "size": "Medium"
        },
        "maxBrands": 42,
        "maxProducts": 42,
        "mediaText": {
          "altText": "string",
          "bodyHtml": "string",
          "mediaAspect": "Original",
          "mediaPosition": "Left",
          "mediaUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
          "videoUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg"
        },
        "narrowText": true,
        "parentCategoryCode": "STD",
        "productColumns": 42,
        "productNumbers": [
          "ABC-001"
        ],
        "productSort": "Manual",
        "productSpotlight": {
          "altText": "string",
          "badge": "string",
          "bodyHtml": "string",
          "documentCategory": "Datasheet",
          "documentIds": [
            "0f8b2c1e-4d3a-4b7e-9f10-2a6c5d8e1b44"
          ],
          "documents": "None",
          "layout": "SideBySide",
          "mediaPosition": "Left",
          "mediaUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
          "productNumber": "ABC-001",
          "showAddToCart": true,
          "showKeySpecs": true,
          "showPrice": true,
          "showStock": true
        },
        "sectionCollectionId": "0f8b2c1e-4d3a-4b7e-9f10-2a6c5d8e1b44",
        "sortOrder": 42,
        "spacing": "Normal",
        "subtitle": "string",
        "supplierNumbers": [
          "SUP-001"
        ],
        "testimonials": [
          {
            "author": "string",
            "avatarUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
            "quote": "string",
            "rating": 42,
            "role": "string"
          }
        ],
        "timeline": {
          "marker": "Number",
          "steps": [
            {}
          ]
        },
        "title": "string",
        "tone": "Default",
        "twoColumns": true,
        "type": "Hero",
        "videoUrl": "https://cdn.fluit.cloud/assets/widget-a-front.jpg"
      }
    ]
  },
  "links": {
    "self": "string"
  },
  "modifiedDate": "2026-06-11T09:24:13.418"
}

Base URL https://api.fluit.cloud/preview. The response example is generated from the schema: the shape is right, the values are made up.

Schemas

The objects this group's calls refer to. The field tables above go one level deep and link here rather than repeating the same schema on every endpoint.

PageConfig

PublicPageConfig

A page built from sections: the layout plus the sections in order.

Field Type Description
fullWidth boolean True for a full-bleed page, false to keep the content inside the container width.
layout enum Page layout exposed via the Public API. Standard WithSidebar Magazine
sections Required PageSection[] · nullable The sections, in the order they are rendered. Required on the way in — send `[]` to clear the page.

PageSection

PublicPageSection

One section on a page. Which fields apply depends on PublicApi.Preview.ContentPages.Queries.PublicPageSection.Type; the rest are ignored.

Field Type Description
alignment enum Alignment of a section's heading. Mirrors `Domain.Ecom.SectionAlignment`. Left Center
anchor string · nullable HTML id, so a link can lead straight to the section (`/contact#write-to-us`).
articleLinkText string · nullable Label on the link to the archive. Empty hides the link.
articleType enum Which content pages a PublicApi.Preview.ContentPages.Queries.PublicPageSectionType.LatestArticles section lists. Mirrors `Domain.Ecom.ArticleSourceType`. All BlogPosts News
bannerEndDate string(date-time) · nullable When the banner stops showing. Null means never.
bannerImageUrl string · nullable Banner image.
bannerLinkUrl string · nullable Where the banner leads.
bannerStartDate string(date-time) · nullable When the banner starts showing. Null means immediately.
buttons SectionButton[] · nullable Buttons under the heading, at most three.
cardColumns integer Columns on wide screens (2–4). Zero lets the storefront choose from the number of cards.
cardVariant enum How the cards of a FeatureCards section are drawn. Mirrors `Domain.Ecom.CardVariant`. Icon ImageTop ImageLeft
categoryCode string · nullable Category to take products from, by category code.
categoryCodes string[] · nullable Specific categories to show, by category code.
contact SectionContact What a Contact section shows.
cssClass string · nullable Extra CSS class, for storefronts that style sections themselves.
custom SectionCustom A custom block on a page: which block, and the values for its fields.
eyebrow string · nullable A short line above the heading ("CONTACT", "OUR SERVICES").
faq SectionFaq A Faq section's questions.
featureCards PageSectionFeatureCard[] · nullable Cards in a FeatureCards section.
form SectionForm A Form section's settings. What happens with a submission is set on the form in Fluit.
galleryImages PageSectionImage[] · nullable Images in a gallery or carousel section.
heroCtaText string · nullable Call-to-action label.
heroCtaUrl string · nullable Where the call to action leads.
heroImageUrl string · nullable Background image for a Hero section.
heroTextColor enum Text colour for a hero section. Mirrors `Domain.Ecom.HeroTextColor`. Light Dark
heroVideoPosterUrl string · nullable Poster frame for a direct-link hero video. Falls back to heroImageUrl.
heroVideoUrl string · nullable Video played from the hero (YouTube, Vimeo or a direct link).
htmlContent string · nullable HTML body for a TextBlock section.
id string(uuid) · nullable The section's own id, stable across edits so a client can address one section of a page. Generated on create when omitted.
isVisible boolean False hides the section without removing it.
itemGroupCode string · nullable Item group to take products from, by category code.
lead string · nullable Lead paragraph of a TextBlock section, between heading and body.
logos SectionLogos A Logos section's logos.
maxBrands integer How many brands to show at most.
maxProducts integer How many products to show at most.
mediaText SectionMediaText A MediaText section's image and text.
narrowText boolean A narrow text column, for long reads.
parentCategoryCode string · nullable Show every child of this category, by category code.
productColumns integer Columns in the product grid.
productNumbers string[] · nullable Manually picked products, by item number, in display order.
productSort enum How products are ordered inside a product section. Mirrors `Domain.Ecom.ProductSortOrder`. Manual Newest PriceLowToHigh PriceHighToLow Bestselling Random Alphabetical
productSpotlight SectionProductSpotlight A ProductSpotlight section: one product shown large. Name, images, key specs, price, stock and documents are read from the product itself on every page view, so only the editor's own choices live here.
sectionCollectionId string(uuid) · nullable A SharedSections section's collection. An opaque id: read it from a page and send it back unchanged; collections are managed in Fluit. Required on a SharedSections section — omit it or send an empty id and the write is rejected with 400 naming sections[{index}].sectionCollectionId. Ignored on every other section type.
sortOrder integer Position on the page. Sections are rendered in ascending order.
spacing enum Space above and below a section. Mirrors `Domain.Ecom.SectionSpacing`. Normal Compact Spacious
subtitle string · nullable Sub-heading or lead text.
supplierNumbers string[] · nullable Specific suppliers to show, by supplier number.
testimonials PageSectionTestimonial[] · nullable Testimonials to show.
timeline SectionTimeline A Timeline section's steps.
title string · nullable Section heading.
tone enum A section's background, from the channel's branding. Mirrors `Domain.Ecom.SectionTone`. Default Muted Ink Brand Accent
twoColumns boolean Break the TextBlock body into two columns on wide screens.
type Required enum The kinds of section a page can be built from. Mirrors `Domain.Ecom.PageSectionType` — see PublicApi.Preview.ContentPages.Queries.PublicPageLayout for why. Hero FeaturedProducts ProductsByCategory ProductsByGroup NewArrivals BestSellers OnSale Categories Banner TextBlock Newsletter Brands Testimonials ImageGallery Video Divider LatestArticles FeatureCards CallToAction Form MediaText Faq Logos Contact SharedSections Custom Timeline ProductSpotlight
videoUrl string · nullable Video URL (YouTube, Vimeo or a direct mp4 link).

PageSectionFeatureCard

PublicPageSectionFeatureCard

One card in a FeatureCards section.

Field Type Description
iconName string · nullable Icon from the storefront's fixed set, e.g. `shield` or `truck`. An unknown name draws no icon rather than failing.
imageAlt string · nullable Alt text for the card's image.
imageUrl string · nullable The card's image, when the section draws cards with images.
linkText string · nullable Link label. Without one the whole card is clickable.
linkUrl string · nullable Where the card links. Null makes it non-clickable. Either a storefront path starting with `/` or an absolute http(s) URL — a protocol-relative address is refused, because it inherits the page's scheme while looking like an internal path.
text string · nullable Body text under the heading.
title Required string Card heading.

PageSectionImage

PublicPageSectionImage

One image in a gallery section.

Field Type Description
altText string · nullable Alt text, for accessibility.
caption string · nullable Caption shown with the image.
imageUrl Required string The image.
linkUrl string · nullable Where the image links. Null makes it non-clickable.

PageSectionTestimonial

PublicPageSectionTestimonial

One testimonial.

Field Type Description
author string · nullable Who said it.
avatarUrl string · nullable Portrait image.
quote Required string The quote itself.
rating integer · nullable Rating from 1 to 5. Null shows no rating.
role string · nullable Their role or company.

SectionButton

PublicSectionButton

A button under a section's heading.

Field Type Description
label Required string The button's label.
openInNewTab boolean Open in a new tab.
pageSlug string · nullable The content page the button leads to, by slug in the same channel. The link then follows the page when its address changes.
url string · nullable Where the button leads: a storefront path, an anchor, mailto:/tel: or an absolute http(s) URL. When PublicApi.Preview.ContentPages.Queries.PublicSectionButton.PageSlug is set, this is the page's current address on the way out and ignored on the way in.
variant enum How a section button is drawn. Mirrors `Domain.Ecom.SectionButtonVariant`. Primary Secondary Link

SectionContact

PublicSectionContact

What a Contact section shows.

Field Type Description
directionsUrl string · nullable The link behind "Get directions".
mapImageUrl string · nullable A map image (an image, not an embedded map).
showAddress boolean Show the visiting address.
showEmail boolean Show the email address.
showOpeningHours boolean Show the opening hours.
showPhone boolean Show the phone number.

SectionCustom

PublicSectionCustom

A custom block on a page: which block, and the values for its fields.

Field Type Description
blockKey Required string The block's key, unique in the channel, e.g. `prislista`.
values object · nullable The values, keyed by field key. A list is an array of objects, an image `{ "url", "alt" }`, a link `{ "url", "openInNewTab" }`, a choice the option's key, a date ISO 8601.

SectionFaq

PublicSectionFaq

A Faq section's questions.

Field Type Description
items SectionFaqItem[] · nullable The questions, in display order.

SectionFaqItem

PublicSectionFaqItem

One question in a Faq section.

Field Type Description
answerHtml string · nullable The answer, as HTML.
question Required string The question.

SectionForm

PublicSectionForm

A Form section's settings. What happens with a submission is set on the form in Fluit.

Field Type Description
aside enum What stands next to a form. Mirrors `Domain.Ecom.FormAside`. None ContactInfo Text
asideHtml string · nullable The text next to the form when aside is Text.
formToken Required string(uuid) The form, by its public token (the same token as in the form's embed link).

SectionLogos

PublicSectionLogos

A Logos section's logos.

Field Type Description
grayscale boolean Show the logos in greyscale, in colour on hover.
items SectionLogo[] · nullable The logos, in display order.
size enum How large the logos are drawn. Mirrors `Domain.Ecom.LogoSize`. Medium Small Large

SectionMediaText

PublicSectionMediaText

A MediaText section's image and text.

Field Type Description
altText string · nullable Alt text for the image.
bodyHtml string · nullable The text, as HTML.
mediaAspect enum The image's proportions in a MediaText section. Mirrors `Domain.Ecom.MediaAspect`. Original Square Wide
mediaPosition enum Where the image stands in a MediaText section. Mirrors `Domain.Ecom.MediaPosition`. Left Right
mediaUrl string · nullable The image.
videoUrl string · nullable A video shown instead of the image; the image becomes its poster.

SectionProductSpotlight

PublicSectionProductSpotlight

A ProductSpotlight section: one product shown large. Name, images, key specs, price, stock and documents are read from the product itself on every page view, so only the editor's own choices live here.

Field Type Description
altText string · nullable Alt text for that image. The product's own images carry theirs.
badge string · nullable Badge over the image, e.g. "Firmware v1.2.0".
bodyHtml string · nullable The editor's pitch, as HTML. Empty falls back to the product's short description.
documentCategory enum A category of product document. The document half of `Domain.Items.AssetCategory`, name for name and value for value — the image categories have no meaning for a document list, and advertising them would invite a value the write rejects. `PublicPageEnumParityTests` fails the build if one of these drifts from the domain. Datasheet Manual Certificate SafetySheet Warranty Brochure Installation Firmware Software Other
documentIds string(uuid)[] · nullable The chosen documents when documents is Selected, at most ten. Opaque ids: read them from a product and send them back unchanged. Ignored for every other value of documents.
documents enum Which of the product's documents a ProductSpotlight section lists. Mirrors `Domain.Ecom.SpotlightDocuments`. None Selected Category
layout enum How a ProductSpotlight section is drawn. Mirrors `Domain.Ecom.SpotlightLayout`. SideBySide Banner Row
mediaPosition enum Where the image stands in a MediaText section. Mirrors `Domain.Ecom.MediaPosition`. Left Right
mediaUrl string · nullable An image of your own instead of the product's.
productNumber Required string The product, by item number. Required on a ProductSpotlight section — omit it and the write is rejected with 400 naming sections[{index}].productSpotlight.productNumber.
showAddToCart boolean Show the buy button. Needs the channel's webshop turned on.
showKeySpecs boolean Show the channel's filterable attributes for the product.
showPrice boolean Show the price. The storefront still decides what this visitor may see.
showStock boolean Show the stock status.

SectionTimeline

PublicSectionTimeline

A Timeline section's steps.

Field Type Description
marker enum What is drawn at each step in a Timeline section. Number Icon Dot
steps SectionTimelineStep[] · nullable The steps, in display order.

SectionTimelineOption

PublicSectionTimelineOption

One of several paths through a step in a Timeline section.

Field Type Description
bodyHtml string · nullable The body text, as HTML.
buttons SectionButton[] · nullable Buttons in the alternative, at most three.
title Required string The alternative's title, without a letter.

SectionTimelineStep

PublicSectionTimelineStep

One step in a Timeline section.

Field Type Description
alternatives SectionTimelineOption[] · nullable Paths that lead through the same step, at most four.
bodyHtml string · nullable The body text, as HTML.
buttons SectionButton[] · nullable Buttons in the step, at most three.
iconName string · nullable Icon name, used when the marker is Icon.
title Required string The step's title, without a number.