curl --request GET \
--url https://www.closient.com/products/api/v1/products/{gtin} \
--header 'X-API-Key: <api-key>'import requests
url = "https://www.closient.com/products/api/v1/products/{gtin}"
headers = {"X-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<api-key>'}};
fetch('https://www.closient.com/products/api/v1/products/{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/products/{gtin}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-Key: <api-key>"
],
]);
$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/products/{gtin}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
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/products/{gtin}")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.closient.com/products/api/v1/products/{gtin}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"brand": "Acme Snacks",
"confidence_score": 0.85,
"country_of_origin": "US",
"data_source": "crowd_sourced",
"date_label_compliance": {
"ca_ab660": "compliant",
"federal": "unknown",
"notes": []
},
"depth_uom": "",
"description": "Premium trail mix with almonds, cashews, and dried cranberries.",
"digital_link": "HTTPS://GTIN.ONE/01/00012345678905",
"field_confidence": {
"brand": 0.9,
"product_name": 0.95
},
"gpc_brick_code": "",
"gpc_class_code": "",
"gpc_family_code": "",
"gpc_segment_code": "",
"gross_weight_uom": "",
"gtin": "00012345678905",
"height_uom": "",
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"image_url": "https://cdn.closient.com/products/00012345678905/hero.jpg",
"is_claimed": false,
"length_uom": "",
"manufacturer": "Acme Foods Inc.",
"metadata": {
"order_id": "6735"
},
"net_content": "340g",
"net_content_uom": "GRM",
"net_content_value": 340,
"net_weight_uom": "",
"product_name": "Acme Trail Mix 12oz",
"sensitivities": [
{
"citations": [
{
"note": "Aged cheeses are very high histamine.",
"source": "SIGHI"
}
],
"name": "Histamine",
"reasoning": "Contains aged cheddar cheese, a major histamine source.",
"severity": "HIGH",
"slug": "histamine",
"source": "llm_inferred",
"verified": false
}
],
"width_uom": ""
}{
"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"
}{
"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"
}Look up a product
Retrieve canonical product data for a GTIN. Accepts GTIN-8, GTIN-12, GTIN-13, or GTIN-14 (with or without hyphens/spaces). The GTIN is normalized to GTIN-14 before lookup. A product whose ownership claim is unverified, disputed or rejected returns 404 unless the caller belongs to the organization that owns it.
curl --request GET \
--url https://www.closient.com/products/api/v1/products/{gtin} \
--header 'X-API-Key: <api-key>'import requests
url = "https://www.closient.com/products/api/v1/products/{gtin}"
headers = {"X-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<api-key>'}};
fetch('https://www.closient.com/products/api/v1/products/{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/products/{gtin}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-Key: <api-key>"
],
]);
$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/products/{gtin}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
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/products/{gtin}")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.closient.com/products/api/v1/products/{gtin}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"brand": "Acme Snacks",
"confidence_score": 0.85,
"country_of_origin": "US",
"data_source": "crowd_sourced",
"date_label_compliance": {
"ca_ab660": "compliant",
"federal": "unknown",
"notes": []
},
"depth_uom": "",
"description": "Premium trail mix with almonds, cashews, and dried cranberries.",
"digital_link": "HTTPS://GTIN.ONE/01/00012345678905",
"field_confidence": {
"brand": 0.9,
"product_name": 0.95
},
"gpc_brick_code": "",
"gpc_class_code": "",
"gpc_family_code": "",
"gpc_segment_code": "",
"gross_weight_uom": "",
"gtin": "00012345678905",
"height_uom": "",
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"image_url": "https://cdn.closient.com/products/00012345678905/hero.jpg",
"is_claimed": false,
"length_uom": "",
"manufacturer": "Acme Foods Inc.",
"metadata": {
"order_id": "6735"
},
"net_content": "340g",
"net_content_uom": "GRM",
"net_content_value": 340,
"net_weight_uom": "",
"product_name": "Acme Trail Mix 12oz",
"sensitivities": [
{
"citations": [
{
"note": "Aged cheeses are very high histamine.",
"source": "SIGHI"
}
],
"name": "Histamine",
"reasoning": "Contains aged cheddar cheese, a major histamine source.",
"severity": "HIGH",
"slug": "histamine",
"source": "llm_inferred",
"verified": false
}
],
"width_uom": ""
}{
"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"
}{
"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"
}Authorizations
Path Parameters
GTIN barcode (8, 12, 13, or 14 digits, with or without separators). Normalized to GTIN-14 for lookup.
Query Parameters
Include LOW-severity dietary-sensitivity flags in the sensitivities list. Defaults to false to keep the common-case payload tight; HIGH and MODERATE flags are always included.
Response
OK
Canonical product record returned by the GTIN repository.
Combines the core product fields, GDSN dimension/weight pairs, GS1
Global Product Classification (GPC) codes, and the Stripe-style
metadata map. Crowd-sourced contributions are folded into this
shape only after they pass the confidence-promotion threshold.
Internal product identifier (UUID). Stable for the lifetime of the GTIN.
22^[23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{22}$Normalized GTIN-14 (zero-padded). Stable across the catalog regardless of input format.
14^\d{14}$Display name of the product as marketed on the packaging.
The GS1 Digital Link URI to encode in this product's QR code; print it as-is rather than building one. Scanning it reaches the resolver, which sends the scan wherever the product's resolution rules and claim allow (its Closient-hosted page by default). The host is the owning organization's verified custom resolver hostname when it has one with an active certificate, otherwise the platform resolver domain. Scheme and host are uppercase because that keeps a QR in its denser alphanumeric mode; both are case-insensitive. Null only for a stored GTIN with no valid check digit, which has no Digital Link. POST /qr/ currently encodes the platform resolver domain for every product, so for an organization with a custom hostname its image differs from this link.
"HTTPS://GTIN.ONE/01/00012345678905"
True when the GTIN has been claimed by a brand owner (i.e. the linked Brand belongs to an Organization).
Provenance of the canonical record (e.g. crowd_sourced, open_food_facts, claimed once a brand owner takes ownership).
crowd_sourced, claimed, imported, ai_extracted, brand_site_crawl, gtin1_authoritative, external_api, open_food_facts, usda_fdc, fda_ndc, affiliate_feed, datakick, common_crawl_wdc Aggregate confidence score across all canonical fields, derived from contribution agreement.
0 <= x <= 1Per-field confidence map, e.g. {"product_name": 0.95, "brand": 0.9}. Each value is in the range 0.0 - 1.0.
Show child attributes
Show child attributes
California AB 660 readiness summary, computed on read by scanning the stored free-text fields (product_name, description, net_content, usage_instructions) for the same banned phrases the registration API rejects. The response shape is stable so a future federal date-label rule can be reported in the federal slot.
Show child attributes
Show child attributes
{
"ca_ab660": "compliant",
"federal": "unknown",
"notes": []
}
{
"ca_ab660": "non_compliant",
"federal": "unknown",
"notes": ["description: 'sell by'"]
}
Developer-attached key/value data attached to this object. Up to 50 keys; key max 40 chars, value max 500 chars.
Show child attributes
Show child attributes
Brand name resolved from the linked Brand record. Empty string when the GTIN is not yet associated with a brand.
Manufacturer name resolved from the linked Manufacturer record. Empty string when no manufacturer is on file.
Long-form description of the product. May be empty. This field holds HTML, and the API sanitizes it on the way out against an allow-list (paragraphs, line breaks, inline emphasis, lists, and links restricted to http, https and mailto). Plain text is returned byte-for-byte; text containing a < that does not open a tag is returned entity-encoded, which is its correct encoding for an HTML field; script, style, event handlers and javascript:/data: URLs are removed. Stored data is never modified.
Absolute URL of the primary product image. Empty string when the product has no hero image.
ISO 3166-1 alpha-2 country code identifying where the product was made. Empty string when unknown.
2Free-text net content as printed on the package (e.g. 340g, 12 x 330ml). Use net_content_value + net_content_uom for the structured pair.
Structured numeric net content (e.g. 340 for 340g). Null when no structured value has been parsed.
UN/CEFACT unit code paired with net_content_value. Null when no structured value has been parsed; expect the empty string on legacy records pending a backfill.
MLT, CLT, LTR, GRM, KGM, ONZ, LBR, PTI, QTI, GLL, EA 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}$Verification tier for the GTIN ownership claim. Null when the GTIN has never been claimed; set automatically to unverified on initial claim and upgraded by external verification signals.
unverified, prefix_matched, verified, disputed, rejected Product length in the unit specified by length_uom. Null when the dimension is unknown.
UN/CEFACT recommendation 20/21 unit code for the paired dimension (e.g. CMT centimetre, MMT millimetre, MTR metre). Empty string when the dimension is unknown.
10Product width in the unit specified by width_uom. Null when the dimension is unknown.
UN/CEFACT recommendation 20/21 unit code for the paired dimension (e.g. CMT centimetre, MMT millimetre, MTR metre). Empty string when the dimension is unknown.
10Product height in the unit specified by height_uom. Null when the dimension is unknown.
UN/CEFACT recommendation 20/21 unit code for the paired dimension (e.g. CMT centimetre, MMT millimetre, MTR metre). Empty string when the dimension is unknown.
10Product depth in the unit specified by depth_uom. Null when the dimension is unknown.
UN/CEFACT recommendation 20/21 unit code for the paired dimension (e.g. CMT centimetre, MMT millimetre, MTR metre). Empty string when the dimension is unknown.
10Gross weight (product + packaging) in the unit specified by gross_weight_uom. Null when unknown.
UN/CEFACT recommendation 20/21 unit code for the paired weight (e.g. GRM gram, KGM kilogram, LBR pound, ONZ ounce). Empty string when the weight is unknown.
10Net weight (product only, excluding packaging) in the unit specified by net_weight_uom. Null when unknown.
UN/CEFACT recommendation 20/21 unit code for the paired weight (e.g. GRM gram, KGM kilogram, LBR pound, ONZ ounce). Empty string when the weight is unknown.
10GS1 Global Product Classification 8-digit brick code (the most specific level). Empty string when the product has not been classified.
8^(\d{8})?$GS1 Global Product Classification class code (parent of brick). Empty string when unclassified.
8^(\d{8})?$GS1 Global Product Classification family code (parent of class). Empty string when unclassified.
8^(\d{8})?$GS1 Global Product Classification segment code (top-level category). Empty string when unclassified.
8^(\d{8})?$AI-inferred dietary-sensitivity flags for this product (histamine, sulfites, FODMAP, etc.), derived from its ingredient list. Only SENSITIVITY-category traits appear here — regulated allergens are not duplicated. LOW-severity flags are excluded unless include_low=true. Informational only, not medical advice.
Show child attributes
Show child attributes