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.

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.

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. Verify state via GET before retrying an unclear failure.

Last updated on

How is this guide?

On this page