CmsService class (accessed via client.cms) provides access to content-driven features like blog posts and lookbooks, allowing you to build rich discovery experiences and content-led commerce.
Blog Posts
listPosts
Retrieve a paginated list of published blog posts, newest first. This is ideal for building a
“News” or “Magazine” section on your storefront. Only published posts are returned — there is no
status filter. Filter by category with the category slug (category: 'buying-guides').
excerpt, featured_image, slug, and
product_count (how many products a shoppable post links to). For the full content, use getPost.
getPost
Retrieve the full content of a specific published blog post by its slug, including any linked
products for shoppable posts (each entry in the products array carries the product’s name,
sku, price, images, and display_type). Returns 404 if no published post matches the slug.
Response
Lookbooks
Lookbooks are curated collections of lifestyle images linked to specific products, perfect for “Shop the Look” features.listLookbooks
Retrieve a list of published lookbooks, newest first. Only published lookbooks are returned —
there is no status filter.
getLookbook
Retrieve the full details of a published lookbook by its slug, including its ordered image gallery
and the shoppable hotspots placed on each image. Returns 404 if no published lookbook matches
the slug.
Each lookbook exposes status (always "published" from the public API) and collection_id — the
product collection that backs the lookbook, or null if it is standalone. The gallery lives under
images[], where each image has a url and a hotspots[] array tagging the products featured at
specific points in the photo (your “Shop the Look” markers).
Response
status is always "published" from the public API. collection_id is the backing product
collection, or null when the lookbook is standalone (as above). Each images[] entry carries a
hotspots[] array — empty here, otherwise one marker per tagged product.Newsletter
subscribeNewsletter
Capture a newsletter signup from your storefront. The email address is the identity, so this works for both anonymous visitors and signed-in shoppers (a signed-in storefront simply prefills the email field). When the merchant has connected a marketing tool, new subscribers are automatically synced to their chosen list.
Response
200 with already_subscribed: true and never creates a duplicate; a brand-new signup returns 201. This endpoint accepts both publishable and secret keys (it’s a storefront write, like cart), so you can call it directly from the browser.
Response Codes
The read endpoints (posts, lookbooks) areGET; subscribeNewsletter is a POST. All accept both publishable and secret keys. Slug validation is enforced — empty or whitespace-only slugs return 400 without hitting the database.

