Skip to content
Start here

Check domain transfer eligibility

client.registrar.transferCheck(RegistrarTransferCheckParams { account_id, domains } params, RequestOptionsoptions?): RegistrarTransferCheckResponse { domains }
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
ParametersExpand Collapse
params: RegistrarTransferCheckParams { account_id, domains }
account_id: string

Path param: Identifier.

maxLength32
domains: Array<Domain>

Body param: List of domain objects to evaluate for transfer eligibility.

domain_name: string

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

auth_code?: string

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

formatbyte
ReturnsExpand Collapse
RegistrarTransferCheckResponse { domains }

Contains the transfer eligibility results.

domains: Record<string, TransferableResult { pricing, transferable, name, reasons } | NonTransferableResult { transferable, name, pricing, reasons } >

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

One of the following:
TransferableResult { pricing, transferable, name, reasons }
pricing: Pricing { 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?: string

The check evaluates this domain name.

reasons?: Array<Reason>
code: "extension_not_supported_via_api" | "extension_not_supported" | "domain_premium" | 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 { transferable, name, pricing, reasons }
transferable: false
name?: string

The check evaluates this domain name.

pricing?: Pricing { 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?: Array<Reason>
code: "extension_not_supported_via_api" | "extension_not_supported" | "domain_premium" | 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"

Check domain transfer eligibility

import Cloudflare from 'cloudflare';

const client = new Cloudflare({
  apiToken: process.env['CLOUDFLARE_API_TOKEN'], // This is the default and can be omitted
});

const response = await client.registrar.transferCheck({
  account_id: '023e105f4ecef8ad9ca31a8372d0c353',
  domains: [{ domain_name: 'example.co.uk' }],
});

console.log(response.domains);
{
  "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
}