curl --request GET \
--url https://api.dev.purplelabelmd.com/v1/account/brands/{brand_id}/readiness \
--header 'Authorization: Bearer <token>' \
--header 'X-Client-Brand-Ids: <x-client-brand-ids>' \
--header 'X-Client-Id: <x-client-id>'import requests
url = "https://api.dev.purplelabelmd.com/v1/account/brands/{brand_id}/readiness"
headers = {
"X-Client-Id": "<x-client-id>",
"X-Client-Brand-Ids": "<x-client-brand-ids>",
"Authorization": "Bearer <token>"
}
response = requests.get(url, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {
'X-Client-Id': '<x-client-id>',
'X-Client-Brand-Ids': '<x-client-brand-ids>',
Authorization: 'Bearer <token>'
}
};
fetch('https://api.dev.purplelabelmd.com/v1/account/brands/{brand_id}/readiness', 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}/readiness",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"X-Client-Brand-Ids: <x-client-brand-ids>",
"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"
"net/http"
"io"
)
func main() {
url := "https://api.dev.purplelabelmd.com/v1/account/brands/{brand_id}/readiness"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-Client-Id", "<x-client-id>")
req.Header.Add("X-Client-Brand-Ids", "<x-client-brand-ids>")
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.dev.purplelabelmd.com/v1/account/brands/{brand_id}/readiness")
.header("X-Client-Id", "<x-client-id>")
.header("X-Client-Brand-Ids", "<x-client-brand-ids>")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.dev.purplelabelmd.com/v1/account/brands/{brand_id}/readiness")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-Client-Id"] = '<x-client-id>'
request["X-Client-Brand-Ids"] = '<x-client-brand-ids>'
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": {
"brand_id": "<string>",
"checks": [
{
"check": "<string>",
"detail": "<string>",
"kind": "<string>",
"blocking": true,
"result": "<string>"
}
],
"offerings": {
"rows": [
{
"checks": [
{
"check": "<string>",
"detail": "<string>",
"kind": "<string>",
"blocking": true,
"result": "<string>"
}
],
"offering_ref": "<string>",
"status": "<string>"
}
],
"source_readable": true
}
}
}{
"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>"
}Check whether your brand is ready to sell
Reports whether one of your brands can actually sell yet, and what is still outstanding if it cannot. Two levels: brand-wide checks covering your payment account and your checkout consent documents, and one row per offering you have enabled carrying the platform’s live verdict plus the per-check report behind it. Every outstanding item says what has to happen and who does it, so a step only Purple operations can complete is never handed to you as yours to do. Some checks cannot be answered by this endpoint; those are reported as unverifiable rather than guessed, and unverifiable is never a pass. Read source_readable before you read an empty offering list: false means the setup could not be read just now. You may ask about your own brands only; any other brand is not found. This read reports configuration state and changes nothing. CALLING IT FROM A BROWSER: a web page may call this read directly. Present a publishable brand key — sent as Authorization: Bearer pub_live_…, or pub_test_… outside production — which is minted for a single brand, is read-only, and is meant to be shipped in page source. The key reaches only the operations its allowlist names: today that is this read and that brand’s storefront price read, and nothing else — every other operation, and every write, is refused. Because it is minted for one brand it may only ask about that brand — any other brand, a sibling brand on your own account included, answers the same not found as a brand that does not exist, and the refusal never tells you which of those it was. A cross-origin page must also have its exact origin registered on that brand’s browser-origin allowlist, so publishing the key does not by itself open the read to any site. The server path is unchanged — call this endpoint from your own server with your secret API key exactly as before, and never put that secret key in page source.
curl --request GET \
--url https://api.dev.purplelabelmd.com/v1/account/brands/{brand_id}/readiness \
--header 'Authorization: Bearer <token>' \
--header 'X-Client-Brand-Ids: <x-client-brand-ids>' \
--header 'X-Client-Id: <x-client-id>'import requests
url = "https://api.dev.purplelabelmd.com/v1/account/brands/{brand_id}/readiness"
headers = {
"X-Client-Id": "<x-client-id>",
"X-Client-Brand-Ids": "<x-client-brand-ids>",
"Authorization": "Bearer <token>"
}
response = requests.get(url, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {
'X-Client-Id': '<x-client-id>',
'X-Client-Brand-Ids': '<x-client-brand-ids>',
Authorization: 'Bearer <token>'
}
};
fetch('https://api.dev.purplelabelmd.com/v1/account/brands/{brand_id}/readiness', 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}/readiness",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"X-Client-Brand-Ids: <x-client-brand-ids>",
"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"
"net/http"
"io"
)
func main() {
url := "https://api.dev.purplelabelmd.com/v1/account/brands/{brand_id}/readiness"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-Client-Id", "<x-client-id>")
req.Header.Add("X-Client-Brand-Ids", "<x-client-brand-ids>")
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.dev.purplelabelmd.com/v1/account/brands/{brand_id}/readiness")
.header("X-Client-Id", "<x-client-id>")
.header("X-Client-Brand-Ids", "<x-client-brand-ids>")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.dev.purplelabelmd.com/v1/account/brands/{brand_id}/readiness")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-Client-Id"] = '<x-client-id>'
request["X-Client-Brand-Ids"] = '<x-client-brand-ids>'
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": {
"brand_id": "<string>",
"checks": [
{
"check": "<string>",
"detail": "<string>",
"kind": "<string>",
"blocking": true,
"result": "<string>"
}
],
"offerings": {
"rows": [
{
"checks": [
{
"check": "<string>",
"detail": "<string>",
"kind": "<string>",
"blocking": true,
"result": "<string>"
}
],
"offering_ref": "<string>",
"status": "<string>"
}
],
"source_readable": true
}
}
}{
"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
the resolved account, set by the gateway.
1the brands the resolved account owns, set by the gateway.
1Path Parameters
the brand to check. Must be one of your own brands; any other brand is not found (404, never 403 — existence is never revealed across accounts).
Response
the brand's readiness report
Whether one of your brands is ready to sell, and what is outstanding if it is not. checks covers the brand as a whole; offerings covers each offering you have enabled. Read source_readable first: false means the platform could not read your offering setup just now, so an empty rows list means "we could not look", never "nothing is outstanding".
Show child attributes
Show child attributes