curl --request POST \
--url https://api.erdo.ai/v1/custom-domains \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"domain": "<string>",
"manager_default": true
}
'import requests
url = "https://api.erdo.ai/v1/custom-domains"
payload = {
"domain": "<string>",
"manager_default": True
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({domain: '<string>', manager_default: true})
};
fetch('https://api.erdo.ai/v1/custom-domains', 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.erdo.ai/v1/custom-domains",
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([
'domain' => '<string>',
'manager_default' => true
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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.erdo.ai/v1/custom-domains"
payload := strings.NewReader("{\n \"domain\": \"<string>\",\n \"manager_default\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
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.erdo.ai/v1/custom-domains")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"domain\": \"<string>\",\n \"manager_default\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.erdo.ai/v1/custom-domains")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"domain\": \"<string>\",\n \"manager_default\": true\n}"
response = http.request(request)
puts response.read_body{
"created_at": "<string>",
"dns_records": [
{
"name": "<string>",
"type": "<string>",
"value": "<string>"
}
],
"domain": "<string>",
"error_reason": "<string>",
"last_checked_at": "<string>",
"manager_default": true,
"status": "<string>",
"updated_at": "<string>"
}{
"code": "not_found",
"details": {},
"message": "<string>"
}CreateCustomDomainAPI registers a custom domain for the caller's org and
returns the DNS records the customer must create.
curl --request POST \
--url https://api.erdo.ai/v1/custom-domains \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"domain": "<string>",
"manager_default": true
}
'import requests
url = "https://api.erdo.ai/v1/custom-domains"
payload = {
"domain": "<string>",
"manager_default": True
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({domain: '<string>', manager_default: true})
};
fetch('https://api.erdo.ai/v1/custom-domains', 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.erdo.ai/v1/custom-domains",
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([
'domain' => '<string>',
'manager_default' => true
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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.erdo.ai/v1/custom-domains"
payload := strings.NewReader("{\n \"domain\": \"<string>\",\n \"manager_default\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
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.erdo.ai/v1/custom-domains")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"domain\": \"<string>\",\n \"manager_default\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.erdo.ai/v1/custom-domains")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"domain\": \"<string>\",\n \"manager_default\": true\n}"
response = http.request(request)
puts response.read_body{
"created_at": "<string>",
"dns_records": [
{
"name": "<string>",
"type": "<string>",
"value": "<string>"
}
],
"domain": "<string>",
"error_reason": "<string>",
"last_checked_at": "<string>",
"manager_default": true,
"status": "<string>",
"updated_at": "<string>"
}{
"code": "not_found",
"details": {},
"message": "<string>"
}Authorizations
An Erdo API key (erdo_api_...) or scoped token (erdo_token_...).
Body
customer controls (e.g. "pages.acme.com"; root domains cannot CNAME).
organizations this one manages, in one step. The caller's organization must already manage at least one organization. To change the flag on a domain that is already registered and serving, use the manager-default endpoint instead of re-registering.
Response
Success response
provider — shown until (and after) the domain validates, so a stuck domain can be re-checked against what should exist.
Show child attributes
Show child attributes
"pages.acme.com". It is the identifier every other custom-domain endpoint takes.
disabled (e.g. a CAA record blocking certificate issuance); empty otherwise.
(RFC 3339); empty if never checked yet.
one manages serve their pages from when they have registered none of their own. At most one of an organization's domains carries it.
customer's DNS records), "pending_cert" (ownership verified, certificate issuing), "active" (serving), "failed" (validation or issuance error — see error_reason), or "disabled" (deregistered upstream). This is read from the same record the serving path consults, kept reconciled against the CDN by a monitoring job.

