domains

PUT /v1/domains/{domainId}/contacts

Change the registrant contact (drives the registrar first).

All domains endpoints

Authentication

Send an API key as a bearer token. This endpoint does not state a specific permission in the specification, so give your key the least it needs and check the response rather than assuming.

This endpoint takes no organisation id. Your key already identifies the organisation it belongs to, and the response is scoped to it.

Try it

Replace anything in angle brackets with your own values, and the key placeholder with a key from your dashboard.

curl -X PUT https://api.zinndigital.com/v1/domains/{domainId}/contacts \
  -H "Authorization: Bearer zdk_live_…" \
  -H "Content-Type: application/json" \
  -d '{ "first": <string>, "last": <string>, "email": <string>, "phone": <string>, "street": <string[]>, "city": <string>, "postcode": <string>, "country": <string> }'

Signed in? The API console in your dashboard fills in your real organisation id and your own key, and runs the request against the live API so you can see the actual response. Open this endpoint in the API console

Details

**This is not a preference.** The registrant address is the ICANN record of who owns the domain and is what the registry emails to verify the registration — an unverified or bouncing one gets the domain **suspended**, so a customer who moves house or changes email needs to be able to correct it. The registrar is driven **first** and our mirror is written only once it accepted. The reverse order would show a customer their new address over a registry that still holds the old one. **Every field is required.** ICANN treats a registrant change as one record, several registries re-verify the whole contact on any change, and the drivers replace the set rather than patching a field — so a partial body would merge into whatever our mirror happened to hold. `422` where the registrar cannot change contacts at all (the Cloudflare route), naming support rather than telling the customer to retry something that will never work. `503` where it could not, which is worth retrying.

Parameters

NameTypeRequiredWhat it is
domainId (path)UuidYesThe domain's id.

Request body

NameTypeRequiredWhat it is
firststringYes
laststringYes
org_namestringNo
emailstringYes
phonestringYesE.164-ish. Validated permissively on purpose — the registry is the authority on what it accepts, and a client-side rule that refused a legitimate international number would be a…
streetstring[]Yes
citystringYes
statestringNoMay be blank — most of the world has no state. The Cloudflare adapter substitutes the city where its API demands one.
postcodestringYes
countrystringYes

Response

NameTypeRequiredWhat it is
contactDomainContact | nullYes
editablebooleanYesWhether this domain's registrar publishes a contact-update path. `false` on the Cloudflare route; the console renders the panel read-only rather than offering a control that ans…

Errors this endpoint can return

401 · 403 · 404 · 422 · 429 · 503