WHOIS Profiles
The six endpoints that manage the registrant profiles a client uses on domain orders.
Overview
A WHOIS profile is the registrant data a client reuses across domain orders. A client can hold several profiles but only one default.
The fields are snake_case and carry the same names as the domain WHOIS contact endpoints. Storage uses a different shape, but the API converts it, so that is not your concern.
Reference
Listing the Profiles
Returns every WHOIS profile the client has. The default one comes first.
840.curl 'https://panel.example.com/api/v1/admin/clients/42/whois-profiles' \
-H "Authorization: Bearer $API_KEY"const res = await fetch('https://panel.example.com/api/v1/admin/clients/42/whois-profiles', {
headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();$ch = curl_init('https://panel.example.com/api/v1/admin/clients/42/whois-profiles');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $apiKey],
]);
$body = json_decode(curl_exec($ch), true);
curl_close($ch);$response = Api::Clients()->GetClientWhoisProfiles(['id' => 42]);
// The default is first, but be ready for an empty list.
$default = $response['data'][0] ?? null;{
"data": [
{
"id": 13,
"name": "Primary",
"is_default": true,
"contact": {
"first_name": "John",
"last_name": "Doe",
"email": "[email protected]",
"phone": "5550100",
"phone_cc": "1",
"address_line1": "123 Market Street",
"city": "San Francisco",
"state": "California",
"zipcode": "94105",
"country": "840"
},
"created_at": "2026-06-21 18:00:00",
"updated_at": "2026-06-21 18:05:00"
}
]
}Creating a Profile
Adds a new WHOIS profile to the client.
840.curl -X POST 'https://panel.example.com/api/v1/admin/clients/42/whois-profiles' \
-H "Authorization: Bearer $API_KEY" \
-H 'Content-Type: application/json' \
-d '{
"name": "Primary",
"default": true,
"contact": {
"first_name": "John",
"last_name": "Doe",
"email": "[email protected]",
"country": "840"
}
}'const res = await fetch('https://panel.example.com/api/v1/admin/clients/42/whois-profiles', {
method: 'POST',
headers: {
Authorization: `Bearer ${apiKey}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
name: 'Primary',
default: true,
contact: {
first_name: 'John',
last_name: 'Doe',
email: '[email protected]',
phone: '5550100',
phone_cc: '1',
address_line1: '123 Market Street',
city: 'San Francisco',
state: 'California',
zipcode: '94105',
country: '840',
},
}),
});
const body = await res.json();$ch = curl_init('https://panel.example.com/api/v1/admin/clients/42/whois-profiles');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $apiKey,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'name' => 'Primary',
'default' => true,
'contact' => [
'first_name' => 'John',
'last_name' => 'Doe',
'email' => '[email protected]',
'phone' => '5550100',
'phone_cc' => '1',
'address_line1' => '123 Market Street',
'city' => 'San Francisco',
'state' => 'California',
'zipcode' => '94105',
'country' => '840',
],
]),
]);
$body = json_decode(curl_exec($ch), true);
curl_close($ch);$response = Api::Clients()->CreateClientWhoisProfile([
'id' => 42,
'name' => 'Primary',
'default' => true,
'contact' => [
'first_name' => 'John',
'last_name' => 'Doe',
'email' => '[email protected]',
'phone' => '5550100',
'phone_cc' => '1',
'address_line1' => '123 Market Street',
'city' => 'San Francisco',
'state' => 'California',
'zipcode' => '94105',
'country' => '840',
],
]);
$profileId = $response['data']['id'];{
"data": {
"id": 14,
"name": "Primary",
"is_default": true,
"contact": { "first_name": "John", "last_name": "Doe", "country": "840" },
"created_at": "2026-06-21 18:00:00",
"updated_at": "2026-06-21 18:00:00"
}
}{
"error": {
"code": "name_required",
"message": "Profile name is required."
}
}Profile Detail
Returns one profile. The schema is the same as a list item.
840.curl 'https://panel.example.com/api/v1/admin/clients/42/whois-profiles/13' \
-H "Authorization: Bearer $API_KEY"const res = await fetch('https://panel.example.com/api/v1/admin/clients/42/whois-profiles/13', {
headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();$ch = curl_init('https://panel.example.com/api/v1/admin/clients/42/whois-profiles/13');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $apiKey],
]);
$body = json_decode(curl_exec($ch), true);
curl_close($ch);$response = Api::Clients()->GetClientWhoisProfile(['id' => 42, 'pid' => 13]);Updating a Profile
Updates the profile. A top-level field you leave out stays as it was.
840.true makes it the default, false takes that away.curl -X PUT 'https://panel.example.com/api/v1/admin/clients/42/whois-profiles/13' \
-H "Authorization: Bearer $API_KEY" \
-H 'Content-Type: application/json' \
-d '{"name":"Billing Contact"}'const res = await fetch('https://panel.example.com/api/v1/admin/clients/42/whois-profiles/13', {
method: 'PUT',
headers: {
Authorization: `Bearer ${apiKey}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({ name: 'Billing Contact' }),
});
const body = await res.json();$ch = curl_init('https://panel.example.com/api/v1/admin/clients/42/whois-profiles/13');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'PUT',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $apiKey,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode(['name' => 'Billing Contact']),
]);
$body = json_decode(curl_exec($ch), true);
curl_close($ch);// To change one contact field, read the current block first.
$current = Api::Clients()->GetClientWhoisProfile(['id' => 42, 'pid' => 13])['data']['contact'];
$current['email'] = '[email protected]';
$response = Api::Clients()->UpdateClientWhoisProfile([
'id' => 42,
'pid' => 13,
'contact' => $current,
]);Setting the Default
Makes the profile the client's default. The previous default is cleared in the same operation.
true.curl -X PUT 'https://panel.example.com/api/v1/admin/clients/42/whois-profiles/13/default' \
-H "Authorization: Bearer $API_KEY"const res = await fetch('https://panel.example.com/api/v1/admin/clients/42/whois-profiles/13/default', {
method: 'PUT',
headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();$ch = curl_init('https://panel.example.com/api/v1/admin/clients/42/whois-profiles/13/default');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'PUT',
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $apiKey],
]);
$body = json_decode(curl_exec($ch), true);
curl_close($ch);$response = Api::Clients()->SetClientWhoisProfileDefault(['id' => 42, 'pid' => 13]);Deleting a Profile
Deletes the profile. Contact data already registered on domains is not affected.
curl -X DELETE 'https://panel.example.com/api/v1/admin/clients/42/whois-profiles/13' \
-H "Authorization: Bearer $API_KEY"const res = await fetch('https://panel.example.com/api/v1/admin/clients/42/whois-profiles/13', {
method: 'DELETE',
headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();$ch = curl_init('https://panel.example.com/api/v1/admin/clients/42/whois-profiles/13');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'DELETE',
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $apiKey],
]);
$body = json_decode(curl_exec($ch), true);
curl_close($ch);$response = Api::Clients()->DeleteClientWhoisProfile(['id' => 42, 'pid' => 13]);Pitfalls
Sending contact on an update replaces the entire block, and the fields you left out are emptied. To change one field, read the current block, edit it, and send all of it back. This differs from the top-level fields: leave out name and it is kept.
The country field wants the numeric code, not the two-letter one: 840 for the United States. Sending the abbreviation leaves the profile without a country and the domain registration can fail at the registrar.
Making a profile the default clears the client's previous default in the same operation. There is no separate confirmation or warning, so read the list back to check the outcome.
Related Articles
Thanks for your feedback!
Our support team is here around the clock for anything you can't find above.