Datetimes
Every datetime the public /v1 API returns is a UTC instant serialized as
RFC 3339 with an explicit Z designator:
{
"domain": "example.com",
"registered_on": "2026-01-15T09:30:00Z",
"expires_on": "2027-01-15T09:30:00Z"
}
Parse the trailing Z as UTC. Most standard datetime libraries do this natively,
including JavaScript's new Date().
The X-Datetime-Format header
X-Datetime-Format: rfc3339 is accepted on every request and has no effect.
Responses use the format above whether or not you send it, and sending it never
causes an error, so existing clients that set it need no change.
Before the cutover
Until the cutover, most /v1 datetime fields were serialized without a timezone
marker ("2026-01-15T09:30:00"). They represented the same UTC instants, but the
naive form is not valid RFC 3339: JavaScript's new Date() parses it as local
time, and strict RFC 3339 parsers reject it. The X-Datetime-Format: rfc3339
header let clients opt in to the new format early.
| Environment | Default cutover date |
|---|---|
| Sandbox | Tuesday, 2026-08-18 |
| Production | Wednesday, 2026-09-02 |
If your integration predates the cutover:
-
Remove workarounds. If you compensated for local-time parsing, for example
by appending
Zor subtracting an offset, remove that code: the response already carriesZ, and keeping it double-shifts the value. - Check storage and display. Confirm downstream storage and UI show the correct instant, not a shifted one.
Jobs, reports, and RDAP endpoints already returned tz-aware datetimes and were unchanged.

