curl --request POST \
--url https://api.dev.purplelabelmd.com/v1/account/brands/{brand_id}/domains/{kind}/verify \
--header 'Authorization: Bearer <token>' \
--header 'X-Brand-Id: <x-brand-id>'import requests
url = "https://api.dev.purplelabelmd.com/v1/account/brands/{brand_id}/domains/{kind}/verify"
headers = {
"X-Brand-Id": "<x-brand-id>",
"Authorization": "Bearer <token>"
}
response = requests.post(url, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-Brand-Id': '<x-brand-id>', Authorization: 'Bearer <token>'}
};
fetch('https://api.dev.purplelabelmd.com/v1/account/brands/{brand_id}/domains/{kind}/verify', 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}/domains/{kind}/verify",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"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"
"net/http"
"io"
)
func main() {
url := "https://api.dev.purplelabelmd.com/v1/account/brands/{brand_id}/domains/{kind}/verify"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("X-Brand-Id", "<x-brand-id>")
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.post("https://api.dev.purplelabelmd.com/v1/account/brands/{brand_id}/domains/{kind}/verify")
.header("X-Brand-Id", "<x-brand-id>")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.dev.purplelabelmd.com/v1/account/brands/{brand_id}/domains/{kind}/verify")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-Brand-Id"] = '<x-brand-id>'
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": {
"brand_id": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"hostname": "<string>",
"kind": "login",
"owner": "platform-walk",
"state": "requested",
"updated_at": "2023-11-07T05:31:56Z",
"bound_by": "<string>",
"cname": {
"name": "<string>",
"type": "CNAME",
"value": "<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>"
}Verify a custom domain and advance provisioning
Verifies the CNAME you added and advances the domain toward serving: a login domain proceeds through certificate issuance to active; a member-portal domain stops at the certificate-request state — the serving activation itself (certificate attach + host routing, cert_issued → active) is performed by the platform operator once your certificate is issued, never by this call. Call this once you have added the CNAME record from the register step. If verification or the certificate is not ready yet the row stays where it is and a retryable 409 is returned. Idempotent at (or past) the state this call drives to. The brand is the one your key owns (path brand_id must match your X-Brand-Id).
curl --request POST \
--url https://api.dev.purplelabelmd.com/v1/account/brands/{brand_id}/domains/{kind}/verify \
--header 'Authorization: Bearer <token>' \
--header 'X-Brand-Id: <x-brand-id>'import requests
url = "https://api.dev.purplelabelmd.com/v1/account/brands/{brand_id}/domains/{kind}/verify"
headers = {
"X-Brand-Id": "<x-brand-id>",
"Authorization": "Bearer <token>"
}
response = requests.post(url, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-Brand-Id': '<x-brand-id>', Authorization: 'Bearer <token>'}
};
fetch('https://api.dev.purplelabelmd.com/v1/account/brands/{brand_id}/domains/{kind}/verify', 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}/domains/{kind}/verify",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"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"
"net/http"
"io"
)
func main() {
url := "https://api.dev.purplelabelmd.com/v1/account/brands/{brand_id}/domains/{kind}/verify"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("X-Brand-Id", "<x-brand-id>")
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.post("https://api.dev.purplelabelmd.com/v1/account/brands/{brand_id}/domains/{kind}/verify")
.header("X-Brand-Id", "<x-brand-id>")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.dev.purplelabelmd.com/v1/account/brands/{brand_id}/domains/{kind}/verify")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-Brand-Id"] = '<x-brand-id>'
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": {
"brand_id": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"hostname": "<string>",
"kind": "login",
"owner": "platform-walk",
"state": "requested",
"updated_at": "2023-11-07T05:31:56Z",
"bound_by": "<string>",
"cname": {
"name": "<string>",
"type": "CNAME",
"value": "<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_-]*$Path Parameters
the brand whose custom domains to view or manage (must match X-Brand-Id).
^brd_[A-Za-z0-9][A-Za-z0-9_-]*$the custom-domain kind — login (the auth domain) or member (the member-portal domain).
login, member Response
the advanced row (login → active; member → cert_requested)
One custom-domain row as the registry holds it: the brand, the kind (login | member), the hostname, its provisioning state, who owns and who bound the host, timestamps, and the CNAME paste-row to add to your DNS. The row never carries a secret nor the provider's internal domain id. An absent row (a kind you have not registered) is the shared-domain default.
Show child attributes
Show child attributes