curl --request POST \
--url https://api.dev.purplelabelmd.com/v1/account/brands/{brand_id}/starter-merchandising \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--header 'X-Client-Id: <x-client-id>' \
--data '
{
"pack_version": 123
}
'import requests
url = "https://api.dev.purplelabelmd.com/v1/account/brands/{brand_id}/starter-merchandising"
payload = { "pack_version": 123 }
headers = {
"Idempotency-Key": "<idempotency-key>",
"X-Client-Id": "<x-client-id>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'Idempotency-Key': '<idempotency-key>',
'X-Client-Id': '<x-client-id>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({pack_version: 123})
};
fetch('https://api.dev.purplelabelmd.com/v1/account/brands/{brand_id}/starter-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/brands/{brand_id}/starter-merchandising",
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([
'pack_version' => 123
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"Idempotency-Key: <idempotency-key>",
"X-Client-Id: <x-client-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/brands/{brand_id}/starter-merchandising"
payload := strings.NewReader("{\n \"pack_version\": 123\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Idempotency-Key", "<idempotency-key>")
req.Header.Add("X-Client-Id", "<x-client-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.post("https://api.dev.purplelabelmd.com/v1/account/brands/{brand_id}/starter-merchandising")
.header("Idempotency-Key", "<idempotency-key>")
.header("X-Client-Id", "<x-client-id>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"pack_version\": 123\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.dev.purplelabelmd.com/v1/account/brands/{brand_id}/starter-merchandising")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Idempotency-Key"] = '<idempotency-key>'
request["X-Client-Id"] = '<x-client-id>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"pack_version\": 123\n}"
response = http.request(request)
puts response.read_body{
"data": {
"adopted": [
"<string>"
],
"pack_sha": "<string>",
"pack_version": 123,
"skipped_existing": [
"<string>"
],
"skipped_no_template": [
"<string>"
]
}
}{
"status": 123,
"title": "<string>",
"code": "<string>",
"detail": "<string>",
"instance": "<string>",
"type": "<string>"
}{
"status": 123,
"title": "<string>",
"code": "<string>",
"detail": "<string>",
"instance": "<string>",
"type": "<string>"
}{
"status": 123,
"title": "<string>",
"code": "<string>",
"detail": "<string>",
"instance": "<string>",
"type": "<string>"
}{
"status": 123,
"title": "<string>",
"code": "<string>",
"detail": "<string>",
"instance": "<string>",
"type": "<string>"
}{
"status": 123,
"title": "<string>",
"code": "<string>",
"detail": "<string>",
"instance": "<string>",
"type": "<string>"
}Adopt the starter merchandising pack for your brand
Adopts the starter merchandising pack for one of your brands in a single call. For every offering enabled on the brand that has no merchandising yet, this writes the pack’s template copy — a starting display name, description, and included-items bullets — as your brand’s own merchandising, exactly as if you had written it yourself. Where the pack has clinically-approved copy for that specific offering, you get that copy; otherwise you get the compliance-safe copy for the offering’s therapy class. Offerings you have already merchandised are never touched (they are listed in the response as skipped), and offerings the pack has no template for are listed as skipped too. Send the pack version stated in your welcome pack; the response returns the pack’s content hash so you can verify you adopted exactly the templates you reviewed. Adoption is optional and repeatable: calling again adopts nothing new, and repeating a completed request with the same Idempotency-Key returns the original result. Every adopted offering is recorded in your brand’s audit trail, attributed to your account. You can adopt only for brands that belong to your account.
curl --request POST \
--url https://api.dev.purplelabelmd.com/v1/account/brands/{brand_id}/starter-merchandising \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--header 'X-Client-Id: <x-client-id>' \
--data '
{
"pack_version": 123
}
'import requests
url = "https://api.dev.purplelabelmd.com/v1/account/brands/{brand_id}/starter-merchandising"
payload = { "pack_version": 123 }
headers = {
"Idempotency-Key": "<idempotency-key>",
"X-Client-Id": "<x-client-id>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'Idempotency-Key': '<idempotency-key>',
'X-Client-Id': '<x-client-id>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({pack_version: 123})
};
fetch('https://api.dev.purplelabelmd.com/v1/account/brands/{brand_id}/starter-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/brands/{brand_id}/starter-merchandising",
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([
'pack_version' => 123
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"Idempotency-Key: <idempotency-key>",
"X-Client-Id: <x-client-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/brands/{brand_id}/starter-merchandising"
payload := strings.NewReader("{\n \"pack_version\": 123\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Idempotency-Key", "<idempotency-key>")
req.Header.Add("X-Client-Id", "<x-client-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.post("https://api.dev.purplelabelmd.com/v1/account/brands/{brand_id}/starter-merchandising")
.header("Idempotency-Key", "<idempotency-key>")
.header("X-Client-Id", "<x-client-id>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"pack_version\": 123\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.dev.purplelabelmd.com/v1/account/brands/{brand_id}/starter-merchandising")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Idempotency-Key"] = '<idempotency-key>'
request["X-Client-Id"] = '<x-client-id>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"pack_version\": 123\n}"
response = http.request(request)
puts response.read_body{
"data": {
"adopted": [
"<string>"
],
"pack_sha": "<string>",
"pack_version": 123,
"skipped_existing": [
"<string>"
],
"skipped_no_template": [
"<string>"
]
}
}{
"status": 123,
"title": "<string>",
"code": "<string>",
"detail": "<string>",
"instance": "<string>",
"type": "<string>"
}{
"status": 123,
"title": "<string>",
"code": "<string>",
"detail": "<string>",
"instance": "<string>",
"type": "<string>"
}{
"status": 123,
"title": "<string>",
"code": "<string>",
"detail": "<string>",
"instance": "<string>",
"type": "<string>"
}{
"status": 123,
"title": "<string>",
"code": "<string>",
"detail": "<string>",
"instance": "<string>",
"type": "<string>"
}{
"status": 123,
"title": "<string>",
"code": "<string>",
"detail": "<string>",
"instance": "<string>",
"type": "<string>"
}Authorizations
Per-client API key (M2M). Presented as Authorization: Bearer <key>.
Headers
Required on every mutation. Replaying the same request with the same key returns the original result; reusing the key with a materially different request is rejected 409 with machine code IDEMPOTENCY_CONFLICT.
1Identifies your account. The platform sets this header from your API key when the request is authenticated — you do not send it yourself, and a value you supply is never trusted. Requests without a resolved account identity answer 401 before any processing, and every write is attributed to this identity in the audit trail.
1Path Parameters
The brand to adopt for. Must be one of your account's own brands.
Body
The starter-pack adoption body: the pack version you are adopting, as stated in your welcome pack. Nothing else rides the body — the template copy is held by the platform, and the brand you are adopting for comes from the path, so you can only ever adopt for a brand that belongs to your account.
the starter pack version to adopt (the current version is 2)
Response
the adoption result — the offerings adopted and the offerings skipped (already merchandised, or no template available), with the pack version and content hash; or an idempotent replay of the original result
The starter-pack adoption result: which offerings this call merchandised, and which it skipped — either because they were already merchandised or because the pack has no template for them — together with the pack version and the pack's content hash. The hash is stable for a given pack version: the templates are a fixed, published set, so the hash moves only when those templates themselves change.
Show child attributes
Show child attributes