curl --request GET \
--url https://www.closient.com/products/api/v1/public/pip/{gtin}import requests
url = "https://www.closient.com/products/api/v1/public/pip/{gtin}"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://www.closient.com/products/api/v1/public/pip/{gtin}', 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/products/api/v1/public/pip/{gtin}",
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/products/api/v1/public/pip/{gtin}"
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/products/api/v1/public/pip/{gtin}")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.closient.com/products/api/v1/public/pip/{gtin}")
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{
"allergen_warnings": "May contain tree nuts.",
"allergens": [
{
"detail": "Legume allergen",
"label": "Peanuts"
}
],
"brand_name": "Example Foods",
"certifications": [
{
"detail": "Oregon Tilth",
"label": "USDA Organic"
}
],
"disclaimers": [],
"disclosure": "full",
"gtin": "00614141000036",
"image_url": "https://media.example.com/media/products/peanut-butter.jpg",
"ingredients": "Roasted peanuts, salt.",
"name": "Creamy Peanut Butter 12oz",
"pip_url": "/pip/00614141000036/",
"recall": {
"count": 0,
"headline": "",
"is_active": false,
"severity_label": ""
},
"requires_age_verification": false
}{
"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"
}Product compliance panel for the embeddable PIP widget
Public, unauthenticated read powering /widget/v1/pip-panel.js. Returns recall status, allergens, certifications and the printed ingredient label for one GTIN, reduced to the disclosure level the hosted page would serve an anonymous visitor.
curl --request GET \
--url https://www.closient.com/products/api/v1/public/pip/{gtin}import requests
url = "https://www.closient.com/products/api/v1/public/pip/{gtin}"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://www.closient.com/products/api/v1/public/pip/{gtin}', 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/products/api/v1/public/pip/{gtin}",
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/products/api/v1/public/pip/{gtin}"
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/products/api/v1/public/pip/{gtin}")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.closient.com/products/api/v1/public/pip/{gtin}")
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{
"allergen_warnings": "May contain tree nuts.",
"allergens": [
{
"detail": "Legume allergen",
"label": "Peanuts"
}
],
"brand_name": "Example Foods",
"certifications": [
{
"detail": "Oregon Tilth",
"label": "USDA Organic"
}
],
"disclaimers": [],
"disclosure": "full",
"gtin": "00614141000036",
"image_url": "https://media.example.com/media/products/peanut-butter.jpg",
"ingredients": "Roasted peanuts, salt.",
"name": "Creamy Peanut Butter 12oz",
"pip_url": "/pip/00614141000036/",
"recall": {
"count": 0,
"headline": "",
"is_active": false,
"severity_label": ""
},
"requires_age_verification": false
}{
"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
Product barcode. GTIN-8, 12, 13 or 14, with or without separators — normalized to GTIN-14 server-side, so a retailer can pass whatever their PIM holds.
Response
OK
Everything the embeddable panel renders for one GTIN.
Which fields are populated depends on disclosure — read that first.
An empty certifications on a full response means the product has
none; on an unverified response it means Closient will not assert
them. The two are different facts and the field alone cannot tell them
apart, which is why disclosure is part of the contract rather than an
implementation detail.
GTIN-14, zero-padded.
How much of the record this response carries. full is the complete panel. suspended is the safety floor for a product whose owning organization is in its deletion grace window. unverified is the identity floor for a GTIN whose claim is not authoritative — recall status only, no name. age_restricted withholds detail that cannot be age-gated on a third-party page.
full, suspended, unverified, age_restricted Active-recall summary. Present at every disclosure level — a recall is regulator-issued rather than brand-supplied, so it is never withheld.
Show child attributes
Show child attributes
{
"count": 0,
"headline": "",
"is_active": false,
"severity_label": ""
}
{
"count": 1,
"headline": "Undeclared milk in 12oz jars",
"is_active": true,
"severity_label": "Serious Health Risk"
}
Canonical hosted product page for this GTIN.
Product name. Always empty on an unverified response.
Brand name. Empty unless disclosure is full.
Product image URL. Empty when there is no usable image.
Declared allergen traits.
Show child attributes
Show child attributes
Assigned certifications.
Show child attributes
Show child attributes
The printed ingredient label, verbatim.
'May contain' / cross-contamination warnings.
True when the full record is only available behind the hosted page's 18+ gate.
Legal disclaimer paragraphs required for this product's regulatory regime (e.g. DSCSA pharma). Empty for an unregulated product. When non-empty these must be displayed alongside the panel — they state what Closient is and is not for this product, and the hosted product page renders them for the same reason.