curl --request PUT \
--url https://www.closient.com/dashboard/api/v1/trade-items/{organization_id}/{gtin}/register-product \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"description": "Register within 30 days to activate your extended warranty.",
"label": "Register your product",
"url": "https://example.com/register?gtin={gtin}&lot={lot}"
}
'import requests
url = "https://www.closient.com/dashboard/api/v1/trade-items/{organization_id}/{gtin}/register-product"
payload = {
"description": "Register within 30 days to activate your extended warranty.",
"label": "Register your product",
"url": "https://example.com/register?gtin={gtin}&lot={lot}"
}
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({
description: 'Register within 30 days to activate your extended warranty.',
label: 'Register your product',
url: 'https://example.com/register?gtin={gtin}&lot={lot}'
})
};
fetch('https://www.closient.com/dashboard/api/v1/trade-items/{organization_id}/{gtin}/register-product', 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/dashboard/api/v1/trade-items/{organization_id}/{gtin}/register-product",
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([
'description' => 'Register within 30 days to activate your extended warranty.',
'label' => 'Register your product',
'url' => 'https://example.com/register?gtin={gtin}&lot={lot}'
]),
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/dashboard/api/v1/trade-items/{organization_id}/{gtin}/register-product"
payload := strings.NewReader("{\n \"description\": \"Register within 30 days to activate your extended warranty.\",\n \"label\": \"Register your product\",\n \"url\": \"https://example.com/register?gtin={gtin}&lot={lot}\"\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/dashboard/api/v1/trade-items/{organization_id}/{gtin}/register-product")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"description\": \"Register within 30 days to activate your extended warranty.\",\n \"label\": \"Register your product\",\n \"url\": \"https://example.com/register?gtin={gtin}&lot={lot}\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.closient.com/dashboard/api/v1/trade-items/{organization_id}/{gtin}/register-product")
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 \"description\": \"Register within 30 days to activate your extended warranty.\",\n \"label\": \"Register your product\",\n \"url\": \"https://example.com/register?gtin={gtin}&lot={lot}\"\n}"
response = http.request(request)
puts response.read_body{
"created": "2026-09-01T09:00:00Z",
"description": "Register within 30 days to activate your extended warranty.",
"id": "keATfB8VP2gSjcnTbsMNQL",
"label": "Register your product",
"modified": "2026-09-01T09:00:00Z",
"url": "https://example.com/register?gtin={gtin}&lot={lot}"
}{
"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"
}Create or replace product registration link
Create the product’s registration link, or replace it in place when one already exists (a product has at most one). The whole link is replaced: an omitted label or description becomes blank. The URL must be https and may carry the substitution tokens the hosted page fills from the scan. Requires the organization.contribute_organization permission on the membership.
curl --request PUT \
--url https://www.closient.com/dashboard/api/v1/trade-items/{organization_id}/{gtin}/register-product \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"description": "Register within 30 days to activate your extended warranty.",
"label": "Register your product",
"url": "https://example.com/register?gtin={gtin}&lot={lot}"
}
'import requests
url = "https://www.closient.com/dashboard/api/v1/trade-items/{organization_id}/{gtin}/register-product"
payload = {
"description": "Register within 30 days to activate your extended warranty.",
"label": "Register your product",
"url": "https://example.com/register?gtin={gtin}&lot={lot}"
}
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({
description: 'Register within 30 days to activate your extended warranty.',
label: 'Register your product',
url: 'https://example.com/register?gtin={gtin}&lot={lot}'
})
};
fetch('https://www.closient.com/dashboard/api/v1/trade-items/{organization_id}/{gtin}/register-product', 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/dashboard/api/v1/trade-items/{organization_id}/{gtin}/register-product",
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([
'description' => 'Register within 30 days to activate your extended warranty.',
'label' => 'Register your product',
'url' => 'https://example.com/register?gtin={gtin}&lot={lot}'
]),
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/dashboard/api/v1/trade-items/{organization_id}/{gtin}/register-product"
payload := strings.NewReader("{\n \"description\": \"Register within 30 days to activate your extended warranty.\",\n \"label\": \"Register your product\",\n \"url\": \"https://example.com/register?gtin={gtin}&lot={lot}\"\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/dashboard/api/v1/trade-items/{organization_id}/{gtin}/register-product")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"description\": \"Register within 30 days to activate your extended warranty.\",\n \"label\": \"Register your product\",\n \"url\": \"https://example.com/register?gtin={gtin}&lot={lot}\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.closient.com/dashboard/api/v1/trade-items/{organization_id}/{gtin}/register-product")
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 \"description\": \"Register within 30 days to activate your extended warranty.\",\n \"label\": \"Register your product\",\n \"url\": \"https://example.com/register?gtin={gtin}&lot={lot}\"\n}"
response = http.request(request)
puts response.read_body{
"created": "2026-09-01T09:00:00Z",
"description": "Register within 30 days to activate your extended warranty.",
"id": "keATfB8VP2gSjcnTbsMNQL",
"label": "Register your product",
"modified": "2026-09-01T09:00:00Z",
"url": "https://example.com/register?gtin={gtin}&lot={lot}"
}{
"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
UUID of the organization that owns the product.
22^[23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{22}$GTIN-8/12/13/14 of the target product. Normalized to GTIN-14 by zero-padding before lookup.
^[0-9]{8,14}$Body
Request body for setting a product's registration link (replaces the whole link).
Registration page URL. Must be https. May include the substitution tokens {gtin}, {lot}, {serial}, {expiry} and the other recognised scan-context tokens, which the hosted page fills from the scan so the brand's form prefills; any other {...} is rejected.
2048^[Hh][Tt][Tt][Pp][Ss]://(?:[^\x00-\x20\x7f/?#{}]|\{(?:batch|bestBefore|cpv|expiry|expiryDateTime|gtin|lot|packagingDate|prodDate|sellBy|serial|tpx)\})(?:[^\x00-\x20\x7f{}]|\{(?:batch|bestBefore|cpv|expiry|expiryDateTime|gtin|lot|packagingDate|prodDate|sellBy|serial|tpx)\})*$Call-to-action button label. Blank shows 'Register your product'.
120^[^\x00]{0,120}$Optional text shown alongside the registration call to action.
^[^\x00]{0,}$Response
OK
A product's registration link.
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}$Registration page URL as entered, substitution tokens intact.
Call-to-action button label; blank shows 'Register your product'.
Text shown alongside the registration call to action.
ISO-8601 UTC timestamp of when the link was added.
ISO-8601 UTC timestamp of the last change.