curl --request POST \
--url https://api.erdo.ai/v1/custom-domains/{domain}/transfer \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"target_org": "<string>"
}
'import requests
url = "https://api.erdo.ai/v1/custom-domains/{domain}/transfer"
payload = { "target_org": "<string>" }
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({target_org: '<string>'})
};
fetch('https://api.erdo.ai/v1/custom-domains/{domain}/transfer', 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/{domain}/transfer",
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([
'target_org' => '<string>'
]),
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/{domain}/transfer"
payload := strings.NewReader("{\n \"target_org\": \"<string>\"\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/{domain}/transfer")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"target_org\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.erdo.ai/v1/custom-domains/{domain}/transfer")
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 \"target_org\": \"<string>\"\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>"
}TransferCustomDomainAPI moves a custom domain to another organization the
caller also administers, without touching its CDN hostname or certificate — the serving cutover is atomic with the move and incurs no re-validation downtime.
curl --request POST \
--url https://api.erdo.ai/v1/custom-domains/{domain}/transfer \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"target_org": "<string>"
}
'import requests
url = "https://api.erdo.ai/v1/custom-domains/{domain}/transfer"
payload = { "target_org": "<string>" }
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({target_org: '<string>'})
};
fetch('https://api.erdo.ai/v1/custom-domains/{domain}/transfer', 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/{domain}/transfer",
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([
'target_org' => '<string>'
]),
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/{domain}/transfer"
payload := strings.NewReader("{\n \"target_org\": \"<string>\"\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/{domain}/transfer")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"target_org\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.erdo.ai/v1/custom-domains/{domain}/transfer")
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 \"target_org\": \"<string>\"\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_...).
Path Parameters
Body
The caller must be an admin of both the org that owns the domain and the target org — a manager credential steering between its managed orgs satisfies both.
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.

