domains
PUT /v1/domains/{domainId}/contacts
Change the registrant contact (drives the registrar first).
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
| Name | Type | Required | What it is |
|---|---|---|---|
domainId (path) | Uuid | Yes | The domain's id. |
Request body
| Name | Type | Required | What it is |
|---|---|---|---|
first | string | Yes | — |
last | string | Yes | — |
org_name | string | No | — |
email | string | Yes | — |
phone | string | Yes | E.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… |
street | string[] | Yes | — |
city | string | Yes | — |
state | string | No | May be blank — most of the world has no state. The Cloudflare adapter substitutes the city where its API demands one. |
postcode | string | Yes | — |
country | string | Yes | — |
Response
| Name | Type | Required | What it is |
|---|---|---|---|
contact | DomainContact | null | Yes | — |
editable | boolean | Yes | Whether 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