curl --request POST \
--url https://www.closient.com/products/api/v1/merchant-links \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"gtin": "00850012345671",
"name": "Acme Store",
"url": "https://shop.example.com/products/smart-kettle"
}
'import requests
url = "https://www.closient.com/products/api/v1/merchant-links"
payload = {
"gtin": "00850012345671",
"name": "Acme Store",
"url": "https://shop.example.com/products/smart-kettle"
}
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({
gtin: '00850012345671',
name: 'Acme Store',
url: 'https://shop.example.com/products/smart-kettle'
})
};
fetch('https://www.closient.com/products/api/v1/merchant-links', 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/merchant-links",
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([
'gtin' => '00850012345671',
'name' => 'Acme Store',
'url' => 'https://shop.example.com/products/smart-kettle'
]),
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/merchant-links"
payload := strings.NewReader("{\n \"gtin\": \"00850012345671\",\n \"name\": \"Acme Store\",\n \"url\": \"https://shop.example.com/products/smart-kettle\"\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/merchant-links")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"gtin\": \"00850012345671\",\n \"name\": \"Acme Store\",\n \"url\": \"https://shop.example.com/products/smart-kettle\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.closient.com/products/api/v1/merchant-links")
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 \"gtin\": \"00850012345671\",\n \"name\": \"Acme Store\",\n \"url\": \"https://shop.example.com/products/smart-kettle\"\n}"
response = http.request(request)
puts response.read_body{
"created": "2026-09-30T09:00:00Z",
"gtin": "00850012345671",
"id": "F5n5NdW6dTbvPYkgnLNjte",
"merchant_name": "",
"modified": "2026-09-30T09:00:00Z",
"name": "Acme Store",
"product_id": "SBjSX6xUJPPHQKUXBpYX2C",
"url": "https://shop.example.com/products/smart-kettle"
}{
"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 merchant link
Create a merchant link on a product. Requires CONTRIBUTE on the organization that owns the product; 404 if the GTIN isn’t a product the caller can see.
curl --request POST \
--url https://www.closient.com/products/api/v1/merchant-links \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"gtin": "00850012345671",
"name": "Acme Store",
"url": "https://shop.example.com/products/smart-kettle"
}
'import requests
url = "https://www.closient.com/products/api/v1/merchant-links"
payload = {
"gtin": "00850012345671",
"name": "Acme Store",
"url": "https://shop.example.com/products/smart-kettle"
}
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({
gtin: '00850012345671',
name: 'Acme Store',
url: 'https://shop.example.com/products/smart-kettle'
})
};
fetch('https://www.closient.com/products/api/v1/merchant-links', 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/merchant-links",
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([
'gtin' => '00850012345671',
'name' => 'Acme Store',
'url' => 'https://shop.example.com/products/smart-kettle'
]),
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/merchant-links"
payload := strings.NewReader("{\n \"gtin\": \"00850012345671\",\n \"name\": \"Acme Store\",\n \"url\": \"https://shop.example.com/products/smart-kettle\"\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/merchant-links")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"gtin\": \"00850012345671\",\n \"name\": \"Acme Store\",\n \"url\": \"https://shop.example.com/products/smart-kettle\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.closient.com/products/api/v1/merchant-links")
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 \"gtin\": \"00850012345671\",\n \"name\": \"Acme Store\",\n \"url\": \"https://shop.example.com/products/smart-kettle\"\n}"
response = http.request(request)
puts response.read_body{
"created": "2026-09-30T09:00:00Z",
"gtin": "00850012345671",
"id": "F5n5NdW6dTbvPYkgnLNjte",
"merchant_name": "",
"modified": "2026-09-30T09:00:00Z",
"name": "Acme Store",
"product_id": "SBjSX6xUJPPHQKUXBpYX2C",
"url": "https://shop.example.com/products/smart-kettle"
}{
"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
Body
Payload for POST /merchant-links.
GTIN of the product to show the link on (8, 12, 13 or 14 digits). Must be a product the caller's organization owns, else 404.
8 - 14Merchant name.
1 - 100^[^\x00]{1,100}$Direct URL to the product page. Must start with https://.
9 - 200^[Hh][Tt][Tt][Pp][Ss]://[^\x00-\x20\x7f/?#][^\x00-\x20\x7f]{0,191}$Response
Created
A merchant link as read from the API. Mirrors :class:apps.products.models.MerchantLink.
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}$The product this link is shown on.
22^[23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{22}$The product's GTIN, normalized to GTIN-14.
Merchant name shown when no catalog merchant is attached.
Name of the catalog merchant attached to this link by Closient staff, which the hosted page shows in place of name. Empty string when none. Read-only.
Direct URL to the product page at the merchant (https).
Server-side ISO 8601 timestamp of creation (UTC).
Server-side ISO 8601 timestamp of last modification (UTC).