VPS.org API

REST API Documentation

Domains API

Search for available domain names, register and renew domains, and manage their nameservers and auto-renewal. Domains are identified by their uuid.

Endpoints 7
Base Path /api/v1/domains
GET /api/v1/domains/

List All Domains

Returns the domains registered in your account, 25 per page. The list has no filters.

Required permission: domains:list

Example Request

cURL
Python
JavaScript
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);

Example Response

{
  "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"
    }
  ]
}

Response Fields

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)
GET /api/v1/domains/{uuid}/

Get Domain Details

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"

Response Status Codes

200 Success
404 Not found, or it belongs to another account
POST /api/v1/domains/search/

Search Domain Availability

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

Request Body Parameters

Parameter Type Required Description
domain string Yes A name with or without an extension, for example mysite or mysite.com (2 to 63 characters)

Example Request

cURL
Python
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"])

Example Response

{
  "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.

Response Status Codes

200 Success
400 Missing domain, or it contains characters other than letters, digits and hyphens
500 The registrar lookup failed. Retry later.
POST /api/v1/domains/register/

Register New Domain

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:*)

Request Body Parameters

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}'

Example Response

{
  "success": true,
  "domain_uuid": "e4b7a2c9-1d3f-4e5a-8b6c-7d8e9f0a1b2c",
  "domain_name": "mysite.dev",
  "message": "mysite.dev registered successfully!"
}

Response Status Codes

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.
POST /api/v1/domains/{uuid}/renew/

Renew a Domain

Renews the domain and charges its renewal_price for each year to your saved payment method.

Required permission: domains:renew

Request Body Parameters

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)!"
}

Response Status Codes

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.
PUT /api/v1/domains/{uuid}/nameservers/

Update Nameservers

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

Request Body Parameters

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"}'

Response Status Codes

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
PUT /api/v1/domains/{uuid}/auto-renew/

Turn Auto-Renewal On or Off

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}'

Response Status Codes

200 Setting saved; the body is the domain object
400 enabled missing
404 Not found, or it belongs to another account

Notes