curl --request POST \
--url https://www.closient.com/products/api/v1/products/{gtin}/verification/evidence \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"evidence_type": "gepir_lookup",
"notes": "Verified by GS1 record: company Acme Foods Inc., prefix 0012345, licensed via GS1 US."
}
'import requests
url = "https://www.closient.com/products/api/v1/products/{gtin}/verification/evidence"
payload = {
"evidence_type": "gepir_lookup",
"notes": "Verified by GS1 record: company Acme Foods Inc., prefix 0012345, licensed via GS1 US."
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
evidence_type: 'gepir_lookup',
notes: 'Verified by GS1 record: company Acme Foods Inc., prefix 0012345, licensed via GS1 US.'
})
};
fetch('https://www.closient.com/products/api/v1/products/{gtin}/verification/evidence', 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}/verification/evidence",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'evidence_type' => 'gepir_lookup',
'notes' => 'Verified by GS1 record: company Acme Foods Inc., prefix 0012345, licensed via GS1 US.'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"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"
"strings"
"net/http"
"io"
)
func main() {
url := "https://www.closient.com/products/api/v1/products/{gtin}/verification/evidence"
payload := strings.NewReader("{\n \"evidence_type\": \"gepir_lookup\",\n \"notes\": \"Verified by GS1 record: company Acme Foods Inc., prefix 0012345, licensed via GS1 US.\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://www.closient.com/products/api/v1/products/{gtin}/verification/evidence")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"evidence_type\": \"gepir_lookup\",\n \"notes\": \"Verified by GS1 record: company Acme Foods Inc., prefix 0012345, licensed via GS1 US.\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.closient.com/products/api/v1/products/{gtin}/verification/evidence")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"evidence_type\": \"gepir_lookup\",\n \"notes\": \"Verified by GS1 record: company Acme Foods Inc., prefix 0012345, licensed via GS1 US.\"\n}"
response = http.request(request)
puts response.read_body{
"badge": "pending",
"created": "2026-09-29T14:03:11Z",
"evidence_type": "gs1_certificate",
"has_file": true,
"id": "2N4kq7ZxYQ8vR3sT1bWnCp",
"notes": "GS1 US company prefix certificate, issued 2024.",
"review_status": "pending",
"strength": "strong"
}{
"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"
}{
"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"
}Submit claim evidence for review
File a GS1 certificate, a Verified by GS1 registry record, an invoice or other proof of ownership. It is stored as pending and counts toward Verified only after staff approve it; this endpoint never changes the claim’s status. Attach a file as base64 or describe the evidence in notes; at least one is required. Requires the organization.contribute_organization permission on the membership owning the GTIN. Rate-limited per user and per organization; over the limit returns 429.
curl --request POST \
--url https://www.closient.com/products/api/v1/products/{gtin}/verification/evidence \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"evidence_type": "gepir_lookup",
"notes": "Verified by GS1 record: company Acme Foods Inc., prefix 0012345, licensed via GS1 US."
}
'import requests
url = "https://www.closient.com/products/api/v1/products/{gtin}/verification/evidence"
payload = {
"evidence_type": "gepir_lookup",
"notes": "Verified by GS1 record: company Acme Foods Inc., prefix 0012345, licensed via GS1 US."
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
evidence_type: 'gepir_lookup',
notes: 'Verified by GS1 record: company Acme Foods Inc., prefix 0012345, licensed via GS1 US.'
})
};
fetch('https://www.closient.com/products/api/v1/products/{gtin}/verification/evidence', 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}/verification/evidence",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'evidence_type' => 'gepir_lookup',
'notes' => 'Verified by GS1 record: company Acme Foods Inc., prefix 0012345, licensed via GS1 US.'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"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"
"strings"
"net/http"
"io"
)
func main() {
url := "https://www.closient.com/products/api/v1/products/{gtin}/verification/evidence"
payload := strings.NewReader("{\n \"evidence_type\": \"gepir_lookup\",\n \"notes\": \"Verified by GS1 record: company Acme Foods Inc., prefix 0012345, licensed via GS1 US.\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://www.closient.com/products/api/v1/products/{gtin}/verification/evidence")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"evidence_type\": \"gepir_lookup\",\n \"notes\": \"Verified by GS1 record: company Acme Foods Inc., prefix 0012345, licensed via GS1 US.\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.closient.com/products/api/v1/products/{gtin}/verification/evidence")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"evidence_type\": \"gepir_lookup\",\n \"notes\": \"Verified by GS1 record: company Acme Foods Inc., prefix 0012345, licensed via GS1 US.\"\n}"
response = http.request(request)
puts response.read_body{
"badge": "pending",
"created": "2026-09-29T14:03:11Z",
"evidence_type": "gs1_certificate",
"has_file": true,
"id": "2N4kq7ZxYQ8vR3sT1bWnCp",
"notes": "GS1 US company prefix certificate, issued 2024.",
"review_status": "pending",
"strength": "strong"
}{
"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"
}{
"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.
^[0-9]{8,14}$Body
Evidence to file for staff review.
Kind of proof. Domain proofs are not accepted here: run the DNS or HTTP check and it records one.
gs1_certificate, gepir_lookup, invoice, other What the evidence shows. Required when no file is attached, as for a gepir_lookup whose registry record is described in text.
2000Base64-encoded file, optionally with a data: URI prefix. Must be a PDF, PNG, JPEG or WebP, judged by its bytes rather than its name. At most 1.5 MiB (1,572,864 bytes) decoded; a larger file is refused with 413.
Original filename. It is not used to store the file, which is kept under a random name with the extension its content implies.
255Response
Created
One piece of evidence the organization has filed for this claim.
Evidence identifier.
22^[23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{22}$What kind of proof this is.
gs1_certificate, gepir_lookup, domain_match, dns_txt_proof, invoice, other, staff_attestation How much it counts toward Verified, set from the evidence type.
strong, medium, weak Staff review state. Only approved, unexpired evidence counts toward Verified.
pending, approved, rejected Display state combining review status and expiry: approved, rejected, expired or pending. An approved row past its expires_at reads expired and no longer counts.
Free-text description submitted with the evidence.
Whether a file is attached. The file itself is visible only to reviewers.
When approved evidence stops counting toward Verified; null means it does not expire.
When the evidence was submitted.