curl --request GET \
--url https://www.closient.com/brands/api/v1/public/brands/{brand_id}/catalogimport requests
url = "https://www.closient.com/brands/api/v1/public/brands/{brand_id}/catalog"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://www.closient.com/brands/api/v1/public/brands/{brand_id}/catalog', 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://www.closient.com/brands/api/v1/public/brands/{brand_id}/catalog",
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://www.closient.com/brands/api/v1/public/brands/{brand_id}/catalog"
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://www.closient.com/brands/api/v1/public/brands/{brand_id}/catalog")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.closient.com/brands/api/v1/public/brands/{brand_id}/catalog")
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{
"brand": {
"id": "2sP1Y9pZ4xQ6rNvHwT3kBe",
"logo_url": "https://cdn.closient.com/brands/acme/logo.png",
"name": "Acme Beverages",
"website": "https://acme.example.com"
},
"has_distribution": true,
"products": [
{
"id": "2sP1Y9pZ4xQ6rNvHwT3kBe",
"name": "Acme Cola 12oz Can"
}
]
}{
"detail": "The requested resource was not found.",
"error_code": "not_found",
"retryable": false,
"status": 404,
"timestamp": "2026-03-31T12:00:00+00:00",
"title": "Not Found",
"type": "https://closient.com/docs/errors/not_found"
}{
"detail": "The requested resource was not found.",
"error_code": "not_found",
"retryable": false,
"status": 404,
"timestamp": "2026-03-31T12:00:00+00:00",
"title": "Not Found",
"type": "https://closient.com/docs/errors/not_found"
}{
"detail": "The requested resource was not found.",
"error_code": "not_found",
"retryable": false,
"status": 404,
"timestamp": "2026-03-31T12:00:00+00:00",
"title": "Not Found",
"type": "https://closient.com/docs/errors/not_found"
}{
"detail": "The requested resource was not found.",
"error_code": "not_found",
"retryable": false,
"status": 404,
"timestamp": "2026-03-31T12:00:00+00:00",
"title": "Not Found",
"type": "https://closient.com/docs/errors/not_found"
}{
"detail": "The requested resource was not found.",
"error_code": "not_found",
"retryable": false,
"status": 404,
"timestamp": "2026-03-31T12:00:00+00:00",
"title": "Not Found",
"type": "https://closient.com/docs/errors/not_found"
}List a brand's products (locator catalog)
Returns the brand’s products for populating the embeddable widget’s product-filter dropdown, plus has_distribution — whether the brand is carried in any store at all. Public, unauthenticated. The widget calls this first, before asking the visitor for a location, so that a brand with no distribution renders nothing instead of prompting for geolocation it has no use for. Capped at the first 250 products by display name — brands with longer catalogs need the search variant (follow-up).
curl --request GET \
--url https://www.closient.com/brands/api/v1/public/brands/{brand_id}/catalogimport requests
url = "https://www.closient.com/brands/api/v1/public/brands/{brand_id}/catalog"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://www.closient.com/brands/api/v1/public/brands/{brand_id}/catalog', 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://www.closient.com/brands/api/v1/public/brands/{brand_id}/catalog",
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://www.closient.com/brands/api/v1/public/brands/{brand_id}/catalog"
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://www.closient.com/brands/api/v1/public/brands/{brand_id}/catalog")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.closient.com/brands/api/v1/public/brands/{brand_id}/catalog")
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{
"brand": {
"id": "2sP1Y9pZ4xQ6rNvHwT3kBe",
"logo_url": "https://cdn.closient.com/brands/acme/logo.png",
"name": "Acme Beverages",
"website": "https://acme.example.com"
},
"has_distribution": true,
"products": [
{
"id": "2sP1Y9pZ4xQ6rNvHwT3kBe",
"name": "Acme Cola 12oz Can"
}
]
}{
"detail": "The requested resource was not found.",
"error_code": "not_found",
"retryable": false,
"status": 404,
"timestamp": "2026-03-31T12:00:00+00:00",
"title": "Not Found",
"type": "https://closient.com/docs/errors/not_found"
}{
"detail": "The requested resource was not found.",
"error_code": "not_found",
"retryable": false,
"status": 404,
"timestamp": "2026-03-31T12:00:00+00:00",
"title": "Not Found",
"type": "https://closient.com/docs/errors/not_found"
}{
"detail": "The requested resource was not found.",
"error_code": "not_found",
"retryable": false,
"status": 404,
"timestamp": "2026-03-31T12:00:00+00:00",
"title": "Not Found",
"type": "https://closient.com/docs/errors/not_found"
}{
"detail": "The requested resource was not found.",
"error_code": "not_found",
"retryable": false,
"status": 404,
"timestamp": "2026-03-31T12:00:00+00:00",
"title": "Not Found",
"type": "https://closient.com/docs/errors/not_found"
}{
"detail": "The requested resource was not found.",
"error_code": "not_found",
"retryable": false,
"status": 404,
"timestamp": "2026-03-31T12:00:00+00:00",
"title": "Not Found",
"type": "https://closient.com/docs/errors/not_found"
}Path Parameters
Brand short id (22-char shortuuid).
22^[23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{22}$Query Parameters
Optional storefront barcode to resolve to one of the brand's products (resolved_product_id).
64^[^\x00]{0,64}$Response
OK
Top-level payload for the brand catalog endpoint.
Identity of the brand whose catalog is being returned.
Show child attributes
Show child attributes
{
"id": "2sP1Y9pZ4xQ6rNvHwT3kBe",
"logo_url": "https://cdn.closient.com/brands/acme/logo.png",
"name": "Acme Beverages",
"website": "https://acme.example.com"
}
Products owned by the brand, ordered by display name. Empty list when the brand has no products.
Show child attributes
Show child attributes
Whether the brand has at least one product carried by an active in-store offer anywhere, at any distance. false means there is nothing a locator could ever show, so an embedding page should render nothing at all rather than a locator that can only report 'no stores found' (C-1393). This is a different question from an empty stores list on /locator, which only says 'none within this radius' and is a legitimate result the visitor can act on by widening the search.
URL-safe 22-character shortuuid encoding of the row's UUID primary key. Stable across the row's lifetime; suitable for sharing in URLs, log lines, and external SDK clients. Accepted on input as either the shortuuid form or the canonical UUID form (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).
22^[23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{22}$