Check Domain Registration Again

POST /v1/domains/self/{uuid}/expiry-check

The Check again action for a custom domain that is suspended because its registration expired (domain status expired). It asks the platform to look the registration up again right now — from the Cloudflare Registrar record when the domain's DNS provider is Cloudflare and Cloudflare has one, otherwise from RDAP (the TLD registry), otherwise from WHOIS — instead of waiting for the automatic re-check that runs every 4 hours. The check is answered within seconds.

If the lookup shows the domain renewed — an expiry date more than 7 days in the future and none of the registry statuses auto renew period, redemption period, pending delete, pending restore, client hold, server hold — the domain is reactivated: the domain and each of its endpoints come back exactly as they were before the suspension and certificate renewal resumes. Only a fresh, successful lookup counts — an error, an empty answer, a date that is still in the past, or a new date the registry shows with one of those statuses (many registries move the date a year forward on the expiry day even if nobody has paid) leaves the domain suspended. What the lookup found is in the domain's registration object. See Domain registration expiry for the whole lifecycle.

The request is queued — the response returns immediately with 202. Poll GET /v1/domains/self/{uuid}/acme/status for the outcome: its expiry_suspension.check_state goes requested → running → idle with a last_check_outcome. When the renewal is found, the domain is no longer suspended: status is back to what it was and expiry_suspension disappears from the response.

Limit: once per 10 minutes per domain, whoever asks (admins included) — the dashboard's Check again button and this endpoint share the same limit. Requires the domains:update permission in the active account.

Path parameters

uuid string (uuid) Req
Domain UUID of a custom domain in your active account.

Request body

None — empty body.

Response (202 Accepted)

ok boolean
true — the check was requested.
message string
Human-readable confirmation.
expiry_suspension object
The domain's suspension right after the request (check_state: "requested"). See the expiry_suspension object.

The expiry_suspension object

Present on a domain while it is suspended because its registration expired; absent otherwise. It is returned by this endpoint, by GET /v1/domains/self/{uuid}/acme/status, on the items of GET /v1/domains/self and on the items of GET /v1/domains/available?include_inactive=1.

suspended_at datetime
When the domain was suspended.
expires_at datetime?
The domain's stored registration expiry date (the same as registration.expires_at). A new date the registry reports with a grace or hold status doesn't replace it — see registration.not_renewed_status.
deletes_at datetime
suspended_at + 30 days. If the domain is still not renewed by then, the domain, its endpoints and its certificates are permanently deleted (after one last check — a domain renewed at the last minute is reactivated instead).
recheck_interval_hours integer
How often the registration is re-checked automatically while suspended — 4.
check_again_available boolean
Whether Check again (this endpoint) is available on the platform. When false, this endpoint answers 503.
check_state string
idle | requested (Check again asked for, waiting to run) | running (the check is in progress).
last_checked_at datetime?
When the registration was last re-checked (automatically or by Check again).
last_check_outcome string?
Why the last re-check left the domain suspended: still_expired — not renewed yet: the expiry date is still in the past, or the registry still shows a grace or hold status such as auto renew period (the renewal isn't paid or complete yet): renew the domain at your registrar, or check with them that the renewal went through; lookup_failed — the registration couldn't be looked up (the reason is in registration.lookup_error); it is tried again on the next check. For a Cloudflare domain, also check the DNS provider API token (you can update the credentials with PUT /v1/domains/self/{uuid}); unsupported — no registration lookup is available for this domain; rare — only when the registry lookups (RDAP / WHOIS) are turned off on the platform and the DNS provider isn't Cloudflare: contact support; account_suspended — the domain was renewed, but the account is suspended: it comes back once the account is active again; error — a failure on the platform side, retried automatically.
check_requested_at datetime?
When Check again was last requested for this domain.
next_check_allowed_at datetime?
When the next Check again is accepted (check_requested_at + 10 minutes).

Errors

401 Unauthorized
Missing auth.
403 Forbidden
Your role in the account lacks the domains:update permission, or the account is suspended (view-only).
404 Not Found
Domain doesn't exist or doesn't belong to your active account.
409 Conflict
code: "not_expiry_suspended" — the domain isn't suspended for an expired registration.
429 Too Many Requests
code: "expiry_check_rate_limited" — the domain was checked less than 10 minutes ago. The Retry-After header gives the wait in seconds; the body also carries expiry_suspension (see next_check_allowed_at).
503 Service Unavailable
Check again isn't available on the platform yet.
Request
curl -X POST "https://api.ngris.com/v1/domains/self/<uuid>/expiry-check" \ -H "X-API-KEY: <your_api_key>"
Poll the outcome
curl "https://api.ngris.com/v1/domains/self/<uuid>/acme/status" \ -H "X-API-KEY: <your_api_key>" # expiry_suspension.check_state: requested → running → idle # expiry_suspension gone = renewal found, domain reactivated
Response — 202 Accepted
{ "ok": true, "message": "Checking the registration with your DNS provider now. This usually takes a few seconds.", "expiry_suspension": { "suspended_at": "2026-09-28T00:05:12Z", "expires_at": "2026-09-28T00:00:00Z", "deletes_at": "2026-10-28T00:05:12Z", "recheck_interval_hours": 4, "check_again_available": true, "check_state": "requested", "last_checked_at": "2026-09-30T08:05:40Z", "last_check_outcome": "still_expired", "check_requested_at": "2026-09-30T09:12:40Z", "next_check_allowed_at": "2026-09-30T09:22:40Z" } }
Response — 429 Too Many Requests
Retry-After: 420 { "error": "This domain was checked less than 10 minutes ago. Try again in 7 minutes.", "code": "expiry_check_rate_limited", "expiry_suspension": { "check_state": "idle", "next_check_allowed_at": "2026-09-30T09:22:40Z", ... } }
Response — 409 Conflict
{ "error": "This domain isn't suspended for an expired registration.", "code": "not_expiry_suspended" }