curl --request POST \
--url https://www.closient.com/products/api/v1/families/{family_id}/members/reorder \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"member_ids": [
"keATfB8VP2gSjcnTbsMNQL",
"F5n5NdW6dTbvPYkgnLNjte"
]
}
'import requests
url = "https://www.closient.com/products/api/v1/families/{family_id}/members/reorder"
payload = { "member_ids": ["keATfB8VP2gSjcnTbsMNQL", "F5n5NdW6dTbvPYkgnLNjte"] }
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({member_ids: ['keATfB8VP2gSjcnTbsMNQL', 'F5n5NdW6dTbvPYkgnLNjte']})
};
fetch('https://www.closient.com/products/api/v1/families/{family_id}/members/reorder', 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/families/{family_id}/members/reorder",
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([
'member_ids' => [
'keATfB8VP2gSjcnTbsMNQL',
'F5n5NdW6dTbvPYkgnLNjte'
]
]),
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/families/{family_id}/members/reorder"
payload := strings.NewReader("{\n \"member_ids\": [\n \"keATfB8VP2gSjcnTbsMNQL\",\n \"F5n5NdW6dTbvPYkgnLNjte\"\n ]\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/families/{family_id}/members/reorder")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"member_ids\": [\n \"keATfB8VP2gSjcnTbsMNQL\",\n \"F5n5NdW6dTbvPYkgnLNjte\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.closient.com/products/api/v1/families/{family_id}/members/reorder")
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 \"member_ids\": [\n \"keATfB8VP2gSjcnTbsMNQL\",\n \"F5n5NdW6dTbvPYkgnLNjte\"\n ]\n}"
response = http.request(request)
puts response.read_body[
{
"gtin": "00850012345672",
"id": "keATfB8VP2gSjcnTbsMNQL",
"is_default": true,
"position": 0,
"product_id": "SBjSX6xUJPPHQKUXBpYX2C",
"product_name": "Oatly Oat Milk 946ml",
"variant_type": "SIZE",
"variant_value": "946ml"
}
]{
"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"
}Reorder product family members
Set the display order of every member at once. member_ids must list each member exactly once; nothing changes if it doesn’t. The default variant always lists first regardless.
curl --request POST \
--url https://www.closient.com/products/api/v1/families/{family_id}/members/reorder \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"member_ids": [
"keATfB8VP2gSjcnTbsMNQL",
"F5n5NdW6dTbvPYkgnLNjte"
]
}
'import requests
url = "https://www.closient.com/products/api/v1/families/{family_id}/members/reorder"
payload = { "member_ids": ["keATfB8VP2gSjcnTbsMNQL", "F5n5NdW6dTbvPYkgnLNjte"] }
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({member_ids: ['keATfB8VP2gSjcnTbsMNQL', 'F5n5NdW6dTbvPYkgnLNjte']})
};
fetch('https://www.closient.com/products/api/v1/families/{family_id}/members/reorder', 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/families/{family_id}/members/reorder",
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([
'member_ids' => [
'keATfB8VP2gSjcnTbsMNQL',
'F5n5NdW6dTbvPYkgnLNjte'
]
]),
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/families/{family_id}/members/reorder"
payload := strings.NewReader("{\n \"member_ids\": [\n \"keATfB8VP2gSjcnTbsMNQL\",\n \"F5n5NdW6dTbvPYkgnLNjte\"\n ]\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/families/{family_id}/members/reorder")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"member_ids\": [\n \"keATfB8VP2gSjcnTbsMNQL\",\n \"F5n5NdW6dTbvPYkgnLNjte\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.closient.com/products/api/v1/families/{family_id}/members/reorder")
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 \"member_ids\": [\n \"keATfB8VP2gSjcnTbsMNQL\",\n \"F5n5NdW6dTbvPYkgnLNjte\"\n ]\n}"
response = http.request(request)
puts response.read_body[
{
"gtin": "00850012345672",
"id": "keATfB8VP2gSjcnTbsMNQL",
"is_default": true,
"position": 0,
"product_id": "SBjSX6xUJPPHQKUXBpYX2C",
"product_name": "Oatly Oat Milk 946ml",
"variant_type": "SIZE",
"variant_value": "946ml"
}
]{
"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 product family.
22^[23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{22}$Body
Body for POST /families/{family_id}/members/reorder.
Every member id of the family, in the new display order. Applied in one transaction: an id from outside the family aborts with 404, a list that omits or repeats a member with 422.
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}$Response
OK
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 member product's id.
22^[23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{22}$The member product's GTIN, normalized to GTIN-14.
The member product's name. Empty string when unknown.
Axis this variant differs from its siblings along (size, flavor, scent, color, ...).
SIZE, FLAVOR, SCENT, COLOR, STRENGTH, FORMAT, OTHER Concrete value on that axis, e.g. 946ml or Lavender. Empty string when unset.
Whether this is the family's canonical variant. At most one member per family is default.
Display order within the family (ascending).