Company Product show
Token-authenticated; resolves by id (the canonical company
identifier). Returns any Product regardless of lifecycle. Pricing is
COUNTRY-RELATIVE — the country parameter selects the per-country
variant price/currency.
curl --request GET \
--url https://api.fluid.app/api/v202604/company/products/{id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.fluid.app/api/v202604/company/products/{id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.fluid.app/api/v202604/company/products/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.fluid.app/api/v202604/company/products/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.fluid.app/api/v202604/company/products/{id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.fluid.app/api/v202604/company/products/{id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/v202604/company/products/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"status": 200,
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"pagination": {
"cursor": "<string>",
"limit": 25,
"prev_cursor": "<string>",
"next_cursor": "<string>"
}
},
"product": {
"id": 60311,
"slug": "scrute-farms-beet-blend",
"title": "Schrute Farms Beet Blend",
"description": "A cold-pressed beet concentrate from the finest acres on Schrute Farms.",
"image_url": "https://cdn.fluid.app/products/60311.png",
"canonical_url": "https://acme.fluid.app/home/products/scrute-farms-beet-blend",
"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"
],
"sku": "SCRUTE-BEET-001",
"is_bundle": false,
"in_stock": true,
"has_subscription_plans": true,
"pricing": {
"price": "29.99",
"currency_code": "USD",
"compare_at": "39.99",
"subscription_price": "26.99",
"display_price": "$29.99"
},
"default_variant": {
"id": 880912,
"sku": "SCRUTE-BEET-001-12OZ"
},
"variants": [
{
"id": 880912,
"sku": "SCRUTE-BEET-001-12OZ",
"is_master": true,
"title": "12 oz",
"display_name": "Schrute Farms Beet Blend — 12 oz",
"image_url": "https://cdn.fluid.app/variants/880912.png",
"position": 1,
"subscription_only": false,
"shipping_included_in_price": false,
"track_quantity": true,
"inventory_quantity": 142,
"bar_code": "0079827230015",
"keep_selling": false,
"limit_subscription": false,
"subscription_max_qty": null,
"limit_quantity_per_customer": false,
"customer_limit": null,
"option_attrs": [
"12 oz"
],
"option_ids": [
4471
],
"allow_subscription": true,
"images": [
{
"id": 5521,
"image_url": "https://cdn.fluid.app/variants/880912/front.png",
"image_path": "variants/880912/front.png",
"position": 1
}
],
"inventory_levels": [
{
"id": 33019,
"available": 142,
"committed": 3,
"on_hand": 145,
"unavailable": 0,
"warehouse": {
"id": 12,
"name": "Scranton DC",
"active": true,
"country_iso": "US"
}
}
],
"variant_countries": {},
"metafields": [
{
"namespace": "custom",
"key": "harvest_acre",
"value": "North Forty",
"value_type": "single_line_text_field"
}
]
}
],
"subscription_plans": [
{
"id": 7741,
"default": true,
"active": true,
"subscription_plan": {
"id": 4410,
"name": "Monthly Beet Club",
"billing_interval": 1,
"billing_interval_unit": "month",
"billing_frequency_in_words": "Every month",
"volume_interval": 1,
"volume_interval_unit": "month",
"allow_max_billing_cycles": false,
"max_billing_cycles": null,
"price_adjustment_type": "percentage",
"price_adjustment_amount": "10.0",
"savings_display_mode": "percent",
"active": true,
"subscription_price": "$26.99",
"savings_label": "Subscribe & save 10%"
}
}
],
"media": [
{
"id": 99021,
"slug": "how-to-press-beets",
"title": "How To Press Beets",
"kind": "video",
"media_type": "video",
"media_format": "mp4",
"image_url": "https://cdn.fluid.app/media/99021/poster.png",
"video_url": "https://cdn.fluid.app/media/99021/clip.mp4",
"canonical_url": "https://acme.fluid.app/home/media/how-to-press-beets",
"description": "A two-minute walkthrough of the cold-press process.",
"duration": 124,
"active": true
}
],
"bundle_groups": [
{
"id": 3301,
"title": "Pick Your Beets",
"description": "Choose any three jars for your bundle.",
"group_type": "selectable",
"min_selections": 1,
"max_selections": 3,
"selection_type": "multiple",
"allow_subscriptions": true,
"force_subscriptions": false,
"sort_order": 1,
"bundle_group_items": [
{
"id": 71002,
"bundled_variant_id": 880912,
"quantity": 1
}
]
}
],
"custom_slug": false
}
}{
"message": "Invalid credentials."
}{
"error": "Not authorized."
}{
"error": {
"message": "<string>",
"details": {}
},
"status": 123,
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"pagination": {
"cursor": "<string>",
"limit": 25,
"prev_cursor": "<string>",
"next_cursor": "<string>"
}
}
}Authorizations
Bearer token authentication. Accepts company-admin tokens with
storefront.view for read operations and storefront.update
for writes and scan triggers (legacy per-resource grants like
categories.update / products.view / etc. are still accepted
during the migration), required on every company operation.
Storefront public operations under /api/v202604/{resource} and
/api/v202604/{resource}/{slug} are unauthenticated
(security: []).
Path Parameters
The unique identifier of the product.
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"
ISO-2 country code that selects COUNTRY-RELATIVE Product pricing.
Product-only — Categories and other storefront resources use
filter[country] as an access-list visibility filter instead.
For Products, country drives the pricing block and each
variant's variant_countries: it picks which per-country variant
price and currency are rendered. On the catalog it also drops
products with no active variant in the requested country. When
omitted, falls back to the company's default country.
"GB"
Response
The Product.
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
Authenticated (company-surface) Product read shape: the public
ProductBase plus custom_slug, admin metadata never rendered on
the public surface.
Show child attributes
Show child attributes
curl --request GET \
--url https://api.fluid.app/api/v202604/company/products/{id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.fluid.app/api/v202604/company/products/{id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.fluid.app/api/v202604/company/products/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.fluid.app/api/v202604/company/products/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.fluid.app/api/v202604/company/products/{id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.fluid.app/api/v202604/company/products/{id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/v202604/company/products/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"status": 200,
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"pagination": {
"cursor": "<string>",
"limit": 25,
"prev_cursor": "<string>",
"next_cursor": "<string>"
}
},
"product": {
"id": 60311,
"slug": "scrute-farms-beet-blend",
"title": "Schrute Farms Beet Blend",
"description": "A cold-pressed beet concentrate from the finest acres on Schrute Farms.",
"image_url": "https://cdn.fluid.app/products/60311.png",
"canonical_url": "https://acme.fluid.app/home/products/scrute-farms-beet-blend",
"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"
],
"sku": "SCRUTE-BEET-001",
"is_bundle": false,
"in_stock": true,
"has_subscription_plans": true,
"pricing": {
"price": "29.99",
"currency_code": "USD",
"compare_at": "39.99",
"subscription_price": "26.99",
"display_price": "$29.99"
},
"default_variant": {
"id": 880912,
"sku": "SCRUTE-BEET-001-12OZ"
},
"variants": [
{
"id": 880912,
"sku": "SCRUTE-BEET-001-12OZ",
"is_master": true,
"title": "12 oz",
"display_name": "Schrute Farms Beet Blend — 12 oz",
"image_url": "https://cdn.fluid.app/variants/880912.png",
"position": 1,
"subscription_only": false,
"shipping_included_in_price": false,
"track_quantity": true,
"inventory_quantity": 142,
"bar_code": "0079827230015",
"keep_selling": false,
"limit_subscription": false,
"subscription_max_qty": null,
"limit_quantity_per_customer": false,
"customer_limit": null,
"option_attrs": [
"12 oz"
],
"option_ids": [
4471
],
"allow_subscription": true,
"images": [
{
"id": 5521,
"image_url": "https://cdn.fluid.app/variants/880912/front.png",
"image_path": "variants/880912/front.png",
"position": 1
}
],
"inventory_levels": [
{
"id": 33019,
"available": 142,
"committed": 3,
"on_hand": 145,
"unavailable": 0,
"warehouse": {
"id": 12,
"name": "Scranton DC",
"active": true,
"country_iso": "US"
}
}
],
"variant_countries": {},
"metafields": [
{
"namespace": "custom",
"key": "harvest_acre",
"value": "North Forty",
"value_type": "single_line_text_field"
}
]
}
],
"subscription_plans": [
{
"id": 7741,
"default": true,
"active": true,
"subscription_plan": {
"id": 4410,
"name": "Monthly Beet Club",
"billing_interval": 1,
"billing_interval_unit": "month",
"billing_frequency_in_words": "Every month",
"volume_interval": 1,
"volume_interval_unit": "month",
"allow_max_billing_cycles": false,
"max_billing_cycles": null,
"price_adjustment_type": "percentage",
"price_adjustment_amount": "10.0",
"savings_display_mode": "percent",
"active": true,
"subscription_price": "$26.99",
"savings_label": "Subscribe & save 10%"
}
}
],
"media": [
{
"id": 99021,
"slug": "how-to-press-beets",
"title": "How To Press Beets",
"kind": "video",
"media_type": "video",
"media_format": "mp4",
"image_url": "https://cdn.fluid.app/media/99021/poster.png",
"video_url": "https://cdn.fluid.app/media/99021/clip.mp4",
"canonical_url": "https://acme.fluid.app/home/media/how-to-press-beets",
"description": "A two-minute walkthrough of the cold-press process.",
"duration": 124,
"active": true
}
],
"bundle_groups": [
{
"id": 3301,
"title": "Pick Your Beets",
"description": "Choose any three jars for your bundle.",
"group_type": "selectable",
"min_selections": 1,
"max_selections": 3,
"selection_type": "multiple",
"allow_subscriptions": true,
"force_subscriptions": false,
"sort_order": 1,
"bundle_group_items": [
{
"id": 71002,
"bundled_variant_id": 880912,
"quantity": 1
}
]
}
],
"custom_slug": false
}
}{
"message": "Invalid credentials."
}{
"error": "Not authorized."
}{
"error": {
"message": "<string>",
"details": {}
},
"status": 123,
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"pagination": {
"cursor": "<string>",
"limit": 25,
"prev_cursor": "<string>",
"next_cursor": "<string>"
}
}
}