---
title: "Create Domain"
method: POST
path: "/core/v1/domains"
tags: ["Domains"]
---

# Create Domain

`POST /core/v1/domains`

Registers a new domain under your account. You must provide `domain.domainName` at minimum.
This endpoint is commonly used to programmatically onboard new domains through user signup flows or checkout experiences.

If no contacts are passed in this request, the default contacts for your name.com account will be used.

### Create Domain pricing

See the [Domain purchase pricing guide](/guides/domain-pricing) for the full reference.
**Recommendation:** For most integrations, scope discovery to `purchaseType: registration`. Other purchase types are supported but add complexity — details in the guide above.

**Discovery (required before create):** Call [Search](/api/v1/reference/domains/search) or [Check Availability](/api/v1/reference/domains/check-availability), not Get Pricing alone. Both return the same `SearchResult` fields (`purchaseType`, `purchasePrice`, `premium`, `purchasable`). [Zone Check](/api/v1/reference/domains/zone-check) is designed for rapid availability checks only; it is not sufficient to complete a purchase.

### Getting the price for Create Domain

1. **Search or Check Availability** → copy `purchaseType`, `premium`, note `purchasePrice`.

2. Branch on `purchaseType`:
   - **`registration` + `premium: false`** — omit `purchasePrice` on create, set `years`. Optional: Get Pricing with same `years` to preview the total.
   - **`registration` + `premium: true`** — Get Pricing with same `years` → pass `purchasePrice` exactly.
   - **aftermarket / expiring / backorder** — use discovery `purchasePrice` (flat fee). Re-check discovery before create. Do not use Get Pricing for create price. `years` does not multiply price or guarantee registration length.

3. If `purchasePrice` is sent, it must match exactly or the request fails with `400` and `"Purchase price does not match"`.

**Years on acquisition types:** For `aftermarket_s`, `aftermarket_b`, `aftermarket_i`, `expiring`, and `backorder`: omit `years` or pass the TLD default. Check `domain.expireDate` in the response; [Renew](/api/v1/reference/domains/renew-domain) to extend registration.

### Best Practices For Domain Creates

In general, you should check that a domain is available prior to attempting to purchase a domain.
You can use either the [checkAvailability](/api/v1/reference/domains/check-availability) endpoint, or the [Search](/api/v1/reference/domains/search) endpoint
to confirm that a domain is purchasable.

#### Important Note on Dropcatching and Abuse Prevention

_The createDomain endpoint is designed for standard domain registrations and is not intended for automated dropcatching (i.e., mass or high-frequency attempts to register domains the moment they become available after expiration). The use of drop-catching tools or services to acquire expired domains is strictly prohibited. All domain acquisitions must go through approved channels to ensure fair and transparent access._

#### Contact Verification
When a new domain registration is created and a contact is submitted, name.com may need to validate the contact's email address in accordance with ICANN policy. This validation involves sending an email to the provided address, prompting the recipient to click a link to verify their email address.

## Headers

- `X-Idempotency-Key` string

## Request body

- CreateDomainRequest — unresolved $ref

## Response `200`

A successful response.

- CreateDomainResponse — CreateDomainResponse contains the domain info as well as the order info for the created domain.
  - `domain` DomainResponsePayload, required — Domain contains all relevant data for a domain.
    - `domainName` string, required — The punycode-encoded value of the domain name.
    - `createDate` string, date-time, required — The date and time when the domain was created at the registry.
    - `expireDate` string, date-time, required — The date and time when the domain will expire.
    - `autorenewEnabled` boolean, required — Indicates whether the domain is set to renew automatically before expiration.
    - `locked` boolean, required — Indicates if the domain is **transfer locked**, preventing transfers to another registrar.
    - `locks` string[] — List of all registry locking statuses currently applied to the domain. Use this to see which locks are active (e.g. clientTransferProhibited, clientHold). Empty when the domain has no locks applied.
    - `transferLockExpiresAt` string, date-time — When present, the domain has an active ICANN-mandated transfer lock (new registration, transfer-in, or material registrant contact change) that blocks client unlock via the API until this time. When omitted, there is no active policy transfer lock with a known expiry — the domain may still be locked (`locked: true`) due to a voluntary user lock. Does not represent RegistrarLock, AccountLock, verification holds, trademark-claim locks, or admin TransferLock with no expiry date.
    - `privacyEnabled` boolean, required — Indicates if Whois Privacy is enabled for this domain.
    - `contacts` Contacts, required — Contacts stores the contact information for the roles related to domains.
      - `admin` Contact — Contact contains all relevant contact data for a domain registrant. This schema is used for API responses and may contain null values for legacy data. For creating or updating contacts, use ContactRequest which enforces all validation requirements.
        - `firstName` string, nullable — First name of the contact.
        - `lastName` string, nullable — Last name of the contact.
        - `companyName` string, nullable — Company name of the contact. Leave blank if the contact is an individual, as some registries may assume it is a corporate entity otherwise.
        - `address1` string, nullable — The first line of the contact's address.
        - `address2` string, nullable — The second line of the contact's address (optional).
        - `city` string, nullable — City of the contact's address.
        - `state` string, nullable — State or Province of the contact's address.
        - `zip` string, nullable — ZIP or Postal Code of the contact's address.
        - `country` string, nullable — Country code for the contact's address. Must be an ISO 3166-1 alpha-2 country code.
        - `email` string, nullable — Email address of the contact. Must be a valid email format. The validation is performed against the `addr-spec` syntax in [RFC 822](https://datatracker.ietf.org/doc/html/rfc822)
        - `phone` string, nullable — Phone number of the contact. Should follow the E.164 international format: "+[country code][number]".
        - `fax` string, nullable — Fax number of the contact. Should follow the E.164 international format: "+[country code][number]".
        - `isVerified` boolean — Indicates if the contact has been verified as per ICANN requirements. If the value is `false` it indicates that the contact has not completed the required verification process. This property is read-only and will be included in responses but should not be included in requests.
        - `verificationId` integer, nullable — When the contact is unverified, this is the ID of the pending verification record. Use this ID with the resend verification email and verify contact endpoints. Omitted or null when the contact is verified.
      - `billing` Contact — Contact contains all relevant contact data for a domain registrant. This schema is used for API responses and may contain null values for legacy data. For creating or updating contacts, use ContactRequest which enforces all validation requirements.
        - `firstName` string, nullable — First name of the contact.
        - `lastName` string, nullable — Last name of the contact.
        - `companyName` string, nullable — Company name of the contact. Leave blank if the contact is an individual, as some registries may assume it is a corporate entity otherwise.
        - `address1` string, nullable — The first line of the contact's address.
        - `address2` string, nullable — The second line of the contact's address (optional).
        - `city` string, nullable — City of the contact's address.
        - `state` string, nullable — State or Province of the contact's address.
        - `zip` string, nullable — ZIP or Postal Code of the contact's address.
        - `country` string, nullable — Country code for the contact's address. Must be an ISO 3166-1 alpha-2 country code.
        - `email` string, nullable — Email address of the contact. Must be a valid email format. The validation is performed against the `addr-spec` syntax in [RFC 822](https://datatracker.ietf.org/doc/html/rfc822)
        - `phone` string, nullable — Phone number of the contact. Should follow the E.164 international format: "+[country code][number]".
        - `fax` string, nullable — Fax number of the contact. Should follow the E.164 international format: "+[country code][number]".
        - `isVerified` boolean — Indicates if the contact has been verified as per ICANN requirements. If the value is `false` it indicates that the contact has not completed the required verification process. This property is read-only and will be included in responses but should not be included in requests.
        - `verificationId` integer, nullable — When the contact is unverified, this is the ID of the pending verification record. Use this ID with the resend verification email and verify contact endpoints. Omitted or null when the contact is verified.
      - `registrant` RegistrantContact — Contact contains all relevant contact data for a domain registrant. This schema is used for API responses and may contain null values for legacy data. For creating or updating contacts, use RegistrantContactRequest which enforces all validation requirements.
        - `firstName` string, nullable — First name of the contact.
        - `lastName` string, nullable — Last name of the contact.
        - `companyName` string, nullable — Company name of the contact. Leave blank if the contact is an individual. Please be advised that ICANN policy links the "Company Name" field (Organization) in your domain's contact details to its legal ownership. If this field contains information, the listed organization is considered the legal "Registered Name Holder" (domain owner).
        - `address1` string, nullable — The first line of the contact's address.
        - `address2` string, nullable — The second line of the contact's address (optional).
        - `city` string, nullable — City of the contact's address.
        - `state` string, nullable — State or Province of the contact's address.
        - `zip` string, nullable — ZIP or Postal Code of the contact's address.
        - `country` string, nullable — Country code for the contact's address. Must be an ISO 3166-1 alpha-2 country code.
        - `email` string, nullable — Email address of the contact. Must be a valid email format. The validation is performed against the `addr-spec` syntax in [RFC 822](https://datatracker.ietf.org/doc/html/rfc822)
        - `phone` string, nullable — Phone number of the contact. Should follow the E.164 international format: "+[country code][number]".
        - `fax` string, nullable — Fax number of the contact. Should follow the E.164 international format: "+[country code][number]".
        - `isVerified` boolean — Indicates if the contact has been verified as per ICANN requirements. If the value is `false` it indicates that the contact has not completed the required verification process. This property is read-only and will be included in responses but should not be included in requests.
        - `verificationId` integer, nullable — When the contact is unverified, this is the ID of the pending verification record. Use this ID with the resend verification email and verify contact endpoints. Omitted or null when the contact is verified.
      - `tech` Contact — Contact contains all relevant contact data for a domain registrant. This schema is used for API responses and may contain null values for legacy data. For creating or updating contacts, use ContactRequest which enforces all validation requirements.
        - `firstName` string, nullable — First name of the contact.
        - `lastName` string, nullable — Last name of the contact.
        - `companyName` string, nullable — Company name of the contact. Leave blank if the contact is an individual, as some registries may assume it is a corporate entity otherwise.
        - `address1` string, nullable — The first line of the contact's address.
        - `address2` string, nullable — The second line of the contact's address (optional).
        - `city` string, nullable — City of the contact's address.
        - `state` string, nullable — State or Province of the contact's address.
        - `zip` string, nullable — ZIP or Postal Code of the contact's address.
        - `country` string, nullable — Country code for the contact's address. Must be an ISO 3166-1 alpha-2 country code.
        - `email` string, nullable — Email address of the contact. Must be a valid email format. The validation is performed against the `addr-spec` syntax in [RFC 822](https://datatracker.ietf.org/doc/html/rfc822)
        - `phone` string, nullable — Phone number of the contact. Should follow the E.164 international format: "+[country code][number]".
        - `fax` string, nullable — Fax number of the contact. Should follow the E.164 international format: "+[country code][number]".
        - `isVerified` boolean — Indicates if the contact has been verified as per ICANN requirements. If the value is `false` it indicates that the contact has not completed the required verification process. This property is read-only and will be included in responses but should not be included in requests.
        - `verificationId` integer, nullable — When the contact is unverified, this is the ID of the pending verification record. Use this ID with the resend verification email and verify contact endpoints. Omitted or null when the contact is verified.
    - `nameservers` string[], required — The list of nameservers assigned to this domain. If unspecified, it defaults to the account's default nameservers.
    - `renewalPrice` number, double — The cost to renew the domain. This may be required for the RenewDomain operation.
  - `order` integer, required — Order is an identifier for this purchase.
  - `totalPaid` number, double, required — TotalPaid is the total amount paid, including VAT and Whois privacy protection.

## Other responses

- `400` — Bad request - Invalid input data.
- `401` — Unauthorized.
- `402` — Payment has failed for this transaction.
- `403` — Forbidden - you do not have permission to perform this action.
- `404` — Domain or requested resource not found.
- `405` — Method not allowed.
- `409` — When sending idempotent requests, this response indicates that there was an issue with the idempotency keys.
- `415` — All POST, PUT, PATCH requests for this API must include the `Content-Type: application/json` header in the requests.
- `422` — Pricing information unavailable.
- `429` — Rate limit has been exceeded.
- `451` — Unavailable for Legal Reasons.
- `500` — Internal server error.
- `501` — Not implemented.
- `502` — Bad Gateway
- `504` — Gateway Timeout

---

[API](https://skmtc.dev/name/apis/name-com-core-api.md) · [All operations](https://skmtc.dev/name/apis/name-com-core-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/name/name-com-core-api/revisions/a37d4cbd3991/schema)
