Skip to content

Domain expiry quickstart

By the end of this guide your domain’s registration is being read once a day, you will know how to tell a healthy result from a stale one, and you will know what to do if your TLD is one of the ten that publish no expiry date.

  • An existing HTTP check. If you do not have one, follow the HTTP checks quickstart.
  • The HTTP check’s URL must be on a domain you register yourself. Hosts on shared platform suffixes (*.github.io, *.herokuapp.com, *.vercel.app) cannot be monitored this way. See step 3.
  1. Open the HTTP check, then Settings.

  2. Toggle Monitor DNS on, and save.

The domain check is provisioned immediately, but it runs on its own daily schedule with a flexible window of up to four hours, so the first result may take a few hours to appear rather than landing on save.

The HTTP check page shows a DNS sub-card with the current status, the registrable domain being monitored, and the expiry date once the first run completes.

Five things to check on that first result:

  • domain is the registrable domain, not the hostname you monitor. https://www.example.com/orders is monitored as example.com. That is correct: registries hold registrations, not hostnames.
  • current_status is good, expired or unknown. unknown is not an error state on its own. See the status table.
  • grace_states is empty, and that is the field to watch. A non-empty list means the registration is in trouble no matter how far away the date reads. See the registry states.
  • expiry_source says who gave you the date. rdap and whois are the registry’s own answer. whoxy is a commercial database, used when the registry gave us nothing, and is worth a second look before you act on it. manual is a date somebody at your company typed in. See where the date comes from.
  • expiry_date may differ by a day from your registrar’s control panel. SiteQwality reads the registry’s date, not the registrar’s. That is expected.

If last_failure_reason is ever set, the registry fields around it are the last known values rather than current ones, because a run that could not reach the registry deliberately leaves them alone. The reference covers the distinction between the check and one run of it.

  1. Check that a domain monitor was created at all. Fetch the HTTP check and look for dns_job_id. If it is null, none was provisioned.

  2. If the URL is on a shared platform suffix, that is expected. A create with monitor_dns: true on myapp.vercel.app succeeds and creates the HTTP check, but quietly pairs no domain monitor, because the registration for vercel.app belongs to Vercel. Turning it on afterwards with PUT /http/job/{id} is refused explicitly:

    400 myapp.vercel.app is hosted on vercel.app, which is a shared platform
    domain. Domain-expiry monitoring needs a domain you register yourself.
  3. If the status is unknown, read the failure reason. GET /dns/job/{id}/results returns failure_reason per run. registry_publishes_no_expiry is not a failure and needs step 4. Everything else is a real lookup problem and is listed in the reference.

Eleven TLDs publish no expiry date to anybody, under any protocol, because their registries have decided not to:

.am · .at · .be · .de · .eu · .gg · .im · .nl · .no · .nz

A domain on one of them reports registry_publishes_expiry: false, expiry_date: null, current_status: unknown and last_failure_reason: "registry_publishes_no_expiry". The check is not broken. No source has the date, so there is nothing to wait for and nothing to retry. Registrar and nameserver change alerts still work normally.

The fix is to tell SiteQwality the date yourself.

  1. Open the HTTP check and find the domain card. On these TLDs it says the registry publishes no expiry date, instead of showing a countdown.

  2. Enter your renewal date and save.

From then on the check behaves like any other: warnings at 90, 60, 30 and 7 days, then on the lapse, each rung once. expiry_source reads manual.

You do not need to do anything to receive alerts: they go to the same notification groups as the parent HTTP check. What arrives is one of five messages.

TriggerHeadline
A ladder rung (90, 60, 30 or 7 days)example.com expires in 30 days
The registration lapsesexample.com expires today, or example.com has expired if it lapsed before monitoring saw it
The registry starts holding the domainexample.com is in auto renew period
The sponsoring registrar changesexample.com changed registrar
The nameserver delegation changesexample.com changed nameservers