curl --request PUT \
--url https://api.dev.purplelabelmd.com/v1/account/offerings/{ref}/merchandising \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'X-Brand-Id: <x-brand-id>' \
--data '
{
"description": "<string>",
"display_name": "<string>",
"includes": [
"<string>"
],
"brand_id": "<string>",
"offering_ref": "<string>"
}
'import requests
url = "https://api.dev.purplelabelmd.com/v1/account/offerings/{ref}/merchandising"
payload = {
"description": "<string>",
"display_name": "<string>",
"includes": ["<string>"],
"brand_id": "<string>",
"offering_ref": "<string>"
}
headers = {
"X-Brand-Id": "<x-brand-id>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {
'X-Brand-Id': '<x-brand-id>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
description: '<string>',
display_name: '<string>',
includes: ['<string>'],
brand_id: '<string>',
offering_ref: '<string>'
})
};
fetch('https://api.dev.purplelabelmd.com/v1/account/offerings/{ref}/merchandising', 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://api.dev.purplelabelmd.com/v1/account/offerings/{ref}/merchandising",
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' => '<string>',
'display_name' => '<string>',
'includes' => [
'<string>'
],
'brand_id' => '<string>',
'offering_ref' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"X-Brand-Id: <x-brand-id>"
],
]);
$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://api.dev.purplelabelmd.com/v1/account/offerings/{ref}/merchandising"
payload := strings.NewReader("{\n \"description\": \"<string>\",\n \"display_name\": \"<string>\",\n \"includes\": [\n \"<string>\"\n ],\n \"brand_id\": \"<string>\",\n \"offering_ref\": \"<string>\"\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("X-Brand-Id", "<x-brand-id>")
req.Header.Add("Authorization", "Bearer <token>")
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://api.dev.purplelabelmd.com/v1/account/offerings/{ref}/merchandising")
.header("X-Brand-Id", "<x-brand-id>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"description\": \"<string>\",\n \"display_name\": \"<string>\",\n \"includes\": [\n \"<string>\"\n ],\n \"brand_id\": \"<string>\",\n \"offering_ref\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.dev.purplelabelmd.com/v1/account/offerings/{ref}/merchandising")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["X-Brand-Id"] = '<x-brand-id>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"description\": \"<string>\",\n \"display_name\": \"<string>\",\n \"includes\": [\n \"<string>\"\n ],\n \"brand_id\": \"<string>\",\n \"offering_ref\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"brand_id": "<string>",
"description": "<string>",
"display_name": "<string>",
"id": "<string>",
"includes": [
"<string>"
],
"offering_ref": "<string>"
}
}{
"data": {
"brand_id": "<string>",
"description": "<string>",
"display_name": "<string>",
"id": "<string>",
"includes": [
"<string>"
],
"offering_ref": "<string>"
}
}{
"status": 123,
"title": "<string>",
"type": "<string>",
"detail": "<string>"
}{
"status": 123,
"title": "<string>",
"type": "<string>",
"detail": "<string>"
}{
"status": 123,
"title": "<string>",
"type": "<string>",
"detail": "<string>"
}{
"status": 123,
"title": "<string>",
"type": "<string>",
"detail": "<string>"
}{
"status": 123,
"title": "<string>",
"type": "<string>",
"detail": "<string>"
}Set the display name and presentation copy for your offering
Publishes the DISPLAY content for one of YOUR offerings — the display name, the description, and the what-is-included lines — using your own API key, so the offering shows BY NAME in checkout and the member portal (no operator seed, no raw SKU code). The brand is the one your key owns (resolved from X-Brand-Id) and is applied to the write for you; the offering is the in the path (the offering_ref = the catalog offering code). The offering must already exist in the canonical catalog: an unknown offering is 404, never auto-created. This is product copy, NOT a price (no money moves). Idempotency-Key is carried through — replay of the same request returns the original result.
curl --request PUT \
--url https://api.dev.purplelabelmd.com/v1/account/offerings/{ref}/merchandising \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'X-Brand-Id: <x-brand-id>' \
--data '
{
"description": "<string>",
"display_name": "<string>",
"includes": [
"<string>"
],
"brand_id": "<string>",
"offering_ref": "<string>"
}
'import requests
url = "https://api.dev.purplelabelmd.com/v1/account/offerings/{ref}/merchandising"
payload = {
"description": "<string>",
"display_name": "<string>",
"includes": ["<string>"],
"brand_id": "<string>",
"offering_ref": "<string>"
}
headers = {
"X-Brand-Id": "<x-brand-id>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {
'X-Brand-Id': '<x-brand-id>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
description: '<string>',
display_name: '<string>',
includes: ['<string>'],
brand_id: '<string>',
offering_ref: '<string>'
})
};
fetch('https://api.dev.purplelabelmd.com/v1/account/offerings/{ref}/merchandising', 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://api.dev.purplelabelmd.com/v1/account/offerings/{ref}/merchandising",
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' => '<string>',
'display_name' => '<string>',
'includes' => [
'<string>'
],
'brand_id' => '<string>',
'offering_ref' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"X-Brand-Id: <x-brand-id>"
],
]);
$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://api.dev.purplelabelmd.com/v1/account/offerings/{ref}/merchandising"
payload := strings.NewReader("{\n \"description\": \"<string>\",\n \"display_name\": \"<string>\",\n \"includes\": [\n \"<string>\"\n ],\n \"brand_id\": \"<string>\",\n \"offering_ref\": \"<string>\"\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("X-Brand-Id", "<x-brand-id>")
req.Header.Add("Authorization", "Bearer <token>")
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://api.dev.purplelabelmd.com/v1/account/offerings/{ref}/merchandising")
.header("X-Brand-Id", "<x-brand-id>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"description\": \"<string>\",\n \"display_name\": \"<string>\",\n \"includes\": [\n \"<string>\"\n ],\n \"brand_id\": \"<string>\",\n \"offering_ref\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.dev.purplelabelmd.com/v1/account/offerings/{ref}/merchandising")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["X-Brand-Id"] = '<x-brand-id>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"description\": \"<string>\",\n \"display_name\": \"<string>\",\n \"includes\": [\n \"<string>\"\n ],\n \"brand_id\": \"<string>\",\n \"offering_ref\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"brand_id": "<string>",
"description": "<string>",
"display_name": "<string>",
"id": "<string>",
"includes": [
"<string>"
],
"offering_ref": "<string>"
}
}{
"data": {
"brand_id": "<string>",
"description": "<string>",
"display_name": "<string>",
"id": "<string>",
"includes": [
"<string>"
],
"offering_ref": "<string>"
}
}{
"status": 123,
"title": "<string>",
"type": "<string>",
"detail": "<string>"
}{
"status": 123,
"title": "<string>",
"type": "<string>",
"detail": "<string>"
}{
"status": 123,
"title": "<string>",
"type": "<string>",
"detail": "<string>"
}{
"status": 123,
"title": "<string>",
"type": "<string>",
"detail": "<string>"
}{
"status": 123,
"title": "<string>",
"type": "<string>",
"detail": "<string>"
}Authorizations
Per-client API key (M2M). Presented as Authorization: Bearer <key>.
Headers
Opaque brand id (brd_...). Validated to belong to the resolved client (§2).
^brd_[A-Za-z0-9][A-Za-z0-9_-]*$Accepted on mutations; carried in trusted context, enforced in a later WI.
Path Parameters
the offering code to merchandise (offering_ref = the catalog offering/SKU code).
1Body
The CLIENT merchandise request body — DISPLAY CONTENT ONLY. Billing and shipping cadence (billing_frequency / shipping_frequency) are money-movement configuration set by the PLATFORM, never on this surface: they are not accepted here and a client-supplied cadence field is rejected (422). The brand (from your key) and the offering (from the path {ref}) are applied for you; a brand_id or offering_ref carried here is structurally inert (overwritten — the anti-spoof). The brand and offering must already exist — this request never creates them.
non-empty offering description.
1non-empty display name shown in checkout + the member portal (never the raw SKU code).
1the what-is-included bullet lines — non-empty strings (the array itself may be empty).
structurally inert — if carried it is OVERWRITTEN with the brand your key owns (the anti-spoof); you never name a brand on this surface.
structurally inert — if carried it is OVERWRITTEN with the path {ref} (the anti-spoof).
Response
merchandising updated — or an idempotent replay of the original write
The display content for one of your offerings, keyed by (brand, offering_ref). Product copy, scoped to your brand — not a price, and it carries no personal health information.
Show child attributes
Show child attributes