---
title: "Register a domain"
method: POST
path: "/domains/register"
tags: ["Domains"]
---

# Register a domain

`POST /domains/register`

## Request

- Base URL: `https://shipmail.to/api/v1`
- URL: `https://shipmail.to/api/v1/domains/register`
- Auth: one of:
  - HTTP bearer
  - OAuth 2 (authorization code, authorization URL `https://shipmail.to/api/auth/oauth2/authorize`, token URL `https://shipmail.to/api/auth/oauth2/token`)

Register a new domain through shipmail. Charges the saved payment method and returns the created Domain object. Requires an active subscription. Only an API key a person created can buy: an agent credential (an OAuth connection, the MCP server over OAuth, or an auth.md registration) never triggers a charge. It gets a 403 with `reason: "owner_confirmation_required"` and an `action_url` where the organization owner reviews the price and confirms the purchase.

## Headers

- `X-Shipmail-Organization` string

## Request body

- object
  - `name` string, required: Domain name to register (e.g. example.com).
  - `years` integer: Number of years to register for. Defaults to 1.
  - `contact` RegistrationContact, required
    - `first_name` string, required
    - `last_name` string, required
    - `address1` string, required
    - `address2` string
    - `city` string, required
    - `state` string
    - `zip` string, required
    - `country` string, required: Two-letter ISO 3166-1 alpha-2 country code.
    - `phone` string, required: Phone number in E.164 format (e.g. +14155551234).
    - `email` string, email, required

## Response `201`

Domain registered, DNS configured, and ready for mailboxes.

- Domain
  - `object` 'domain', required
  - `id` string, required
  - `name` string, required
  - `status` 'pending' | 'verifying' | 'verified' | 'failed' | 'degraded', required
  - `managed_by` 'external' | 'shipmail', required: Whether the domain is managed externally or registered through Shipmail.
  - `dns_provider` string, nullable, required
  - `mx_verified` boolean, required
  - `spf_verified` boolean, required
  - `dkim_verified` boolean, required
  - `dmarc_verified` boolean, required: Whether the DMARC record was last seen as valid.
  - `dmarc_managed_externally` boolean, required: True if a non-shipmail DMARC record is already published for this domain.
  - `outbound_verified` boolean, required
  - `catch_all_mailbox_id` string, nullable, required: Active mailbox in the same organization receiving unmatched addresses, or null when catch-all is disabled. The mailbox may use another domain.
  - `verified_at` string, date-time, nullable, required
  - `created_at` string, date-time, required
  - `updated_at` string, date-time, required
  - `registration` DomainRegistrationInfo
    - `expires_at` string, date-time, required
    - `auto_renew` boolean, required
    - `renewal_price` number, required
    - `privacy_enabled` boolean, required
    - `currency` string, required
    - `registered_at` string, date-time, required

## Other responses

- `402`: Validation failed.
- `403`: Insufficient permissions.
- `409`: Resource conflict.
- `422`: Validation failed.
- `429`: Rate limit exceeded.

---

[API](https://skmtc.dev/shipmail/apis/shipmail-api.md) · [All operations](https://skmtc.dev/shipmail/apis/shipmail-api/llms.txt) · [OpenAPI document](https://skmtc.dev/shipmail/apis/shipmail-api/revisions/2c23e59d7e30?raw)
