curl --request PUT \
--url https://www.closient.com/resolver/api/v1/organizations/{organization_id}/products/{gtin}/resolver-enabled \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"enabled": true
}
'import requests
url = "https://www.closient.com/resolver/api/v1/organizations/{organization_id}/products/{gtin}/resolver-enabled"
payload = { "enabled": True }
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({enabled: true})
};
fetch('https://www.closient.com/resolver/api/v1/organizations/{organization_id}/products/{gtin}/resolver-enabled', 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/resolver/api/v1/organizations/{organization_id}/products/{gtin}/resolver-enabled",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'enabled' => true
]),
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/resolver/api/v1/organizations/{organization_id}/products/{gtin}/resolver-enabled"
payload := strings.NewReader("{\n \"enabled\": true\n}")
req, _ := http.NewRequest("PUT", 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.put("https://www.closient.com/resolver/api/v1/organizations/{organization_id}/products/{gtin}/resolver-enabled")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"enabled\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.closient.com/resolver/api/v1/organizations/{organization_id}/products/{gtin}/resolver-enabled")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"enabled\": true\n}"
response = http.request(request)
puts response.read_body{
"age_restricted": false,
"enhanced_resolution_enabled": true,
"expiry_behavior": "REDIRECT",
"expiry_redirect_url": "https://acmesnacks.com/reorder",
"gtin": "00012345678905",
"product_name": "Acme Trail Mix 12oz",
"resolver_enabled": true,
"resolver_enabled_at": "2026-06-01T09:00:00Z",
"serial_policy": "PERMISSIVE",
"shelf_life_offset_ai": "15",
"shelf_life_offset_days": 180
}{
"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"
}Set product resolver status
Turn the resolver on or off for one product. Idempotent: sending the state the product already has changes nothing. The flag enrolls the product in resolver billing; while it is off its lots and serials are not billable either and enhanced resolution cannot be on, but scans still resolve. Requires an OWNER, MANAGER or EDITOR (or an EDITOR+ API key); free on every plan.
curl --request PUT \
--url https://www.closient.com/resolver/api/v1/organizations/{organization_id}/products/{gtin}/resolver-enabled \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"enabled": true
}
'import requests
url = "https://www.closient.com/resolver/api/v1/organizations/{organization_id}/products/{gtin}/resolver-enabled"
payload = { "enabled": True }
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({enabled: true})
};
fetch('https://www.closient.com/resolver/api/v1/organizations/{organization_id}/products/{gtin}/resolver-enabled', 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/resolver/api/v1/organizations/{organization_id}/products/{gtin}/resolver-enabled",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'enabled' => true
]),
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/resolver/api/v1/organizations/{organization_id}/products/{gtin}/resolver-enabled"
payload := strings.NewReader("{\n \"enabled\": true\n}")
req, _ := http.NewRequest("PUT", 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.put("https://www.closient.com/resolver/api/v1/organizations/{organization_id}/products/{gtin}/resolver-enabled")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"enabled\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.closient.com/resolver/api/v1/organizations/{organization_id}/products/{gtin}/resolver-enabled")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"enabled\": true\n}"
response = http.request(request)
puts response.read_body{
"age_restricted": false,
"enhanced_resolution_enabled": true,
"expiry_behavior": "REDIRECT",
"expiry_redirect_url": "https://acmesnacks.com/reorder",
"gtin": "00012345678905",
"product_name": "Acme Trail Mix 12oz",
"resolver_enabled": true,
"resolver_enabled_at": "2026-06-01T09:00:00Z",
"serial_policy": "PERMISSIVE",
"shelf_life_offset_ai": "15",
"shelf_life_offset_days": 180
}{
"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
ID of the organization. Caller must be an editor.
22^[23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{22}$GTIN-8, GTIN-12, GTIN-13, or GTIN-14 digits (no separators) with a valid GS1 check digit. Normalized to GTIN-14 for lookup; the product must belong to one of the organization's brands.
8 - 14Body
Set whether a product is enrolled in the resolver.
The state to set, not a toggle: repeating a request changes nothing. The flag enrolls the product in resolver billing: while it is off, the product's lots and serials are not billable either (their own flags are kept) and enhanced resolution cannot be on. Scans of the product still resolve either way.
Response
OK
A product's resolver state and its per-GTIN resolver behavior.
Normalized GTIN-14 (zero-padded).
Product name, for display.
Whether the product is enrolled in the resolver (its billable unit). While false, its lots and serials are not billable either, whatever their own flags say, and enhanced resolution cannot be on. Scans of the product resolve either way.
Whether the product is on the paid enhanced tier, which unlocks expiry behavior and the strict serial policy. Requires the resolver to be on.
What a scan carrying a past use-by (AI 17) or best-before (AI 15) date gets: NONE forwards it unchanged, NOTICE shows a past-date notice, REDIRECT sends it to expiry_redirect_url. Only acted on while enhanced resolution is on.
NONE, NOTICE, REDIRECT Destination for an expired scan when expiry_behavior is REDIRECT; empty otherwise.
PERMISSIVE falls back to the deepest available page for an unknown serial; STRICT shows an unverified-unit page. Only acted on while enhanced resolution is on.
PERMISSIVE, STRICT Whether scans of this product pass an 18+ age gate first.
When the resolver was last turned on for this product; null if never.
Days from manufacture to the printed date; null when not configured.
Which printed date the offset produces: 15 best-before or 17 use-by; null when not set.
15, 17