# Manage DNS for a bought domain

Source: https://modulify.ai/docs/publish/manage-dns

Edit the DNS records and nameservers of a domain the workspace bought, and see the records Modulify keeps in it for your sites and email domains.

A domain the workspace buys on the **Domains** page starts out on Modulify's nameservers, `ns1.modulify.ai` and `ns2.modulify.ai`, so its DNS is managed from the domain's own page in Modulify. There you add, edit and delete its records and move it to other nameservers. When a site or an email domain of the workspace uses the domain, Modulify adds the records it needs by itself, keeps them locked, and deletes them once nothing needs them. For a domain you bought somewhere else, the records go in at its own DNS host, see [Connect a custom domain](https://modulify.ai/docs/publish/custom-domains).

## Before you begin

Everyone in the workspace can open a domain's page and read its records and nameservers. Changing them needs the **Manage domains** permission, the same one that adds custom domains to a site. The workspace owner always has it, and a custom role can be given it. Without it, **Add record**, **Change nameservers** and the items in each record's menu are disabled with the tooltip `You do not have permission to do this.` See [Members and roles](https://modulify.ai/docs/reference/members-and-roles).

The domain also has to be **Active** or **Expiring soon**. An **Expired** domain still lists its records, but every change is disabled with the tooltip `Renew this domain before you change it.`, and a **This domain has expired** notice with a **Renew domain** button sits above the tabs, see [Notices above the tabs](https://modulify.ai/docs/publish/buy-a-domain#notices-above-the-tabs).

## Open a domain's page

On the **Domains** page, click the row of a registered domain, or choose **Manage DNS** from its row menu. The page opens at `/dashboard/domains/<domain ID>`, where the ID is the one Modulify gives the domain, not its name, and the **Nameservers** and **Settings** tabs add `/nameservers` and `/settings`. It is headed with the domain and its status, with a line such as `Registered Oct 7, 2026. Expires Oct 7, 2027.` When the domain needs renewing, a notice above the tabs says so, see [Notices above the tabs](https://modulify.ai/docs/publish/buy-a-domain#notices-above-the-tabs).

The row of a pending, failed or released domain does not open, and its **Manage DNS** is disabled with the tooltip `DNS opens once the domain is registered.`, `This order failed, so the domain was never registered.` on a failed one, or `This workspace no longer holds this domain.` on a released one. On the page of such a domain, the same tooltip disables the controls of all three tabs. Instead of the records, the **DNS records** tab then reads **Not registered yet**, `Records open once the registrar confirms it.`, **Registration failed**, `No records exist for an unregistered domain.`, or **Domain released**, `This workspace no longer holds this domain.`

The page has three tabs: **DNS records**, **Nameservers** and **Settings**. This page covers the first two. **Settings** holds auto-renew, renewing by hand, the registrant, the transfer lock and the transfer code, see [Auto-renew](https://modulify.ai/docs/publish/buy-a-domain#auto-renew), [Renew a domain](https://modulify.ai/docs/publish/buy-a-domain#renew-a-domain), [Change the registrant](https://modulify.ai/docs/publish/buy-a-domain#change-the-registrant) and [Move a domain to another registrar](https://modulify.ai/docs/publish/buy-a-domain#move-a-domain-to-another-registrar).

If the page cannot load the domain, it reads **Could not load domain**, `This page retries on its own shortly.`, and tries again every 10 seconds.

The page belongs to the workspace you are in. The links in Modulify's domain emails switch you to the workspace that owns the domain first, and any other link to a domain outside your current workspace takes you back to the **Domains** page.

## Read the records

**DNS records** lists every record the domain holds, in four columns: **Type**, **Name**, **Value** and **TTL**. Names are relative to the domain, so `@` is `acme.com` itself and `www` is `www.acme.com`. The list runs by name, with `@` first, then by type. An MX or SRV record shows its priority under the value, and an SRV record its weight and port as well, for example `Priority 10 · Weight 5 · Port 5060`. A lock next to the type marks a record Modulify manages, see [Locked records](https://modulify.ai/docs/publish/manage-dns#locked-records). A name and a value are plain text, and the copy icon next to each one copies it.

**Search by name or value** narrows the list, and the type filter next to it, **All types** until you pick one, keeps a single record type.

| Empty table | When |
| --- | --- |
| **No DNS records**, `Add a record to point this domain.` | The domain holds no records |
| **No matching records**, `Try a different search or record type.` | The search or the type filter matches nothing |
| **Could not load records**, with the reason underneath, for example `You are loading DNS records too fast. Try again in 42 seconds!`, and a **Try again** button | The records could not be read, or you went over the record loads for this minute |

After **Could not load records** the list tries again on its own every 10 seconds. Otherwise it reloads on its own every 5 minutes while the **DNS records** tab is open, and straight away when you switch back to the browser tab, so a change a teammate makes shows up without a refresh. It waits while a record dialog is open or a change is being saved.

## Add a record

Click **Add record** above the table. The dialog is headed **Add DNS record**, `Changes to acme.com usually reach every DNS server within a few minutes.` Fill in the fields and click **Add record**. The **Record added** toast reads `It usually takes a few minutes to reach every DNS server.`, and the record joins the list.

A service that needs records on the domain can also hand you a link that opens Modulify with the records filled in, for you to review and add in one click, see [Add records with a link](https://modulify.ai/docs/publish/add-records-with-a-link).

| Field | What goes in it |
| --- | --- |
| **Type** | The record type, A until you pick another. Each type in the list carries a line on what it does |
| **TTL** | `How long DNS servers keep the record before asking again.` Pick `5 minutes`, `15 minutes`, `30 minutes`, `1 hour`, `4 hours`, `12 hours`, `1 day` or `1 week`. A new record starts at `5 minutes`. The A and AAAA records at one name share a TTL, so saving a new one on any of them changes the others |
| **Name** | `@` for the domain itself, or the part in front of it, such as `www`. A line under the field shows the full name, for example `Answers for www.acme.com` |
| The value | Its label follows the type: **IPv4 address**, **IPv6 address**, **Target**, **Mail server**, **Nameserver** or **Value** |
| **Priority** | MX and SRV records only. A whole number from 0 to 65535, `10` until you change it |
| **Weight** | SRV records only. A whole number from 0 to 65535, `0` until you change it |
| **Port** | SRV records only. A port from 1 to 65535 |

### The record types

| Type | Described as | The value |
| --- | --- | --- |
| A | `Points a name at an IPv4 address.` | An IPv4 address, such as `192.0.2.10` |
| AAAA | `Points a name at an IPv6 address.` | An IPv6 address, such as `2001:db8::10` |
| ANAME | `Points the domain itself at another hostname.` | A hostname |
| CNAME | `Makes a name an alias of another hostname.` | A hostname |
| MX | `Sends email for a name to a mail server.` | The mail server's hostname, with a **Priority** |
| NS | `Hands a subdomain to other nameservers.` | A nameserver's hostname |
| SRV | `Points a service at a host and port.` | The target hostname, with a **Priority**, a **Weight** and a **Port** |
| TXT | `Holds text, like a verification code or an SPF policy.` | Up to 2,048 characters of text |

### The name

- For a record on the domain itself, type `@`, leave the field empty, or type the domain. A full name such as `www.acme.com` is saved as `www`.
- Each part between dots takes letters, numbers, hyphens and underscores, up to 63 characters, and cannot start or end with a hyphen. With the domain added, the full name stays within 253 characters.
- `*` as the first part makes a wildcard name, such as `*` or `*.dev`. NS and SRV records cannot use one.
- An SRV name starts with the service and the protocol, such as `_sip._tcp`. The protocol is `_tcp`, `_udp`, `_tls` or `_sctp`.
- Names are saved in lower case.

### The value

- An ANAME, CNAME, MX, NS or SRV record takes a full hostname, such as `target.example.com`. An IP address is refused there, and a trailing dot is dropped.
- A CNAME record cannot point at its own name.
- A TXT value stays on one line, with no line breaks or other control characters. A value pasted in double quotes, the way many DNS hosts display TXT records, is saved without them, and several quoted parts are joined into one.

### Records that cannot exist together

Modulify refuses these, in the dialog or when you save:

- A CNAME record on `@`. Use an ANAME record to point the domain itself at another hostname.
- An ANAME record at any name other than `@`. Use a CNAME record there.
- A CNAME record next to any other record at the same name, and any record at a name that already holds a CNAME.
- An ANAME record next to an A, AAAA or other ANAME record at the same name.
- An NS record on `@`. The domain's own nameservers change on the **Nameservers** tab.
- An NS record at a name that already holds other records, at that name or under it. An NS record hands the name and every name under it to other nameservers, so those records would stop answering. Several NS records at the same name are fine.
- Any other record at or under a name that holds an NS record, including another NS record further down, because it would never answer.
- A second SPF record, a TXT record starting with `v=spf1`, at a name that already has one. A name can only hold one SPF record, so add to the one that is there.
- A record that is already there: the same name, type and value, and for MX and SRV the same priority. A TXT value counts as the same whether or not it is wrapped in double quotes.
- A new record once the domain holds 100 records.

## Edit or delete a record

Each row's menu, the three dots at its end, holds **Edit record** and **Delete record**. Both are disabled with the same tooltips as **Add record**.

**Edit record** opens the same dialog, headed **Edit DNS record** and filled in with the record. Change what you need, the type included, and click **Save record**. The **Record saved** toast reads `It usually takes a few minutes to reach every DNS server.`

**Delete record** asks first, for example `Delete the A record for www.acme.com?` with `Sites, email or services that rely on this record can stop working once DNS servers drop their cached copy.` Click **Delete record** to confirm. The **Record deleted** toast reads `It stops answering once DNS servers drop their cached copy.`

## When a record is refused

The dialog checks the fields as you type and shows the problem under the field. **Add record** and **Save record** send nothing until every field is right.

| Message under the field | Cause |
| --- | --- |
| `Use letters, numbers, hyphens and underscores between dots, with * only at the start.` | The name has another character, a `*` that is not its first part, or a part or a whole name that is too long |
| `A CNAME record cannot sit on the domain itself. Use an ANAME record there.` | A CNAME record on `@` |
| `An ANAME record can only sit on the domain itself. Use a CNAME record for other names.` | An ANAME record at a name other than `@` |
| `Change the nameservers of the domain itself on the Nameservers tab.` | An NS record on `@` |
| `NS records cannot use * in their name.` or `SRV records cannot use * in their name.` | An NS or SRV record with a wildcard name |
| `Start with the service and the protocol, like _sip._tcp.` | An SRV name without them |
| `Enter an IPv4 address like 192.0.2.10.` | An A record whose value is not an IPv4 address |
| `Enter an IPv6 address like 2001:db8::10.` | An AAAA record whose value is not an IPv6 address |
| `Enter a full hostname like example.com.` | An ANAME, CNAME, NS or SRV value that is not a hostname |
| `Enter the mail server as a full hostname like mail.example.com.` | An MX value that is not a hostname |
| `A CNAME record cannot point at itself.` | A CNAME record whose target is its own name |
| `Enter the text this record holds.` | An empty TXT value |
| `Keep it to 2,048 characters or fewer.` | A TXT value over 2,048 characters |
| `Remove line breaks and other control characters.` | A TXT value with a line break |
| `Use a whole number from 0 to 65535.` | A priority or a weight outside that range |
| `Use a port from 1 to 65535.` | A port outside that range |
| `Pick a TTL from 5 minutes to 1 week.` | A record, such as one added before the domain came here, whose TTL is outside that range |
| `Choose a record type.` | A record of a type the dialog does not offer |

The rest come back from the server, in a **Could not add record** or **Could not save record** toast.

| Message in the toast | Cause |
| --- | --- |
| `This record already exists!` | The same record is already there |
| `A CNAME record cannot share its name with other records!` | The name of the new CNAME record already holds other records |
| `This name already has a CNAME record, and a CNAME record cannot share its name with other records!` | The name already holds a CNAME record |
| `An ANAME record cannot share its name with A, AAAA or other ANAME records!` | The name of the new ANAME record already holds one of those |
| `This name already has an ANAME record, which cannot share its name with A or AAAA records!` | An A or AAAA record at a name that holds an ANAME record |
| `sub.acme.com is handed to other nameservers by an NS record, so a record at or under it would not answer!` | A record at or under a name that holds an NS record |
| `An NS record hands sub.acme.com and every name under it to other nameservers, so the records already there would stop answering. Delete them first!` | An NS record at a name that already holds other records, at it or under it |
| `This name already has an SPF record, and a name can hold only one. Edit that record instead!` | A second TXT record starting with `v=spf1` at the same name |
| `A domain can hold at most 100 DNS records!` | The domain is full. Delete a record first |
| `This DNS record no longer exists!` | You saved a record someone deleted in the meantime |
| `This workspace is changing its domains too fast. Try again in 12 seconds!` | The workspace went over its changes for this minute, see [Limits](https://modulify.ai/docs/publish/manage-dns#limits) |
| `This DNS change was refused: <reason>!` | The record was refused, with the reason |
| `The DNS records could not be loaded: <reason>!` | The records of the domain could not be read before the change, with the reason |
| `Name.com does not list this domain right now. Try again later!` | Name.com did not find the domain the last time Modulify checked it. Modulify checks again every hour. If Name.com still does not list it after a day, and also shows the name as free or registered elsewhere, because it moved to another registrar or was deleted, it shows as released |
| `The DNS of this domain is busy right now. Try again in a moment!` | Its DNS is still being set up, or asked for a pause |
| `The DNS of this domain did not answer. Try again in a moment!` | Its DNS did not answer |

## Change the nameservers

The **Nameservers** tab lists the nameservers the domain uses, with a badge that says who answers for it. Each nameserver is plain text, and the copy icon next to it copies it.

| Badge | Line under it |
| --- | --- |
| **Managed here** | `Modulify answers for this domain, so the records on the DNS records tab are live.` |
| **Other nameservers** | `Other nameservers answer for this domain, so its records are managed where those nameservers are hosted.` |

The **DNS** column of the **Domains** list shows the same badge for each registered domain.

To hand the domain's DNS to another host, click **Change nameservers**. The dialog reads `Point the domain at the nameservers of another DNS host. Its records here stop answering until you switch back.` Type the nameservers your DNS host gave you into **Nameserver 1**, **Nameserver 2** and the rows after them, add a row with **Add nameserver** or drop one with the cross next to it, and click **Save nameservers**. A domain takes at least 2 nameservers and at most 13.

The dialog checks the rows as you type and shows an error under the exact field that is wrong.

| Message under the field | Cause |
| --- | --- |
| `Use a hostname, not an IP address.` | The value is an IP address, such as `192.0.2.10` |
| `Enter a hostname like ns1.example.com.` | The value is not a full hostname |
| `It cannot be under this domain itself.` | The nameserver is the domain itself or a name under it, such as `ns1.acme.com` for `acme.com` |
| `Already listed above.` | The same nameserver sits in a row above |

Once you try to save, a count that does not fit shows under the rows: `Add at least 2 nameservers.` with fewer than 2 rows filled in, or `Use at most 13 nameservers.` with more than 13. Nothing is saved until every row is right.

For an AI client or the [HTTP API](https://modulify.ai/docs/api), `set_domain_nameservers` refuses a nameserver under the domain itself too, with `ns1.acme.com is under acme.com itself, so it cannot be one of its nameservers!`

The **Nameservers updated** toast reads `The change can take up to 48 hours to reach every network.`

### The records while other nameservers answer

Changing the nameservers deletes nothing on the **DNS records** tab. The records stay, but they stop answering, so add the records the domain needs, and those of any site or email domain that uses it, at the new DNS host. Modulify stops managing records on the domain while it uses other nameservers, so none of them is locked.

While the domain uses other nameservers, the **DNS records** tab opens with **This domain uses other nameservers**, `The records here only take effect while the domain uses the Modulify nameservers. Add records where its DNS is hosted, or switch back on the Nameservers tab.`, and an **Open nameservers** button. You can still change the records there, and they answer again once you switch back.

### Switch back to Modulify's nameservers

Whenever its rows differ from Modulify's nameservers, `ns1.modulify.ai` and `ns2.modulify.ai`, the **Change nameservers** dialog also offers **Use Modulify nameservers**. It fills the rows with those nameservers. Click **Save nameservers** to put the domain back on them, and the records on the **DNS records** tab answer again. Modulify brings the records of your sites and email domains up to date straight away.

## Records Modulify manages

The sites and email domains of the workspace can use the domain without anyone typing a record. While the domain is **Active** or **Expiring soon** and uses Modulify's nameservers, Modulify adds the records they need to its DNS, keeps them in step, and deletes them once nothing needs them.

| What uses the domain | The records Modulify keeps |
| --- | --- |
| A site of this workspace whose custom domain is the domain or a subdomain of it, such as `blog.acme.com`, with its www variant | The A, AAAA, ANAME or CNAME records that point each hostname at the site |
| An email domain of a site of this workspace, such as `mail.acme.com` | Its ownership TXT record and its three DKIM CNAME records, and its MX record while receiving is on |

The DMARC record an email domain recommends is not one of them, so add it yourself if you want it. A site or an email domain of another workspace gets no records here, even under this domain.

### When records go in and come out

- Connecting the domain, or a subdomain of it, to a site adds its records straight away, and the **Domain added** toast reads, for example, `acme.com and www.acme.com are connecting. Modulify adds the DNS records to acme.com for you.`
- Adding an email domain adds its records with its first check, turning on receiving adds its MX record, and restarting its verification replaces its DKIM records.
- Removing a domain or its www variant from the site, removing the email domain, or turning off receiving deletes those records within a minute.
- Deleting the site deletes them within a minute, and so does deleting the workspace or closing the account that owns it.
- Moving a site to another workspace leaves the records of its custom domains in place, but this workspace no longer manages them, so they are no longer locked. Modulify still keeps track of them: once the moved site no longer uses that hostname, because it was removed from the site or the site was deleted, Modulify deletes the record within a minute if it still holds what Modulify put there. The move takes the site's email domains away from it, so their records are deleted within a minute.
- Once the domain has gone 6 hours without a check, Modulify compares its records with what its sites and email domains need again, puts back any that went missing, and moves any that still point at an old Modulify address to the current one.
- Opening the **DNS records** tab or the site's **Domain** tab never changes records, and neither does reading them from an AI client or through the [HTTP API](https://modulify.ai/docs/api). When Modulify finds them out of step, it brings them up to date within a minute.

At a name a site uses, Modulify deletes the other A, AAAA, ANAME and CNAME records there, such as an address left from an earlier host, so no visitor is sent anywhere else. While an email domain receives mail, the other MX records at its name are deleted the same way, and turning receiving off again does not bring them back. Records of other types at those names stay. When Modulify replaces one of its own A, AAAA, MX or TXT records with a new value, it adds the new record before it deletes the old one, so the name keeps answering. When a change fails halfway, the records added so far are taken back and the ones deleted are put back, and the message names any record that could not be put back so you can add it again. A record of its own that Modulify puts back stays locked.

### Locked records

On the **DNS records** tab, a record Modulify manages carries a lock next to its type. Hovering the lock says what holds the record, and **Edit record** and **Delete record** in its menu are disabled with the same text.

| Record | Tooltip |
| --- | --- |
| A site's record | `Modulify manages this record so www.acme.com reaches the site Shop. Remove www.acme.com from that site to release it.` |
| An email domain's MX record | `Modulify manages this record so the email domain mail.acme.com of the site Shop receives mail. Turn off receiving or remove that email domain to release it.` |
| An email domain's other records | `Modulify manages this record for the email domain mail.acme.com of the site Shop. Remove that email domain to release it.` |
| A record nothing uses any more that Modulify is still trying to delete | `Modulify is deleting this record because nothing uses it any more.` |

Once at least one record in the list is marked **Managed by Modulify**, the tab opens with **Some records are managed by Modulify**, `The records your sites and email domains need are added and removed for you, and are locked here. Removing the domain from its site, or the email domain, releases them.`

A record that would clash with a managed one is refused too. That covers the records a site or an email domain is about to get, so a name a site was just connected to is held for it before its records are in place. The message shows in the **Could not add record** or **Could not save record** toast, and in the answer an AI client gets.

| Message | Cause |
| --- | --- |
| `www.acme.com is managed for www.acme.com on the site Shop, so its address records cannot be changed here. Remove www.acme.com from that site first!` | An A, AAAA, ANAME or CNAME record at a name whose address records Modulify manages |
| `mail.acme.com receives mail for the email domain mail.acme.com of the site Shop, so its MX records cannot be changed here. Turn off receiving for mail.acme.com first!` | An MX record at a name that receives mail for an email domain |
| `abc._domainkey.mail.acme.com holds a CNAME record Modulify manages for the email domain mail.acme.com of the site Shop, and a CNAME record cannot share its name with other records!` | Any record at the name of a CNAME record Modulify manages for an email domain |
| `An NS record there would hand www.acme.com to other nameservers, and Modulify manages the records at www.acme.com for www.acme.com on the site Shop. Remove www.acme.com from that site first!` | An NS record at a name whose records Modulify manages, or at a name above it |
| `This record connects www.acme.com to the site Shop, so Modulify manages it. Remove www.acme.com from that site to release it!` | Editing or deleting a locked record, for example from an AI client |
| `Nothing uses this record any more, and Modulify could not delete it yet. It tries again within 30 minutes, and unlocks the record if that keeps failing!` | Editing or deleting a record Modulify is still trying to delete |
| `www.acme.com holds a record Modulify is still deleting because nothing uses it any more. Try again once it is gone!` | A record at a name where Modulify is still trying to delete one of its records |

When Modulify cannot delete a record nothing uses any more, it keeps the record locked and tries again within 30 minutes. Meanwhile its lock reads `Modulify is deleting this record because nothing uses it any more.` After 5 failed tries it unlocks the record, so you can delete it yourself, and keeps trying with its regular checks.

### When records cannot be added

A CNAME record cannot share its name with other records. When a name that needs one, such as `www`, holds an MX, SRV or TXT record of your own, Modulify adds nothing at that name. An NS record at a name, or at a name above it, hands that name to other nameservers, so Modulify adds nothing there either and reports it, even for records it added before the NS record. For the same reason, an email domain at a name a site reaches through a CNAME record does not get its MX record. The site's **Domain** tab then shows **Records not added** on the domain's card, the **DNS records** tab opens with **Some records could not be added**, and an email domain shows the reason under its name and is not ready.

| Message | What to do |
| --- | --- |
| `www.acme.com has other records, so the records Modulify manages there cannot be added. Delete them under DNS records on the page of the domain!` | Delete the records at that name on the **DNS records** tab. Modulify adds its own as soon as you do |
| `sub.acme.com is handed to other nameservers by an NS record, so the records Modulify manages at www.sub.acme.com would not answer. Delete the NS record under DNS records on the page of the domain!` | Delete the NS record on the **DNS records** tab. Modulify adds its own as soon as you do |
| `shop.acme.com connects a site through a CNAME record, which cannot share its name with other records, so the MX record of the email domain shop.acme.com cannot be added. Use another name for the email domain, or turn off receiving for it!` | Use another name for the email domain, or turn off receiving for it |
| `A domain can hold at most 100 DNS records, so the records Modulify manages cannot all be added. Delete some under DNS records on the page of the domain!` | Delete records the domain no longer needs. Modulify adds its own as soon as you do |
| `The DNS of this domain did not answer. Try again in a moment!` or another message about its DNS | Nothing. Modulify tries again within 30 minutes |

### The site's Domain tab

For a domain Modulify manages, the card on the site's **Domain** tab has nothing to add by hand and no **Connect with `<your provider>`** strip. Under **Your custom domain** it reads `Modulify adds the records that connect this domain for you.`, and the card starts with a banner whose **Manage DNS** button opens the domain's **DNS records** tab.

The records of each hostname on the card stay folded behind a **DNS records** toggle, whether the hostname is connected or not. Opening it shows `Modulify adds these records to acme.com for you, and deletes them once the domain leaves this site.` above the records and their status. The copy icon next to a name or a value copies it.

| Banner | When |
| --- | --- |
| **Adding records**, `This workspace owns acme.com, so Modulify adds the DNS records of this domain and its www variant for you. There is nothing to add at a DNS provider.` | The records are not all in place yet |
| **Records added**, `Modulify added the DNS records of this domain and its www variant to acme.com. The domain connects once DNS servers pick them up, usually within a few minutes.` | Every record is in place, and the domain waits for DNS servers and its certificate |
| **Records not added**, with the reason | Something blocks the records, see [When records cannot be added](https://modulify.ai/docs/publish/manage-dns#when-records-cannot-be-added) |

`and its www variant` is left out when the card has no www variant. The banner shows while a hostname on the card is not connected, and is hidden while the site's custom domains are [paused](https://modulify.ai/docs/publish/custom-domains#when-your-plan-ends).

A bought domain that uses other nameservers gets the usual card: the records to add at that DNS host, and the **Connect with `<your provider>`** strip when that host supports one-click setup, see [One click setup](https://modulify.ai/docs/publish/dns-records#one-click-setup).

Chat tells you there is nothing to add for a domain Modulify manages. An AI client, or your own code through the [HTTP API](https://modulify.ai/docs/api), reads the same state: `get_domain_status` returns the domain as `OwnedDomain` with `ManagedDns`, `Ready` and `Error`, and `list_dns_records` marks each managed record `Locked`, with `ManagedBy` naming what holds it and `CleanupPending` set to `true` while Modulify is still trying to delete it. Neither changes any record.

## Limits

| Limit | Value |
| --- | --- |
| Record loads, per person, across every domain | 20 a minute |
| Changes, per workspace, across every domain | 30 a minute |
| Records on one domain | 100 |
| Records in one [add-records link](https://modulify.ai/docs/publish/add-records-with-a-link) | 20 |

Changes cover adding, editing and deleting records, saving nameservers, saving the registrant, turning the transfer lock or auto-renew on or off and getting a transfer code. The records Modulify adds and deletes by itself do not count. Record loads and changes made by an AI client or through the [HTTP API](https://modulify.ai/docs/api) count toward the same limits, see [Bought domains](https://modulify.ai/docs/mcp/tools#bought-domains). Each minute starts on the clock. Past a limit, the message says how long to wait, for example `You are loading DNS records too fast. Try again in 42 seconds!` or `This workspace is changing its domains too fast. Try again in 12 seconds!`

## On the mobile app

On a domain's page in the Modulify app for iPhone and Android, the **DNS records**, **Nameservers** and **Settings** tabs work like the web, through the same requests.

- **DNS records** lists each record as a card with its type, TTL, **Name** and **Value**. Tap a name or a value to copy it. The search box, the record type filter and **Add record** sit above the list.
- **Add record** and **Edit record** open the same form as a sheet, with **Type**, **TTL**, **Name**, the value and, for the types that need them, **Priority**, **Weight** and **Port**.
- The three dots on a record open **Edit record** and **Delete record**. A record Modulify manages shows a lock and writes why it is locked under it.
- **Change nameservers** on the **Nameservers** tab opens the nameservers as a sheet, with **Add nameserver** and **Use Modulify nameservers**. Tap a nameserver to copy it.
- The link in an email about a domain opens its page in the app, see [Emails about your domains](https://modulify.ai/docs/publish/buy-a-domain#emails-about-your-domains).
- Where the web shows a tooltip on a disabled control, the app writes the same text under it.

### Does managing DNS need a paid plan?

No. A bought domain's records and nameservers can be changed on every plan. Connecting the domain to a site as a custom domain needs a paid plan, like any custom domain.

### Why does my new record not answer yet?

Look at the **Nameservers** tab first: the records answer only while the domain uses Modulify's nameservers. If it does, give the change a few minutes. A DNS server that already holds the old answer keeps it until its TTL runs out.

### Can I use the domain for email?

Yes. Add the MX and TXT records your mail provider gives you on the **DNS records** tab. To have a site send email from the domain, add it under **Email domains** on the **Settings** tab of the site's **Emails** tab, and Modulify adds the records it needs here by itself. See [Use your own domain](https://modulify.ai/docs/automations/emails#use-your-own-domain).

### Can chat or an AI client change these records?

Yes. Ask a site's chat in plain words, such as `add a TXT record on acme.com for Google verification`. It reads, adds, changes and deletes the records of a domain the workspace bought and moves its nameservers, asking you first before it changes or deletes a record or moves the nameservers. An AI client connected over MCP can too, and so can your own code through the [HTTP API](https://modulify.ai/docs/api), with a token that holds the `domains:write` scope. Each acts only within your role, so it needs the **Manage domains** permission like this page does, and none of them can change the records Modulify manages. See [Bought domains](https://modulify.ai/docs/mcp/tools#bought-domains).

### Who can change the registrant or get the transfer code?

Only the workspace owner. They do it on the **Settings** tab, or through an AI client over MCP or their own code through the [HTTP API](https://modulify.ai/docs/api), with a token of theirs that holds the `domains:write` scope: `update_domain_registrant` changes the registrant, and `get_domain_transfer_code` returns the transfer code when the token also holds `credentials:reveal`. See [Change the registrant](https://modulify.ai/docs/publish/buy-a-domain#change-the-registrant).

## Next

- [Buy a domain](https://modulify.ai/docs/publish/buy-a-domain) covers buying, renewing and the **Settings** tab.
- [Add records with a link](https://modulify.ai/docs/publish/add-records-with-a-link) covers the link a service can send you, and how a service builds one.
- [Connect a custom domain](https://modulify.ai/docs/publish/custom-domains) walks a site's domain setup end to end.
- [DNS records](https://modulify.ai/docs/publish/dns-records) explains the records a site needs.
- [Troubleshoot a domain](https://modulify.ai/docs/publish/troubleshooting-a-domain) covers a domain that stays Pending.