Get a domain version
Returns a single lifecycle event from a domain's append-only history, addressed by its per-domain version number. The event carries two things:
-
snapshot: the complete frozen state of the domain at that version (expiry, auto-renew, term, roid, sponsoring registrar, contacts, nameservers, EPP statuses, DNSSEC DS records). -
changes: the field-level deltas versus the previous version, so a client can renderExpiry: 1 Jan 2025 -> 1 Jan 2026without diffing snapshots itself. The first (registration) version reports its seeded values asnull -> value.
Change kinds
Each entry in changes has a kind describing how to render it:
| Kind | Meaning | from/to shape |
|---|---|---|
| date | timestamp field (expiry) | RFC 3339 string |
| toggle | boolean (auto-renew) | bool |
| count | integer (term) | number |
| text | scalar string (roid, sponsoring registrar) | string |
| list | set field (nameservers, EPP statuses, DS records) | array |
| reference | a contact role | object |
Permissions
| Key type | Accepted | Permission required | Notes |
|---|---|---|---|
| Org API key | yes | domain:read |
Key must be scoped to the org that owns the domain. |
| Personal API key | yes | domain:read |
Requires X-Org-ID for the owning org; caller needs a role granting domain:read and team visibility of the domain. |
Error Codes
| Code | HTTP | Description |
|---|---|---|
| domain_version.get.unauthorized | 401 | No authenticated identity |
| domain_version.get.no_org | 403 | No active organization in scope |
| domain_version.get.invalid_id | 400 | Malformed domain id |
| domain_version.get.invalid_version | 400 | Version is not a positive integer |
| domain_version.get.not_found | 404 | Domain or version does not exist or is not visible to the caller |
| domain_version.get.failed | 500 | Version lookup failed |
Path Parameters
- Type: stringidrequired
Domain id (dom_...)
- Type: integerversionrequired
Version number (1-based)
Responses
- application/json
- application/json
- application/json
- application/json
- application/json
- application/json
Request Example for get/domains/{id}/versions/{version}
curl 'https://api.nametrust.com/domains/{id}/versions/1'
{
"object": "domain_version",
"occurred_at": "2026-01-01T00:00:00Z",
"id": "domv_01h455vb4pex5vsknk084sn02q",
"domain_id": "dom_01h455vb4pex5vsknk084sn02q",
"version": 3,
"change_type": "renewed",
"change_summary": "Renewed for 1 year",
"snapshot": {
"object": "domain_version_snapshot",
"ds_records": [
{
"object": "domain_version_ds",
"key_tag": 12345,
"algorithm": 13,
"digest_type": 2,
"digest": "49FD46E6C4B45C55D4AC",
"max_sig_life": 604800
}
],
"auto_renew": true,
"period": {
"object": "period",
"count": 1,
"unit": "y"
},
"expires_at": "2027-01-01T00:00:00Z",
"roid": "D123-EXMP",
"sponsoring_registrar": "registrar-1234",
"contacts": [
{
"object": "domain_version_contact",
"street2": "Suite 200",
"city": "Mountain View",
"region": "California",
"postal_code": "94043",
"country_code": "US",
"disclose": false,
"verification_status": "verified",
"is_active": true,
"role": "registrant",
"first_name": "Jane",
"last_name": "Doe",
"org_name": "Acme Inc",
"email": "jane@acme.com",
"phone": "+1.5555550100",
"fax": "+1.5555550101",
"street1": "100 Main St"
}
],
"nameservers": [
"ns1.example.com"
],
"epp_statuses": [
"clientTransferProhibited"
]
},
"changes": [
{
"object": "domain_version_change",
"field": "expires_at",
"label": "Expiry",
"kind": "date",
"from": {},
"to": {}
}
],
"changed_by": {
"object": "actor",
"method": "session",
"user": {
"object": "user",
"last_login_at": "2025-06-15T09:30:00Z",
"last_active_at": "2025-06-15T09:30:00Z",
"id": "user_01h455vb4pex5vsknk084sn02q",
"email": "jane@acme.com",
"first_name": "Jane",
"last_name": "Doe",
"avatar_url": "https://example.com/avatar.jpg",
"mfa_enabled": true,
"created_at": "2025-06-01T12:00:00Z",
"updated_at": "2025-06-15T09:30:00Z"
},
"personal_key": {
"object": "actor_personal_key",
"id": "pkey_01h455vb4pex5vsknk084sn02q"
},
"org_key": {
"object": "actor_org_key",
"id": "okey_01h455vb4pex5vsknk084sn02q"
}
}
}