---
title: Cloudflare Registrar
description: Register and manage domains at cost with Cloudflare.
image: https://developers.cloudflare.com/core-services-preview.png
---

> Documentation Index  
> Fetch the complete documentation index at: https://developers.cloudflare.com/registrar/llms.txt  
> Use this file to discover all available pages before exploring further.

[Skip to content](#%5Ftop) 

# Cloudflare Registrar

Buy and renew your domain at cost with Cloudflare Registrar.

 Available on all plans 

Buy and manage your domain with Cloudflare Registrar, and add an additional layer of security to your DNS records for free. Cloudflare Registrar also offers redacted WHOIS information by default and will only charge you what is paid to the registry for your domain. No markup. No surprise fees.

---

## Features

###  Buy domains at cost 

Buy and renew domains through Cloudflare Registrar at cost, without markup fees. You only pay what is charged by [registries and ICANN ↗](https://www.cloudflare.com/products/registrar/).

[ Buy domains at cost ](https://developers.cloudflare.com/registrar/get-started/register-domain/) 

###  Renew your domain 

Cloudflare Registrar enrolls your domain to auto-renew by default. Unlike other registrars, your domain will only renew at the list price set by the registry.

[ Renew your domain ](https://developers.cloudflare.com/registrar/account-options/renew-domains/) 

###  DNSSEC 

Cloudflare Registrar offers one-click DNSSEC activation. DNSSEC secures DNS records with cryptographic signatures, and is free to all Cloudflare customers.

[ Use DNSSEC ](https://developers.cloudflare.com/registrar/get-started/enable-dnssec/) 

---

## Related products

**[DNS](https://developers.cloudflare.com/dns/)** 

When you use Cloudflare DNS, all DNS queries for your domain are answered by Cloudflare’s global anycast network. This network delivers performance and global availability.

```json
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"item":{"@id":"/directory/","name":"Directory"}},{"@type":"ListItem","position":2,"item":{"@id":"/registrar/","name":"Registrar"}}]}
```

---

---
title: About
description: Learn how Cloudflare Firewall Rules work.
image: https://developers.cloudflare.com/core-services-preview.png
---

> Documentation Index  
> Fetch the complete documentation index at: https://developers.cloudflare.com/registrar/llms.txt  
> Use this file to discover all available pages before exploring further.

[Skip to content](#%5Ftop) 

# About

Cloudflare Registrar offers several advantages over other [registrars ↗](https://www.cloudflare.com/learning/dns/glossary/what-is-a-domain-name-registrar/), such as domain name registration renewal [without markups fees ↗](https://www.cloudflare.com/products/registrar/). You only pay what is charged by registries and [ICANN ↗](https://www.icann.org/). Cloudflare Registrar also offers additional security features, such as free, one-click activation for [Domain Name System Security Extensions (DNSSEC)](https://developers.cloudflare.com/registrar/get-started/enable-dnssec/), [custom domain protection](https://developers.cloudflare.com/registrar/custom-domain-protection/), and [WHOIS redaction](https://developers.cloudflare.com/registrar/account-options/whois-redaction/).

You can buy your domain from Cloudflare Registrar or from a third party. Even when you buy it from a third party, you can manage your domain with Cloudflare to benefit from all the features Cloudflare offers.

```json
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"item":{"@id":"/directory/","name":"Directory"}},{"@type":"ListItem","position":2,"item":{"@id":"/registrar/","name":"Registrar"}},{"@type":"ListItem","position":3,"item":{"@id":"/registrar/about/","name":"About"}}]}
```

---

---
title: Registrar API
description: Search and register domains via the Registrar API.
image: https://developers.cloudflare.com/core-services-preview.png
---

> Documentation Index  
> Fetch the complete documentation index at: https://developers.cloudflare.com/registrar/llms.txt  
> Use this file to discover all available pages before exploring further.

[Skip to content](#%5Ftop) 

# Registrar API

Use the Cloudflare Registrar API to search for domain names, check real-time availability and pricing, and register supported domains programmatically.

This guide walks through the beta workflow using the Cloudflare API and `curl`. These same endpoints are in the official Cloudflare API reference and through Cloudflare MCP by default, which means they can be used from scripts, backend services, CI pipelines, and agent-driven tools without additional integration work.

## Before you begin

Before you make your first API request, make sure you have:

1. A Cloudflare account ID.
2. An API token with Registrar write permissions. Create one at `https://dash.cloudflare.com/<ACCOUNT_ID>/api-tokens`.
3. A billing profile with a valid default payment method. Manage billing at `https://dash.cloudflare.com/<ACCOUNT_ID>/billing/payment-info`.
4. A default registrant contact configured on the account, plus acceptance of the Domain Registration Agreement on the registrations page: `https://dash.cloudflare.com/<ACCOUNT_ID>/domains/registrations`.

For related setup help, refer to:

* [Find your account ID](https://developers.cloudflare.com/fundamentals/account/find-account-and-zone-ids/)
* [Create an API token](https://developers.cloudflare.com/fundamentals/api/get-started/create-token/)
* [Make API calls](https://developers.cloudflare.com/fundamentals/api/how-to/make-api-calls/)
* \[Registrar API docs\] (/api/resources/registrar)

## Set up authentication

Cloudflare API requests use bearer token authentication.

In your terminal, define environment variables for your account ID and API token:

Terminal window

```

export ACCOUNT_ID="<YOUR_ACCOUNT_ID>"

export CLOUDFLARE_API_TOKEN="<YOUR_API_TOKEN>"


```

All requests in this guide use the Cloudflare API v4 base URL:

```

https://api.cloudflare.com/client/v4/


```

Note 

Agent best practice: Keep `ACCOUNT_ID` and `CLOUDFLARE_API_TOKEN` in environment variables and reuse them across steps rather than rebuilding request context for every call.

## Beta workflow

The beta workflow has three core steps:

1. Search for candidate domain names.
2. Check real-time availability and pricing for the domain you want.
3. Register the domain.

Search is useful for discovery, but it is not the source of truth. Always call the `Check` endpoint immediately before registration to reduce the likelihood of hitting an error during registration.

## Example prompts for agents

If you are using Cloudflare MCP or another agent-driven workflow, prompts can be as simple as:

* `Search for domains for a coffee shop based in Evergreen, Colorado.`
* `Find 5 available .com or .dev domains for an AI expense tracker.`
* `Check whether example.com is available and show me the current price.`
* `Check these domains and tell me which ones are registrable right now: example.com, example.dev, example.cafe`
* `Register example.com on my Cloudflare account.`

Note 

Agent best practice: Use Search to generate options, use Check to confirm the final choice and price, and only then call Registration.

## 1\. Search for domains

Use the Search endpoint to generate candidate domain names from a keyword, phrase, or partial domain name.

Search results:

* Are fast and intended for discovery.
* Are based on cached data.
* Only include extensions supported by the API beta.

Note 

Agent best practice: Generate multiple candidates during search, but do not make purchase decisions from search results alone.

Terminal window

```

curl --request GET \

  --url "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/registrar/domain-search?q=acme%20corp&limit=3" \

  --header "Authorization: Bearer $CLOUDFLARE_API_TOKEN"


```

Example response:

```

{

  "success": true,

  "errors": [],

  "messages": [],

  "result": {

    "domains": [

      {

        "name": "acmecorp.com",

        "registrable": true,

        "tier": "standard",

        "pricing": {

          "currency": "USD",

          "registration_cost": "8.57",

          "renewal_cost": "8.57"

        }

      },

      {

        "name": "acmecorp.dev",

        "registrable": true,

        "tier": "standard",

        "pricing": {

          "currency": "USD",

          "registration_cost": "10.11",

          "renewal_cost": "10.11"

        }

      },

      {

        "name": "acmecorp.app",

        "registrable": true,

        "tier": "standard",

        "pricing": {

          "currency": "USD",

          "registration_cost": "11.00",

          "renewal_cost": "11.00"

        }

      }

    ]

  }

}


```

## 2\. Check real-time availability and pricing

Use the Check endpoint to confirm whether a domain is currently registrable and to retrieve the current price.

Check results:

* Query the registry directly.
* Reflect current registry state.
* Should be used immediately before calling the registration endpoint.
* Responses can include a `reason` field when `registrable` is `false`.

This endpoint accepts up to 20 domains per request.

Note 

Agent best practice: Run `Check` immediately before registration, surface the returned price to the user, and stop if the response indicates an unsupported extension or a non-registrable domain.

Terminal window

```

curl --request POST \

  --url "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/registrar/domain-check" \

  --header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \

  --header "Content-Type: application/json" \

  --data '{

    "domains": ["acmecorp.dev"]

  }'


```

Example response:

```

{

  "success": true,

  "errors": [],

  "messages": [],

  "result": {

    "domains": [

      {

        "name": "acmecorp.dev",

        "registrable": true,

        "tier": "standard",

        "pricing": {

          "currency": "USD",

          "registration_cost": "10.11",

          "renewal_cost": "10.11"

        }

      }

    ]

  }

}


```

If a domain cannot be registered through the API, the response includes a reason. For example:

```

{

  "success": true,

  "errors": [],

  "messages": [],

  "result": {

    "domains": [

      {

        "name": "mybrand.uk",

        "registrable": false,

        "reason": "extension_not_supported_via_api"

      }

    ]

  }

}


```

Common `reason` values include:

* `domain_unavailable`
* `extension_not_supported_via_api`
* `extension_not_supported`
* `extension_disallows_registration`

## 3\. Register a domain

Use the Registration endpoint to start a domain registration workflow.

Important:

* Successful registrations are billable to the default payment profile.
* Registrations are non-refundable once they complete successfully.
* Always confirm the domain name and price before calling this endpoint.

The simplest request only requires `domain_name`:

Terminal window

```

curl --request POST \

  --url "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/registrar/registrations" \

  --header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \

  --header "Content-Type: application/json" \

  --data '{

    "domain_name": "acmecorp.dev"

  }'


```

The account must have a default registrant contact configured. If you do not pass a new contact inline, the API uses the default contact automatically. If you want to register the domain with a different contact, you can pass that contact in the request.

Current default behavior:

* `auto_renew` defaults to `false`.
* `privacy_mode` defaults to `redaction` when supported for the TLD, otherwise `off`.
* The account's default payment method is charged automatically.

Note 

Agent best practice: keep the registration request minimal unless you are intentionally overriding contact details or other registration settings.

To override the default registrant contact for a single registration, provide one inline:

Terminal window

```

curl --request POST \

  --url "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/registrar/registrations" \

  --header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \

  --header "Content-Type: application/json" \

  --data '{

    "domain_name": "acmecorp.dev",

    "contacts": {

      "registrant": {

        "email": "ada@example.com",

        "phone": "+1.5555555555",

        "postal_info": {

          "name": "Ada Lovelace",

          "organization": "Example Inc",

          "address": {

            "street": "123 Main St",

            "city": "Austin",

            "state": "TX",

            "postal_code": "78701",

            "country_code": "US"

          }

        }

      }

    }

  }'


```

Example successful response:

```

{

  "success": true,

  "errors": [],

  "messages": [],

  "result": {

    "domain_name": "acmecorp.dev",

    "state": "succeeded",

    "completed": true,

    "created_at": "2025-10-27T10:00:00Z",

    "updated_at": "2025-10-27T10:00:03Z",

    "context": {

      "registration": {

        "domain_name": "acmecorp.dev",

        "status": "active",

        "created_at": "2025-10-27T10:00:00Z",

        "expires_at": "2026-10-27T10:00:00Z",

        "auto_renew": false,

        "privacy_mode": "redaction",

        "locked": true

      }

    },

    "links": {

      "self": "/accounts/abc/registrar/registrations/acmecorp.dev/registration-status",

      "resource": "/accounts/abc/registrar/registrations/acmecorp.dev"

    }

  }

}


```

## Handle registration responses

By default, the registration endpoint waits for up to 10 seconds before responding.

You can receive either:

* `201 Created` if the registration completed within the wait window.
* `202 Accepted` if the registration is still in progress.

To force immediate asynchronous behavior, send `Prefer: respond-async`.

Note 

Agent best practice: Treat both `201` and `202` as expected outcomes. Do not retry the same registration immediately just because the first response returned `202`.

Example asynchronous request:

Terminal window

```

curl --request POST \

  --url "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/registrar/registrations" \

  --header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \

  --header "Content-Type: application/json" \

  --header "Prefer: respond-async" \

  --data '{

    "domain_name": "acmecorp.dev"

  }'


```

Example `202 Accepted` response:

```

{

  "success": true,

  "errors": [],

  "messages": [],

  "result": {

    "domain_name": "acmecorp.dev",

    "state": "in_progress",

    "completed": false,

    "created_at": "2025-10-27T10:00:00Z",

    "updated_at": "2025-10-27T10:00:10Z",

    "links": {

      "self": "/accounts/abc/registrar/registrations/acmecorp.dev/registration-status",

      "resource": "/accounts/abc/registrar/registrations/acmecorp.dev"

    }

  }

}


```

## Poll registration status

If the registration is still in progress, poll the status endpoint until the workflow reaches a terminal state.

Terminal window

```

curl --request GET \

  --url "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/registrar/registrations/acmecorp.dev/registration-status" \

  --header "Authorization: Bearer $CLOUDFLARE_API_TOKEN"


```

Example response:

```

{

  "success": true,

  "errors": [],

  "messages": [],

  "result": {

    "domain_name": "acmecorp.dev",

    "state": "succeeded",

    "completed": true,

    "created_at": "2025-10-27T10:00:00Z",

    "updated_at": "2025-10-27T10:00:03Z",

    "context": {

      "registration": {

        "domain_name": "acmecorp.dev",

        "status": "active",

        "created_at": "2025-10-27T10:00:00Z",

        "expires_at": "2026-10-27T10:00:00Z",

        "auto_renew": false,

        "privacy_mode": "redaction",

        "locked": true

      }

    },

    "links": {

      "self": "/accounts/abc/registrar/registrations/acmecorp.dev/registration-status",

      "resource": "/accounts/abc/registrar/registrations/acmecorp.dev"

    }

  }

}


```

Possible workflow states include:

* `in_progress`
* `succeeded`
* `failed`
* `action_required`
* `blocked`

If the workflow returns `action_required`, stop polling and surface the required user action.

If the workflow returns `failed`, inspect `error.code` and `error.message` before retrying.

Note 

Agent best practice: Stop polling on `action_required` and `failed`, and avoid silent loops that continue charging ahead without user review.

## Get the registration resource

Once registration is complete, retrieve the registration resource directly:

Terminal window

```

curl --request GET \

  --url "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/registrar/registrations/acmecorp.dev" \

  --header "Authorization: Bearer $CLOUDFLARE_API_TOKEN"


```

Example response:

```

{

  "success": true,

  "errors": [],

  "messages": [],

  "result": {

    "domain_name": "acmecorp.dev",

    "status": "active",

    "created_at": "2025-10-27T10:00:00Z",

    "expires_at": "2026-10-27T10:00:00Z",

    "auto_renew": false,

    "privacy_mode": "redaction",

    "locked": true

  }

}


```

## Beta limitations

This is the first beta release of the Registrar API.

Current limitations include:

* Only a subset of supported Cloudflare Registrar extensions are available through the API beta.
* Search results are scoped to API-supported extensions only.
* Some extensions supported in the dashboard are not yet available for programmatic registration.
* When supported, premium domains will require explicit fee acknowledgement before registration.
* Renewals are not yet available through the API.
* Transfers are not yet available through the API.
* Contact updates are not yet available through the API.

If you check a domain that Cloudflare supports in the dashboard but not yet in the API, the Check response returns `extension_not_supported_via_api`.

These core Registrar functions will be added in future versions of the API.

Add a link here to the supported extensions list once it exists.

## Next steps

* Review [Cloudflare API auth and request conventions](https://developers.cloudflare.com/fundamentals/api/how-to/make-api-calls/).

If you are building with the Registrar API beta, especially for automation, agents, or multi-tenant platform workflows, we want your feedback.

```json
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"item":{"@id":"/directory/","name":"Directory"}},{"@type":"ListItem","position":2,"item":{"@id":"/registrar/","name":"Registrar"}},{"@type":"ListItem","position":3,"item":{"@id":"/registrar/registrar-api/","name":"Registrar API"}}]}
```

---

---
title: Top Level Domains supported
description: View supported top-level domains for registration.
image: https://developers.cloudflare.com/core-services-preview.png
---

> Documentation Index  
> Fetch the complete documentation index at: https://developers.cloudflare.com/registrar/llms.txt  
> Use this file to discover all available pages before exploring further.

[Skip to content](#%5Ftop) 

# Top Level Domains supported

Cloudflare supports over 400 [top-level domains (TLDs) ↗](https://www.cloudflare.com/learning/dns/top-level-domain/) and is always evaluating adding new TLDs. We have no specific timeframes for TLDs not yet listed. You can find the full list of supported and coming soon TLDs on the [TLD policies page ↗](https://www.cloudflare.com/tld-policies/).

Note

If you want to register a `.us` domain refer to [Additional requirements for .US domains](https://developers.cloudflare.com/registrar/top-level-domains/us-domains/).

## Domain availability

During your [TLD registration process](https://developers.cloudflare.com/registrar/get-started/register-domain/#how-to-register-a-new-domain), Cloudflare Registrar will inform you if the TLD you are looking for is available to register. If it does not appear in your search list, this means that TLD is not available for registration.

Possible causes for the domain not being available include:

* Someone else owns that domain.
* It is an Internationalized Domain Name (IDN) which Cloudflare Registrar does not support. These domains include international characters (such as `á`, `ü`, among others).

## Transfer a domain

When transferring a domain to Cloudflare Registrar, refer to [Domain is in a restricted status](https://developers.cloudflare.com/registrar/troubleshooting/#domain-is-in-a-restricted-status) for statuses that can block a transfer.

```json
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"item":{"@id":"/directory/","name":"Directory"}},{"@type":"ListItem","position":2,"item":{"@id":"/registrar/","name":"Registrar"}},{"@type":"ListItem","position":3,"item":{"@id":"/registrar/top-level-domains/","name":"Top Level Domains supported"}}]}
```

---

---
title: .UK domains
description: Manage .UK domains with Cloudflare Registrar.
image: https://developers.cloudflare.com/core-services-preview.png
---

> Documentation Index  
> Fetch the complete documentation index at: https://developers.cloudflare.com/registrar/llms.txt  
> Use this file to discover all available pages before exploring further.

[Skip to content](#%5Ftop) 

# .UK domains

## How to transfer a .UK domain to Cloudflare

Cloudflare currently supports the transfer of `.uk`, `co.uk`, `org.uk`, and `me.uk` domains. To transfer a `.uk` domain to Cloudflare from another registrar follow these steps:

1. In the Cloudflare dashboard, go to the **Transfer domains** page.  
[ Go to **Transfer domains** ](https://dash.cloudflare.com/?to=/:account/registrar/transfer)

Cloudflare will show you a list of domains that are eligible for transfer (see below for restrictions). If you do not see your domain, [add the domain you want to transfer](https://developers.cloudflare.com/fundamentals/manage-domains/add-site/) to your Cloudflare account before you try to transfer your `.uk` domain. 2\. Select the domains you wish to transfer. 3\. Proceed to checkout. Note that there is no fee to transfer a `.uk` domain and an additional year is NOT added during the transfer process. 4\. After checkout, request your current registrar to update the [IPS tag ↗](https://en.wikipedia.org/wiki/Internet%5FProvider%5FSecurity) to `CLOUDFLARE`. If the transfer is not completed within 24 hours, ask your registrar again to update the IPS tag. The transfer will be automatically canceled if not completed within 30 days. 5\. Cloudflare will receive a notice once your registrar updates the IPS tag. After that, we will finish transferring your domain.

Warning

If you request your current registrar to update the IPS tag before completing the checkout process, the transfer request will be automatically rejected. You must complete the checkout process before requesting the IPS tag update.

For security reasons, domains transferred to Cloudflare Registrar are locked for 60 days before they can be transferred out to another Registrar.

## Transfer a .UK domain to another registrar

1. Log in to the [Cloudflare dashboard ↗](https://dash.cloudflare.com/login) and select your account.
2. Go to **Domain Registration** \> **Manage Domains**.
3. Find the domain you want to transfer, and select **Manage**.
4. Select **Configuration** \> **Unlock**.
5. Enter the IPS tag of the registrar you wish to transfer to.

Your new registrar is responsible for accepting the transfer. Cloudflare has no visibility into why a transfer might not be accepted by the new registrar.

Note

If you do not know the IPS tag, contact your new registrar for instructions. Your new registrar may require you to follow some additional steps before starting the transfer process.

```json
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"item":{"@id":"/directory/","name":"Directory"}},{"@type":"ListItem","position":2,"item":{"@id":"/registrar/","name":"Registrar"}},{"@type":"ListItem","position":3,"item":{"@id":"/registrar/top-level-domains/","name":"Top Level Domains supported"}},{"@type":"ListItem","position":4,"item":{"@id":"/registrar/top-level-domains/uk-domains/","name":".UK domains"}}]}
```

---

---
title: .US domains
description: Register and manage .US domains with Cloudflare.
image: https://developers.cloudflare.com/core-services-preview.png
---

> Documentation Index  
> Fetch the complete documentation index at: https://developers.cloudflare.com/registrar/llms.txt  
> Use this file to discover all available pages before exploring further.

[Skip to content](#%5Ftop) 

# .US domains

## Registration requirements for .US domains

If you want to register a `.us` domain, you must have a genuine connection to the United States as described in the [usTLD Nexus Policy ↗](https://www.about.us/policies). When registering a domain name, registrants must identify the category under which they qualify for the usTLD Nexus Requirement:

Nexus Category 1

**C11**: A natural person who is a United States Citizen; or

**C12**: A natural person who is a permanent resident of the United States of America, or any of its possessions or territories.

Nexus Category 2

**C21**: A U.S.-based organization or company formed within one of the fifty (50) U.S. states, the District of Columbia, or any of the United States possessions or territories, or organized or otherwise constituted under the laws of a state of the United States of America, the District of Columbia or any of its possessions or territories or a U.S. federal, state, or local government entity or a political subdivision thereof.

Nexus Category 3

**C31**: A foreign entity or organization that has a bona fide presence in the United States of America or any of its possessions or territories who regularly engages in lawful activities, sales of goods or services or other business, commercial or non-commercial, including not-for-profit relations in the United States; or

**C32**: A foreign entity that has an office or other facility in the United States.

The nexus category information will be supplied to the .US registry. Failure to provide accurate information and/or to respond to requests for information may result in the suspension or cancellation of the domain registration.

### Application purpose

In addition to nexus information, registrants must also identify their intended use of the domain name. The possible options are:

* Personal use
* For-profit business
* Non-profit business or organization
* Government
* Education

### .US WHOIS requirements

The .US registry requires that domain contact data is displayed in the public WHOIS database. Redaction and/or use of WHOIS privacy services is prohibited. This is a registry policy that all registrars must comply with.

### .US domain transfers

Transferring a `.us` domain works in a similar way to other domains, but always requires approval via the Form of Authorization (FOA) email. You must select the approve link within five days for the transfer to proceed. If you do not respond, the transfer request will be cancelled.

Refer to [Transfer your domain to Cloudflare](https://developers.cloudflare.com/registrar/get-started/transfer-domain-to-cloudflare/) for more information.

```json
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"item":{"@id":"/directory/","name":"Directory"}},{"@type":"ListItem","position":2,"item":{"@id":"/registrar/","name":"Registrar"}},{"@type":"ListItem","position":3,"item":{"@id":"/registrar/top-level-domains/","name":"Top Level Domains supported"}},{"@type":"ListItem","position":4,"item":{"@id":"/registrar/top-level-domains/us-domains/","name":".US domains"}}]}
```

---

---
title: Cloudflare Custom Domain Protection
description: Enterprise domain protection against hijacking.
image: https://developers.cloudflare.com/core-services-preview.png
---

> Documentation Index  
> Fetch the complete documentation index at: https://developers.cloudflare.com/registrar/llms.txt  
> Use this file to discover all available pages before exploring further.

[Skip to content](#%5Ftop) 

# Cloudflare Custom Domain Protection

Cloudflare offers [Custom Domain Protection ↗](https://www.cloudflare.com/products/registrar/custom-domain-protection/) to customers with a Cloudflare Enterprise plan and high-profile domains who need the highest level of security against domain hijacking.

Custom Domain Protection offers additional safeguard features for registered domains, including:

* **Registry lock**: Cloudflare applies Registry Lock, when available, to all domains registered through Custom Domain Protection. Any changes to a domain requires Cloudflare to first unlock the domain at the registry level.
* **Out-of-band authentication**: All changes to domain ownership or nameserver information are verified and executed manually based on an authentication process defined by the customer.
* **No interface**: Custom Domain Protection does not offer an interface, to remove the possibility of domain hijack through a compromised account.

Contact your account team if you are interested in Cloudflare's Custom Domain Protection.

```json
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"item":{"@id":"/directory/","name":"Directory"}},{"@type":"ListItem","position":2,"item":{"@id":"/registrar/","name":"Registrar"}},{"@type":"ListItem","position":3,"item":{"@id":"/registrar/custom-domain-protection/","name":"Cloudflare Custom Domain Protection"}}]}
```

---

---
title: WHOIS requests
description: Submit WHOIS disclosure requests to Cloudflare.
image: https://developers.cloudflare.com/core-services-preview.png
---

> Documentation Index  
> Fetch the complete documentation index at: https://developers.cloudflare.com/registrar/llms.txt  
> Use this file to discover all available pages before exploring further.

[Skip to content](#%5Ftop) 

# WHOIS requests

This page describes the mechanism and process for submitting a disclosure request to Cloudflare for WHOIS data under Section 10 of the Internet Corporation for Assigned Names and Number's ("ICANN") [Registration Data Policy ↗](https://www.icann.org/en/contracted-parties/consensus-policies/registration-data-policy).

Please read the following instructions carefully.

## 1\. Prepare your request

Your request must include the following elements:

* Your name
* The requestor's name, mailing address, and email
* Whether you are making this request on behalf of yourself as an individual or on behalf of another person or entity. If the latter, identify whether the requestor is an individual, corporation, or government
* Any power of Attorney statements or similar statements evidencing authorization to act on the requestor's behalf, where applicable and relevant
* A list of data element values requested by the requestor
* Information about the legal rights of the requestor and specific rationale and basis for the request
* An affirmation that the request is being made in good faith
* An affirmation by the requestor to process lawfully any data element values received in response to the request

## 2\. Submit your request

Email your request to [whoisrequest@cloudflare.com](mailto:whoisdisclosure@cloudflare.com). The subject line of your email must include “WHOIS Disclosure Request,” the requestor's name, and the target URL. For example, if the requestor was Acme Corp. seeking information about example.com, your email subject line would be: "WHOIS Disclosure Request - Acme Corp. - example.com."

## 3\. Await response

Cloudflare processes WHOIS disclosure requests in the order they are received. If you have properly formatted and submitted your request according to Steps 1 and 2, Cloudflare typically will send you an acknowledgment of your request within two (2) business days and a substantive response within thirty (30) business days. Cloudflare will send all communications regarding your request to the email address from which you send your request. Cloudflare reserves the right to deny abusive, repetitive, or incomplete requests.

```json
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"item":{"@id":"/directory/","name":"Directory"}},{"@type":"ListItem","position":2,"item":{"@id":"/registrar/","name":"Registrar"}},{"@type":"ListItem","position":3,"item":{"@id":"/registrar/whoisrequests/","name":"WHOIS requests"}}]}
```

---

---
title: FAQ
description: Answers to common questions.
image: https://developers.cloudflare.com/core-services-preview.png
---

> Documentation Index  
> Fetch the complete documentation index at: https://developers.cloudflare.com/registrar/llms.txt  
> Use this file to discover all available pages before exploring further.

[Skip to content](#%5Ftop) 

# FAQ

Below you will find answers to our most commonly asked questions. If you cannot find the answer you are looking for, refer to the [community page ↗](https://community.cloudflare.com/) to explore more resources.

* [Domain management](#domain-management)
* [Domain transfers](#domain-transfers)
* [Domain registrations](#domain-registrations)
* [Domain restoration](#domain-restoration)
* [Domain deletions](#domain-deletions)
* [Billing](#billing)

---

## Domain management

### Can I change my nameservers?

No, all domains on Cloudflare Registrar use Cloudflare nameservers, so that we can protect and speed up your content or services.

If you only need a subdomain to be on a different service provider, you can [delegate a subdomain](https://developers.cloudflare.com/dns/manage-dns-records/how-to/subdomains-outside-cloudflare/). Also, if you are on the Business or Enterprise plans, you have the option to set up [custom nameservers](https://developers.cloudflare.com/dns/nameservers/custom-nameservers/), which means you will be using Cloudflare nameservers but with custom-branded nameserver names.

If you still need to use different nameservers, you will have to [move your domain to another Registrar](https://developers.cloudflare.com/registrar/account-options/transfer-out-from-cloudflare/).

### How can I update my telephone number, email, name or address?

You can update both your default contact information and any individual Registrant, Administrator, Technical or Billing contact for your domain registrations by following [Registrant contact updates](https://developers.cloudflare.com/registrar/account-options/domain-contact-updates/). Details that may be updated include name, email, address, organization and telephone number.

---

## Domain transfers

### What happens to my nameservers when I transfer my domain to Cloudflare?

Cloudflare Registrar only supports transfers of domains that are active on a Cloudflare [full setup](https://developers.cloudflare.com/dns/zone-setups/full-setup/). Domains on Cloudflare use [nameservers assigned by Cloudflare](https://developers.cloudflare.com/dns/nameservers/nameserver-options/#assignment-method) to the associated account and those nameservers must remain in place for the domain to be Active.

### Why did my transfer fail?

Domain transfers sometimes fail. Refer to [Registrar: troubleshoot stalled domain transfers](https://developers.cloudflare.com/registrar/troubleshooting/) for more information on what might have happened and how to solve the issue.

If you cannot solve the issue, open a support ticket or contact your account team.

### Why did my domain's expiration date change after transferring it to Cloudflare?

ICANN requires that any transfer also extends the expiration date of your domain by at least one year — that is one year from your current expiration date, not one year from the date of transfer. For example, if you transfer a domain on October 10, 2021, but it expires on March 10, 2022, your new expiration date will be March 10, 2023.

Whenever a domain is first registered, the registrant purchases control of that domain for some number of years — up to 10 years. For example, a domain registered on October 8, 2020 will have an expiration date of October 8th in some year between 2021 and 2030, depending on the amount of years originally purchased.

Transferring a domain adds time to the current expiration date, unless your domain already has [10 years on the term](#if-i-registered-my-domain-for-10-years-at-another-registrar-will-i-gain-another-year-if-i-transfer-it-to-cloudflare).

### How can I see the status of my domain transfer?

Once you initiate a domain transfer, your previous registrar has five days to release the domain. In most cases, they will send you an email to confirm you want to transfer. If you actively acknowledge that email (through a link or the registrar's dashboard), they can process it immediately.

To see the progress of your transfer, go to the **Transfer domains** page in the Cloudflare dashboard to see a list of domain transfers that are in progress.

[ Go to **Transfer domains** ](https://dash.cloudflare.com/?to=/:account/registrar/transfer) 

To accelerate the process, be sure to check with your old registrar how you can approve the transfer out.

Once successful, you will receive an email from Cloudflare and be able to manage the domain in the dashboard under **Overview** of that site.

### Why am I not allowed to transfer my domain?

ICANN prohibits domain transfers within 60 days of a change to the WHOIS data or registrar of a domain. If you modified your contact information, transferred registrars, or registered your domain in the last 60 days, Cloudflare will be unable to process your transfer immediately.

You can leave the domain **In Progress** and Cloudflare will wait until after the 60-day window passes to attempt to process the transfer.

Note

This information does not apply to `.uk` domains.

### Why am I not able to start a transfer?

If you have an [unverified email address](https://developers.cloudflare.com/fundamentals/user-profiles/verify-email-address/), you might experience issues when initiating a domain transfer.

### What happens if I enter the wrong auth code?

If you enter an incorrect auth code (also referred to as authentication code or authorization code), return to the **Domain Registration** page or the **Overview** for your site. You can use the available input field to reenter your authentication code.

### If I registered my domain for 10 years at another registrar, will I gain another year if I transfer it to Cloudflare?

No. A domain cannot have more than 10 years on the term. If you registered your domain for 10 years, you will get 10 years upon transferring it to Cloudflare.

---

## Domain registrations

### My domain's registration was not extended by one year after transferring to Cloudflare

Most transfers add one year to your registration. However, if your domain expired, you renewed it to keep it, and then transferred within 45 days of renewal, you will be charged for the transfer but no additional year will actually be added. This is a registry restriction that applies to all registrars, not just Cloudflare.

For example, say `example.com` expires on March 1\. You renew it on March 10, extending the registration to March 10 of the following year. You then transfer to Cloudflare on March 20\. Because the transfer is within 45 days of renewal, the registry does not add an additional year. Your expiration date remains March 10 of the following year.

To avoid this, wait at least 45 days after renewal before transferring.

If this already happened, you have effectively paid twice for the same year. Per ICANN rules, you are entitled to request a refund from your previous registrar.

### What Happens When a Domain Expires?

In summary, here is what will happen after a domain expires:

* **Day 0**: Expiration Date.
* **Day 1 - 30**: Grace Period (domain resolves normally).
* **Day 31 - 40**: Suspension Period (domains resolves to suspension page).
* **Day 41 - 70**: Redemption Period.
* **Day 71 - 75**: Pending Delete Period.

Cloudflare currently offers a 40-day grace period for most top-level domains (TLDs).

During this period you may renew/extend the domain at any time from within the dashboard but no further auto-renew attempts will be made. For the first 30 days of the grace period, the domain will continue to resolve as normal. On the 30th day after the expiration date, the domain will be suspended and a parked suspension page will be displayed. You may still renew the domain at any time during this suspension period. On the 40th day, the domain will enter the Redemption Period and will no longer resolve to any web page.

The redemption period lasts for 30 days. During this time, it may be possible to restore and renew the domain. A restore fee may apply in addition to the renewal fee. At the end of the 30 day redemption period, the domain will be placed in pending delete status for a period of five days, after which it will be released and made available for re-registration. The domain cannot be restored or renewed during this period.

If the domain is in a state where it can be restored, the Manage Domain page in the Registrar section of dash will display a message indicating the domain is restorable. You will then will be able to initiate the restore process directly from the dashboard.

Cloudflare does not guarantee against domain loss in the sense of fully indemnifying you for business losses if you lose your domain. However, mechanisms are in place to alert you of domain expiration and redemption grace periods should your domain expire. You can also elect to set up your domain registration to renew automatically. For an additional layer of control over your domains, refer to [Domain Protection Service ↗](https://www.cloudflare.com/products/registrar/custom-domain-protection/).

---

## Domain restoration

### Which domains are eligible to be restored?

Domains that are in the Redemption Period and have an EPP status of redemptionPeriod may be restored. For most TLDs this will include domains that are between 40 and 70 days past expiration.

Currently `.uk` domains cannot be restored using this process. We are working on an alternative process for `.uk` domains and will provide additional information at a later date.

### Is there a fee to restore a domain?

Yes, in most cases there is a restore fee.

The amount varies depending on the TLD. The restore fee is separate from the renewal fee. You will be presented with both the restore and renewal fees before confirming they wish to proceed.

### Will the domain be renewed after the restore has completed?

Yes. We will attempt to renew the domain after the restore has been completed. While not common, it is possible for the renewal transaction to fail.

In the event of a failure, we will make several retry attempts. If we are unable to process the renewal after several retries, you will be presented with a message that you should contact support for assistance.

### How long does the restore process take?

The entire process can take a few minutes to complete.

There are multiple steps to the restore process, and each step must be completed in a specific sequence. These steps are performed automatically by the system. The UI will continue to poll for an updated status and will provide feedback as each step completes.

### What happens if the domain renewal fails?

The restore and the renewal are two distinct processes that happen sequentially.

In rare cases the domain may be successfully restored but the renewal fails. We will make several attempts to renew the domain. However, should all the renewals fail the customer may attempt to manually renew the domain or contact support so we may investigate the cause of the failure.

### Can a restore be reversed or refunded?

No. Once a restore has been completed it can not be reversed. It may be possible to delete the domain again but there are no refunds.

Note

Domain names should be released after a period of 75 days, although the exact deletion timeline is ultimately determined by the domain's registry. You should monitor the domain status to ascertain when it will become available for registration once again.

---

## Domain deletions

### Why am I unable to delete my Registrar domain?

A domain can only be deleted if all the following conditions are met:

* The user initiating the action is a Super Admin or Read/Write Administrator.
* The domain is not delete locked at the registry with either `clientDeleteProhibited` or `serverDeleteProhibited`.
* The domain is not already in `pendingDelete`, `redemptionPeriod`, or in `pendingTransfer`.
* The domain has not been administratively locked by Cloudflare. This typically occurs for legal reasons such as a UDRP filing or court order, but may also be the result of an abuse or payment investigation.
* The domain is NOT a .UK domain. .UK domains currently cannot be deleted at the registry.

If any of the above conditions are not met, the domain cannot be deleted.

### Who has permission to delete a domain registration?

Only Super Admins and Administrators with Read/Write access can initiate the deletion of a domain. Note that only Super Admins will receive the email with the delete token.

### Will I receive a refund for my deleted domain registration?

No. Refunds will not be issued for costs incurred by a domain registration.

### How do I get the domain deletion token?

The delete token is only sent to the Super Admins of the account. If the user requesting the deletion is not a Super Admin they will need to obtain the delete token from one of the Super Admins of the account.

### How long is the domain deletion token valid for?

The delete token is valid for 30 minutes. After the 30 minutes the code will expire and the user must restart the process.

### Will the domain be deleted immediately from my account?

If the domain is within 5 days of the initial registration, the domain will be immediately released by the registry and made available for re-registration. In this scenario the domain will be immediately removed from the registrar section of the account. You may need to refresh the page to force an update of the data.

If the domain is more than 5 days old, it will enter the redemption period and will remain in account until the redemption period expires and the registry releases the domain.

---

## Billing

### How much does Cloudflare Registrar cost?

Refer to [What is Cloudflare Registrar ↗](https://www.cloudflare.com/learning/dns/what-is-cloudflare-registrar/) for more information on pricing.

### When will I be billed?

You will be billed when you input your authorization code and initiate the transfer of your domain to Cloudflare. Currently, Cloudflare Registrar only uses the primary payment method for any associated transaction. Make sure to copy and paste the code to avoid mistakes. The transfer will not initiate if the code is incorrect.

### Is there a fee to transfer a .UK domain?

No, there is no fee to transfer a `.uk` domain. Also, an additional year is NOT added during the transfer process. However, if the domain is nearing the expiration date and is set to auto-renew, it may be automatically renewed shortly after the completion of the transfer.

```json
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"item":{"@id":"/directory/","name":"Directory"}},{"@type":"ListItem","position":2,"item":{"@id":"/registrar/","name":"Registrar"}},{"@type":"ListItem","position":3,"item":{"@id":"/registrar/faq/","name":"FAQ"}}]}
```

---

# Registrar

## Search for available domains

**get** `/accounts/{account_id}/registrar/domain-search`

Searches for domain name suggestions based on a keyword, phrase, or partial domain name.
Returns a list of potentially available domains with pricing information.

**Important:** Results are non-authoritative and based on cached data. Always use the
`/domain-check` endpoint to verify real-time availability before attempting registration.

Suggestions are scoped to extensions supported for programmatic registration
via this API (`POST /registrations`). Domains on unsupported extensions will
not appear in results, even if they are available at the registry level.

### Use cases

- Brand name discovery (e.g., "acme corp" → acmecorp.com, acmecorp.dev)
- Keyword-based suggestions (e.g., "coffee shop" → coffeeshop.com, mycoffeeshop.net)
- Alternative extension discovery (e.g., "example.com" → example.com, example.app, example.xyz)

### Workflow

1. Call this endpoint with a keyword or domain name.
1. Present suggestions to the user.
1. Call `/domain-check` with the user's chosen domains to confirm real-time availability and pricing.
1. Proceed to `POST /registrations` only for supported non-premium domains
   where the Check response returns `registrable: true`.

**Note:** Searching with just a domain extension (e.g., "com" or ".app") is not supported. Provide a keyword or domain name.

### Path Parameters

- `account_id: string`

  Identifier

### Query Parameters

- `q: string`

  The search term to find domain suggestions. Accepts keywords, phrases, or full domain names.

  - Phrases: "coffee shop" returns coffeeshop.com, mycoffeeshop.net, etc.
  - Domain names: "example.com" returns example.com and variations across extensions

- `extensions: optional array of string`

  Limits results to specific domain extensions from the supported set. If not specified,
  returns results across all supported extensions. Extensions not in the supported
  set are silently ignored.

- `limit: optional number`

  Maximum number of domain suggestions to return. Defaults to 20 if not specified.

### Returns

- `errors: array of ResponseInfo`

  - `code: number`

  - `message: string`

  - `documentation_url: optional string`

  - `source: optional object { pointer }`

    - `pointer: optional string`

- `messages: array of ResponseInfo`

  - `code: number`

  - `message: string`

  - `documentation_url: optional string`

  - `source: optional object { pointer }`

- `result: object { domains }`

  Contains the search results.

  - `domains: array of object { name, registrable, pricing, 2 more }`

    Array of domain suggestions sorted by relevance. May be empty if no domains match the search criteria.

    - `name: string`

      The fully qualified domain name (FQDN) in punycode format for internationalized domain names (IDNs).

    - `registrable: boolean`

      Indicates whether this domain appears available based on search data. Search results are non-authoritative and may be stale. - `true`: The domain appears available. Use POST /domain-check to confirm before registration.

      - `false`: The domain does not appear available in search results.

    - `pricing: optional object { currency, registration_cost, renewal_cost }`

      Annual pricing information for a registrable domain. This object is only
      present when `registrable` is `true`. All prices are per year and returned
      as strings to preserve decimal precision.

      `registration_cost` and `renewal_cost` are frequently the same value, but
      may differ — especially for premium domains where registries set different
      rates for initial registration vs. renewal. For a multi-year registration
      (e.g., 4 years), the first year is charged at `registration_cost` and each
      subsequent year at `renewal_cost`. Registry pricing may change over time;
      the values returned here reflect the current registry rate. Premium pricing
      may be surfaced by Search and Check, but premium registration is not currently
      supported by this API.

      - `currency: string`

        ISO-4217 currency code for the prices (e.g., "USD", "EUR", "GBP").

      - `registration_cost: string`

        The first-year cost to register this domain. For premium domains
        (`tier: premium`), this price is set by the registry and may be
        significantly higher than standard pricing. For multi-year
        registrations, this cost applies to the first year only; subsequent
        years are charged at `renewal_cost`.

      - `renewal_cost: string`

        Per-year renewal cost for this domain. Applied to each year beyond
        the first year of a multi-year registration, and to each annual
        auto-renewal thereafter. May differ from `registration_cost`,
        especially for premium domains where initial registration often
        costs more than renewals.

    - `reason: optional "extension_not_supported_via_api" or "extension_not_supported" or "extension_disallows_registration" or 2 more`

      Present only when `registrable` is `false` on search results. Explains why the domain does not appear registrable through this API. These values are advisory; use POST /domain-check for authoritative status.

      - `extension_not_supported_via_api`: Cloudflare Registrar supports this extension in the dashboard but it is not yet available for programmatic registration via this API.
      - `extension_not_supported`: This extension is not supported by Cloudflare Registrar at all.
      - `extension_disallows_registration`: The extension's registry has temporarily or permanently frozen new registrations.
      - `domain_premium`: The domain is premium priced. Premium registration is not currently supported by this API.
      - `domain_unavailable`: The domain appears unavailable.

      - `"extension_not_supported_via_api"`

      - `"extension_not_supported"`

      - `"extension_disallows_registration"`

      - `"domain_premium"`

      - `"domain_unavailable"`

    - `tier: optional "standard" or "premium"`

      The pricing tier for this domain. Always present when `registrable` is `true`;
      defaults to `standard` for most domains. May be absent when `registrable`
      is `false`.

      - `standard`: Standard registry pricing
      - `premium`: Premium domain with higher pricing set by the registry

      - `"standard"`

      - `"premium"`

- `success: true`

  Whether the API call was successful

  - `true`

### Example

```http
curl https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/registrar/domain-search \
    -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN"
```

#### Response

```json
{
  "errors": [],
  "messages": [],
  "result": {
    "domains": [
      {
        "name": "acmecorp.com",
        "pricing": {
          "currency": "USD",
          "registration_cost": "8.57",
          "renewal_cost": "8.57"
        },
        "registrable": true,
        "tier": "standard"
      },
      {
        "name": "acmecorp.dev",
        "pricing": {
          "currency": "USD",
          "registration_cost": "10.11",
          "renewal_cost": "10.11"
        },
        "registrable": true,
        "tier": "standard"
      },
      {
        "name": "acmecorp.app",
        "pricing": {
          "currency": "USD",
          "registration_cost": "11.00",
          "renewal_cost": "11.00"
        },
        "registrable": true,
        "tier": "standard"
      }
    ]
  },
  "success": true
}
```

## Check domain availability

**post** `/accounts/{account_id}/registrar/domain-check`

Performs real-time, authoritative availability checks directly against domain
registries. Use this endpoint to verify a domain is available before attempting
registration via `POST /registrations`.

**Important:** Unlike the Search endpoint, these results are authoritative and
reflect current registry status. Always check availability immediately before
registration as domain status can change rapidly.

**Note:** This endpoint uses POST to accept a list of domains in the request
body. It is a read-only operation — it does not create, modify, or reserve
any domains.

### Extension support

Only domains on extensions supported for programmatic registration by this API
can be registered. If you check a domain on an unsupported extension, the response
will include `registrable: false` with a `reason` field explaining why:

- `extension_not_supported_via_api` — Cloudflare Registrar supports this extension
  in the dashboard, but it is not yet available for programmatic registration via
  this API. Register via `https://dash.cloudflare.com/{account_id}/domains/registrations` instead.
- `extension_not_supported` — This extension is not supported by Cloudflare
  Registrar.
- `extension_disallows_registration` — The extension's registry has temporarily
  or permanently frozen new registrations. No registrar can register domains on
  this extension at this time.
- `domain_premium` — The domain is premium priced. Premium registration is not
  currently supported by this API.
- `domain_unavailable` — The domain is already registered, reserved, or otherwise
  not available for registration on a supported extension.

The `reason` field is only present when `registrable` is `false`.

### Behavior

- Maximum 20 domains per request
- Pricing is only returned for domains where `registrable: true`
- Results are not cached; each request queries the registry

### Workflow

1. Call this endpoint with domains the user wants to register.
1. For each domain where `registrable: true`, present pricing to the user.
1. If `tier: premium`, note that premium registration is not currently
   supported by this API and do not proceed to `POST /registrations`.
1. Proceed to `POST /registrations` only for supported non-premium domains.

### Path Parameters

- `account_id: string`

  Identifier

### Body Parameters

- `domains: array of string`

  List of fully qualified domain names (FQDNs) to check for availability. Each domain must include the extension.

  - Minimum: 1 domain
  - Maximum: 20 domains per request
  - Domains on unsupported extensions are returned with `registrable: false` and a `reason` field
  - Malformed domain names (e.g., missing extension) may be omitted from the response

### Returns

- `errors: array of ResponseInfo`

  - `code: number`

  - `message: string`

  - `documentation_url: optional string`

  - `source: optional object { pointer }`

    - `pointer: optional string`

- `messages: array of ResponseInfo`

  - `code: number`

  - `message: string`

  - `documentation_url: optional string`

  - `source: optional object { pointer }`

- `result: object { domains }`

  Contains the availability check results.

  - `domains: array of object { name, registrable, pricing, 2 more }`

    Array of domain availability results. Domains on unsupported
    extensions are included with `registrable: false` and a `reason`
    field. Malformed domain names may be omitted.

    - `name: string`

      The fully qualified domain name (FQDN) in punycode format for internationalized domain names (IDNs).

    - `registrable: boolean`

      Indicates whether this domain can be registered programmatically through this API based on a real-time registry check.

      - `true`: Domain is available for registration. The `pricing` object will be included.
      - `false`: Domain is not available. See the `reason` field for why. `tier` may still be present on some non-registrable results, such as premium domains.

    - `pricing: optional object { currency, registration_cost, renewal_cost }`

      Annual pricing information for a registrable domain. This object is only
      present when `registrable` is `true`. All prices are per year and returned
      as strings to preserve decimal precision.

      `registration_cost` and `renewal_cost` are frequently the same value, but
      may differ — especially for premium domains where registries set different
      rates for initial registration vs. renewal. For a multi-year registration
      (e.g., 4 years), the first year is charged at `registration_cost` and each
      subsequent year at `renewal_cost`. Registry pricing may change over time;
      the values returned here reflect the current registry rate. Premium pricing
      may be surfaced by Search and Check, but premium registration is not currently
      supported by this API.

      - `currency: string`

        ISO-4217 currency code for the prices (e.g., "USD", "EUR", "GBP").

      - `registration_cost: string`

        The first-year cost to register this domain. For premium domains
        (`tier: premium`), this price is set by the registry and may be
        significantly higher than standard pricing. For multi-year
        registrations, this cost applies to the first year only; subsequent
        years are charged at `renewal_cost`.

      - `renewal_cost: string`

        Per-year renewal cost for this domain. Applied to each year beyond
        the first year of a multi-year registration, and to each annual
        auto-renewal thereafter. May differ from `registration_cost`,
        especially for premium domains where initial registration often
        costs more than renewals.

    - `reason: optional "extension_not_supported_via_api" or "extension_not_supported" or "extension_disallows_registration" or 2 more`

      Present only when `registrable` is `false`. Explains why the domain cannot be registered via this API.

      - `extension_not_supported_via_api`: Cloudflare Registrar supports this extension in the dashboard but it is not yet available for programmatic registration via this API. The user can register via `https://dash.cloudflare.com/{account_id}/domains/registrations`.
      - `extension_not_supported`: This extension is not supported by Cloudflare Registrar at all.
      - `extension_disallows_registration`: The extension's registry has temporarily or permanently frozen new registrations. No registrar can register domains on this extension at this time.
      - `domain_premium`: The domain is premium priced. Premium registration is not currently supported by this API.
      - `domain_unavailable`: The domain is already registered, reserved, or otherwise not available on a supported extension.

      - `"extension_not_supported_via_api"`

      - `"extension_not_supported"`

      - `"extension_disallows_registration"`

      - `"domain_premium"`

      - `"domain_unavailable"`

    - `tier: optional "standard" or "premium"`

      The pricing tier for this domain. Always present when `registrable` is `true`; defaults to `standard` for most domains. May be absent when `registrable` is `false`.

      - `standard`: Standard registry pricing
      - `premium`: Premium domain with higher pricing set by the registry

      - `"standard"`

      - `"premium"`

- `success: true`

  Whether the API call was successful

  - `true`

### Example

```http
curl https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/registrar/domain-check \
    -H 'Content-Type: application/json' \
    -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
    -d '{
          "domains": [
            "myawesomebrand.com",
            "myawesomebrand.net",
            "myawesomebrand.org",
            "myawesomebrand.app",
            "myawesomebrand.dev"
          ]
        }'
```

#### Response

```json
{
  "errors": [],
  "messages": [],
  "result": {
    "domains": [
      {
        "name": "xq7mz9brand.com",
        "pricing": {
          "currency": "USD",
          "registration_cost": "8.57",
          "renewal_cost": "8.57"
        },
        "registrable": true,
        "tier": "standard"
      },
      {
        "name": "xq7mz9brand.net",
        "pricing": {
          "currency": "USD",
          "registration_cost": "9.95",
          "renewal_cost": "9.95"
        },
        "registrable": true,
        "tier": "standard"
      }
    ]
  },
  "success": true
}
```

## Domain Types

### Registration

- `Registration object { auto_renew, created_at, domain_name, 4 more }`

  A domain registration resource representing the current state of a registered domain.

  - `auto_renew: boolean`

    Whether the domain will be automatically renewed before expiration.

  - `created_at: string`

    When the domain was registered. Present when the registration resource exists.

  - `domain_name: string`

    Fully qualified domain name (FQDN) including the extension
    (e.g., `example.com`, `mybrand.app`). The domain name uniquely
    identifies a registration — the same domain cannot be registered
    twice, making it a natural idempotency key for registration requests.

  - `expires_at: string`

    When the domain registration expires. Present when the registration is ready; may be null only while `status` is `registration_pending`.

  - `locked: boolean`

    Whether the domain is locked for transfer.

  - `privacy_mode: "redaction"`

    Current WHOIS privacy mode for the registration.

    - `"redaction"`

  - `status: "active" or "registration_pending" or "expired" or 3 more`

    Current registration status.

    - `active`: Domain is registered and operational
    - `registration_pending`: Registration is in progress
    - `expired`: Domain has expired
    - `suspended`: Domain is suspended by the registry
    - `redemption_period`: Domain is in the redemption grace period
    - `pending_delete`: Domain is pending deletion by the registry

    - `"active"`

    - `"registration_pending"`

    - `"expired"`

    - `"suspended"`

    - `"redemption_period"`

    - `"pending_delete"`

### Workflow Status

- `WorkflowStatus object { completed, created_at, links, 4 more }`

  Status of an async registration workflow.

  - `completed: boolean`

    Whether the workflow has reached a terminal state. `true` when
    `state` is `succeeded` or `failed`. `false` for `pending`,
    `in_progress`, `action_required`, and `blocked`.

  - `created_at: string`

  - `links: object { self, resource }`

    - `self: string`

      URL to this status resource.

    - `resource: optional string`

      URL to the domain resource.

  - `state: "pending" or "in_progress" or "action_required" or 3 more`

    Workflow lifecycle state.

    - `pending`: Workflow has been created but not yet started processing.
    - `in_progress`: Actively processing. Continue polling `links.self`.
      The workflow has an internal deadline and will not remain in this
      state indefinitely.
    - `action_required`: Paused — requires action by the user (not the
      system). See `context.action` for what is needed. An automated
      polling loop must break on this state; it will not resolve on its
      own without user intervention.
    - `blocked`: The workflow cannot make progress due to a third party
      such as the domain extension's registry or a losing registrar.
      No user action will help. Continue polling — the block may resolve
      when the third party responds.
    - `succeeded`: Terminal. The operation completed successfully.
      `completed` will be `true`. For registrations, `context.registration`
      contains the resulting registration resource.
    - `failed`: Terminal. The operation failed. `completed` will be `true`.
      See `error.code` and `error.message` for the reason. Do not
      auto-retry without user review.

    - `"pending"`

    - `"in_progress"`

    - `"action_required"`

    - `"blocked"`

    - `"succeeded"`

    - `"failed"`

  - `updated_at: string`

  - `context: optional map[unknown]`

    Workflow-specific data for this workflow.

    The workflow subject is identified by `context.domain_name` for
    domain-centric workflows.

  - `error: optional object { code, message }`

    Error details when a workflow reaches the `failed` state. The specific
    error codes and messages depend on the workflow type (registration,
    update, etc.) and the underlying registry response. These workflow
    error codes are separate from immediate HTTP error `errors[].code`
    values returned by non-2xx responses. Surface
    `error.message` to the user for context.

    - `code: string`

      Machine-readable error code identifying the failure reason.

    - `message: string`

      Human-readable explanation of the failure. May include registry-specific details.

### Registrar Search Response

- `RegistrarSearchResponse object { domains }`

  Contains the search results.

  - `domains: array of object { name, registrable, pricing, 2 more }`

    Array of domain suggestions sorted by relevance. May be empty if no domains match the search criteria.

    - `name: string`

      The fully qualified domain name (FQDN) in punycode format for internationalized domain names (IDNs).

    - `registrable: boolean`

      Indicates whether this domain appears available based on search data. Search results are non-authoritative and may be stale. - `true`: The domain appears available. Use POST /domain-check to confirm before registration.

      - `false`: The domain does not appear available in search results.

    - `pricing: optional object { currency, registration_cost, renewal_cost }`

      Annual pricing information for a registrable domain. This object is only
      present when `registrable` is `true`. All prices are per year and returned
      as strings to preserve decimal precision.

      `registration_cost` and `renewal_cost` are frequently the same value, but
      may differ — especially for premium domains where registries set different
      rates for initial registration vs. renewal. For a multi-year registration
      (e.g., 4 years), the first year is charged at `registration_cost` and each
      subsequent year at `renewal_cost`. Registry pricing may change over time;
      the values returned here reflect the current registry rate. Premium pricing
      may be surfaced by Search and Check, but premium registration is not currently
      supported by this API.

      - `currency: string`

        ISO-4217 currency code for the prices (e.g., "USD", "EUR", "GBP").

      - `registration_cost: string`

        The first-year cost to register this domain. For premium domains
        (`tier: premium`), this price is set by the registry and may be
        significantly higher than standard pricing. For multi-year
        registrations, this cost applies to the first year only; subsequent
        years are charged at `renewal_cost`.

      - `renewal_cost: string`

        Per-year renewal cost for this domain. Applied to each year beyond
        the first year of a multi-year registration, and to each annual
        auto-renewal thereafter. May differ from `registration_cost`,
        especially for premium domains where initial registration often
        costs more than renewals.

    - `reason: optional "extension_not_supported_via_api" or "extension_not_supported" or "extension_disallows_registration" or 2 more`

      Present only when `registrable` is `false` on search results. Explains why the domain does not appear registrable through this API. These values are advisory; use POST /domain-check for authoritative status.

      - `extension_not_supported_via_api`: Cloudflare Registrar supports this extension in the dashboard but it is not yet available for programmatic registration via this API.
      - `extension_not_supported`: This extension is not supported by Cloudflare Registrar at all.
      - `extension_disallows_registration`: The extension's registry has temporarily or permanently frozen new registrations.
      - `domain_premium`: The domain is premium priced. Premium registration is not currently supported by this API.
      - `domain_unavailable`: The domain appears unavailable.

      - `"extension_not_supported_via_api"`

      - `"extension_not_supported"`

      - `"extension_disallows_registration"`

      - `"domain_premium"`

      - `"domain_unavailable"`

    - `tier: optional "standard" or "premium"`

      The pricing tier for this domain. Always present when `registrable` is `true`;
      defaults to `standard` for most domains. May be absent when `registrable`
      is `false`.

      - `standard`: Standard registry pricing
      - `premium`: Premium domain with higher pricing set by the registry

      - `"standard"`

      - `"premium"`

### Registrar Check Response

- `RegistrarCheckResponse object { domains }`

  Contains the availability check results.

  - `domains: array of object { name, registrable, pricing, 2 more }`

    Array of domain availability results. Domains on unsupported
    extensions are included with `registrable: false` and a `reason`
    field. Malformed domain names may be omitted.

    - `name: string`

      The fully qualified domain name (FQDN) in punycode format for internationalized domain names (IDNs).

    - `registrable: boolean`

      Indicates whether this domain can be registered programmatically through this API based on a real-time registry check.

      - `true`: Domain is available for registration. The `pricing` object will be included.
      - `false`: Domain is not available. See the `reason` field for why. `tier` may still be present on some non-registrable results, such as premium domains.

    - `pricing: optional object { currency, registration_cost, renewal_cost }`

      Annual pricing information for a registrable domain. This object is only
      present when `registrable` is `true`. All prices are per year and returned
      as strings to preserve decimal precision.

      `registration_cost` and `renewal_cost` are frequently the same value, but
      may differ — especially for premium domains where registries set different
      rates for initial registration vs. renewal. For a multi-year registration
      (e.g., 4 years), the first year is charged at `registration_cost` and each
      subsequent year at `renewal_cost`. Registry pricing may change over time;
      the values returned here reflect the current registry rate. Premium pricing
      may be surfaced by Search and Check, but premium registration is not currently
      supported by this API.

      - `currency: string`

        ISO-4217 currency code for the prices (e.g., "USD", "EUR", "GBP").

      - `registration_cost: string`

        The first-year cost to register this domain. For premium domains
        (`tier: premium`), this price is set by the registry and may be
        significantly higher than standard pricing. For multi-year
        registrations, this cost applies to the first year only; subsequent
        years are charged at `renewal_cost`.

      - `renewal_cost: string`

        Per-year renewal cost for this domain. Applied to each year beyond
        the first year of a multi-year registration, and to each annual
        auto-renewal thereafter. May differ from `registration_cost`,
        especially for premium domains where initial registration often
        costs more than renewals.

    - `reason: optional "extension_not_supported_via_api" or "extension_not_supported" or "extension_disallows_registration" or 2 more`

      Present only when `registrable` is `false`. Explains why the domain cannot be registered via this API.

      - `extension_not_supported_via_api`: Cloudflare Registrar supports this extension in the dashboard but it is not yet available for programmatic registration via this API. The user can register via `https://dash.cloudflare.com/{account_id}/domains/registrations`.
      - `extension_not_supported`: This extension is not supported by Cloudflare Registrar at all.
      - `extension_disallows_registration`: The extension's registry has temporarily or permanently frozen new registrations. No registrar can register domains on this extension at this time.
      - `domain_premium`: The domain is premium priced. Premium registration is not currently supported by this API.
      - `domain_unavailable`: The domain is already registered, reserved, or otherwise not available on a supported extension.

      - `"extension_not_supported_via_api"`

      - `"extension_not_supported"`

      - `"extension_disallows_registration"`

      - `"domain_premium"`

      - `"domain_unavailable"`

    - `tier: optional "standard" or "premium"`

      The pricing tier for this domain. Always present when `registrable` is `true`; defaults to `standard` for most domains. May be absent when `registrable` is `false`.

      - `standard`: Standard registry pricing
      - `premium`: Premium domain with higher pricing set by the registry

      - `"standard"`

      - `"premium"`

# Domains

## List domains

**get** `/accounts/{account_id}/registrar/domains`

List domains handled by Registrar.

### Path Parameters

- `account_id: string`

  Identifier

### Returns

- `errors: array of ResponseInfo`

  - `code: number`

  - `message: string`

  - `documentation_url: optional string`

  - `source: optional object { pointer }`

    - `pointer: optional string`

- `messages: array of ResponseInfo`

  - `code: number`

  - `message: string`

  - `documentation_url: optional string`

  - `source: optional object { pointer }`

- `result: array of Domain`

  - `id: optional string`

    Domain identifier.

  - `available: optional boolean`

    Shows if a domain is available for transferring into Cloudflare Registrar.

  - `can_register: optional boolean`

    Indicates if the domain can be registered as a new domain.

  - `created_at: optional string`

    Shows time of creation.

  - `current_registrar: optional string`

    Shows name of current registrar.

  - `expires_at: optional string`

    Shows when domain name registration expires.

  - `locked: optional boolean`

    Shows whether a registrar lock is in place for a domain.

  - `registrant_contact: optional object { address, city, country, 10 more }`

    Shows contact information for domain registrant.

    - `address: string`

      Address.

    - `city: string`

      City.

    - `country: string`

      The country in which the user lives.

    - `first_name: string`

      User's first name

    - `last_name: string`

      User's last name

    - `organization: string`

      Name of organization.

    - `phone: string`

      User's telephone number

    - `state: string`

      State.

    - `zip: string`

      The zipcode or postal code where the user lives.

    - `id: optional string`

      Contact Identifier.

    - `address2: optional string`

      Optional address line for unit, floor, suite, etc.

    - `email: optional string`

      The contact email address of the user.

    - `fax: optional string`

      Contact fax number.

  - `registry_statuses: optional string`

    A comma-separated list of registry status codes. A full list of status codes can be found at [EPP Status Codes](https://www.icann.org/resources/pages/epp-status-codes-2014-06-16-en).

  - `supported_tld: optional boolean`

    Whether a particular TLD is currently supported by Cloudflare Registrar. Refer to [TLD Policies](https://www.cloudflare.com/tld-policies/) for a list of supported TLDs.

  - `transfer_in: optional object { accept_foa, approve_transfer, can_cancel_transfer, 3 more }`

    Statuses for domain transfers into Cloudflare Registrar.

    - `accept_foa: optional "needed" or "ok"`

      Form of authorization has been accepted by the registrant.

      - `"needed"`

      - `"ok"`

    - `approve_transfer: optional "needed" or "ok" or "pending" or 3 more`

      Shows transfer status with the registry.

      - `"needed"`

      - `"ok"`

      - `"pending"`

      - `"trying"`

      - `"rejected"`

      - `"unknown"`

    - `can_cancel_transfer: optional boolean`

      Indicates if cancellation is still possible.

    - `disable_privacy: optional "needed" or "ok" or "unknown"`

      Privacy guards are disabled at the foreign registrar.

      - `"needed"`

      - `"ok"`

      - `"unknown"`

    - `enter_auth_code: optional "needed" or "ok" or "pending" or 2 more`

      Auth code has been entered and verified.

      - `"needed"`

      - `"ok"`

      - `"pending"`

      - `"trying"`

      - `"rejected"`

    - `unlock_domain: optional "needed" or "ok" or "pending" or 2 more`

      Domain is unlocked at the foreign registrar.

      - `"needed"`

      - `"ok"`

      - `"pending"`

      - `"trying"`

      - `"unknown"`

  - `updated_at: optional string`

    Last updated.

- `success: true`

  Whether the API call was successful

  - `true`

- `result_info: optional object { count, page, per_page, total_count }`

  - `count: optional number`

    Total number of results for the requested service

  - `page: optional number`

    Current page within paginated list of results

  - `per_page: optional number`

    Number of results per page of results

  - `total_count: optional number`

    Total results available without any search parameters

### Example

```http
curl https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/registrar/domains \
    -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN"
```

#### Response

```json
{
  "errors": [
    {
      "code": 1000,
      "message": "message",
      "documentation_url": "documentation_url",
      "source": {
        "pointer": "pointer"
      }
    }
  ],
  "messages": [
    {
      "code": 1000,
      "message": "message",
      "documentation_url": "documentation_url",
      "source": {
        "pointer": "pointer"
      }
    }
  ],
  "result": [
    {
      "id": "ea95132c15732412d22c1476fa83f27a",
      "available": false,
      "can_register": false,
      "created_at": "2018-08-28T17:26:26Z",
      "current_registrar": "Cloudflare",
      "expires_at": "2019-08-28T23:59:59Z",
      "locked": false,
      "registrant_contact": {
        "address": "123 Sesame St.",
        "city": "Austin",
        "country": "US",
        "first_name": "John",
        "last_name": "Appleseed",
        "organization": "Cloudflare, Inc.",
        "phone": "+1 123-123-1234",
        "state": "TX",
        "zip": "12345",
        "id": "ea95132c15732412d22c1476fa83f27a",
        "address2": "Suite 430",
        "email": "user@example.com",
        "fax": "123-867-5309"
      },
      "registry_statuses": "ok,serverTransferProhibited",
      "supported_tld": true,
      "transfer_in": {
        "accept_foa": "needed",
        "approve_transfer": "unknown",
        "can_cancel_transfer": true,
        "disable_privacy": "ok",
        "enter_auth_code": "needed",
        "unlock_domain": "ok"
      },
      "updated_at": "2018-08-28T17:26:26Z"
    }
  ],
  "success": true,
  "result_info": {
    "count": 1,
    "page": 1,
    "per_page": 20,
    "total_count": 2000
  }
}
```

## Get domain

**get** `/accounts/{account_id}/registrar/domains/{domain_name}`

Show individual domain.

### Path Parameters

- `account_id: string`

  Identifier

- `domain_name: string`

  Fully qualified domain name (FQDN) including the extension
  (e.g., `example.com`, `mybrand.app`). The domain name uniquely
  identifies a registration — the same domain cannot be registered
  twice, making it a natural idempotency key for registration requests.

### Returns

- `errors: array of ResponseInfo`

  - `code: number`

  - `message: string`

  - `documentation_url: optional string`

  - `source: optional object { pointer }`

    - `pointer: optional string`

- `messages: array of ResponseInfo`

  - `code: number`

  - `message: string`

  - `documentation_url: optional string`

  - `source: optional object { pointer }`

- `result: unknown`

- `success: true`

  Whether the API call was successful

  - `true`

### Example

```http
curl https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/registrar/domains/$DOMAIN_NAME \
    -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN"
```

#### Response

```json
{
  "errors": [
    {
      "code": 1000,
      "message": "message",
      "documentation_url": "documentation_url",
      "source": {
        "pointer": "pointer"
      }
    }
  ],
  "messages": [
    {
      "code": 1000,
      "message": "message",
      "documentation_url": "documentation_url",
      "source": {
        "pointer": "pointer"
      }
    }
  ],
  "result": {},
  "success": true
}
```

## Update domain

**put** `/accounts/{account_id}/registrar/domains/{domain_name}`

Update individual domain.

### Path Parameters

- `account_id: string`

  Identifier

- `domain_name: string`

  Fully qualified domain name (FQDN) including the extension
  (e.g., `example.com`, `mybrand.app`). The domain name uniquely
  identifies a registration — the same domain cannot be registered
  twice, making it a natural idempotency key for registration requests.

### Body Parameters

- `auto_renew: optional boolean`

  Auto-renew controls whether subscription is automatically renewed upon domain expiration.

- `locked: optional boolean`

  Shows whether a registrar lock is in place for a domain.

- `privacy: optional boolean`

  Privacy option controls redacting WHOIS information.

### Returns

- `errors: array of ResponseInfo`

  - `code: number`

  - `message: string`

  - `documentation_url: optional string`

  - `source: optional object { pointer }`

    - `pointer: optional string`

- `messages: array of ResponseInfo`

  - `code: number`

  - `message: string`

  - `documentation_url: optional string`

  - `source: optional object { pointer }`

- `result: unknown`

- `success: true`

  Whether the API call was successful

  - `true`

### Example

```http
curl https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/registrar/domains/$DOMAIN_NAME \
    -X PUT \
    -H 'Content-Type: application/json' \
    -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
    -d '{
          "auto_renew": true,
          "privacy": true
        }'
```

#### Response

```json
{
  "errors": [
    {
      "code": 1000,
      "message": "message",
      "documentation_url": "documentation_url",
      "source": {
        "pointer": "pointer"
      }
    }
  ],
  "messages": [
    {
      "code": 1000,
      "message": "message",
      "documentation_url": "documentation_url",
      "source": {
        "pointer": "pointer"
      }
    }
  ],
  "result": {},
  "success": true
}
```

## Domain Types

### Domain

- `Domain object { id, available, can_register, 9 more }`

  - `id: optional string`

    Domain identifier.

  - `available: optional boolean`

    Shows if a domain is available for transferring into Cloudflare Registrar.

  - `can_register: optional boolean`

    Indicates if the domain can be registered as a new domain.

  - `created_at: optional string`

    Shows time of creation.

  - `current_registrar: optional string`

    Shows name of current registrar.

  - `expires_at: optional string`

    Shows when domain name registration expires.

  - `locked: optional boolean`

    Shows whether a registrar lock is in place for a domain.

  - `registrant_contact: optional object { address, city, country, 10 more }`

    Shows contact information for domain registrant.

    - `address: string`

      Address.

    - `city: string`

      City.

    - `country: string`

      The country in which the user lives.

    - `first_name: string`

      User's first name

    - `last_name: string`

      User's last name

    - `organization: string`

      Name of organization.

    - `phone: string`

      User's telephone number

    - `state: string`

      State.

    - `zip: string`

      The zipcode or postal code where the user lives.

    - `id: optional string`

      Contact Identifier.

    - `address2: optional string`

      Optional address line for unit, floor, suite, etc.

    - `email: optional string`

      The contact email address of the user.

    - `fax: optional string`

      Contact fax number.

  - `registry_statuses: optional string`

    A comma-separated list of registry status codes. A full list of status codes can be found at [EPP Status Codes](https://www.icann.org/resources/pages/epp-status-codes-2014-06-16-en).

  - `supported_tld: optional boolean`

    Whether a particular TLD is currently supported by Cloudflare Registrar. Refer to [TLD Policies](https://www.cloudflare.com/tld-policies/) for a list of supported TLDs.

  - `transfer_in: optional object { accept_foa, approve_transfer, can_cancel_transfer, 3 more }`

    Statuses for domain transfers into Cloudflare Registrar.

    - `accept_foa: optional "needed" or "ok"`

      Form of authorization has been accepted by the registrant.

      - `"needed"`

      - `"ok"`

    - `approve_transfer: optional "needed" or "ok" or "pending" or 3 more`

      Shows transfer status with the registry.

      - `"needed"`

      - `"ok"`

      - `"pending"`

      - `"trying"`

      - `"rejected"`

      - `"unknown"`

    - `can_cancel_transfer: optional boolean`

      Indicates if cancellation is still possible.

    - `disable_privacy: optional "needed" or "ok" or "unknown"`

      Privacy guards are disabled at the foreign registrar.

      - `"needed"`

      - `"ok"`

      - `"unknown"`

    - `enter_auth_code: optional "needed" or "ok" or "pending" or 2 more`

      Auth code has been entered and verified.

      - `"needed"`

      - `"ok"`

      - `"pending"`

      - `"trying"`

      - `"rejected"`

    - `unlock_domain: optional "needed" or "ok" or "pending" or 2 more`

      Domain is unlocked at the foreign registrar.

      - `"needed"`

      - `"ok"`

      - `"pending"`

      - `"trying"`

      - `"unknown"`

  - `updated_at: optional string`

    Last updated.

### Domain Get Response

- `DomainGetResponse = unknown`

### Domain Update Response

- `DomainUpdateResponse = unknown`

# Registrations

## Create Registration

**post** `/accounts/{account_id}/registrar/registrations`

Starts a domain registration workflow. This is a billable operation — successful
registration charges the account's default payment method. All successful
domain registrations are non-refundable — once the workflow completes with
`state: succeeded`, the charge cannot be reversed.

### Prerequisites

- The account must have a billing profile with a valid default payment method.
  Set this up at `https://dash.cloudflare.com/{account_id}/billing/payment-info`.
- The account must not already be at the maximum supported domain limit.
  A single account may own up to 100 domains in total across registrations
  created through either the dashboard or this API.
- The domain must be on a supported extension for programmatic registration.
- Use `POST /domain-check` immediately before calling this endpoint to confirm
  real-time availability and pricing.

### Supported extensions

In this API, "extension" means the full registrable suffix after the domain
label. For example, in `example.co.uk`, the extension is `co.uk`.

Programmatic registration is currently supported for:

`com`, `org`, `net`, `app`, `dev`, `cc`, `xyz`, `info`, `cloud`, `studio`,
`live`, `link`, `pro`, `tech`, `fyi`, `shop`, `online`, `tools`, `run`,
`games`, `build`, `systems`, `world`, `news`, `site`, `network`, `chat`,
`space`, `family`, `page`, `life`, `group`, `email`, `solutions`, `day`,
`blog`, `ing`, `icu`, `academy`, `today`

Cloudflare Registrar supports 400+ extensions in the dashboard. Extensions
not listed above can still be registered at
`https://dash.cloudflare.com/{account_id}/domains/registrations`.

### Express mode

The only required field is `domain_name`. If `contacts` is omitted, the system
uses the account's default address book entry as the registrant. If no default
exists and no contact is provided, the request fails. Set up a default address
book entry and accept the required agreement at
`https://dash.cloudflare.com/{account_id}/domains/registrations`.

### Defaults

- `years`: defaults to the extension's minimum registration period (1 year for
  most extensions, but varies — for example, `.ai` (if supported) requires a minimum of 2 years).
- `auto_renew`: defaults to `false`. Setting it to `true` is an explicit
  opt-in authorizing Cloudflare to charge the account's default payment
  method up to 30 days before domain expiry to renew the registration.
  Renewal pricing may change over time based on registry pricing.
- `privacy_mode`: defaults to `redaction`.

### Premium domains

Premium domain registration is not currently supported by this API.
If `POST /domain-check` returns `tier: premium`, do not call this
endpoint for that domain.

### Response behavior

By default, the server holds the connection for a bounded, server-defined
amount of time while the registration completes. Most registrations finish
within this window and return `201 Created` with a completed workflow status.

If the registration is still processing after this synchronous wait window,
the server returns `202 Accepted`. Poll the URL in `links.self` to track progress.

To skip the wait and receive an immediate `202`, send `Prefer: respond-async`.

### Path Parameters

- `account_id: string`

  Identifier

### Header Parameters

- `Prefer: optional string`

### Body Parameters

- `domain_name: string`

  Fully qualified domain name (FQDN) including the extension
  (e.g., `example.com`, `mybrand.app`). The domain name uniquely
  identifies a registration — the same domain cannot be registered
  twice, making it a natural idempotency key for registration requests.

- `auto_renew: optional boolean`

  Enable or disable automatic renewal. Defaults to `false` if omitted.
  Setting this field to `true` is an explicit opt-in authorizing
  Cloudflare to charge the account's default payment method up to 30
  days before domain expiry to renew the domain automatically.
  Renewal pricing may change over time based on registry pricing.

- `contacts: optional object { registrant }`

  Contact data for the registration request.

  If the `contacts` object is omitted entirely from the request, or if
  `contacts.registrant` is not provided, the system will use the account's
  default address book entry as the registrant contact. This default must be
  pre-configured by the account owner at
  `https://dash.cloudflare.com/{account_id}/domains/registrations`, where
  they can create or update the address book entry and accept the required
  agreement. No API exists for managing address book entries at this time.

  If no default address book entry exists and no registrant contact is
  provided, the registration request will fail with a validation error.

  - `registrant: optional object { email, phone, postal_info, fax }`

    Registrant contact data for the domain registration. This information
    is submitted to the domain registry and, depending on extension and
    privacy settings, may appear in public WHOIS records.

    - `email: string`

      Email address for the registrant. Used for domain-related
      communications from the registry, including ownership verification
      and renewal notices.

    - `phone: string`

      Phone number in E.164 format: `+{country_code}.{number}` with no
      spaces or dashes. Examples: `+1.5555555555` (US), `+44.2071234567`
      (UK), `+81.312345678` (Japan).

    - `postal_info: object { address, name, organization }`

      Postal/mailing information for the registrant contact.

      - `address: object { city, country_code, postal_code, 2 more }`

        Physical mailing address for the registrant contact.

        - `city: string`

          City or locality name.

        - `country_code: string`

          Two-letter country code per ISO 3166-1 alpha-2 (e.g., `US`, `GB`, `CA`, `DE`).

        - `postal_code: string`

          Postal or ZIP code.

        - `state: string`

          State, province, or region. Use the standard abbreviation where applicable (e.g., `TX` for Texas, `ON` for Ontario).

        - `street: string`

          Street address including building/suite number.

      - `name: string`

        Full legal name of the registrant (individual or authorized representative).

      - `organization: optional string`

        Organization or company name. Optional for individual registrants.

    - `fax: optional string`

      Fax number in E.164 format (e.g., `+1.5555555555`). Optional.
      Most registrations do not require a fax number.

- `privacy_mode: optional "redaction"`

  WHOIS privacy mode for the registration. Defaults to `redaction`.

  - `off`: Do not request WHOIS privacy.
  - `redaction`: Request WHOIS redaction where supported by the extension.
    Some extensions do not support privacy/redaction.

  - `"redaction"`

- `years: optional number`

  Number of years to register (1–10). If omitted, defaults to the
  minimum registration period required by the registry for this
  extension. For most extensions this is 1 year, but some extensions
  require longer minimum terms (e.g., `.ai` requires a minimum of
  2 years).

  The registry for each extension may also enforce its own maximum
  registration term. If the requested value exceeds the registry's
  maximum, the registration will be rejected. When in doubt, use the
  default by omitting this field.

### Returns

- `errors: array of ResponseInfo`

  - `code: number`

  - `message: string`

  - `documentation_url: optional string`

  - `source: optional object { pointer }`

    - `pointer: optional string`

- `messages: array of ResponseInfo`

  - `code: number`

  - `message: string`

  - `documentation_url: optional string`

  - `source: optional object { pointer }`

- `result: WorkflowStatus`

  Status of an async registration workflow.

  - `completed: boolean`

    Whether the workflow has reached a terminal state. `true` when
    `state` is `succeeded` or `failed`. `false` for `pending`,
    `in_progress`, `action_required`, and `blocked`.

  - `created_at: string`

  - `links: object { self, resource }`

    - `self: string`

      URL to this status resource.

    - `resource: optional string`

      URL to the domain resource.

  - `state: "pending" or "in_progress" or "action_required" or 3 more`

    Workflow lifecycle state.

    - `pending`: Workflow has been created but not yet started processing.
    - `in_progress`: Actively processing. Continue polling `links.self`.
      The workflow has an internal deadline and will not remain in this
      state indefinitely.
    - `action_required`: Paused — requires action by the user (not the
      system). See `context.action` for what is needed. An automated
      polling loop must break on this state; it will not resolve on its
      own without user intervention.
    - `blocked`: The workflow cannot make progress due to a third party
      such as the domain extension's registry or a losing registrar.
      No user action will help. Continue polling — the block may resolve
      when the third party responds.
    - `succeeded`: Terminal. The operation completed successfully.
      `completed` will be `true`. For registrations, `context.registration`
      contains the resulting registration resource.
    - `failed`: Terminal. The operation failed. `completed` will be `true`.
      See `error.code` and `error.message` for the reason. Do not
      auto-retry without user review.

    - `"pending"`

    - `"in_progress"`

    - `"action_required"`

    - `"blocked"`

    - `"succeeded"`

    - `"failed"`

  - `updated_at: string`

  - `context: optional map[unknown]`

    Workflow-specific data for this workflow.

    The workflow subject is identified by `context.domain_name` for
    domain-centric workflows.

  - `error: optional object { code, message }`

    Error details when a workflow reaches the `failed` state. The specific
    error codes and messages depend on the workflow type (registration,
    update, etc.) and the underlying registry response. These workflow
    error codes are separate from immediate HTTP error `errors[].code`
    values returned by non-2xx responses. Surface
    `error.message` to the user for context.

    - `code: string`

      Machine-readable error code identifying the failure reason.

    - `message: string`

      Human-readable explanation of the failure. May include registry-specific details.

- `success: true`

  Whether the API call was successful

  - `true`

### Example

```http
curl https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/registrar/registrations \
    -H 'Content-Type: application/json' \
    -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
    -d '{
          "domain_name": "my-new-startup.com",
          "privacy_mode": "redaction",
          "years": 1
        }'
```

#### Response

```json
{
  "errors": [
    {
      "code": 1000,
      "message": "message",
      "documentation_url": "documentation_url",
      "source": {
        "pointer": "pointer"
      }
    }
  ],
  "messages": [
    {
      "code": 1000,
      "message": "message",
      "documentation_url": "documentation_url",
      "source": {
        "pointer": "pointer"
      }
    }
  ],
  "result": {
    "completed": false,
    "created_at": "2019-12-27T18:11:19.117Z",
    "links": {
      "self": "/accounts/{account_id}/registrar/registrations/example.com/registration-status",
      "resource": "/accounts/{account_id}/registrar/registrations/example.com"
    },
    "state": "in_progress",
    "updated_at": "2019-12-27T18:11:19.117Z",
    "context": {
      "foo": "bar"
    },
    "error": {
      "code": "registry_rejected",
      "message": "Registry rejected the request."
    }
  },
  "success": true
}
```

## List Registrations

**get** `/accounts/{account_id}/registrar/registrations`

Returns a paginated list of domain registrations owned by the account.

This endpoint uses cursor-based pagination. Results are ordered by registration
date by default. To fetch the next page, pass the `cursor` value from the
`result_info` object in the response as the `cursor` query parameter in
your next request. An empty `cursor` string indicates there are no more
pages.

### Path Parameters

- `account_id: string`

  Identifier

### Query Parameters

- `cursor: optional string`

  Opaque token from a previous response's `result_info.cursor`.
  Pass this value to fetch the next page of results. Omit (or
  pass an empty string) for the first page.

- `direction: optional "asc" or "desc"`

  Sort direction for results. Defaults to ascending order.

  - `"asc"`

  - `"desc"`

- `per_page: optional number`

  Number of items to return per page.

- `sort_by: optional "registry_created_at" or "registry_expires_at" or "name"`

  Column to sort results by. Defaults to registration date
  (`registry_created_at`) when omitted.

  - `"registry_created_at"`

  - `"registry_expires_at"`

  - `"name"`

### Returns

- `errors: array of ResponseInfo`

  - `code: number`

  - `message: string`

  - `documentation_url: optional string`

  - `source: optional object { pointer }`

    - `pointer: optional string`

- `messages: array of ResponseInfo`

  - `code: number`

  - `message: string`

  - `documentation_url: optional string`

  - `source: optional object { pointer }`

- `result: array of Registration`

  - `auto_renew: boolean`

    Whether the domain will be automatically renewed before expiration.

  - `created_at: string`

    When the domain was registered. Present when the registration resource exists.

  - `domain_name: string`

    Fully qualified domain name (FQDN) including the extension
    (e.g., `example.com`, `mybrand.app`). The domain name uniquely
    identifies a registration — the same domain cannot be registered
    twice, making it a natural idempotency key for registration requests.

  - `expires_at: string`

    When the domain registration expires. Present when the registration is ready; may be null only while `status` is `registration_pending`.

  - `locked: boolean`

    Whether the domain is locked for transfer.

  - `privacy_mode: "redaction"`

    Current WHOIS privacy mode for the registration.

    - `"redaction"`

  - `status: "active" or "registration_pending" or "expired" or 3 more`

    Current registration status.

    - `active`: Domain is registered and operational
    - `registration_pending`: Registration is in progress
    - `expired`: Domain has expired
    - `suspended`: Domain is suspended by the registry
    - `redemption_period`: Domain is in the redemption grace period
    - `pending_delete`: Domain is pending deletion by the registry

    - `"active"`

    - `"registration_pending"`

    - `"expired"`

    - `"suspended"`

    - `"redemption_period"`

    - `"pending_delete"`

- `result_info: object { count, cursor, per_page }`

  Cursor-based pagination metadata. Used by list endpoints that support
  cursor pagination. Pass the `cursor` value as a query parameter in the
  next request to fetch the next page. An empty string indicates there
  are no more pages.

  - `count: number`

    Number of items in the current result set.

  - `cursor: string`

    Opaque cursor for fetching the next page. Pass this value as the
    `cursor` query parameter in a subsequent request. An empty string
    indicates there are no more pages.

  - `per_page: number`

    Maximum number of items per page.

- `success: true`

  Whether the API call was successful

  - `true`

### Example

```http
curl https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/registrar/registrations \
    -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN"
```

#### Response

```json
{
  "errors": [],
  "messages": [],
  "result": [],
  "result_info": {
    "count": 0,
    "cursor": "",
    "per_page": 20
  },
  "success": true
}
```

## Get Registration

**get** `/accounts/{account_id}/registrar/registrations/{domain_name}`

Returns the current state of a domain registration.

This is the canonical read endpoint for a domain you own. It returns
the full registration resource including current settings and expiration.
When the registration resource is ready, both `created_at` and `expires_at`
are present in the response.

### Path Parameters

- `account_id: string`

  Identifier

- `domain_name: string`

  Fully qualified domain name (FQDN) including the extension
  (e.g., `example.com`, `mybrand.app`). The domain name uniquely
  identifies a registration — the same domain cannot be registered
  twice, making it a natural idempotency key for registration requests.

### Returns

- `errors: array of ResponseInfo`

  - `code: number`

  - `message: string`

  - `documentation_url: optional string`

  - `source: optional object { pointer }`

    - `pointer: optional string`

- `messages: array of ResponseInfo`

  - `code: number`

  - `message: string`

  - `documentation_url: optional string`

  - `source: optional object { pointer }`

- `result: Registration`

  A domain registration resource representing the current state of a registered domain.

  - `auto_renew: boolean`

    Whether the domain will be automatically renewed before expiration.

  - `created_at: string`

    When the domain was registered. Present when the registration resource exists.

  - `domain_name: string`

    Fully qualified domain name (FQDN) including the extension
    (e.g., `example.com`, `mybrand.app`). The domain name uniquely
    identifies a registration — the same domain cannot be registered
    twice, making it a natural idempotency key for registration requests.

  - `expires_at: string`

    When the domain registration expires. Present when the registration is ready; may be null only while `status` is `registration_pending`.

  - `locked: boolean`

    Whether the domain is locked for transfer.

  - `privacy_mode: "redaction"`

    Current WHOIS privacy mode for the registration.

    - `"redaction"`

  - `status: "active" or "registration_pending" or "expired" or 3 more`

    Current registration status.

    - `active`: Domain is registered and operational
    - `registration_pending`: Registration is in progress
    - `expired`: Domain has expired
    - `suspended`: Domain is suspended by the registry
    - `redemption_period`: Domain is in the redemption grace period
    - `pending_delete`: Domain is pending deletion by the registry

    - `"active"`

    - `"registration_pending"`

    - `"expired"`

    - `"suspended"`

    - `"redemption_period"`

    - `"pending_delete"`

- `success: true`

  Whether the API call was successful

  - `true`

### Example

```http
curl https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/registrar/registrations/$DOMAIN_NAME \
    -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN"
```

#### Response

```json
{
  "errors": [],
  "messages": [],
  "result": {
    "auto_renew": true,
    "created_at": "2025-01-15T10:00:00Z",
    "domain_name": "example.com",
    "expires_at": "2026-01-15T10:00:00Z",
    "locked": true,
    "privacy_mode": "redaction",
    "status": "active"
  },
  "success": true
}
```

## Update Registration

**patch** `/accounts/{account_id}/registrar/registrations/{domain_name}`

Updates an existing domain registration.

By default, the server holds the connection for a bounded, server-defined
amount of time while the update completes. Most updates finish within this
window and return `200 OK` with a completed workflow status.

If the update is still processing after this synchronous wait window, the
server returns `202 Accepted`. Poll the URL in `links.self` to track progress.

To skip the wait and receive an immediate `202`, send `Prefer: respond-async`.

This endpoint currently supports updating `auto_renew` only.

### Path Parameters

- `account_id: string`

  Identifier

- `domain_name: string`

  Fully qualified domain name (FQDN) including the extension
  (e.g., `example.com`, `mybrand.app`). The domain name uniquely
  identifies a registration — the same domain cannot be registered
  twice, making it a natural idempotency key for registration requests.

### Header Parameters

- `Prefer: optional "respond-async"`

  - `"respond-async"`

### Body Parameters

- `auto_renew: optional boolean`

  Enable or disable automatic renewal.
  Setting this field to `true` authorizes Cloudflare to charge the
  account's default payment method up to 30 days before domain expiry
  to renew the domain automatically. Renewal pricing may change over
  time based on registry pricing.

### Returns

- `errors: array of ResponseInfo`

  - `code: number`

  - `message: string`

  - `documentation_url: optional string`

  - `source: optional object { pointer }`

    - `pointer: optional string`

- `messages: array of ResponseInfo`

  - `code: number`

  - `message: string`

  - `documentation_url: optional string`

  - `source: optional object { pointer }`

- `result: WorkflowStatus`

  Status of an async registration workflow.

  - `completed: boolean`

    Whether the workflow has reached a terminal state. `true` when
    `state` is `succeeded` or `failed`. `false` for `pending`,
    `in_progress`, `action_required`, and `blocked`.

  - `created_at: string`

  - `links: object { self, resource }`

    - `self: string`

      URL to this status resource.

    - `resource: optional string`

      URL to the domain resource.

  - `state: "pending" or "in_progress" or "action_required" or 3 more`

    Workflow lifecycle state.

    - `pending`: Workflow has been created but not yet started processing.
    - `in_progress`: Actively processing. Continue polling `links.self`.
      The workflow has an internal deadline and will not remain in this
      state indefinitely.
    - `action_required`: Paused — requires action by the user (not the
      system). See `context.action` for what is needed. An automated
      polling loop must break on this state; it will not resolve on its
      own without user intervention.
    - `blocked`: The workflow cannot make progress due to a third party
      such as the domain extension's registry or a losing registrar.
      No user action will help. Continue polling — the block may resolve
      when the third party responds.
    - `succeeded`: Terminal. The operation completed successfully.
      `completed` will be `true`. For registrations, `context.registration`
      contains the resulting registration resource.
    - `failed`: Terminal. The operation failed. `completed` will be `true`.
      See `error.code` and `error.message` for the reason. Do not
      auto-retry without user review.

    - `"pending"`

    - `"in_progress"`

    - `"action_required"`

    - `"blocked"`

    - `"succeeded"`

    - `"failed"`

  - `updated_at: string`

  - `context: optional map[unknown]`

    Workflow-specific data for this workflow.

    The workflow subject is identified by `context.domain_name` for
    domain-centric workflows.

  - `error: optional object { code, message }`

    Error details when a workflow reaches the `failed` state. The specific
    error codes and messages depend on the workflow type (registration,
    update, etc.) and the underlying registry response. These workflow
    error codes are separate from immediate HTTP error `errors[].code`
    values returned by non-2xx responses. Surface
    `error.message` to the user for context.

    - `code: string`

      Machine-readable error code identifying the failure reason.

    - `message: string`

      Human-readable explanation of the failure. May include registry-specific details.

- `success: true`

  Whether the API call was successful

  - `true`

### Example

```http
curl https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/registrar/registrations/$DOMAIN_NAME \
    -X PATCH \
    -H 'Content-Type: application/json' \
    -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
    -d '{
          "auto_renew": false
        }'
```

#### Response

```json
{
  "errors": [
    {
      "code": 1000,
      "message": "message",
      "documentation_url": "documentation_url",
      "source": {
        "pointer": "pointer"
      }
    }
  ],
  "messages": [
    {
      "code": 1000,
      "message": "message",
      "documentation_url": "documentation_url",
      "source": {
        "pointer": "pointer"
      }
    }
  ],
  "result": {
    "completed": false,
    "created_at": "2019-12-27T18:11:19.117Z",
    "links": {
      "self": "/accounts/{account_id}/registrar/registrations/example.com/registration-status",
      "resource": "/accounts/{account_id}/registrar/registrations/example.com"
    },
    "state": "in_progress",
    "updated_at": "2019-12-27T18:11:19.117Z",
    "context": {
      "foo": "bar"
    },
    "error": {
      "code": "registry_rejected",
      "message": "Registry rejected the request."
    }
  },
  "success": true
}
```

# Registration Status

## Get Registration Status

**get** `/accounts/{account_id}/registrar/registrations/{domain_name}/registration-status`

Returns the current status of a domain registration workflow.

Use this endpoint to poll for completion when the POST response
returned `202 Accepted`. The URL is provided in the `links.self`
field of the workflow status response.

Poll this endpoint until the workflow reaches a terminal state or a
state that requires user attention.

**Terminal states:** `succeeded` and `failed` are terminal and always
have `completed: true`.

**Non-terminal states:**

- `action_required` has `completed: false` and will not resolve on its
  own. The workflow is paused pending user intervention.
- `blocked` has `completed: false` and indicates the workflow is waiting
  on a third party such as the extension registry or losing registrar.
  Continue polling while informing the user of the delay.

Use increasing backoff between polls. When `state: blocked`, use a
longer polling interval and do not poll indefinitely.

A naive polling loop that only checks `completed` can run indefinitely
when `state: action_required`. Break explicitly on `action_required`:

```js
let status;
do {
  await new Promise(r => setTimeout(r, 2000));
  status = await cloudflare.request({
    method: 'GET',
    path: reg.result.links.self,
  });
} while (
  !status.result.completed &&
  status.result.state !== 'action_required'
);

if (status.result.state === 'action_required') {
  // Surface context.action and context.confirmation_sent_to to the user.
  // Do not re-submit the registration request.
}
```

### Path Parameters

- `account_id: string`

  Identifier

- `domain_name: string`

  Fully qualified domain name (FQDN) including the extension
  (e.g., `example.com`, `mybrand.app`). The domain name uniquely
  identifies a registration — the same domain cannot be registered
  twice, making it a natural idempotency key for registration requests.

### Returns

- `errors: array of ResponseInfo`

  - `code: number`

  - `message: string`

  - `documentation_url: optional string`

  - `source: optional object { pointer }`

    - `pointer: optional string`

- `messages: array of ResponseInfo`

  - `code: number`

  - `message: string`

  - `documentation_url: optional string`

  - `source: optional object { pointer }`

- `result: WorkflowStatus`

  Status of an async registration workflow.

  - `completed: boolean`

    Whether the workflow has reached a terminal state. `true` when
    `state` is `succeeded` or `failed`. `false` for `pending`,
    `in_progress`, `action_required`, and `blocked`.

  - `created_at: string`

  - `links: object { self, resource }`

    - `self: string`

      URL to this status resource.

    - `resource: optional string`

      URL to the domain resource.

  - `state: "pending" or "in_progress" or "action_required" or 3 more`

    Workflow lifecycle state.

    - `pending`: Workflow has been created but not yet started processing.
    - `in_progress`: Actively processing. Continue polling `links.self`.
      The workflow has an internal deadline and will not remain in this
      state indefinitely.
    - `action_required`: Paused — requires action by the user (not the
      system). See `context.action` for what is needed. An automated
      polling loop must break on this state; it will not resolve on its
      own without user intervention.
    - `blocked`: The workflow cannot make progress due to a third party
      such as the domain extension's registry or a losing registrar.
      No user action will help. Continue polling — the block may resolve
      when the third party responds.
    - `succeeded`: Terminal. The operation completed successfully.
      `completed` will be `true`. For registrations, `context.registration`
      contains the resulting registration resource.
    - `failed`: Terminal. The operation failed. `completed` will be `true`.
      See `error.code` and `error.message` for the reason. Do not
      auto-retry without user review.

    - `"pending"`

    - `"in_progress"`

    - `"action_required"`

    - `"blocked"`

    - `"succeeded"`

    - `"failed"`

  - `updated_at: string`

  - `context: optional map[unknown]`

    Workflow-specific data for this workflow.

    The workflow subject is identified by `context.domain_name` for
    domain-centric workflows.

  - `error: optional object { code, message }`

    Error details when a workflow reaches the `failed` state. The specific
    error codes and messages depend on the workflow type (registration,
    update, etc.) and the underlying registry response. These workflow
    error codes are separate from immediate HTTP error `errors[].code`
    values returned by non-2xx responses. Surface
    `error.message` to the user for context.

    - `code: string`

      Machine-readable error code identifying the failure reason.

    - `message: string`

      Human-readable explanation of the failure. May include registry-specific details.

- `success: true`

  Whether the API call was successful

  - `true`

### Example

```http
curl https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/registrar/registrations/$DOMAIN_NAME/registration-status \
    -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN"
```

#### Response

```json
{
  "errors": [
    {
      "code": 1000,
      "message": "message",
      "documentation_url": "documentation_url",
      "source": {
        "pointer": "pointer"
      }
    }
  ],
  "messages": [
    {
      "code": 1000,
      "message": "message",
      "documentation_url": "documentation_url",
      "source": {
        "pointer": "pointer"
      }
    }
  ],
  "result": {
    "completed": false,
    "created_at": "2019-12-27T18:11:19.117Z",
    "links": {
      "self": "/accounts/{account_id}/registrar/registrations/example.com/registration-status",
      "resource": "/accounts/{account_id}/registrar/registrations/example.com"
    },
    "state": "in_progress",
    "updated_at": "2019-12-27T18:11:19.117Z",
    "context": {
      "foo": "bar"
    },
    "error": {
      "code": "registry_rejected",
      "message": "Registry rejected the request."
    }
  },
  "success": true
}
```

# Update Status

## Get Update Status

**get** `/accounts/{account_id}/registrar/registrations/{domain_name}/update-status`

Returns the current status of a domain update workflow.

Use this endpoint to poll for completion when the PATCH response
returned `202 Accepted`. The URL is provided in the `links.self`
field of the workflow status response.

Poll this endpoint until the workflow reaches a terminal state or a
state that requires user attention.

Use increasing backoff between polls. When the workflow remains blocked
on a third party, use a longer polling interval and do not poll indefinitely.

### Path Parameters

- `account_id: string`

  Identifier

- `domain_name: string`

  Fully qualified domain name (FQDN) including the extension
  (e.g., `example.com`, `mybrand.app`). The domain name uniquely
  identifies a registration — the same domain cannot be registered
  twice, making it a natural idempotency key for registration requests.

### Returns

- `errors: array of ResponseInfo`

  - `code: number`

  - `message: string`

  - `documentation_url: optional string`

  - `source: optional object { pointer }`

    - `pointer: optional string`

- `messages: array of ResponseInfo`

  - `code: number`

  - `message: string`

  - `documentation_url: optional string`

  - `source: optional object { pointer }`

- `result: WorkflowStatus`

  Status of an async registration workflow.

  - `completed: boolean`

    Whether the workflow has reached a terminal state. `true` when
    `state` is `succeeded` or `failed`. `false` for `pending`,
    `in_progress`, `action_required`, and `blocked`.

  - `created_at: string`

  - `links: object { self, resource }`

    - `self: string`

      URL to this status resource.

    - `resource: optional string`

      URL to the domain resource.

  - `state: "pending" or "in_progress" or "action_required" or 3 more`

    Workflow lifecycle state.

    - `pending`: Workflow has been created but not yet started processing.
    - `in_progress`: Actively processing. Continue polling `links.self`.
      The workflow has an internal deadline and will not remain in this
      state indefinitely.
    - `action_required`: Paused — requires action by the user (not the
      system). See `context.action` for what is needed. An automated
      polling loop must break on this state; it will not resolve on its
      own without user intervention.
    - `blocked`: The workflow cannot make progress due to a third party
      such as the domain extension's registry or a losing registrar.
      No user action will help. Continue polling — the block may resolve
      when the third party responds.
    - `succeeded`: Terminal. The operation completed successfully.
      `completed` will be `true`. For registrations, `context.registration`
      contains the resulting registration resource.
    - `failed`: Terminal. The operation failed. `completed` will be `true`.
      See `error.code` and `error.message` for the reason. Do not
      auto-retry without user review.

    - `"pending"`

    - `"in_progress"`

    - `"action_required"`

    - `"blocked"`

    - `"succeeded"`

    - `"failed"`

  - `updated_at: string`

  - `context: optional map[unknown]`

    Workflow-specific data for this workflow.

    The workflow subject is identified by `context.domain_name` for
    domain-centric workflows.

  - `error: optional object { code, message }`

    Error details when a workflow reaches the `failed` state. The specific
    error codes and messages depend on the workflow type (registration,
    update, etc.) and the underlying registry response. These workflow
    error codes are separate from immediate HTTP error `errors[].code`
    values returned by non-2xx responses. Surface
    `error.message` to the user for context.

    - `code: string`

      Machine-readable error code identifying the failure reason.

    - `message: string`

      Human-readable explanation of the failure. May include registry-specific details.

- `success: true`

  Whether the API call was successful

  - `true`

### Example

```http
curl https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/registrar/registrations/$DOMAIN_NAME/update-status \
    -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN"
```

#### Response

```json
{
  "errors": [
    {
      "code": 1000,
      "message": "message",
      "documentation_url": "documentation_url",
      "source": {
        "pointer": "pointer"
      }
    }
  ],
  "messages": [
    {
      "code": 1000,
      "message": "message",
      "documentation_url": "documentation_url",
      "source": {
        "pointer": "pointer"
      }
    }
  ],
  "result": {
    "completed": false,
    "created_at": "2019-12-27T18:11:19.117Z",
    "links": {
      "self": "/accounts/{account_id}/registrar/registrations/example.com/registration-status",
      "resource": "/accounts/{account_id}/registrar/registrations/example.com"
    },
    "state": "in_progress",
    "updated_at": "2019-12-27T18:11:19.117Z",
    "context": {
      "foo": "bar"
    },
    "error": {
      "code": "registry_rejected",
      "message": "Registry rejected the request."
    }
  },
  "success": true
}
```

---

---
title: Troubleshoot failed domain transfers
description: Fix common domain transfer issues.
image: https://developers.cloudflare.com/core-services-preview.png
---

> Documentation Index  
> Fetch the complete documentation index at: https://developers.cloudflare.com/registrar/llms.txt  
> Use this file to discover all available pages before exploring further.

[Skip to content](#%5Ftop) 

# Troubleshoot failed domain transfers

After you start the transfer process to Cloudflare Registrar, your previous registrar has five days to release the domain after a successful transfer request. If your transfer has not been completed within that time frame, something has likely gone wrong.

Most issues with a stalled transfer can be solved by checking the following details and [restarting the transfer](#restart-your-transfer).

## Domain is still locked

If `clientTransferProhibited` appears in your domain WHOIS or RDAP output, the domain is still locked. Unlock it at your current registrar. If you reapplied the registrar lock after requesting the transfer, you will need to remove it again to restart the transfer process.

If you already unlocked the domain but WHOIS still shows it as locked, allow up to 5 hours for the change to propagate. Some registrars may take up to 24 hours. Some registrars have multiple lock types (domain lock, transfer lock, privacy lock) that must each be disabled separately. If your registrar dashboard shows unlocked but WHOIS disagrees, contact your current registrar directly.

## DNSSEC is still active

Active DNSSEC at your current registrar will block the transfer. Disable DNSSEC and wait for the DS record TTL to expire (usually 24 hours) before retrying. Refer to [Disable DNSSEC](https://developers.cloudflare.com/registrar/get-started/transfer-domain-to-cloudflare/#disable-dnssec) for detailed steps.

## Authorization code is invalid or expired

Authorization codes are usually only valid for a limited period. If your code is rejected, request a fresh one from your current registrar. Check for trailing spaces or line breaks when copy-pasting the code.

## Cannot find where to enter your authorization code

Unlike some registrars, Cloudflare does not allow you to submit an authorization code upfront. Cloudflare requires your domain to be active on its network first so that your site benefits from Cloudflare performance and security features from the moment the transfer begins. You must first [add your domain](https://developers.cloudflare.com/fundamentals/manage-domains/add-site/) to Cloudflare, [update your nameservers](https://developers.cloudflare.com/dns/nameservers/update-nameservers/), and wait for the zone to show **Active** status in the Cloudflare dashboard. Only then will the [Transfer Domains ↗](https://dash.cloudflare.com/?to=/:account/registrar/transfer) page allow you to enter your code.

If your zone is still **Pending**, verify that you updated nameservers correctly at your current registrar and wait up to 24 hours. If you already have an authorization code, keep in mind that most codes are only valid for a limited period. If your code expires while you wait for the zone to activate, request a new one from your current registrar before proceeding.

## Transfer rejected

Your transfer has been rejected by your previous registrar. There are several reasons for this to happen:

* You actively rejected the transfer request in the email you received from your registrar or on your registrar interface.
* Your registrar determined the domain is not eligible for transfer.
* Some registrars allow customers to enable a setting to reject all transfer requests.
* If you are transferring from GoDaddy, make sure Domain Privacy and Domain Protection are fully disabled. GoDaddy may reject the transfer if either is still active.
* In some instances, registrars may reject the transfer if they suspect malicious behavior.

You will need to restart the transfer and approve the request or contact your current registrar to resolve this issue.

## Transfer rejected due to registration limits

Domain registries enforce maximum registration periods. Because every transfer adds one year to your registration, a transfer can be rejected if the extra year would exceed the limit.

**Maximum registration periods:**

* Most TLDs (such as `.com`, `.net`, `.org`) allow up to **10 years** of registration.
* `.co` domains have a maximum of **5 years**.

**Common reasons for rejection:**

* Your domain already has 9 or more years of registration remaining. Adding one year would exceed the 10-year limit (or 5-year limit for `.co`).
* Your domain was renewed after expiring and then transferred within 45 days of the original expiration date. In this case, the registry may not add the extra year. For example, if `example.com` expires on December 10, you renew it on December 20 (extending it to December 20 of the following year), and then transfer to Cloudflare on December 30 — the transfer is within 45 days of the original expiration, so the registry may not add an additional year. Your expiration date would remain December 20 of the following year, meaning you effectively paid twice for the same year. If this happens, you are entitled to request a refund from your previous registrar under ICANN rules.
* Your domain does not meet a TLD-specific minimum. For example, `.ai` domains require a minimum 2-year registration for transfers.
* `.uk` domains do not receive an additional year when transferred.

**What you can do:**

* If your domain has too many years remaining, wait until the total registration period (current time remaining plus the one year added by the transfer) would not exceed the maximum — 10 years for most TLDs, or 5 years for `.co`. For example, a `.com` domain with 9 years and 6 months remaining cannot be transferred until at least 6 months have passed.
* If your domain is close to expiration, renew it at your current registrar first. Once the renewal is confirmed, initiate the transfer.
* If your domain is a TLD with special requirements (such as `.ai`), verify that you meet the minimum registration period before transferring.

## Domain was recently registered or transferred

ICANN rules prohibit transfers within 60 days of registration or a previous transfer. Check the domain creation date and last transfer date in WHOIS.

## Domain is in a restricted status

Domains with certain WHOIS statuses cannot be transferred:

* `clientHold` or `serverHold` — the domain is suspended, usually due to non-payment, failed verification, or a dispute. Contact your current registrar to find out why the hold was applied and how to remove it.
* `redemptionPeriod` — the domain has expired and passed the grace period. You must restore and renew it at your current registrar before it can be transferred.
* `pendingDelete` — the domain is scheduled for deletion by the registry and cannot be transferred or recovered. After deletion, the domain becomes available for anyone to register.

Other common WHOIS or RDAP statuses include:

* `clientTransferProhibited` — the domain is locked at the registrar.
* `serverTransferProhibited` — the registry has applied a transfer restriction.
* `addPeriod` — the domain is within the post-registration lock window.
* `pendingTransfer` — the domain is already in an active transfer.
* `clientDeleteProhibited` or `serverDeleteProhibited` — deletion is restricted.

## WHOIS privacy is blocking the transfer

Most domains can be transferred with WHOIS privacy enabled. However, some registrars may prohibit transfer requests if you have WHOIS privacy services enabled. If your transfer is failing, check with your current registrar to confirm WHOIS privacy is not blocking it.

## Payment failed during transfer

If your payment method was declined after submitting the authorization code, the transfer may be in a partially started state. Update your payment method in your Cloudflare billing settings and check the [Transfer Domains ↗](https://dash.cloudflare.com/?to=/:account/registrar/transfer) page for the current status.

## Transfer is taking too long

Domain transfers typically take 3-5 business days. Some TLDs (such as `.mx`) can take up to 10 days. You can speed up the process by approving the transfer at your current registrar when you receive the confirmation email. If the transfer has been stuck beyond these timeframes with no identifiable issue, contact your current registrar to confirm there are no holds or restrictions on their end.

## Domain not available for transfer

Your domain may not appear on the [Transfer Domains ↗](https://dash.cloudflare.com/?to=/:account/registrar/transfer) page if:

* You have not [added your domain](https://developers.cloudflare.com/fundamentals/manage-domains/add-site/) to your Cloudflare account, or it is still in **Pending** status. Your domain must be **Active** before you can transfer it.
* The domain was registered or previously transferred in the last 60 days (ICANN requirement).
* Cloudflare does not support the TLD.
* The domain has a status that blocks transfers (such as `serverHold` or `pendingDelete`). Refer to [Domain is in a restricted status](#domain-is-in-a-restricted-status) for details.

## Cannot update nameservers at your current registrar

Some commerce and site-building platforms (such as Shopify, Block, and Wix) do not allow you to change nameservers while the domain is registered with them. Because Cloudflare requires your nameservers to point to Cloudflare before a transfer can begin, a direct transfer from these platforms is not possible. For the recommended workaround, refer to [Transfer from Shopify, Block, or Wix](https://developers.cloudflare.com/registrar/get-started/transfer-domain-to-cloudflare/#transfer-from-shopify-block-or-wix).

## Email verification required

Cloudflare may send a verification email to your registrant contact email address when you register or transfer a domain, or when you update your registrant email. Per ICANN requirements, if the registrant email is not verified within 15 days, a hold is placed on the domain and nameservers are replaced with a parking server until verification is complete. After successful verification, nameservers are automatically restored.

Verification is triggered when your registrant contact email differs from your verified Cloudflare account email.

Some TLDs — including `.mx`, `.nz`, and `.ca` — may send verification through a third-party service. In these cases, the verification email will come from `noreply@emailverification.info` rather than Cloudflare. Check your spam folder if you do not receive it.

For these TLDs, if verification is not completed in time, the registry may temporarily replace your nameservers with `ns1.emailverification.info` and related hostnames until the registrant email is verified.

## `.uk` transfer uses an IPS tag, not an auth code

`.uk`, `.co.uk`, and `.org.uk` domains do not use the standard auth-code transfer flow.

Instead, the losing registrar changes the domain's IPS tag to the gaining registrar. If you are transferring a `.uk` family domain to Cloudflare and cannot find an auth-code field, this behavior is expected.

If the transfer does not proceed, contact the current registrar and confirm that they have updated the IPS tag correctly.

## Restart your transfer

Note

This solution does not apply to `.uk` domains.

1. In the Cloudflare dashboard, go to the **Manage Domains** page.  
[ Go to **Manage domains** ](https://dash.cloudflare.com/?to=/:account/registrar/domains)
2. Find the correct domain and select **Manage**.
3. Select **Cancel Transfer and Retry**. After you initiate the retry, you must re-enter your auth code and confirm your WHOIS information.

```json
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"item":{"@id":"/directory/","name":"Directory"}},{"@type":"ListItem","position":2,"item":{"@id":"/registrar/","name":"Registrar"}},{"@type":"ListItem","position":3,"item":{"@id":"/registrar/troubleshooting/","name":"Troubleshoot failed domain transfers"}}]}
```

---

---
title: Registrant contact updates
description: Update domain registrant contact information.
image: https://developers.cloudflare.com/core-services-preview.png
---

> Documentation Index  
> Fetch the complete documentation index at: https://developers.cloudflare.com/registrar/llms.txt  
> Use this file to discover all available pages before exploring further.

[Skip to content](#%5Ftop) 

# Registrant contact updates

It is important that you keep your contact details accurate and up-to-date. [ICANN rules state ↗](https://www.icann.org/resources/pages/registrant-contact-information-wdrp-2017-08-31-en) that if you do not have updated contact information, your domain name registration may be suspended or even cancelled.

The contact information you can update includes:

* First name
* Last name
* Email
* Organization
* Phone
* Address including City, State/Province, Postal code & Country

To update your registrant contacts:

1. In the Cloudflare dashboard, go to the **Manage domains** page.  
[ Go to **Manage domains** ](https://dash.cloudflare.com/?to=/:account/registrar/domains)
2. Find **Default contact** and select **Edit**.
3. Update the relevant information, and select **Save**.
4. Find the domain where you want to update your contact information, and select **Manage**.
5. Select the **Contacts** tab, and edit the contact information.

If you change any of the following fields, Cloudflare Registrar will require a Change of Registrant approval before the changes are finalized:

* First name
* Last name
* Organization
* Email address

If you update any of the fields mentioned above, Cloudflare Registrar will send an approval email to the current registrant's email address. The approval email contains a link to a web page where the requested change may be viewed and approved or rejected. If the pending change is not approved or rejected within seven days, the request will automatically be canceled.

If you do not update these fields, your contact information is updated immediately and no further action is required.

Important

After selecting the link in the approval email Cloudflare sends you, you have the option to accept or reject the contact changes. If you select the **Accept** button, your domain will be transfer-locked for 60 days.

If you do not want your domain to be locked, be sure to select the **Do not apply 60 day transfer lock** checkbox _before_ selecting the **Accept** button. This applies to all supported TLDs, including `.uk`.

## Changing email contact

If the registrant contact update also includes a change to the email address, Cloudflare sends a second approval email to the new (requested) email address. Both the old (original) email address and the new one have to approve the change for the change to be successfully completed.

Only the current registrant may opt out of the transfer lock, however. The approval page for the new registrant will not include the option to opt out.

## 60-day transfer lock

After the changes for the registrant contact are approved, the domain will be placed on a transfer lock for 60 days. This happens when you approve changes to the registrant contacts without checking the box to prevent the transfer lock.

This transfer lock prevents the transfer of the domain to another registrar, and the transfer to another Cloudflare account. It does not prevent additional updates to the domain name.

If the registrant contact is updated again while the domain is in the 60-day lock period, the lock expiration will be further extended to 60 days from the most recent update.

```json
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"item":{"@id":"/directory/","name":"Directory"}},{"@type":"ListItem","position":2,"item":{"@id":"/registrar/","name":"Registrar"}},{"@type":"ListItem","position":3,"item":{"@id":"/registrar/account-options/","name":"Registration options"}},{"@type":"ListItem","position":4,"item":{"@id":"/registrar/account-options/domain-contact-updates/","name":"Registrant contact updates"}}]}
```

---

---
title: Domain management
description: Manage your registered domains in the dashboard.
image: https://developers.cloudflare.com/core-services-preview.png
---

> Documentation Index  
> Fetch the complete documentation index at: https://developers.cloudflare.com/registrar/llms.txt  
> Use this file to discover all available pages before exploring further.

[Skip to content](#%5Ftop) 

# Domain management

## Domain status

When your domain is registered with Cloudflare, you can review your domain status in **Overview**.

1. In the Cloudflare dashboard, go to the **Manage domains** page.  
[ Go to **Manage domains** ](https://dash.cloudflare.com/?to=/:account/registrar/domains)
2. From **Overview**, scroll down to **Domain Registration** to review the current expiration date.
3. Select **Manage domain** to review the Auto-Renew status for your domain.

## Billing information

Domain registrations will not appear in the **Active Subscriptions** section of the dashboard, as Registrar is not subscription based. To check information related to your domain billing:

1. In the Cloudflare dashboard, go to the **Manage Domains** page.  
[ Go to **Manage domains** ](https://dash.cloudflare.com/?to=/:account/registrar/domains)
2. Find the domain you want to check and select **Manage**.
3. Refer to **Registration** for information regarding your domain fees. From here, you can also opt to [renew or extend](https://developers.cloudflare.com/registrar/account-options/renew-domains/) your domain registration.

## Edit WHOIS records

Cloudflare redacts WHOIS information from your domain by default. However, we do store the authentic WHOIS record for your domain. You may edit the WHOIS contact data for any domain. To do that:

1. In the Cloudflare dashboard, go to the **Manage Domains** page.  
[ Go to **Manage domains** ](https://dash.cloudflare.com/?to=/:account/registrar/domains)
2. Find the domain you want to edit and select **Manage** \> **Contacts**.
3. Select **Edit** in any of the contacts you previously set up. This allows you to update the contact information for the selected domain only. It will not update the contact information for other domains within the account.

Refer to [Registrant contact updates](https://developers.cloudflare.com/registrar/account-options/domain-contact-updates/) for more information.

## Edit Default Contact information

The first time you transfer or register a new domain, a Cloudflare Registrar creates a Default Contact with information that can be used for future transfers and registrations. The contact data may be updated at any time in the dashboard. Updating the Default Contact data will not update the contact information for any domains already in the account. This Default Contact data is only used to prepopulate contact information for new registrations and transfers.

It is important that you keep this information accurate and up-to-date. Refer to [Registrant contact updates](https://developers.cloudflare.com/registrar/account-options/domain-contact-updates/) for important information about this topic, and to learn how to update this information.

## Delete a domain registration

Domains using Cloudflare Registrar will be deleted automatically after expiration if they have not been renewed. The exact timing varies, refer to [What happens when a domain expires?](https://developers.cloudflare.com/registrar/faq/#what-happens-when-a-domain-expires) for more details.

Deletion is irreversible

Deleting a domain registration from Cloudflare Registrar starts an irreversible process. At the end of that process, the domain will be available for anyone to purchase at any domain registrar. This means you should only delete your registration if you are comfortable losing it. If you intend to keep the domain but use another registrar, refer to [Transfer domain from Cloudflare to another registrar](https://developers.cloudflare.com/registrar/account-options/transfer-out-from-cloudflare/).

There may be instances where users may wish to delete a domain prior to expiration. In most cases a domain may be deleted prior to expiration by following these steps:

1. In the Cloudflare dashboard, go to the **Manage Domains** page.  
[ Go to **Manage domains** ](https://dash.cloudflare.com/?to=/:account/registrar/domains)
2. Under the **Configuration** tab on the Manage page you will find a **Delete** button.
3. If the domain is deletable the button will be active. The button will be disabled if your domain cannot be deleted and you should refer to the Registrar [FAQ](https://developers.cloudflare.com/registrar/faq/#why-am-i-unable-to-delete-my-registrar-domain).
4. Once you click the Delete button, you will be presented with a confirmation window. If you proceed, an email will be sent to all users with the Super Admin role in the account. The email contains a deletion authorization token that must be entered into the window which appears to confirm and complete the deletion.

Once all steps are completed, the domain will then be scheduled for deletion. To understand more about the timelines and potential reasons why a domain cannot be deleted, refer to the Registrar [FAQ](https://developers.cloudflare.com/registrar/faq/#domain-deletions).

```json
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"item":{"@id":"/directory/","name":"Directory"}},{"@type":"ListItem","position":2,"item":{"@id":"/registrar/","name":"Registrar"}},{"@type":"ListItem","position":3,"item":{"@id":"/registrar/account-options/","name":"Registration options"}},{"@type":"ListItem","position":4,"item":{"@id":"/registrar/account-options/domain-management/","name":"Domain management"}}]}
```

---

---
title: iCloud Custom Email Domains
description: Set up iCloud custom email domains via Cloudflare.
image: https://developers.cloudflare.com/core-services-preview.png
---

> Documentation Index  
> Fetch the complete documentation index at: https://developers.cloudflare.com/registrar/llms.txt  
> Use this file to discover all available pages before exploring further.

[Skip to content](#%5Ftop) 

# iCloud Custom Email Domains

With [iCloud Custom Email Domain ↗](https://support.apple.com/kb/HT212514), you can now purchase a custom domain right from iCloud Settings through Cloudflare and have it automatically set up with your iCloud Mail account. It's great if you want to create a custom email domain for you or your family, such as @examplefamily.com.

You will need an active iCloud+ subscription to add a custom email domain.

## Purchase custom email domain

If you want to buy a custom email domain, go to your [iCloud ↗](https://www.icloud.com/settings/) settings and scroll down to **Custom Email Domain**.

---

## Log in to Cloudflare

Once you have bought a custom email domain, you can manage your domain and other options through the [Cloudflare Dashboard ↗](https://dash.cloudflare.com/login).

### Signing in with Apple

If you had signed up with Apple, signing into Cloudflare is as easy as clicking the “Sign in with Apple” button.

### Signing in with Cloudflare

If you had signed up with Cloudflare, signing into Cloudflare can be done with your email and password.

---

## Billing information

### Supported payment methods

For domain registration, Cloudflare supports the following payment methods:

* Credit Card
* PayPal
* Apple Pay (available if you have a wallet with a valid payment method and are using an iOS device or Safari on macOS)

For domain renewals, Apple Pay does not currently support recurring payments. You can either add another payment method (Credit Card or PayPal) for automatic renewals or log into [your account](#log-in-to-cloudflare) near the renewal date and use Apple Pay.

### Local currency price estimates

Users may see a price estimate in both U.S. Dollars and a local currency. This is only an estimate based on the current exchange rate.

The final payment will be charged in US dollars.

---

## Email issues

### Email issues

If you are not receiving emails intended for your new email address, review your DNS records in the Cloudflare dashboard:

1. Log into the [Cloudflare dashboard](#log-in-to-cloudflare).
2. Go to **DNS**.
3. Your domain should have records similar to the following:
![Your iCloud custom email domain should have a specific set of records created by default.](https://developers.cloudflare.com/_astro/icloud-custom-domain-dns-example.DXfRAhRV_2nrVJy.webp) 

If your domain has records similar to those listed above and you are still experiencing problems with your new email address, contact [Apple Support ↗](https://support.apple.com/).

---

## Domain website

If you try to visit your new domain, your browser will show an error or empty page.

That's because there's more to setting up a website than purchasing a domain name (which you just did) and setting up email records (which we just did for you). 

If you want your domain to be a fully functioning website, you will need to:

1. **Build your website**: Either using [Cloudflare Pages](https://developers.cloudflare.com/pages/), a website builder, or files hosted on a server.
2. **Update your Cloudflare DNS**: To direct visitors looking for your domain name to the actual content on your website ([detailed guide](https://developers.cloudflare.com/dns/manage-dns-records/how-to/create-zone-apex/)).

---

## Landing Page

After you buy a domain through iCloud, Cloudflare Registrar automatically enables a landing page for it. This temporary page informs your visitors that you still do not have a website. This feature is only available to new domain registrations, when you buy a domain through an Apple device.

### Disable Landing Page

If you do not want to have Landing Page enabled:

1. In the Cloudflare dashboard, go to the **Manage domains** page.  
[ Go to **Manage domains** ](https://dash.cloudflare.com/?to=/:account/registrar/domains)
2. Find the domain you want to disable Landing Page for, and select **Manage** \> **Configuration**.
3. Scroll to Landing Page and select **Disable**.

You now have Landing Page disabled. The page can also be re-enabled through the same process.

Note

Customers must disable the landing page before they can add DNS records to point to a new website.

```json
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"item":{"@id":"/directory/","name":"Directory"}},{"@type":"ListItem","position":2,"item":{"@id":"/registrar/","name":"Registrar"}},{"@type":"ListItem","position":3,"item":{"@id":"/registrar/account-options/","name":"Registration options"}},{"@type":"ListItem","position":4,"item":{"@id":"/registrar/account-options/icloud-domains/","name":"iCloud Custom Email Domains"}}]}
```

---

---
title: Move a Cloudflare Registrar domain registration between accounts
description: Transfer domain registration between Cloudflare accounts.
image: https://developers.cloudflare.com/core-services-preview.png
---

> Documentation Index  
> Fetch the complete documentation index at: https://developers.cloudflare.com/registrar/llms.txt  
> Use this file to discover all available pages before exploring further.

[Skip to content](#%5Ftop) 

# Move a Cloudflare Registrar domain registration between accounts

Cloudflare supports the move (transfer) of domain registrations between Cloudflare accounts when the source and target account both confirm the move. The move will result in the loss of all configurations and settings for the domain in the source account.

Important

This process only applies to domains which are registered with Cloudflare Registrar. For domains with other registrars, refer to [Move a domain between Cloudflare accounts](https://developers.cloudflare.com/fundamentals/manage-domains/move-domain/).

Before proceeding, please be aware of the following:

* WHOIS contact information will be moved as is.
* No other configuration will be moved.
* After successful move, the registration will be transfer-locked for 30 days.
* The target account will become responsible for domain renewals going forward.

## 1\. Prepare for the move

Before you request the move, you will need to do the following:

* Obtain the [account ID](https://developers.cloudflare.com/fundamentals/account/find-account-and-zone-ids/) of the new account.
* Add the domain as a website to the new account and select a plan.
* [Disable DNSSEC](https://developers.cloudflare.com/dns/dnssec/#disable-dnssec) for the domain and ensure it is set up and ready in the new dashboard account you intend to move it to.

The following pre-conditions must be met before the domain can be moved:

* The domain must have been registered more than 10 days ago.
* The domain must be added to the new account as a website and a plan must be selected.
* The domain must not be administratively locked, such as being locked due to a dispute or court order.
* The domain must not have any of the following registry statuses: `pendingDelete`, `redemptionPeriod`, or `pendingTransfer`.
* The registrant email address must be verified.
* A pending Change of Registrant request cannot be present. If there is a pending request, it should be completed before initiating the move request.
* DNSSEC must be turned off. It can be re-enabled on the new zone once the move completes.
* If the current zone is locked, the lock must be released.

## 2\. Submit the move request

You can now submit the move request under the **Configuration** tab of the **Manage Domain** page. Begin the submission process by selecting the **Start** button and follow the instructions.

**Important**: Review the pre-conditions described above. If those conditions have not been met, the domain move will not be completed.

Once the move request has been submitted, the gaining account will receive an email notifying them of the request and will provide instructions for how to approve the request.

The gaining account must log into their account and go to **Manage Domains** (under Domain Registration). A message will appear at the top of the page stating that there are domains requiring action to be taken.

Select **View Actions** to display the domains with a pending move along and choose to accept or reject the request. Action must be taken within five days of the request.

If no action is taken within the five days, the request will be automatically canceled.

```json
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"item":{"@id":"/directory/","name":"Directory"}},{"@type":"ListItem","position":2,"item":{"@id":"/registrar/","name":"Registrar"}},{"@type":"ListItem","position":3,"item":{"@id":"/registrar/account-options/","name":"Registration options"}},{"@type":"ListItem","position":4,"item":{"@id":"/registrar/account-options/inter-account-transfer/","name":"Move a Cloudflare Registrar domain registration between accounts"}}]}
```

---

---
title: Renew domains
description: Manage automatic and manual domain renewals.
image: https://developers.cloudflare.com/core-services-preview.png
---

> Documentation Index  
> Fetch the complete documentation index at: https://developers.cloudflare.com/registrar/llms.txt  
> Use this file to discover all available pages before exploring further.

[Skip to content](#%5Ftop) 

# Renew domains

## Automatic renewal of domain

Cloudflare Registrar enrolls your domain to auto-renew by default. Unlike other registrars, your domain will only renew at the list price set by the registry. When a domain has the auto-renew setting turned on, Cloudflare will attempt to automatically renew the domain prior to expiration.

There is no guarantee that the renewal will succeed. Renewals may fail for various reasons, including billing failures and registry downtime. While Cloudflare will make several attempts to renew, it is strongly recommended you frequently review your account to ensure your domains have been renewed.

If you decide you no longer need the domain, [disable auto-renew for your domain](#set-up-automatic-renewals). Once disabled, your domain will not renew upon expiration.

Note

The first auto-renew attempt will occur approximately 30 days prior to expiration. If you wish to disable auto-renew, do so at least 30 days prior to the expiration date.

You can continue to keep your domain registered with Cloudflare for the time remaining until the expiration date. If you decide you want to keep the domain, enable auto-renew at any time prior to expiration.

## Set up automatic renewals

If you want your domains to renew automatically, keep the default settings for your domain (**Auto Renew** should be set to **On**). To find this setting:

1. In the Cloudflare dashboard, go to the **Manage domains** page.  
[ Go to **Manage domains** ](https://dash.cloudflare.com/?to=/:account/registrar/domains)
2. Find the domain you want to automatically renew, and make sure the **Auto-renew** toggle is enabled.

Cloudflare attempts to renew these domains automatically 30 days before their expiration date. Several more attempts are made if the first attempt fails. The last attempt to renew is made on the day before expiration. You can also [manually renew](#renew-a-domain-manually) a domain at any time.

If multiple domains are auto-renewed on the same date, only one charge will be made to the primary payment method.

If the renewal fails, you will receive an email notification and Cloudflare will try to renew the domain three additional times. If these attempts fail, you must manually renew your domain.

Note

If you want to delete your domain from Cloudflare, **disable** Auto-Renew first.

## Renew a domain manually

You can renew a domain at any time. To renew a domain registered with Cloudflare:

1. In the Cloudflare dashboard, go to the **Manage domains** page.  
[ Go to **Manage domains** ](https://dash.cloudflare.com/?to=/:account/registrar/domains)
2. Find the domain you want to renew and select **Manage**.
3. In **Registration** select **Renew/Extend Domain**.
4. In the **Renew for** drop-down menu, choose a number of years to renew your domain (up to 10 years).
5. Select **Renew** and then **Purchase**.

Once Cloudflare validates your payment, the status of your domain changes to **Renewal Pending**. After the renewal is finished, the status changes back to **Active**.

## Renewal notifications

Once a domain is registered, Registrar sends the following expiration notices to the Super Admin of the domain:

* A monthly email listing all domains set to renew automatically within the next 45 days.
* A monthly email listing all domains expiring in the next 60-90 days.

In addition to the Super Admin, the following expiration notices are sent to the WHOIS Registrant contact associated with the domain:

* A weekly email listing all domains expiring within the next month.
* A daily email listing all domains expiring in seven days.
* An email one day after a domain expires.
* An email 20 days after the expiration date.

Note

If you do not renew your domain before the expiration date, your domain will enter a Redemption Grace Period (RGP) for 30 days. These domains are not deleted and you can restore them to your account, but restoration may require an additional fee. You cannot transfer domains during the RGP.

All renewals are final and Cloudflare will not issue refunds.

When renewing a domain, additional years are always added to the current expiration date regardless of when the renewal takes place.

```json
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"item":{"@id":"/directory/","name":"Directory"}},{"@type":"ListItem","position":2,"item":{"@id":"/registrar/","name":"Registrar"}},{"@type":"ListItem","position":3,"item":{"@id":"/registrar/account-options/","name":"Registration options"}},{"@type":"ListItem","position":4,"item":{"@id":"/registrar/account-options/renew-domains/","name":"Renew domains"}}]}
```

---

---
title: Transfer domain out from Cloudflare
description: Transfer your domain to another registrar.
image: https://developers.cloudflare.com/core-services-preview.png
---

> Documentation Index  
> Fetch the complete documentation index at: https://developers.cloudflare.com/registrar/llms.txt  
> Use this file to discover all available pages before exploring further.

[Skip to content](#%5Ftop) 

# Transfer domain out from Cloudflare

Cloudflare Registrar makes it easy to transfer your domain to another registrar. Be aware that ICANN rules prohibit a domain from being transferred if:

* The domain has been transferred within the last 60 days;
* The domain was registered within the last 60 days;
* If the WHOIS registrant information has been modified in the last 60 days (even if redacted).

Follow the instructions below to transfer your domain out from Cloudflare.

Warning

Anyone with super-admin and admin permissions for a zone can also manage your domains. This means these users can also unlock domains or obtain authorization codes to transfer domains to other registrars. Be careful who you give these account roles to.

## 1\. Unlock your domain at Cloudflare

1. In the Cloudflare dashboard, go to the **Manage Domains** page.  
[ Go to **Manage domains** ](https://dash.cloudflare.com/?to=/:account/registrar/domains)
2. Find the domain you want to transfer, and select **Manage**.
3. Select **Configuration** \> **Unlock**.
4. Select **Confirm and Unlock** to confirm that you want to unlock your domain.
5. Copy the auth code (also referred to as authentication code and authorization code) generated by Cloudflare, and use at your new registrar.

If you lose your authentication code, you can get a new one by:

* Selecting the **Regenerate** button;
* Locking the domain and repeating steps 1-6.

## 2\. Transfer to a new registrar

1. Go to your new registrar.
2. You will be asked for the authorization code from Cloudflare (it might be called EPP in some systems). Input the code created for you from the Cloudflare dashboard.
3. Your new registrar will send the transfer request to the registry for your domain. The registry will then send it to Cloudflare. After Cloudflare receives the message, you can manually approve the transfer to initiate it immediately.
4. You will need to confirm the approval. You can also reject it at this stage. If you reject it, Cloudflare will reapply the registrar lock.
5. If you do not manually approve the transfer, the transfer will auto-approve on the fifth day after receiving the request. In either case, when your transfer out completes Cloudflare will remove the domain from your account and you will not be charged for future renewals.

```json
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"item":{"@id":"/directory/","name":"Directory"}},{"@type":"ListItem","position":2,"item":{"@id":"/registrar/","name":"Registrar"}},{"@type":"ListItem","position":3,"item":{"@id":"/registrar/account-options/","name":"Registration options"}},{"@type":"ListItem","position":4,"item":{"@id":"/registrar/account-options/transfer-out-from-cloudflare/","name":"Transfer domain out from Cloudflare"}}]}
```

---

---
title: WHOIS redaction
description: Protect personal data with WHOIS redaction.
image: https://developers.cloudflare.com/core-services-preview.png
---

> Documentation Index  
> Fetch the complete documentation index at: https://developers.cloudflare.com/registrar/llms.txt  
> Use this file to discover all available pages before exploring further.

[Skip to content](#%5Ftop) 

# WHOIS redaction

Cloudflare Registrar provides personal data redaction on WHOIS information, if permitted by the registry.

WHOIS is a standard for publishing the contact and nameserver information for all registered domains. Each registrar maintains their own WHOIS service. Anyone can query the registrar’s WHOIS service to reveal the data behind a given domain.

However, broadcasting the registrant contact information via the WHOIS service can cause spam mail to be delivered to your personal addresses. Cloudflare Registrar offers personal data redaction on WHOIS for free, that meets current ICANN guidelines.

Cloudflare’s WHOIS service can be found at [https://rdap.cloudflare.com/ ↗](https://rdap.cloudflare.com/). Select **WHOIS** as the search type.

## What is WHOIS redaction?

WHOIS redaction removes most contact information categorized as personal data (such as registrant name, email address, postal address) from the published WHOIS record for a domain. These fields will read `Data Redacted`. The nameserver, domain lock information, and date records for a domain are still available publicly. The following fields will continue to show in WHOIS, due to ICANN policy:

* Registrant state/province
* Registrant country

Cloudflare still maintains the authoritative, unredacted, record of your WHOIS data. You can modify this information at any time. Refer to [Registrant contact updates](https://developers.cloudflare.com/registrar/account-options/domain-contact-updates) for more information.

## What is RDAP?

RDAP (Registration Data Access Protocol) is a new standard for querying domain contact and nameserver information for all registered domains. This new protocol offers some advantages over WHOIS, including standardized data access, support for internationalization, and secure access controls. RDAP is intended to eventually replace WHOIS. However, Cloudflare currently provides both WHOIS and RDAP search capability.

Cloudflare’s RDAP service can be found at [https://rdap.cloudflare.com/ ↗](https://rdap.cloudflare.com/). Select **RDAP** as the search type.

## How can third parties reach registrants?

As part of the ICANN guidelines, registrars must have a method for third parties to reach the registrant without revealing their identity. Cloudflare has a form available where third parties can [submit a message for a given domain on Cloudflare Registrar ↗](https://www.cloudflare.com/abuse/form). Cloudflare will forward the message to the registrant email on file for that domain.

```json
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"item":{"@id":"/directory/","name":"Directory"}},{"@type":"ListItem","position":2,"item":{"@id":"/registrar/","name":"Registrar"}},{"@type":"ListItem","position":3,"item":{"@id":"/registrar/account-options/","name":"Registration options"}},{"@type":"ListItem","position":4,"item":{"@id":"/registrar/account-options/whois-redaction/","name":"WHOIS redaction"}}]}
```

---

---
title: Enable DNSSEC
description: Enable DNSSEC for your registered domain.
image: https://developers.cloudflare.com/core-services-preview.png
---

> Documentation Index  
> Fetch the complete documentation index at: https://developers.cloudflare.com/registrar/llms.txt  
> Use this file to discover all available pages before exploring further.

[Skip to content](#%5Ftop) 

# Enable DNSSEC

The domain name system (DNS) translates domain names into numeric Internet addresses. However, DNS is a fundamentally insecure protocol. It does not guarantee where DNS records come from and accepts any requests given to it.

[DNSSEC](https://developers.cloudflare.com/dns/dnssec/) creates a secure layer to the domain name system by adding cryptographic signatures to DNS records. By doing so, your request can check the signature to verify that the record you need comes from the authoritative nameserver and was not altered along the way.

## Enable or disable DNSSEC

Cloudflare Registrar offers one-click DNSSEC activation for free to all customers:

1. In Cloudflare dashboard, go to the **Manage Domains** page.  
[ Go to **Manage domains** ](https://dash.cloudflare.com/?to=/:account/registrar/domains)
2. Find the domain that you want to activate DNSSEC and select **Manage**.
3. Select **Configuration** \> **Enable DNSSEC**. If DNSSEC was previously activated, select **Disable DNSSEC** to disable it.

Cloudflare publishes delegation signer (DS) records in the form of [CDS and CDNSKEY records ↗](https://www.cloudflare.com/dns/dnssec/how-dnssec-works/) for a domain delegated to Cloudflare. Cloudflare Registrar scans those records at regular intervals, gathers those details and sends them to your domain's registry.

This process can take one to two days after you first enable DNSSEC.

Note

If your domain is not on Cloudflare Registrar, you can enable DNSSEC in [**DNS**](https://developers.cloudflare.com/dns/dnssec/) on the Cloudflare dashboard.

## Confirming DNSSEC

When DNSSEC has been successfully applied to your domain, Cloudflare shows you a confirmed status. Go to [**DNS** \> **Settings** ↗](https://dash.cloudflare.com/?to=/:account/:zone/dns/settings) in the Cloudflare dashboard, and scroll down to **DNSSEC**.

You can also confirm this by reviewing the [WHOIS information ↗](https://lookup.icann.org/) for your domain. Domains with DNSSEC will read `signedDelegation` in the DNSSEC field.

```json
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"item":{"@id":"/directory/","name":"Directory"}},{"@type":"ListItem","position":2,"item":{"@id":"/registrar/","name":"Registrar"}},{"@type":"ListItem","position":3,"item":{"@id":"/registrar/get-started/","name":"Get started"}},{"@type":"ListItem","position":4,"item":{"@id":"/registrar/get-started/enable-dnssec/","name":"Enable DNSSEC"}}]}
```

---

---
title: Register a new domain
description: Register a new domain with Cloudflare.
image: https://developers.cloudflare.com/core-services-preview.png
---

> Documentation Index  
> Fetch the complete documentation index at: https://developers.cloudflare.com/registrar/llms.txt  
> Use this file to discover all available pages before exploring further.

[Skip to content](#%5Ftop) 

# Register a new domain

## Prerequisites and restrictions

Cloudflare nameservers

All domains acquired via Cloudflare Registrar use Cloudflare nameservers, automatically [protecting and speeding up](https://developers.cloudflare.com/fundamentals/concepts/how-cloudflare-works/) your content or services. You will not be able to change to another DNS provider's nameservers while using Cloudflare Registrar.

* Cloudflare Registrar does not currently support internationalized domain names (IDNs), also known as Unicode.
* You must have a [verified account email address](https://developers.cloudflare.com/fundamentals/user-profiles/verify-email-address/), to transfer or register domains.

Note

If you purchased your domain through Cloudflare Registrar, [ICANN ↗](https://www.icann.org/) requires you to verify your registrant email address. If your email is unverified or if the verification has expired, ICANN places a hold on the domain and replaces your nameservers with parking server nameservers (NS). Once you complete verification, your nameservers are automatically restored.

## How to register a new domain

Note

If you are registering a `.us` domain, refer to the [Additional requirements for .US domains](https://developers.cloudflare.com/registrar/top-level-domains/us-domains/) before proceeding.

1. In the Cloudflare dashboard, go to the **Register domains** page.  
[ Go to **Register domains** ](https://dash.cloudflare.com/?to=/:account/registrar/register)
2. In the search box, enter the domain name you wish to register, and select **Search**. You may also enter one or more keywords. The search results will contain a list of suggested domains. If the domain you entered does not appear in the list, this means it is not available for registration.

Important

Cloudflare Registrar currently does not support internationalized domain names (IDNs), also known as unicode. For that reason, you cannot search for words with special characters, such as `à`, `ü`, `ç`, among others.

1. Select **Purchase** on the domain you wish to register. In rare instances, a domain that is not available for registration may appear in the search results. After selecting **Purchase**, a definitive availability check will be performed to confirm that the domain is actually available for registration.
2. Select the term (number of years) you wish to register the domain from the **Payment option** drop-down menu. Most top-level domains (TLDs) can be registered for a maximum of ten years. Some TLDs may have different term limits and these will be reflected in the drop-down options.  
The expiration date and price will update automatically based on the term selected. The **Renew On** date is the date that the system will attempt to auto-renew the domain. All registrations have Auto-renew turned on by default. However, you may [disable this option](https://developers.cloudflare.com/registrar/account-options/renew-domains/) at any time.
3. Enter the contact details for the domain. These details will be used to create all of the required contacts (Registrant, Admin, Technical, and Billing), and may be updated after registration is completed. Refer to [Contact requirements](#contact-requirements) to learn the specific requirements for each contact field.

Note

If you have previously registered or transferred a domain name, the form will be filled in advance with the information from your default contact. If not, you will need to fill out the form.

It is important that you provide complete and accurate contact information. If you do not follow this recommendation, the domain registration may be suspended and/or canceled.

1. In **Payment**, select which type of payment you want to use. If you already have a billing profile, Cloudflare uses this information to automatically fill the form. If there is no billing profile, you need to enter your payment information.
2. Review the terms and conditions, including the Domain Registration Agreement, Self-serve Subscription Agreement, and the Privacy Policy.
3. Select **Complete purchase** to continue. By selecting **Complete purchase**, you acknowledge that you are accepting the terms of the agreements.

The registration process may take up to 30 seconds to complete. Once the registration is complete, the browser will navigate to the domain management page where you may update the contacts, change the auto-renew settings, and add additional years to the term. You will also receive a confirmation email regarding your new domain registration.

## Contact requirements

At this time, you can only use ASCII characters for contact data. If the default contact has non-ASCII characters, you will need to update the domain contact details before proceeding. Cloudflare recommends that you update your default contact information to include ASCII characters only.

| Field        | Required? | Restrictions                                                                                                                   |
| ------------ | --------- | ------------------------------------------------------------------------------------------------------------------------------ |
| First Name   | Yes       | Minimum of two letters.                                                                                                        |
| Last Name    | Yes       | Minimum of two letters.                                                                                                        |
| Email        | Yes       | Must be a properly formatted email address.                                                                                    |
| Organization | No        | Optional for most TLDs. In some cases, the Organization field may be populated by default with data from First and Last names. |
| Phone number | Yes       | Must select a valid country code from the drop-down options. Only numbers will be accepted in the phone number field.          |
| Ext          | No        | Only numbers may be entered.                                                                                                   |
| Address 1    | Yes       | May not be all numeric.                                                                                                        |
| Address 2    | No        | \-                                                                                                                             |
| City         | Yes       | \-                                                                                                                             |
| State        | Yes       | \-                                                                                                                             |
| Country      | Yes       | You must select one from the drop-down options.                                                                                |
| Postal Code  | Yes       | Must be a properly formatted postal code.                                                                                      |

When you register a domain with Cloudflare, your personal information is redacted when permitted by the registry. Refer to [WHOIS redaction](https://developers.cloudflare.com/registrar/account-options/whois-redaction/) for more information.

## Next steps

To improve the security of your domain, enable [Domain Name System Security Extensions](https://developers.cloudflare.com/registrar/get-started/enable-dnssec/) to create a secure layer with a cryptographic signature.

```json
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"item":{"@id":"/directory/","name":"Directory"}},{"@type":"ListItem","position":2,"item":{"@id":"/registrar/","name":"Registrar"}},{"@type":"ListItem","position":3,"item":{"@id":"/registrar/get-started/","name":"Get started"}},{"@type":"ListItem","position":4,"item":{"@id":"/registrar/get-started/register-domain/","name":"Register a new domain"}}]}
```

---

---
title: Transfer your domain to Cloudflare
description: Transfer a domain to Cloudflare Registrar from another registrar.
image: https://developers.cloudflare.com/core-services-preview.png
---

> Documentation Index  
> Fetch the complete documentation index at: https://developers.cloudflare.com/registrar/llms.txt  
> Use this file to discover all available pages before exploring further.

[Skip to content](#%5Ftop) 

# Transfer your domain to Cloudflare

Transferring a domain moves your registration from your current registrar to Cloudflare.

* **Active work:** About 30 minutes.
* **Total time:** Up to 10 days, depending on your registrar.
* **Cost:** Cloudflare domains are at-cost with no markup fees. Most transfers include a one-year extension from your current expiration date. Some country-code domains (such as `.uk`) have no transfer fee.

Note

Before you can transfer, you must first [add your domain to Cloudflare](#1-add-your-domain-to-cloudflare). You cannot [enter an authorization code](https://developers.cloudflare.com/registrar/troubleshooting/#cannot-find-where-to-enter-your-authorization-code) until your domain is active on Cloudflare. If your domain is registered with Shopify, Wix, or a similar platform, you may not be able to change nameservers while the domain is registered there. Refer to [Transfer from Shopify, Block, or Wix](#transfer-from-shopify-block-or-wix) for the recommended workaround, or [Troubleshoot failed domain transfers](https://developers.cloudflare.com/registrar/troubleshooting/) if you are running into issues.

Note

If your domain recently expired and you renewed it, wait at least 45 days after the original expiration date before transferring. Otherwise, the registry may not add the extra year. For details, refer to [Why did my domain's expiration date change?](https://developers.cloudflare.com/registrar/faq/#my-domains-registration-was-not-extended-by-one-year-after-transferring-to-cloudflare).

Note

If you purchased your domain through Cloudflare Registrar, [ICANN ↗](https://www.icann.org/) requires you to verify your registrant email address. If your email is unverified or if the verification has expired, ICANN places a hold on the domain and replaces your nameservers with parking server nameservers (NS). Once you complete verification, your nameservers are automatically restored.

---

Before you begin

Confirm the following before you start:

* You have a [Cloudflare account](https://developers.cloudflare.com/fundamentals/account/create-account/) with a [verified email address](https://developers.cloudflare.com/fundamentals/user-profiles/verify-email-address/).
* Your Cloudflare account has a valid payment method on file.
* Your domain was registered at least 60 days ago and has not been transferred in the last 60 days (ICANN requirement).
* You have not changed your registrant name, organization, or email address in the last 60 days. Under ICANN rules, changes to these fields trigger a 60-day transfer lock. Some registrars let you opt out of this lock during the change, but not all do.
* Your account at your current registrar is active. If your domain has expired, renew it at your current registrar first.
* Your domain uses only standard characters (letters, numbers, hyphens). Cloudflare does not support domains with non-Latin characters (for example, `例え.jp`).
* If you are transferring a `.us` domain, refer to [Additional requirements for .US domains](https://developers.cloudflare.com/registrar/top-level-domains/us-domains/).
* If you are transferring multiple domains, notify your bank to prevent fraud alerts on multiple charges.
* Cloudflare Registrar requires your domain to use Cloudflare for [authoritative DNS](https://developers.cloudflare.com/dns/zone-setups/full-setup/) (full setup). You cannot use another DNS provider while registered with Cloudflare.

---

## 1\. Add your domain to Cloudflare

Before you can transfer your registration, your domain must be [active on Cloudflare](https://developers.cloudflare.com/dns/zone-setups/full-setup/). This is what allows Cloudflare to protect your site with performance and security features during and after the transfer. You will not be able to enter an authorization code or proceed with the transfer until this step is complete.

### Disable DNSSEC

If DNSSEC is enabled at your current registrar, disable it before you change nameservers. DNSSEC validates DNS responses using cryptographic signatures tied to your current provider. When you point nameservers to Cloudflare, those signatures will no longer match, which causes DNS resolution failures and can prevent your domain from becoming active.

**At your current registrar:**

1. Check your domain settings for DNSSEC or DS records. If there are none, DNSSEC is not active and you can skip to [Add your domain](#add-your-domain-and-update-your-nameservers).
2. Remove or disable DNSSEC (sometimes labeled "DS records").
3. Wait at least 24 hours for the change to propagate before changing nameservers.

Provider-specific DNSSEC instructions

This is not an exhaustive list, but the following links may be helpful:

* [DNSimple ↗](https://support.dnsimple.com/articles/cloudflare-ds-record/)
* [Domaindiscount24 ↗](https://support.domaindiscount24.com/hc/articles/4409759478161)
* [DreamHost ↗](https://help.dreamhost.com/hc/en-us/articles/219539467)
* [Dynadot ↗](https://www.dynadot.com/help/question/set-DNSSEC)
* [Enom ↗](https://support.enom.com/support/solutions/articles/201000065386)
* [Gandi ↗](https://docs.gandi.net/en/domain%5Fnames/advanced%5Fusers/dnssec.html)
* [GoDaddy ↗](https://www.godaddy.com/help/add-a-ds-record-23865)
* [Hostinger ↗](https://www.hostinger.com/support/3667267-how-to-use-dnssec-records-at-hostinger/)
* [Hover ↗](https://support.hover.com/support/solutions/articles/201000064716)
* [Infomaniak ↗](https://faq.infomaniak.com/2187)
* [InMotion Hosting ↗](https://www.inmotionhosting.com/support/edu/cpanel/enable-dnssec-cloudflare/)
* [INWX ↗](https://kb.inwx.com/en-us/3-nameserver/131)
* [Joker.com ↗](https://joker.com/faq/books/jokercom-faq-en/page/dnssec)
* [Name.com ↗](https://www.name.com/support/articles/205439058-managing-dnssec)
* [Namecheap ↗](https://www.namecheap.com/support/knowledgebase/article.aspx/9722/2232/managing-dnssec-for-domains-pointed-to-custom-dns/)
* [NameISP ↗](https://support.nameisp.com/knowledgebase/dns)
* [Namesilo ↗](https://www.namesilo.com/support/v2/articles/domain-manager/ds-records)
* [OVH ↗](https://help.ovhcloud.com/csm/en-dns-secure-domain-dnssec?id=kb%5Farticle%5Fview&sysparm%5Farticle=KB0051637)
* [Squarespace ↗](https://support.squarespace.com/hc/articles/4404183898125-Nameservers-and-DNSSEC-for-Squarespace-managed-domains#toc-dnssec)
* [Registro.br ↗](https://registro.br/tecnologia/dnssec/?secao=tutoriais-dns)
* [Porkbun ↗](https://kb.porkbun.com/article/93-how-to-install-dnssec) (do not fill out **keyData**)
* [TransIP ↗](https://www.transip.eu/knowledgebase/150-secure-domains-custom-nameservers-dnssec/)

After your transfer completes, you can re-enable DNSSEC through Cloudflare with one click. Refer to [Enable DNSSEC](https://developers.cloudflare.com/dns/dnssec/#1-activate-dnssec-in-cloudflare).

### Add your domain and update your nameservers

Follow the steps in [Set up Cloudflare DNS](https://developers.cloudflare.com/dns/zone-setups/full-setup/setup/) to add your domain, review your DNS records, and get your assigned nameservers. Then [update the nameservers](https://developers.cloudflare.com/dns/nameservers/update-nameservers/) at your current registrar to the ones Cloudflare assigned.

Nameserver instructions for popular registrars

Each registrar has a different interface for updating nameservers. These links explain the process at popular registrars:

* [Enom ↗](https://support.enom.com/support/solutions/articles/201000065324-preparing-your-domain-for-transfer)
* [GoDaddy ↗](https://www.godaddy.com/help/transfer-my-domain-away-from-godaddy-3560)
* [Ionos by 1&1 ↗](https://www.ionos.com/help/domains/domain-transfers/#acc4514)
* [Namecheap ↗](https://www.namecheap.com/support/knowledgebase/article.aspx/258/84/what-should-i-do-to-transfer-a-domain-from-namecheap/)
* [Network Solutions ↗](https://www.networksolutions.com/help/article/transfer-out-of-network-solutions)
* [Squarespace ↗](https://support.squarespace.com/hc/articles/205812338-Transferring-a-domain-away-from-Squarespace)

### Wait for your domain to become active

**In the Cloudflare dashboard:**

Wait for your domain status to change from **Pending** to **Active**. This usually takes a few minutes but can take up to 24 hours.

Note

You cannot proceed with the transfer until your domain shows **Active** status. The Transfer Domains page will not let you enter an authorization code while the zone is still **Pending**.

If your zone has been pending for more than 24 hours, verify that you updated the nameservers correctly at your current registrar and that DNSSEC is disabled.

---

## 2\. Transfer your registration

Once your domain is active on Cloudflare, you can transfer the registration. This moves your domain record from your current registrar to Cloudflare. You will go back and forth between your current registrar and Cloudflare during this process.

### Unlock your domain

**At your current registrar:**

Remove the lock on your domain so Cloudflare can process the transfer. Most registrars apply a lock by default (sometimes called registrar lock, domain lock, or transfer lock) to prevent unauthorized transfers. In WHOIS, this appears as `clientTransferProhibited`.

Note

Some registrars have multiple lock types (domain lock, transfer lock, privacy lock) that must each be disabled separately. If your domain still shows as locked after you have disabled one, check for additional lock settings.

### Request an authorization code

**At your current registrar:**

Request an authorization code for your domain. This is also called an auth code, EPP code, authinfo code, or transfer code. Cloudflare uses this code to verify that the transfer is authorized by the domain owner.

Authorization codes are usually only valid for a limited period. Request the code when you are ready to enter it in the next step.

### Enter your authorization code and confirm payment

**In the Cloudflare dashboard:**

[ Go to **Transfer domains** ](https://dash.cloudflare.com/?to=/:account/registrar/transfer) 

Select your domain and enter the authorization code. For most generic TLDs (such as `.com`, `.net`, and `.org`), the transfer price includes a one-year registration extension from your current expiration date. This is an ICANN requirement for gTLD transfers. Country-code domains follow their own registry policies — for example, `.uk` transfers do not add an extra year or charge a transfer fee.

If you do not have a payment method on file, add one before proceeding.

Note

Verify your payment method is valid before submitting. A payment failure after submitting the authorization code can leave the transfer in a partially started state.

For information about registration limits and the one-year extension, refer to [Transfer rejected due to registration limits](https://developers.cloudflare.com/registrar/troubleshooting/#transfer-rejected-due-to-registration-limits).

### Confirm your contact information

**In the Cloudflare dashboard:**

Enter the contact information for your registration. Cloudflare Registrar redacts this information from public WHOIS by default, but ICANN requires Cloudflare to collect accurate contact details. Providing inaccurate information may result in domain suspension.

You can [modify your contact information](https://developers.cloudflare.com/registrar/account-options/domain-contact-updates/) later.

Warning

Some TLDs have additional registrant verification requirements. For `.ca`, `.mx`, and `.nz` domains, you may receive a separate email to verify your registrant contact information after the transfer completes. Failure to complete this verification within the required timeframe may result in domain suspension.

After entering the contact information, agree to the domain registration terms of service by selecting **Confirm transfer**.

### Approve the transfer at your current registrar

After you submit the transfer, Cloudflare will begin processing it and send a Form of Authorization (FOA) email to the registrant if the information is available in the public WHOIS database.

Your current registrar will email you confirming the transfer or asking for your approval. Afterwards, most registrars process it within 5 business days (but some TLDs, such as `.mx`, can take up to 10 business days).

Note

Registrants transferring a `.us` domain will always receive a FOA email.

---

## Transfer from Shopify, Block, or Wix

Some commerce and site-building platforms (such as Shopify, Block, and Wix) act as both your hosting provider and domain registrar. These platforms typically do not allow you to change nameservers while the domain is registered with them. Because Cloudflare requires your nameservers to point to Cloudflare before a transfer can begin, a direct transfer is not possible.

The workaround is to transfer your domain to another registrar first, wait 60 days, then transfer to Cloudflare:

1. **Get your authorization code from your current platform.** Each platform has a different process. Refer to your platform documentation for instructions on transferring your domain away.
2. **Transfer to another registrar** that allows nameserver changes. Enter the authorization code there and complete the transfer. This usually takes 3-5 days.
3. **Update nameservers to Cloudflare.** Once the domain is at the new registrar, update the nameservers to Cloudflare. You can use all Cloudflare features (CDN, DNS, security) immediately after this step.
4. **Transfer to Cloudflare Registrar after 60 days.** ICANN requires a 60-day wait between transfers. After that period, initiate the transfer to Cloudflare from the [Transfer Domains](#enter-your-authorization-code-and-confirm-payment) page.

Note

Each transfer adds one year to your domain registration. You will pay the other registrar for the first transfer, and Cloudflare for the second. These are not redundant charges — each extends your registration.

If you do not need Cloudflare as your registrar and only want to use Cloudflare DNS, CDN, and security features, you can stop after step 3.

---

## Transfer statuses

You can check the status of your transfer on the **Transfer Domains** page in the dashboard.

* **Transfer in progress**: Cloudflare has submitted the request to your current registrar. If this status persists for more than 24 hours, verify that you have unlocked the domain at your current registrar.
* **Pending approval**: Your current registrar has received the transfer request and can take up to five days to release the domain. To speed this up, approve the transfer through the email or dashboard of your current registrar.
* **Transfer rejected**: The transfer was rejected by your current registrar. This can happen if you declined the transfer request, or if the registrar determined the domain is not eligible. Select **Retry** to start a new transfer request.

---

## Bulk domain transfers

The process for transferring domains in bulk is the same as transferring a single domain. Each domain is charged individually.

---

## Common transfer issues

Here are suggestions for how to handle common transfer issues:

* [Domain is still locked](https://developers.cloudflare.com/registrar/troubleshooting/#domain-is-still-locked)
* [Authorization code is invalid or expired](https://developers.cloudflare.com/registrar/troubleshooting/#authorization-code-is-invalid-or-expired)
* [Cannot find where to enter your authorization code](https://developers.cloudflare.com/registrar/troubleshooting/#cannot-find-where-to-enter-your-authorization-code)
* [Transfer rejected](https://developers.cloudflare.com/registrar/troubleshooting/#transfer-rejected)
* [Transfer is taking too long](https://developers.cloudflare.com/registrar/troubleshooting/#transfer-is-taking-too-long)
* [Payment failed during transfer](https://developers.cloudflare.com/registrar/troubleshooting/#payment-failed-during-transfer)

For a full list of issues, refer to [Troubleshoot failed domain transfers](https://developers.cloudflare.com/registrar/troubleshooting/).

## Next steps

As mentioned in [Review DNS records in Cloudflare](https://developers.cloudflare.com/dns/zone-setups/full-setup/setup/#2-review-your-dns-records), when moving your domain to Cloudflare Registrar, you might need to configure your DNS records to correctly point traffic to your web host. Cloudflare automatically scans for common records and adds them to your account's DNS page, but the scan is not guaranteed to find all existing DNS records.

Refer to your web host's documentation to learn what type of records you need to configure and where they should point, to avoid downtime.

Example

For example, Netlify asks customers that host websites with them to add a `CNAME` record pointing `<YOUR-DOMAIN>` to `apex-loadbalancer.netlify.com`, and another `CNAME` record pointing `www` to `<YOUR-DOMAIN>.netlify.app`, depending on which one is the primary domain.

![An example of DNS management in Cloudflare's DNS dashboard](https://developers.cloudflare.com/_astro/dns-management.0LI9Ggoq_Z1jtI5k.webp)

You may also want to [enable DNSSEC](https://developers.cloudflare.com/dns/dnssec/#1-activate-dnssec-in-cloudflare).

```json
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"item":{"@id":"/directory/","name":"Directory"}},{"@type":"ListItem","position":2,"item":{"@id":"/registrar/","name":"Registrar"}},{"@type":"ListItem","position":3,"item":{"@id":"/registrar/get-started/","name":"Get started"}},{"@type":"ListItem","position":4,"item":{"@id":"/registrar/get-started/transfer-domain-to-cloudflare/","name":"Transfer your domain to Cloudflare"}}]}
```
