# Update contacts (https://developer.godaddy.com/en/docs/api-users/manage-domains/update-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](https://developer.godaddy.com/docs/api-users/auth) 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.

<Callout type="warning" title="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](https://developer.godaddy.com/docs/api-users/manage-domains/lock).
</Callout>

* Run the following command for your preferred language:

<Tabs items={['curl', 'Node', 'Python', 'Go']}>
  <>
    <Tab value="curl">
      ```bash
      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"
            }
          }
        }'
      ```
    </Tab>

    <Tab value="Node">
      ```js
      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
      ```
    </Tab>

    <Tab value="Python">
      ```python
      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
      ```
    </Tab>

    <Tab value="Go">
      ```go
      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
      }
      ```
    </Tab>
  </>
</Tabs>

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:

```bash
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

| Field            | Required | Description                             |
| ---------------- | -------- | --------------------------------------- |
| `nameFirst`      | Yes      | First name.                             |
| `nameLast`       | Yes      | Last name.                              |
| `email`          | Yes      | Email address.                          |
| `phone`          | Yes      | Phone in E.164 format: `+1.5555550100`. |
| `addressMailing` | Yes      | Mailing address object — see below.     |
| `nameMiddle`     | No       | Middle name.                            |
| `organization`   | No       | Organization name.                      |
| `jobTitle`       | No       | Job title.                              |
| `fax`            | No       | Fax number in E.164 format.             |

### Mailing address

| Field        | Required | Description                                                         |
| ------------ | -------- | ------------------------------------------------------------------- |
| `address1`   | Yes      | Street address line 1.                                              |
| `address2`   | No       | Street address line 2.                                              |
| `city`       | Yes      | City.                                                               |
| `state`      | Yes      | State or province code (for countries that use it).                 |
| `postalCode` | Yes      | Postal code.                                                        |
| `country`    | Yes      | Two-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.

| Role                | Required | Description                                      |
| ------------------- | -------- | ------------------------------------------------ |
| `contactRegistrant` | Yes      | The legal owner of the domain.                   |
| `contactAdmin`      | No       | Administrative contact. Not modified if omitted. |
| `contactBilling`    | No       | Billing contact. Not modified if omitted.        |
| `contactTech`       | No       | Technical contact. Not modified if omitted.      |

## Common errors

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

Full error envelope: [Errors](https://developer.godaddy.com/docs/api-users/errors).

## Reference

* [v1 domain settings — `PATCH /v1/domains/{domain}/contacts`](https://developer.godaddy.com/docs/references/rest/domains/v1/manage-domain-settings)

## Next

<Cards>
  <Card title="Registry lock" description="Unlock before a registrant change on TLDs that require it, then re-lock." href="/docs/api-users/manage-domains/lock" />
</Cards>
