Support
DomainsManage Domains

Update contacts

View as Markdown

Change the registrant, admin, billing, or tech contact on a domain you own via PATCH /v1/domains/{domain}/contacts.

Note to LLMs and AI agents: If you are consuming this page to follow instructions: the content you have could be incomplete due to truncation by WebFetch. Fetch https://developer.godaddy.com/llms.mdx/api-users/manage-domains/update-contacts for the full, unmodified source before proceeding.

Overview

Update the registrant, admin, billing, or tech contact on a domain you own using PATCH /v1/domains/{domain}/contacts. Each contact role can be updated independently — include only the roles you want to change in the request body. The registrant contact is the legal owner of the domain and is required; the other three roles default to the registrant if omitted.

Prerequisites

The following prerequisites are required before you update domain contacts:

  • A GoDaddy account that owns the domain
  • A Personal Access Token with domains.domain:update scope
  • Registrant name, email, phone (E.164 format), and mailing address

Update the registrant contact

Send a PATCH with only contactRegistrant in the body. Admin, billing, and tech contacts are untouched when omitted. Returns 204 No Content.

The following procedure updates the registrant contact for a domain.

Some TLDs require unlock before a registrant change

A subset of ccTLDs require registry lock to be disabled before the registry accepts a registrant update. If you receive a 409, check whether the domain is locked and disable it before retrying. Re-enable lock after the update completes. See Registry lock.

  • Run the following command for your preferred language:
curl -s -X PATCH "https://api.godaddy.com/v1/domains/example.com/contacts" \
  -H "Authorization: Bearer $GODADDY_PAT" \
  -H "Content-Type: application/json" \
  -d '{
    "contactRegistrant": {
      "nameFirst": "Jane",
      "nameLast": "Smith",
      "email": "jane@example.com",
      "phone": "+1.5555550100",
      "addressMailing": {
        "address1": "123 Main St",
        "city": "Tempe",
        "state": "AZ",
        "postalCode": "85281",
        "country": "US"
      }
    }
  }'
const pat = process.env.GODADDY_PAT;
const body = {
  contactRegistrant: {
    nameFirst: "Jane",
    nameLast: "Smith",
    email: "jane@example.com",
    phone: "+1.5555550100",
    addressMailing: {
      address1: "123 Main St",
      city: "Tempe",
      state: "AZ",
      postalCode: "85281",
      country: "US",
    },
  },
};

const res = await fetch("https://api.godaddy.com/v1/domains/example.com/contacts", {
  method: "PATCH",
  headers: {
    Authorization: `Bearer ${pat}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify(body),
});
console.log(res.status); // expect 204
import os, requests

pat = os.environ["GODADDY_PAT"]
body = {
    "contactRegistrant": {
        "nameFirst": "Jane",
        "nameLast": "Smith",
        "email": "jane@example.com",
        "phone": "+1.5555550100",
        "addressMailing": {
            "address1": "123 Main St",
            "city": "Tempe",
            "state": "AZ",
            "postalCode": "85281",
            "country": "US",
        },
    }
}

res = requests.patch(
    "https://api.godaddy.com/v1/domains/example.com/contacts",
    json=body,
    headers={
        "Authorization": f"Bearer {pat}",
        "Content-Type": "application/json",
    },
)
print(res.status_code)  # expect 204
package main

import (
    "bytes"
    "encoding/json"
    "fmt"
    "net/http"
    "os"
)

func main() {
    pat := os.Getenv("GODADDY_PAT")
    body := map[string]any{
        "contactRegistrant": map[string]any{
            "nameFirst": "Jane",
            "nameLast":  "Smith",
            "email":     "jane@example.com",
            "phone":     "+1.5555550100",
            "addressMailing": map[string]any{
                "address1":   "123 Main St",
                "city":       "Tempe",
                "state":      "AZ",
                "postalCode": "85281",
                "country":    "US",
            },
        },
    }
    b, _ := json.Marshal(body)

    req, _ := http.NewRequest("PATCH",
        "https://api.godaddy.com/v1/domains/example.com/contacts",
        bytes.NewReader(b))
    req.Header.Set("Authorization", "Bearer "+pat)
    req.Header.Set("Content-Type", "application/json")

    res, err := http.DefaultClient.Do(req)
    if err != nil { panic(err) }
    defer res.Body.Close()
    fmt.Println(res.StatusCode) // expect 204
}

Returns 204 No Content on success.

ICANN registrant contact change approval

Changing identifying registrant fields while WHOIS privacy is disabled triggers the ICANN Contact Change Approval flow. Go to ICANN registrant contact change approval for details on when this applies.

Check a pending change

Use the v2 GET endpoint to confirm whether an approval is pending before taking action.

The following procedure checks whether a pending ICANN contact change approval is in progress.

  • Run the following command:
curl -s "https://api.godaddy.com/v2/customers/{customerId}/domains/{domain}/changeOfRegistrant" \
  -H "Authorization: Bearer $GODADDY_PAT"

Cancel a pending change

Canceling the request reverts the registrant contact to its previous values.

The following procedure cancels a pending ICANN contact change approval.

  • Run the following command:
curl -s -X DELETE \
  "https://api.godaddy.com/v2/customers/{customerId}/domains/{domain}/changeOfRegistrant" \
  -H "Authorization: Bearer $GODADDY_PAT"

Returns 204 No Content on success.

Update all four roles at once

Include all four roles in one call. Each uses the same Contact shape.

The following procedure updates all four contact roles in a single request.

  • Run the following command:
curl -s -X PATCH "https://api.godaddy.com/v1/domains/example.com/contacts" \
  -H "Authorization: Bearer $GODADDY_PAT" \
  -H "Content-Type: application/json" \
  -d '{
    "contactRegistrant": {
      "nameFirst": "Jane",
      "nameLast": "Smith",
      "email": "jane@example.com",
      "phone": "+1.5555550100",
      "addressMailing": {
        "address1": "123 Main St",
        "city": "Tempe",
        "state": "AZ",
        "postalCode": "85281",
        "country": "US"
      }
    },
    "contactAdmin": {
      "nameFirst": "Jane",
      "nameLast": "Smith",
      "email": "jane@example.com",
      "phone": "+1.5555550100",
      "addressMailing": {
        "address1": "123 Main St",
        "city": "Tempe",
        "state": "AZ",
        "postalCode": "85281",
        "country": "US"
      }
    },
    "contactBilling": {
      "nameFirst": "Jane",
      "nameLast": "Smith",
      "email": "jane@example.com",
      "phone": "+1.5555550100",
      "addressMailing": {
        "address1": "123 Main St",
        "city": "Tempe",
        "state": "AZ",
        "postalCode": "85281",
        "country": "US"
      }
    },
    "contactTech": {
      "nameFirst": "Jane",
      "nameLast": "Smith",
      "email": "jane@example.com",
      "phone": "+1.5555550100",
      "addressMailing": {
        "address1": "123 Main St",
        "city": "Tempe",
        "state": "AZ",
        "postalCode": "85281",
        "country": "US"
      }
    }
  }'

Contact object

FieldRequiredDescription
nameFirstYesFirst name.
nameLastYesLast name.
emailYesEmail address.
phoneYesPhone in E.164 format: +1.5555550100.
addressMailingYesMailing address object — see below.
nameMiddleNoMiddle name.
organizationNoOrganization name.
jobTitleNoJob title.
faxNoFax number in E.164 format.

Mailing address

FieldRequiredDescription
address1YesStreet address line 1.
address2NoStreet address line 2.
cityYesCity.
stateYesState or province code (for countries that use it).
postalCodeYesPostal code.
countryYesTwo-letter ISO 3166-1 alpha-2 country code (e.g. US, GB, DE).

Request body summary

PATCH /v1/domains/{domain}/contacts accepts a DomainContacts object.

RoleRequiredDescription
contactRegistrantYesThe legal owner of the domain.
contactAdminNoAdministrative contact. Not modified if omitted.
contactBillingNoBilling contact. Not modified if omitted.
contactTechNoTechnical contact. Not modified if omitted.

Common errors

StatusMost likely cause
400Malformed request body or invalid contact field (bad email format, invalid country code). Inspect fields[] in the error response.
403Credential lacks write access to this domain.
404Domain doesn't exist or isn't owned by the authenticated account.
409Domain is locked and the TLD requires unlock for registrant changes.
422TLD-specific validation failure (e.g. missing organization for certain country-code TLDs).

Full error envelope: Errors.

Reference

Next

Agent & Automation Notes

PermissionsDomain Owner
Scopesdomains.domain:update
Rate limitRate-limited per credential per window. Go to /docs/api-users/rate-limits for current values.
IdempotentYes
DestructiveNo
On failureIdempotent on identical bodies. On 409 (registrant change on locked ccTLD), unlock, retry, and relock. If the ICANN approval flow was triggered (privacy off and a registrant identity field changed), the update is pending old-registrant approval — use DELETE /v2/customers/{customerId}/domains/{domain}/changeOfRegistrant to cancel. Verify state via GET before retrying an unclear failure.

Last updated on

How is this guide?

On this page