Public Post by slug
Unauthenticated. Resolves by slug. Returns 404 for archived or discarded posts; draft / scheduled / inactive posts resolve (noindex at the theme layer).
curl --request GET \
--url https://api.fluid.app/api/v202604/posts/{slug}import requests
url = "https://api.fluid.app/api/v202604/posts/{slug}"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.fluid.app/api/v202604/posts/{slug}', 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/posts/{slug}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$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/posts/{slug}"
req, _ := http.NewRequest("GET", url, nil)
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/posts/{slug}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/v202604/posts/{slug}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"status": 200,
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"pagination": {
"cursor": "<string>",
"limit": 25,
"prev_cursor": "<string>",
"next_cursor": "<string>"
}
},
"post": {
"id": 7305,
"slug": "how-we-shipped-the-summer-line",
"title": "How We Shipped the Summer Line",
"description": "A behind-the-scenes look at three months of work.",
"image_url": "https://cdn.fluid.app/posts/7305.png",
"canonical_url": "https://acme.fluid.app/home/blog/how-we-shipped-the-summer-line",
"images": {
"thumb": {
"url": "https://ik.imagekit.io/fluidapp/tr:w-600,c-at_max,f-auto,q-75/categories/4821.png",
"width": 600
},
"medium": {
"url": "https://ik.imagekit.io/fluidapp/tr:w-600,c-at_max,f-auto,q-75/categories/4821.png",
"width": 600
},
"large": {
"url": "https://ik.imagekit.io/fluidapp/tr:w-600,c-at_max,f-auto,q-75/categories/4821.png",
"width": 600
}
},
"active": true,
"status": "published",
"publish_at": null,
"seo": {
"title": "Summer Sale — Up to 40% Off",
"description": "Shop the July clearance event before it ends.",
"image_url": "https://ik.imagekit.io/fluidapp/tr:w-1200,h-630,c-maintain_ratio,fo-auto,f-auto,q-80/seo/9215.png",
"block_crawler": false,
"id": 9215
},
"metafields": [
{
"namespace": "custom",
"key": "material",
"value": "<unknown>",
"value_type": "single_line_text_field",
"description": "The primary material used in this product",
"created_at": "2026-05-01T12:00:00Z",
"updated_at": "2026-05-01T12:00:00Z",
"locked": false
}
],
"languages": [
"en",
"fr"
],
"countries": [
"GB",
"US"
],
"summary": "A short lead paragraph shown on listing cards.",
"post_date": "2026-05-01",
"post_author": "Dwight Schrute",
"category_id": 4821,
"collection_ids": [
5102,
5103
]
}
}{
"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>"
}
}
}Path Parameters
The URL slug of the post.
Query Parameters
Response locale. ISO code (e.g. fr, de). When omitted,
responds in the company's default locale. On the public
surface, falls back to en for any translated field missing
in the requested locale.
"fr"
Response
The Post.
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.
200
Response metadata included on every successful response body.
request_id and timestamp are always present; list endpoints
also add pagination.
Show child attributes
Show child attributes
Public Post read shape — the storefront (unauthenticated)
projection. Closed with unevaluatedProperties: false so any
authenticated-only field (notably custom_slug) leaking onto the
public surface is caught in conformance.
Show child attributes
Show child attributes
curl --request GET \
--url https://api.fluid.app/api/v202604/posts/{slug}import requests
url = "https://api.fluid.app/api/v202604/posts/{slug}"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.fluid.app/api/v202604/posts/{slug}', 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/posts/{slug}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$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/posts/{slug}"
req, _ := http.NewRequest("GET", url, nil)
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/posts/{slug}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/v202604/posts/{slug}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"status": 200,
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"pagination": {
"cursor": "<string>",
"limit": 25,
"prev_cursor": "<string>",
"next_cursor": "<string>"
}
},
"post": {
"id": 7305,
"slug": "how-we-shipped-the-summer-line",
"title": "How We Shipped the Summer Line",
"description": "A behind-the-scenes look at three months of work.",
"image_url": "https://cdn.fluid.app/posts/7305.png",
"canonical_url": "https://acme.fluid.app/home/blog/how-we-shipped-the-summer-line",
"images": {
"thumb": {
"url": "https://ik.imagekit.io/fluidapp/tr:w-600,c-at_max,f-auto,q-75/categories/4821.png",
"width": 600
},
"medium": {
"url": "https://ik.imagekit.io/fluidapp/tr:w-600,c-at_max,f-auto,q-75/categories/4821.png",
"width": 600
},
"large": {
"url": "https://ik.imagekit.io/fluidapp/tr:w-600,c-at_max,f-auto,q-75/categories/4821.png",
"width": 600
}
},
"active": true,
"status": "published",
"publish_at": null,
"seo": {
"title": "Summer Sale — Up to 40% Off",
"description": "Shop the July clearance event before it ends.",
"image_url": "https://ik.imagekit.io/fluidapp/tr:w-1200,h-630,c-maintain_ratio,fo-auto,f-auto,q-80/seo/9215.png",
"block_crawler": false,
"id": 9215
},
"metafields": [
{
"namespace": "custom",
"key": "material",
"value": "<unknown>",
"value_type": "single_line_text_field",
"description": "The primary material used in this product",
"created_at": "2026-05-01T12:00:00Z",
"updated_at": "2026-05-01T12:00:00Z",
"locked": false
}
],
"languages": [
"en",
"fr"
],
"countries": [
"GB",
"US"
],
"summary": "A short lead paragraph shown on listing cards.",
"post_date": "2026-05-01",
"post_author": "Dwight Schrute",
"category_id": 4821,
"collection_ids": [
5102,
5103
]
}
}{
"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>"
}
}
}