Initiate Transfer
Starts a domain transfer-in workflow. This is typically a billable operation — successful transfers charge the account’s default payment method, except for extensions with zero transfer pricing (e.g. UK extensions). All successful domain transfers are non-refundable.
How transfers work
Domain transfers move a domain from another registrar to Cloudflare. Transfers typically take 1-10 days due to ICANN-mandated approval windows.
Prerequisites
- The domain must already have a zone in the Cloudflare account (added through the dashboard or zone API).
- The zone must have DNSSec disabled.
- For billable transfers (i.e. extensions with non-zero transfer pricing), 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 domain must be unlocked at the current registrar.
- An authorization/EPP code from the current registrar is required, except for UK extensions — see Auth code below.
Auth code
An authorization code (also called EPP code, transfer key, or auth-info code) is required for most extensions, with the exception of UK extensions. Obtain this from your current registrar’s control panel.
The auth code in the request body must be base64-encoded per RFC 4648 §4 (standard alphabet, no line breaks).
Response behavior
Successful transfer initiation returns 202 Accepted. Validation or
initiation failures return the documented 4XX responses. Poll
GET /accounts/{account_id}/registrar/registrations/{domain_name}/transfer-in-status to track progress.
Premium domains
Premium domain transfers are not currently supported by this API. Please use the dashboard for now.
Billing
The account’s default payment method is charged upon successful transfer completion, unless the extension has zero transfer pricing (e.g. UK extensions). The transfer adds time to the domain’s existing expiration date (typically 1 year).
Security
API Token
The preferred authorization scheme for interacting with the Cloudflare API. Create a token.
API Email + API Key
The previous authorization scheme for interacting with the Cloudflare API, used in conjunction with a Global API key.
The previous authorization scheme for interacting with the Cloudflare API. When possible, use API tokens instead of Global API keys.
Path Parameters
Provides a fully qualified domain name (FQDN), including the extension
(e.g., example.com, mybrand.app). The domain name uniquely identifies
a registration. Cloudflare permits only one registration per domain, making
the domain name a natural idempotency key for registration requests.
Body ParametersJSON
The EPP/authorization code from your current registrar, base64-encoded per RFC 4648 §4. Obtain this from your current registrar’s control panel. Required for all extensions, except for UK.
Enable or disable automatic renewal after transfer. Defaults to false if omitted.
Registry-specific contact extension values for the registrant.
GET /accounts/{account_id}/registrar/extensions/{extension} documents the
required keys and allowed values for each extension in the
transfer_schema.properties.contact_extensions object.
Examples include .us nexus fields, .uk registrant type fields,
and .ca legal type fields. Include this object only when the extension’s
transfer schema defines contact_extensions.
Initiate Transfer
curl https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/registrar/registrations/$DOMAIN_NAME/transfer-in \
-H 'Content-Type: application/json' \
-H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
-d '{
"auth_code": "bml4b3M+Pj5hcmNoLWxpbnV4",
"contact_extensions": {
"application_purpose": "bar",
"nexus_category": "bar"
},
"privacy_mode": "redaction"
}'{
"errors": [],
"messages": [],
"result": {
"completed": false,
"context": {
"domain_name": "example.com"
},
"created_at": "2025-10-27T10:00:00Z",
"links": {
"resource": "/accounts/abc/registrar/registrations/example.com",
"self": "/accounts/abc/registrar/registrations/example.com/transfer-in-status"
},
"state": "pending",
"updated_at": "2025-10-27T10:00:01Z"
},
"success": true
}{
"errors": [
{
"code": 10000,
"message": "object at root is missing required properties: auth_code",
"source": {
"pointer": "/auth_code"
}
}
],
"messages": [],
"result": null,
"success": false
}{
"errors": [
{
"code": 10000,
"message": "Auth code must be a base64 encoded string",
"source": {
"pointer": "/auth_code"
}
}
],
"messages": [],
"result": null,
"success": false
}{
"errors": [
{
"code": 10000,
"message": "Domain not found",
"source": {
"pointer": "/domain_name"
}
}
],
"messages": [],
"result": null,
"success": false
}{
"errors": [
{
"code": 10000,
"message": "TLD Not supported by the API",
"source": {
"pointer": "/domain_name"
}
}
],
"messages": [],
"result": null,
"success": false
}{
"errors": [
{
"code": 10000,
"message": "Domain registration term would exceed maximum",
"source": {
"pointer": "/domain_name"
}
}
],
"messages": [],
"result": null,
"success": false
}{
"errors": [
{
"code": 10000,
"message": "No registrant contact provided and no default address book entry found for this account."
}
],
"messages": [],
"result": null,
"success": false
}{
"errors": [
{
"code": 10000,
"message": "A workflow already exists for this resource. Use GET status to check its progress."
}
],
"messages": [],
"result": null,
"success": false
}Returns Examples
{
"errors": [],
"messages": [],
"result": {
"completed": false,
"context": {
"domain_name": "example.com"
},
"created_at": "2025-10-27T10:00:00Z",
"links": {
"resource": "/accounts/abc/registrar/registrations/example.com",
"self": "/accounts/abc/registrar/registrations/example.com/transfer-in-status"
},
"state": "pending",
"updated_at": "2025-10-27T10:00:01Z"
},
"success": true
}{
"errors": [
{
"code": 10000,
"message": "object at root is missing required properties: auth_code",
"source": {
"pointer": "/auth_code"
}
}
],
"messages": [],
"result": null,
"success": false
}{
"errors": [
{
"code": 10000,
"message": "Auth code must be a base64 encoded string",
"source": {
"pointer": "/auth_code"
}
}
],
"messages": [],
"result": null,
"success": false
}{
"errors": [
{
"code": 10000,
"message": "Domain not found",
"source": {
"pointer": "/domain_name"
}
}
],
"messages": [],
"result": null,
"success": false
}{
"errors": [
{
"code": 10000,
"message": "TLD Not supported by the API",
"source": {
"pointer": "/domain_name"
}
}
],
"messages": [],
"result": null,
"success": false
}{
"errors": [
{
"code": 10000,
"message": "Domain registration term would exceed maximum",
"source": {
"pointer": "/domain_name"
}
}
],
"messages": [],
"result": null,
"success": false
}{
"errors": [
{
"code": 10000,
"message": "No registrant contact provided and no default address book entry found for this account."
}
],
"messages": [],
"result": null,
"success": false
}{
"errors": [
{
"code": 10000,
"message": "A workflow already exists for this resource. Use GET status to check its progress."
}
],
"messages": [],
"result": null,
"success": false
}