curl --request PUT \
--url https://www.atom.com/api/registrar/v1/domains/{domain_name}/contacts \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"registrant": "ATOM-12345",
"admin": "CONTACT_1-67890",
"billing": "CONTACT_2-67890",
"tech": "CONTACT_3-67890"
}
'import requests
url = "https://www.atom.com/api/registrar/v1/domains/{domain_name}/contacts"
payload = {
"registrant": "ATOM-12345",
"admin": "CONTACT_1-67890",
"billing": "CONTACT_2-67890",
"tech": "CONTACT_3-67890"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
registrant: 'ATOM-12345',
admin: 'CONTACT_1-67890',
billing: 'CONTACT_2-67890',
tech: 'CONTACT_3-67890'
})
};
fetch('https://www.atom.com/api/registrar/v1/domains/{domain_name}/contacts', 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://www.atom.com/api/registrar/v1/domains/{domain_name}/contacts",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'registrant' => 'ATOM-12345',
'admin' => 'CONTACT_1-67890',
'billing' => 'CONTACT_2-67890',
'tech' => 'CONTACT_3-67890'
]),
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://www.atom.com/api/registrar/v1/domains/{domain_name}/contacts"
payload := strings.NewReader("{\n \"registrant\": \"ATOM-12345\",\n \"admin\": \"CONTACT_1-67890\",\n \"billing\": \"CONTACT_2-67890\",\n \"tech\": \"CONTACT_3-67890\"\n}")
req, _ := http.NewRequest("PUT", 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.put("https://www.atom.com/api/registrar/v1/domains/{domain_name}/contacts")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"registrant\": \"ATOM-12345\",\n \"admin\": \"CONTACT_1-67890\",\n \"billing\": \"CONTACT_2-67890\",\n \"tech\": \"CONTACT_3-67890\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.atom.com/api/registrar/v1/domains/{domain_name}/contacts")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"registrant\": \"ATOM-12345\",\n \"admin\": \"CONTACT_1-67890\",\n \"billing\": \"CONTACT_2-67890\",\n \"tech\": \"CONTACT_3-67890\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"message": "Domain contacts updated successfully",
"data": {
"domain_name": "example.com",
"registrant_handle": "ATOM-12345",
"admin_handle": "CONTACT_1-67890",
"billing_handle": "CONTACT_2-67890",
"tech_handle": "CONTACT_3-67890"
}
}{
"success": true,
"message": "Domain contact update initiated. Please verify the update via the email sent to your registered email address.",
"verification_required": true,
"data": {
"domain_name": "example.com"
}
}{
"success": false,
"error": "Bad Request",
"message": "Invalid input provided"
}{
"success": false,
"error": "Unauthorized",
"message": "Invalid registrar API token or access has been revoked. Please request registrar API access from your dashboard."
}{
"success": false,
"error": "Bad Request",
"message": "Invalid input provided"
}{
"success": false,
"error": "Bad Request",
"message": "Invalid input provided"
}{
"success": false,
"error": "Bad Request",
"message": "Invalid input provided"
}Update domain contacts
Assign contact handles to one or more roles on a domain — registrant, admin, billing, and/or tech. At least one role must be supplied; roles that are omitted remain unchanged.
If the registrar requires email verification (e.g. registrant change), a 202 is returned and the update is applied once the verification email is approved.
The domain must have domain_contact_management enabled (active, non-locked domain with Atom nameservers).
curl --request PUT \
--url https://www.atom.com/api/registrar/v1/domains/{domain_name}/contacts \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"registrant": "ATOM-12345",
"admin": "CONTACT_1-67890",
"billing": "CONTACT_2-67890",
"tech": "CONTACT_3-67890"
}
'import requests
url = "https://www.atom.com/api/registrar/v1/domains/{domain_name}/contacts"
payload = {
"registrant": "ATOM-12345",
"admin": "CONTACT_1-67890",
"billing": "CONTACT_2-67890",
"tech": "CONTACT_3-67890"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
registrant: 'ATOM-12345',
admin: 'CONTACT_1-67890',
billing: 'CONTACT_2-67890',
tech: 'CONTACT_3-67890'
})
};
fetch('https://www.atom.com/api/registrar/v1/domains/{domain_name}/contacts', 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://www.atom.com/api/registrar/v1/domains/{domain_name}/contacts",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'registrant' => 'ATOM-12345',
'admin' => 'CONTACT_1-67890',
'billing' => 'CONTACT_2-67890',
'tech' => 'CONTACT_3-67890'
]),
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://www.atom.com/api/registrar/v1/domains/{domain_name}/contacts"
payload := strings.NewReader("{\n \"registrant\": \"ATOM-12345\",\n \"admin\": \"CONTACT_1-67890\",\n \"billing\": \"CONTACT_2-67890\",\n \"tech\": \"CONTACT_3-67890\"\n}")
req, _ := http.NewRequest("PUT", 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.put("https://www.atom.com/api/registrar/v1/domains/{domain_name}/contacts")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"registrant\": \"ATOM-12345\",\n \"admin\": \"CONTACT_1-67890\",\n \"billing\": \"CONTACT_2-67890\",\n \"tech\": \"CONTACT_3-67890\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.atom.com/api/registrar/v1/domains/{domain_name}/contacts")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"registrant\": \"ATOM-12345\",\n \"admin\": \"CONTACT_1-67890\",\n \"billing\": \"CONTACT_2-67890\",\n \"tech\": \"CONTACT_3-67890\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"message": "Domain contacts updated successfully",
"data": {
"domain_name": "example.com",
"registrant_handle": "ATOM-12345",
"admin_handle": "CONTACT_1-67890",
"billing_handle": "CONTACT_2-67890",
"tech_handle": "CONTACT_3-67890"
}
}{
"success": true,
"message": "Domain contact update initiated. Please verify the update via the email sent to your registered email address.",
"verification_required": true,
"data": {
"domain_name": "example.com"
}
}{
"success": false,
"error": "Bad Request",
"message": "Invalid input provided"
}{
"success": false,
"error": "Unauthorized",
"message": "Invalid registrar API token or access has been revoked. Please request registrar API access from your dashboard."
}{
"success": false,
"error": "Bad Request",
"message": "Invalid input provided"
}{
"success": false,
"error": "Bad Request",
"message": "Invalid input provided"
}{
"success": false,
"error": "Bad Request",
"message": "Invalid input provided"
}Authorizations
Registrar API Bearer token. Obtain from dashboard at /dashboard/seller/api-access after requesting Registrar API access.
Path Parameters
Domain name (e.g. example.com)
Body
At least one of registrant, admin, billing, or tech must be provided. Omitted roles are left unchanged.
Contact handle to set as the registrant. Must belong to the authenticated user.
"ATOM-12345"
Contact handle to set as the administrative contact.
"CONTACT_1-67890"
Contact handle to set as the billing contact.
"CONTACT_2-67890"
Contact handle to set as the technical contact.
"CONTACT_3-67890"