Skip to content
Start here

Check domain transfer eligibility

POST/accounts/{account_id}/registrar/domain-transfer-check

Performs real-time, authoritative eligibility checks directly against needed requirements. Use this endpoint to verify a domain is available before attempting a transfer via POST /registrations/:domain_name/transfer-in.

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.

Behavior

  • Maximum 10 domains per request
  • Pricing is only returned for domains where transferable: true
  • Results are not cached; each request queries the registry & other needed upstreams

Extension Support

All .uk extensions (.uk, .co.uk, etc) do not support auth codes. As such, Cloudflare will ignore the auth_code section of this request for .uk domains.

This means that a .uk domain depends on public data to obtain domain information, so it might be a few minutes outdated.

Workflow

  1. Call this endpoint with domains the user wants to transfer.
  2. For each domain where transferable: true, present pricing to the user.
  3. For each domain where transferable: false, present reasons to the user
  4. Proceed to POST /registrations/:domain_name/transfer-in only for the transferable: true domains.
Security
API Token

The preferred authorization scheme for interacting with the Cloudflare API. Create a token.

Example:Authorization: Bearer Sn3lZJTBX6kkg7OdcBUAxOO963GEIyGQqnFTOFYY
API Email + API Key

The previous authorization scheme for interacting with the Cloudflare API, used in conjunction with a Global API key.

Example:X-Auth-Email: user@example.com

The previous authorization scheme for interacting with the Cloudflare API. When possible, use API tokens instead of Global API keys.

Example:X-Auth-Key: 144c9defac04969c7bfad8efaa8ea194
Path ParametersExpand Collapse
account_id: string

Identifier.

maxLength32
Body ParametersJSONExpand Collapse
domains: array of object { domain_name, auth_code }

List of domain objects to evaluate for transfer eligibility.

domain_name: string

Fully qualified domain name (FQDN) to check for transfer eligibility.

auth_code: optional string

Base64-encoded auth/EPP code from the current registrar. Required for most TLDs. .uk namespaces do not use auth codes.

formatbyte
ReturnsExpand Collapse
errors: array of object { code, message, source }
code: number
minimum1000
message: string
source: optional object { pointer }

Location of the invalid value that caused the error.

pointer: string

JSON Pointer to the invalid or missing request value.

messages: array of object { code, message, source }
code: number
minimum1000
message: string
source: optional object { pointer }

Location of the invalid value that caused the error.

pointer: string

JSON Pointer to the invalid or missing request value.

result: object { domains }

Contains the transfer eligibility results.

domains: map[object { pricing, transferable, name, reasons } or object { transferable, name, pricing, reasons } ]

Maps domain names to transfer eligibility results. Each value contains name, transferable, and reasons.

One of the following:
TransferableResult object { pricing, transferable, name, reasons }
pricing: object { currency, renewal_cost, transfer_cost }

Provides annual pricing information for a given domain. The API returns all per-year prices as strings to preserve decimal precision.

renewal_cost and registration_cost or transfer_cost are frequently the same value, but may differ due to premium rates for certain domains.

For a multi-year operations, the operation’s cost applies to the first year and renewal_cost applies to each subsequent year. The values reflect the current registry rate, which can change over time.

currency: string

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

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.

transfer_cost: string

The first-year cost to transfer this domain.

transferable: true
name: optional string

The check evaluates this domain name.

reasons: optional array of object { code }
code: "extension_not_supported_via_api" or "extension_not_supported" or "domain_premium" or 14 more

Transfer eligibility reason code.

  • extension_not_supported_via_api: This API excludes the extension; dashboard flows support it.
  • extension_not_supported: Cloudflare Registrar excludes the extension.
  • domain_premium: This API currently excludes premium transfers.
  • extension_disallows_transfer: Extension currently blocks transfer operations.
  • domain_not_exists: No registration record exists for the domain.
  • domain_on_cloudflare: Cloudflare already serves as the domain’s registrar.
  • domain_locked: Losing registrar reports transfer-prohibited lock status.
  • registry_status: Registry status currently blocks transfer (for example, pending transfer or deletion state).
  • domain_outside_transfer_window: Domain is within a transfer wait window (for example, recently registered).
  • domain_max_term: Completing transfer would exceed the registry maximum term.
  • invalid_auth_code: The provided auth code is incorrect.
  • invalid_auth_code_format: Auth code fails Base64 validation.
  • dnssec_enabled: DNSSEC is enabled. It must be disabled before transfer.
  • zone_not_found: The target account lacks a Cloudflare zone for the domain.
  • zone_status_invalid: The Cloudflare zone cannot transfer in its current state.
  • invalid_zone_plan: The zone plan fails transfer requirements.
  • domain_unsupported: This endpoint rejects the domain name format.
One of the following:
"extension_not_supported_via_api"
"extension_not_supported"
"domain_premium"
"extension_disallows_transfer"
"domain_not_exists"
"domain_on_cloudflare"
"domain_locked"
"registry_status"
"domain_outside_transfer_window"
"domain_max_term"
"invalid_auth_code"
"invalid_auth_code_format"
"dnssec_enabled"
"zone_not_found"
"zone_status_invalid"
"invalid_zone_plan"
"domain_unsupported"
NonTransferableResult object { transferable, name, pricing, reasons }
transferable: false
name: optional string

The check evaluates this domain name.

pricing: optional object { currency, renewal_cost, transfer_cost }

Provides annual pricing information for a given domain. The API returns all per-year prices as strings to preserve decimal precision.

renewal_cost and registration_cost or transfer_cost are frequently the same value, but may differ due to premium rates for certain domains.

For a multi-year operations, the operation’s cost applies to the first year and renewal_cost applies to each subsequent year. The values reflect the current registry rate, which can change over time.

currency: string

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

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.

transfer_cost: string

The first-year cost to transfer this domain.

reasons: optional array of object { code }
code: "extension_not_supported_via_api" or "extension_not_supported" or "domain_premium" or 14 more

Transfer eligibility reason code.

  • extension_not_supported_via_api: This API excludes the extension; dashboard flows support it.
  • extension_not_supported: Cloudflare Registrar excludes the extension.
  • domain_premium: This API currently excludes premium transfers.
  • extension_disallows_transfer: Extension currently blocks transfer operations.
  • domain_not_exists: No registration record exists for the domain.
  • domain_on_cloudflare: Cloudflare already serves as the domain’s registrar.
  • domain_locked: Losing registrar reports transfer-prohibited lock status.
  • registry_status: Registry status currently blocks transfer (for example, pending transfer or deletion state).
  • domain_outside_transfer_window: Domain is within a transfer wait window (for example, recently registered).
  • domain_max_term: Completing transfer would exceed the registry maximum term.
  • invalid_auth_code: The provided auth code is incorrect.
  • invalid_auth_code_format: Auth code fails Base64 validation.
  • dnssec_enabled: DNSSEC is enabled. It must be disabled before transfer.
  • zone_not_found: The target account lacks a Cloudflare zone for the domain.
  • zone_status_invalid: The Cloudflare zone cannot transfer in its current state.
  • invalid_zone_plan: The zone plan fails transfer requirements.
  • domain_unsupported: This endpoint rejects the domain name format.
One of the following:
"extension_not_supported_via_api"
"extension_not_supported"
"domain_premium"
"extension_disallows_transfer"
"domain_not_exists"
"domain_on_cloudflare"
"domain_locked"
"registry_status"
"domain_outside_transfer_window"
"domain_max_term"
"invalid_auth_code"
"invalid_auth_code_format"
"dnssec_enabled"
"zone_not_found"
"zone_status_invalid"
"invalid_zone_plan"
"domain_unsupported"
success: true

Whether the API call was successful.

Check domain transfer eligibility

curl https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/registrar/domain-transfer-check \
    -H 'Content-Type: application/json' \
    -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
    -d '{
          "domains": [
            {
              "domain_name": "example.co.uk"
            }
          ]
        }'
{
  "errors": [],
  "messages": [],
  "result": {
    "domains": {
      "example.com": {
        "name": "example.com",
        "pricing": {
          "currency": "USD",
          "renewal_cost": "10.11",
          "transfer_cost": "8.57"
        },
        "reasons": [],
        "transferable": true
      },
      "mybrand.net": {
        "name": "mybrand.net",
        "pricing": {
          "currency": "USD",
          "renewal_cost": "12.50",
          "transfer_cost": "9.99"
        },
        "reasons": [],
        "transferable": true
      }
    }
  },
  "success": true
}
{
  "errors": [],
  "messages": [],
  "result": {
    "domains": {
      "example.com": {
        "name": "example.com",
        "reasons": [
          {
            "code": "invalid_auth_code"
          }
        ],
        "transferable": false
      }
    }
  },
  "success": true
}
{
  "errors": [],
  "messages": [],
  "result": {
    "domains": {
      "cloudflare.com": {
        "name": "cloudflare.com",
        "reasons": [
          {
            "code": "domain_on_cloudflare"
          }
        ],
        "transferable": false
      },
      "locked-example.com": {
        "name": "locked-example.com",
        "reasons": [
          {
            "code": "domain_locked"
          }
        ],
        "transferable": false
      },
      "move-ready.net": {
        "name": "move-ready.net",
        "pricing": {
          "currency": "USD",
          "renewal_cost": "12.50",
          "transfer_cost": "9.99"
        },
        "reasons": [],
        "transferable": true
      },
      "pending-transfer.dev": {
        "name": "pending-transfer.dev",
        "reasons": [
          {
            "code": "registry_status"
          }
        ],
        "transferable": false
      }
    }
  },
  "success": true
}
{
  "errors": [
    {
      "code": 10000,
      "message": "Internal API failure for domain flaky-example.com",
      "source": {
        "pointer": "/domains/1"
      }
    }
  ],
  "messages": [],
  "result": {
    "domains": {
      "stable-example.com": {
        "name": "stable-example.com",
        "pricing": {
          "currency": "USD",
          "renewal_cost": "10.11",
          "transfer_cost": "8.57"
        },
        "reasons": [],
        "transferable": true
      }
    }
  },
  "success": true
}
{
  "errors": [],
  "messages": [],
  "result": {
    "domains": {
      "example.horse": {
        "name": "example.horse",
        "reasons": [
          {
            "code": "extension_not_supported"
          }
        ],
        "transferable": false
      },
      "invalid@@domain": {
        "name": "invalid@@domain",
        "reasons": [
          {
            "code": "domain_unsupported"
          }
        ],
        "transferable": false
      }
    }
  },
  "success": true
}
{
  "errors": [
    {
      "code": 10000,
      "message": "object at root is missing required properties: domains",
      "source": {
        "pointer": "/domains"
      }
    }
  ],
  "messages": [],
  "result": null,
  "success": false
}
{
  "errors": [
    {
      "code": 10000,
      "message": "Duplicate domain name",
      "source": {
        "pointer": "/domains/1"
      }
    }
  ],
  "messages": [],
  "result": null,
  "success": false
}
{
  "errors": [
    {
      "code": 10000,
      "message": "array at `/domains` is too long (maximum: 10)",
      "source": {
        "pointer": "/domains"
      }
    }
  ],
  "messages": [],
  "result": null,
  "success": false
}
{
  "errors": [
    {
      "code": 10000,
      "message": "Internal API failure for domain example.com",
      "source": {
        "pointer": "/domains/0"
      }
    },
    {
      "code": 10000,
      "message": "Internal API failure for domain mybrand.net",
      "source": {
        "pointer": "/domains/1"
      }
    }
  ],
  "messages": [],
  "result": null,
  "success": false
}
Returns Examples
{
  "errors": [],
  "messages": [],
  "result": {
    "domains": {
      "example.com": {
        "name": "example.com",
        "pricing": {
          "currency": "USD",
          "renewal_cost": "10.11",
          "transfer_cost": "8.57"
        },
        "reasons": [],
        "transferable": true
      },
      "mybrand.net": {
        "name": "mybrand.net",
        "pricing": {
          "currency": "USD",
          "renewal_cost": "12.50",
          "transfer_cost": "9.99"
        },
        "reasons": [],
        "transferable": true
      }
    }
  },
  "success": true
}
{
  "errors": [],
  "messages": [],
  "result": {
    "domains": {
      "example.com": {
        "name": "example.com",
        "reasons": [
          {
            "code": "invalid_auth_code"
          }
        ],
        "transferable": false
      }
    }
  },
  "success": true
}
{
  "errors": [],
  "messages": [],
  "result": {
    "domains": {
      "cloudflare.com": {
        "name": "cloudflare.com",
        "reasons": [
          {
            "code": "domain_on_cloudflare"
          }
        ],
        "transferable": false
      },
      "locked-example.com": {
        "name": "locked-example.com",
        "reasons": [
          {
            "code": "domain_locked"
          }
        ],
        "transferable": false
      },
      "move-ready.net": {
        "name": "move-ready.net",
        "pricing": {
          "currency": "USD",
          "renewal_cost": "12.50",
          "transfer_cost": "9.99"
        },
        "reasons": [],
        "transferable": true
      },
      "pending-transfer.dev": {
        "name": "pending-transfer.dev",
        "reasons": [
          {
            "code": "registry_status"
          }
        ],
        "transferable": false
      }
    }
  },
  "success": true
}
{
  "errors": [
    {
      "code": 10000,
      "message": "Internal API failure for domain flaky-example.com",
      "source": {
        "pointer": "/domains/1"
      }
    }
  ],
  "messages": [],
  "result": {
    "domains": {
      "stable-example.com": {
        "name": "stable-example.com",
        "pricing": {
          "currency": "USD",
          "renewal_cost": "10.11",
          "transfer_cost": "8.57"
        },
        "reasons": [],
        "transferable": true
      }
    }
  },
  "success": true
}
{
  "errors": [],
  "messages": [],
  "result": {
    "domains": {
      "example.horse": {
        "name": "example.horse",
        "reasons": [
          {
            "code": "extension_not_supported"
          }
        ],
        "transferable": false
      },
      "invalid@@domain": {
        "name": "invalid@@domain",
        "reasons": [
          {
            "code": "domain_unsupported"
          }
        ],
        "transferable": false
      }
    }
  },
  "success": true
}
{
  "errors": [
    {
      "code": 10000,
      "message": "object at root is missing required properties: domains",
      "source": {
        "pointer": "/domains"
      }
    }
  ],
  "messages": [],
  "result": null,
  "success": false
}
{
  "errors": [
    {
      "code": 10000,
      "message": "Duplicate domain name",
      "source": {
        "pointer": "/domains/1"
      }
    }
  ],
  "messages": [],
  "result": null,
  "success": false
}
{
  "errors": [
    {
      "code": 10000,
      "message": "array at `/domains` is too long (maximum: 10)",
      "source": {
        "pointer": "/domains"
      }
    }
  ],
  "messages": [],
  "result": null,
  "success": false
}
{
  "errors": [
    {
      "code": 10000,
      "message": "Internal API failure for domain example.com",
      "source": {
        "pointer": "/domains/0"
      }
    },
    {
      "code": 10000,
      "message": "Internal API failure for domain mybrand.net",
      "source": {
        "pointer": "/domains/1"
      }
    }
  ],
  "messages": [],
  "result": null,
  "success": false
}