List domain changes
The catalog's change feed, newest first.
Name events of catalog names: price, status, expiry, lifecycle, registrar, transfer, lock, renewal, nameserver, parking and auction events. With since, oldest first from that time, for polling.
plan_required..csv)Keep a key on a server: a page a visitor loads shows it to everyone.
Request
typesstringOptionalQueryComma list of change types (default all): price_drop, price_increase, status_change, expiry_window, lifecycle_move, registrar_change, transfer, lock_removed, renewal_observed, nameserver_change, parking_change, auction_ending, auction_jump.
endingstringOptionalQueryComma list of endings without the dot.
sincestringOptionalQueryEvents observed at or after this time, oldest first.
limitintegerOptionalQueryRows a page: 20 by default, at most 20 without a key and 100 with a paid subscription; a larger value is clamped.
cursorstringOptionalQueryThe meta.cursor of the previous page; the last page answers null.
fieldsstringOptionalQueryComma-separated top-level keys to keep; an unknown key answers 400 unsupported_field.
curl -X GET "https://api.unique.domains/v1/domains/changes?types=price_drop&ending=com%2Cio" \ -H "Authorization: Bearer YOUR_MEMBER_KEY"
const response = await fetch("https://api.unique.domains/v1/domains/changes?types=price_drop&ending=com%2Cio", {
method: "GET",
headers: {
"Authorization": "Bearer YOUR_MEMBER_KEY",
},
});
const data = await response.json();
console.log(data);import requests
response = requests.get(
"https://api.unique.domains/v1/domains/changes?types=price_drop&ending=com%2Cio",
headers={
"Authorization": "Bearer YOUR_MEMBER_KEY",
},
)
print(response.json())req, err := http.NewRequest("GET", "https://api.unique.domains/v1/domains/changes?types=price_drop&ending=com%2Cio", nil)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer YOUR_MEMBER_KEY")
res, err := http.DefaultClient.Do(req)$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => "https://api.unique.domains/v1/domains/changes?types=price_drop&ending=com%2Cio",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOUR_MEMBER_KEY",
],
]);
$response = curl_exec($ch);uri = URI("https://api.unique.domains/v1/domains/changes?types=price_drop&ending=com%2Cio")
request = Net::HTTP::Get.new(uri)
request["Authorization"] = "Bearer YOUR_MEMBER_KEY"
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(request) }Response
idstringnamestringtypestringobservedAtstringsubjectobjectbeforeobject | nullafterobject | nullexpiresAtstring | nullErrors
{
"data": [
{
"id": "5b1f7c3e-2d48-4a9b-8e60-f1c2d3a4b5e6",
"name": "harbor.co",
"type": "price_drop",
"observedAt": "2026-11-05T03:12:00.000Z",
"subject": {
"kind": "name",
"key": "harbor.co"
},
"before": {
"price": 116
},
"after": {
"price": 27.5
},
"expiresAt": null
}
],
"meta": {
"asOf": "2026-11-05T08:00:00Z",
"cursor": null,
"limit": 20
},
"links": {
"self": "https://api.unique.domains/v1/domains/changes?types=price_drop&ending=com%2Cio",
"next": null,
"register": null,
"product": null,
"dataset": null
}
}