Search for available domain names, register and renew domains, and manage their nameservers and auto-renewal. Domains are identified by their uuid.
Returns the domains registered in your account, 25 per page. The list has no filters.
Required permission: domains:list
curl -X GET "https://admin.vps.org/api/v1/domains/" \
-H "Authorization: Bearer YOUR_API_TOKEN"
import requests
url = "https://admin.vps.org/api/v1/domains/"
headers = {"Authorization": "Bearer YOUR_API_TOKEN"}
response = requests.get(url, headers=headers)
for domain in response.json()["results"]:
print(domain["domain_name"], domain["status"], domain["expiration_date"])
const response = await fetch('https://admin.vps.org/api/v1/domains/', {
headers: { 'Authorization': 'Bearer YOUR_API_TOKEN' }
});
const data = await response.json();
console.log(data.results);
{
"count": 1,
"next": null,
"previous": null,
"results": [
{
"uuid": "e4b7a2c9-1d3f-4e5a-8b6c-7d8e9f0a1b2c",
"domain_name": "example.com",
"status": "active",
"registrar": "dynadot",
"registration_date": "2026-01-15T10:30:00Z",
"expiration_date": "2027-01-15T10:30:00Z",
"days_until_expiration": 122,
"is_expired": false,
"needs_renewal_soon": false,
"auto_renew": true,
"renewal_period_years": 1,
"registration_price": "12.64",
"renewal_price": "12.64",
"whois_privacy": true,
"nameserver1": "ns1.vps.org",
"nameserver2": "ns2.vps.org",
"nameserver3": "ns3.vps.org",
"nameserver4": null,
"transfer_lock": true,
"created_at": "2026-01-15T10:30:00Z",
"updated_at": "2026-09-01T08:12:40Z"
}
]
}
| Field | Type | Description |
|---|---|---|
uuid |
string | Domain identifier used in the other domain endpoints |
status |
string | active, pending, expired, cancelled, transferred |
registrar |
string | Registrar the domain is held at |
registration_date, expiration_date |
datetime | When the domain was registered and when it expires. expiration_date can be null. |
days_until_expiration |
integer | null | Whole days until expiration_date, negative once expired |
is_expired, needs_renewal_soon |
boolean | Whether the domain has expired, and whether it expires within the next 30 days |
auto_renew, renewal_period_years |
boolean, integer | Whether the domain renews automatically, and for how many years |
registration_price, renewal_price |
string | Prices in USD as decimal strings |
whois_privacy, transfer_lock |
boolean | WHOIS privacy and registrar transfer lock settings |
nameserver1 to nameserver4 |
string | null | The domain's nameservers |
created_at, updated_at |
datetime | When the record was created and last changed (ISO 8601, UTC) |
Returns one domain object with the fields above.
Required permission: domains:list
curl -X GET "https://admin.vps.org/api/v1/domains/e4b7a2c9-1d3f-4e5a-8b6c-7d8e9f0a1b2c/" \
-H "Authorization: Bearer YOUR_API_TOKEN"
| 200 | Success |
| 404 | Not found, or it belongs to another account |
Checks whether a name is available across about 20 popular extensions (com, net, org, io, dev, co, app, ai and more), plus the extension you typed if it is not among them. Results start with the exact match, then available names, then taken ones.
Required permission: domains:search
| Parameter | Type | Required | Description |
|---|---|---|---|
domain |
string | Yes | A name with or without an extension, for example mysite or mysite.com (2 to 63 characters) |
curl -X POST "https://admin.vps.org/api/v1/domains/search/" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"domain": "mysite.com"}'
import requests
url = "https://admin.vps.org/api/v1/domains/search/"
headers = {"Authorization": "Bearer YOUR_API_TOKEN"}
response = requests.post(url, headers=headers, json={"domain": "mysite.com"})
for result in response.json()["results"]:
if result["available"]:
print(result["domain"], result["registration_price"], result["renewal_price"])
{
"results": [
{
"domain": "mysite.com",
"available": false,
"price": null,
"registration_price": null,
"renewal_price": null,
"tld": "com",
"is_exact_match": true
},
{
"domain": "mysite.dev",
"available": true,
"price": 17.24,
"registration_price": 17.24,
"renewal_price": 17.24,
"tld": "dev",
"is_exact_match": false
}
],
"base_domain": "mysite",
"search_count": 20
}
Prices are numbers in USD for one year and are null for names that are not available. The prices shown are illustrative.
| 200 | Success |
| 400 | Missing domain, or it contains characters other than letters, digits and hyphens |
| 500 | The registrar lookup failed. Retry later. |
Registers a domain and charges your saved payment method. Availability and price are checked with the registrar again right before the charge. The registrant contact details are taken from your account profile. If the registrar rejects the registration after the charge, the payment is refunded.
Required permission: domains:register (granted by domains:*)
| Parameter | Type | Required | Description |
|---|---|---|---|
domain |
string | Yes | The full domain name including its extension, for example example.com |
years |
integer | No | Registration period, 1 to 10 (default 1). The price is the yearly price times years. .ai requires at least 2 years; a smaller value returns 400. |
curl -X POST "https://admin.vps.org/api/v1/domains/register/" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"domain": "mysite.dev", "years": 1}'
{
"success": true,
"domain_uuid": "e4b7a2c9-1d3f-4e5a-8b6c-7d8e9f0a1b2c",
"domain_name": "mysite.dev",
"message": "mysite.dev registered successfully!"
}
| 201 | Domain registered |
| 400 | Invalid domain, domain no longer available, price could not be verified, outdated payment method, or the payment failed |
| 402 | No payment method on file, or unpaid invoices |
| 500 | The payment could not be processed, or the registrar rejected the registration after payment. In the second case the error message says whether the refund went through. |
Renews the domain and charges its renewal_price for each year to your saved payment method.
Required permission: domains:renew
| Parameter | Type | Required | Description |
|---|---|---|---|
years |
integer | No | Years to add, 1 to 10 (default 1) |
curl -X POST "https://admin.vps.org/api/v1/domains/e4b7a2c9-1d3f-4e5a-8b6c-7d8e9f0a1b2c/renew/" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"years": 1}'
{
"success": true,
"domain_uuid": "e4b7a2c9-1d3f-4e5a-8b6c-7d8e9f0a1b2c",
"new_expiration": "2028-01-15T10:30:00+00:00",
"message": "example.com renewed successfully for 1 year(s)!"
}
| 200 | Domain renewed |
| 400 | Invalid years, no renewal price for the domain, no usable payment method, or the payment failed |
| 404 | Not found, or it belongs to another account |
| 500 | Payment could not be processed, or the payment went through but the registrar renewal failed. Contact support in that case. |
Sets the domain's nameservers at the registrar and returns the updated domain object. To manage DNS with the DNS API, use ns1.vps.org, ns2.vps.org and ns3.vps.org and create a zone for the domain.
Required permission: domains:update
| Parameter | Type | Required | Description |
|---|---|---|---|
nameserver1 |
string | Yes | Primary nameserver hostname |
nameserver2, nameserver3, nameserver4 |
string | No | Additional nameserver hostnames |
curl -X PUT "https://admin.vps.org/api/v1/domains/e4b7a2c9-1d3f-4e5a-8b6c-7d8e9f0a1b2c/nameservers/" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"nameserver1": "ns1.vps.org", "nameserver2": "ns2.vps.org", "nameserver3": "ns3.vps.org"}'
| 200 | Nameservers updated; the body is the domain object |
| 400 | nameserver1 missing |
| 404 | Not found, or it belongs to another account |
| 500 | The update failed; the body has error and message fields |
Sets auto_renew and returns the updated domain object. Send enabled as a JSON boolean: any non-empty string, including the string false, turns auto-renewal on.
Required permission: domains:update
curl -X PUT "https://admin.vps.org/api/v1/domains/e4b7a2c9-1d3f-4e5a-8b6c-7d8e9f0a1b2c/auto-renew/" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"enabled": false}'
| 200 | Setting saved; the body is the domain object |
| 400 | enabled missing |
| 404 | Not found, or it belongs to another account |