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-checkimmediately 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 tofalse. Setting it totrueis 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 toredaction.
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.
Servers
- https://api.cloudflare.com/client/v4
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
account_id |
String | Yes |
Cloudflare account ID. Required for all Registrar API operations. |
Request headers
| Name | Type | Required | Description |
|---|---|---|---|
Content-Type |
String | Yes |
The media type of the request body.
Default value: "application/json" |
Prefer |
String | No |
Set to The header may be combined with other preferences using standard comma-separated syntax. |
Request body fields
| Name | Type | Required | Description |
|---|---|---|---|
privacy_mode |
String | No |
WHOIS privacy mode for the registration. Defaults to
Valid values:
Default value: "redaction" |
years |
Integer | No |
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., 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. |
contacts |
Object | No |
Contact data for the registration request. If the If no default address book entry exists and no registrant contact is provided, the registration request will fail with a validation error. |
contacts.registrant |
Object | No |
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. |
contacts.registrant.email |
String | Yes |
Email address for the registrant. Used for domain-related communications from the registry, including ownership verification and renewal notices. |
contacts.registrant.fax |
String | No |
Fax number in E.164 format (e.g., |
contacts.registrant.postal_info |
Object | Yes |
Postal/mailing information for the registrant contact. |
contacts.registrant.postal_info.name |
String | Yes |
Full legal name of the registrant (individual or authorized representative). |
contacts.registrant.postal_info.organization |
String | No |
Organization or company name. Optional for individual registrants. |
contacts.registrant.postal_info.address |
Object | Yes |
Physical mailing address for the registrant contact. |
contacts.registrant.postal_info.address.postal_code |
String | Yes |
Postal or ZIP code. |
contacts.registrant.postal_info.address.country_code |
String | Yes |
Two-letter country code per ISO 3166-1 alpha-2 (e.g., |
contacts.registrant.postal_info.address.state |
String | Yes |
State, province, or region. Use the standard abbreviation where applicable (e.g., |
contacts.registrant.postal_info.address.street |
String | Yes |
Street address including building/suite number. |
contacts.registrant.postal_info.address.city |
String | Yes |
City or locality name. |
contacts.registrant.phone |
String | Yes |
Phone number in E.164 format: |
auto_renew |
Boolean | No |
Enable or disable automatic renewal. Defaults to Default value: false |
domain_name |
String | Yes |
Fully qualified domain name (FQDN) including the extension
(e.g., |
How to start integrating
- Add HTTP Task to your workflow definition.
- Search for the API you want to integrate with and click on the name.
- This loads the API reference documentation and prepares the Http request settings.
- Click Test request to test run your request to the API and see the API's response.