openapi: 3.1.0
info:
title: Reseller API
version: 1.0.0
contact:
name: Unstoppable Domains (Reseller Engineering)
email: [email protected]
description: |
# Feature Overview
The Reseller API provides domain reseller partners with the ability to search, register and manage traditional DNS domains. The API exposes a RESTful interface for domain registration, DNS management, and domain lifecycle operations.
- **Domain Discovery**: Search for specific domains or find suggested alternatives, determine pricing, availability and registration details
- **Domain Registration**: Register domains with full control over registration period, contacts, and initial DNS configuration
- **DNS Management**: Create, update and delete DNS records for your domains
- **Domain Lifecycle**: Manage renewals, transfers, contacts, and domain flags through a simple API interface
- **Marketplace**: Browse secondary marketplace listings to find premium domains available for purchase from existing owners
For access, authentication, environments, and your first request, start with the [Quick Start](/apis/reseller/quick-start).
For implementation guidance on operations, flags, registration flows, contact management, DNS management, webhooks, and lifecycle operations, see the [Implementation Guide](/apis/reseller/implementation-guide).
servers:
- url: https://api.unstoppabledomains.com/partner/v3
description: Production
- url: https://api.ud-sandbox.com/partner/v3
description: Sandbox
tags:
- name: domain-search
description: |
Search for domain availability and retrieve details for one or more domains. Use the `$expand` parameter to include registration details and flags in the response.
x-displayName: Search & Lookup
- name: domain-registration
description: |
Register new domains and manage renewals. Use `$preview=true` to validate requests and get price quotes before committing.
x-displayName: Registration & Renewals
- name: domain-management
description: |
Comprehensive domain updates — modify nameservers, DNSSEC, contacts, flags, and DNS records in a single request.
x-displayName: Domain Management
- name: dns-records
description: |
Create, read, update and delete DNS records for your domains. Also includes DNS metadata, nameserver management, and DNSSEC configuration.
x-displayName: DNS Records
- name: domain-transfers
description: |
Check transfer eligibility and retrieve authorization codes for transferring domains to another registrar.
x-displayName: Transfers
- name: domain-flags
description: |
View and manage domain flags that control behavior and security settings such as DNS resolution, transfer locks, WHOIS privacy, and more.
x-displayName: Domain Flags
- name: domain-contacts
description: |
View and update the ICANN-required contacts (owner, admin, tech, billing) assigned to a specific domain.
x-displayName: Domain Contacts
- name: suggestions
description: Find available domain alternatives based on keywords and preferences.
x-displayName: Suggestions
- name: pricing
description: Retrieve pricing information for domain registration, renewal, transfer, and restoration by domain name or TLD.
x-displayName: Pricing
- name: tlds
description: Browse available top-level domains (TLDs), their details, and DNS security configuration.
x-displayName: TLDs
- name: contacts
description: |
Create and manage ICANN-required contacts for domain registration. Contacts represent individuals or organizations associated with domain roles (owner, admin, tech, billing).
New contacts are automatically sent a verification email upon creation. Contacts can be used in domain registrations immediately, but domains associated with unverified contacts may become unmanageable after a certain period.
x-displayName: Contacts
- name: operations
description: |
All asynchronous processes handled by the API are represented as Operations. This includes registering a domain, updating DNS records, renewing a domain, and more.
Operations contain dependencies that represent the individual units of work. Each dependency has its own status, parameters, and result data.
x-displayName: Operations
- name: hosting
description: |
Configure how your domains serve content on the web. Hosting configurations control what happens when someone visits your domain — whether it redirects to another URL or proxies content from another server.
Available hosting types:
- `REDIRECT_301` — Permanent redirect to another URL
- `REDIRECT_302` — Temporary redirect to another URL
- `REVERSE_PROXY` — Proxy requests to a backend server
All hosting configurations require SSL certificate provisioning. When a configuration is created or updated, the `certificateStatus` field will be `PENDING` until the certificate is issued and active. This process typically completes within a few minutes but may take longer in some cases.
x-displayName: Hosting
- name: marketplace
description: |
Browse and search the Unstoppable Domains secondary marketplace. Retrieve paginated listings of domains available for purchase from existing owners, with filtering by TLD and sorting options.
x-displayName: Marketplace
- name: account
description: Manage your account details, authentication tokens, and webhook subscriptions.
x-displayName: Account
x-tagGroups:
- name: Domains
tags:
- domain-search
- suggestions
- domain-registration
- domain-management
- dns-records
- domain-transfers
- domain-flags
- domain-contacts
- name: Marketplace
tags:
- marketplace
- name: Discovery
tags:
- pricing
- tlds
- name: Contacts
tags:
- contacts
- name: Operations
tags:
- operations
- name: Hosting
tags:
- hosting
- name: Account
tags:
- account
paths:
/domains:
get:
operationId: getMultipleDomains
parameters:
- name: $expand
required: false
in: query
schema:
type: array
items:
$ref: '#/components/schemas/DomainExpandField'
- name: ending
required: false
in: query
schema:
default: []
type: array
items:
type: string
description: TLD or domain endings to combine with unqualified query labels (e.g. `com`, `net`). Required when any `query` value is an unqualified label.
- name: query
required: true
in: query
schema:
maxItems: 50
type: array
items:
type: string
description: Domain names or labels to search. Fully qualified names (e.g. `example.com`) are looked up directly. Unqualified labels (e.g. `example`) are combined with each `ending` value to produce domain names.
responses:
'200':
description: List of domains matching search query
content:
application/json:
schema:
$ref: '#/components/schemas/MultipleDomainSearchResponse'
'400':
description: Invalid request
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'401':
description: Authentication required
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'403':
description: Insufficient permissions
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'500':
description: Internal server error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
tags:
- domain-search
summary: Lookup multiple domains
description: |
Get domain availability and details for multiple domains. Optionally, use the `$expand` query parameter to include additional data in the response (e.g. `?$expand=registration&$expand=flags`).
If a domain is available for registration it will have an `availability.status` of `AVAILABLE` and will include an `availability.price` object.
**Search constraints:**
- Each `query` value must be a fully qualified domain name (e.g. `example.com`), OR at least one `ending` parameter must be provided.
- The total number of domains resolved (queries × endings) must not exceed **50**.
- If a `query` value already contains a valid TLD (e.g. `example.com`), it is looked up directly and is not combined with `ending` values.
post:
operationId: registerDomain
parameters:
- name: $preview
required: true
in: query
schema:
default: false
type: boolean
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/DomainRegistrationRequestBody'
responses:
'201':
description: Domain registration operation created
content:
application/json:
schema:
$ref: '#/components/schemas/DomainOperationResponse'
'400':
description: Invalid request
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'401':
description: Authentication required
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'403':
description: Insufficient permissions
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'409':
description: Resource conflict
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'500':
description: Internal server error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
tags:
- domain-registration
summary: Register or transfer in a domain
description: |
Register a new domain or transfer an existing domain into your account. The request body specifies the domain name and optional DNS configuration including registration period, contacts, and nameserver settings.
To **register** a new domain, submit the request without an authorization code. To **transfer in** an existing domain from another registrar, include the `dns.authorizationCode` field — the presence of this field determines that this is a transfer-in rather than a new registration.
Use `$preview=true` to validate the request and get a price quote without executing the operation.
/domains/{name}:
get:
operationId: getSingleDomain
parameters:
- name: name
required: true
in: path
schema:
type: string
- name: $expand
required: false
in: query
schema:
type: array
items:
$ref: '#/components/schemas/DomainExpandField'
responses:
'200':
description: Domain details
content:
application/json:
schema:
$ref: '#/components/schemas/DomainSearchResponse'
'400':
description: Invalid request
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'401':
description: Authentication required
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'403':
description: Insufficient permissions
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'404':
description: Resource not found
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'500':
description: Internal server error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
tags:
- domain-search
summary: Lookup a single domain
description: |
Get availability and details for a single domain. Optionally, use the `$expand` query parameter to include additional data such as registration details and flags.
patch:
operationId: updateDomain
summary: Update a domain
description: Comprehensive domain update — modify nameservers, DNSSEC, contacts, flags, and DNS records in a single operation. All fields are optional; only include the sections you want to change.
Returns an operation that tracks all the resulting changes.
tags:
- domain-management
parameters:
- name: name
required: true
in: path
schema:
type: string
description: Domain name
- name: $preview
required: true
in: query
schema:
type: boolean
default: false
description: Preview mode — validate the request without executing changes.
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/DomainUpdateRequestBody'
responses:
'200':
description: Update operation created
content:
application/json:
schema:
$ref: '#/components/schemas/DomainOperationResponse'
'400':
description: Invalid request
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'401':
description: Authentication required
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'403':
description: Insufficient permissions
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'404':
description: Resource not found
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'500':
description: Internal server error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
/domains/{name}/pending-operations:
get:
operationId: getDomainPendingOperations
parameters:
- name: name
required: true
in: path
schema:
type: string
responses:
'200':
description: List of pending operations for domain
content:
application/json:
schema:
$ref: '#/components/schemas/DomainPendingOperationsListResponse'
'400':
description: Invalid request
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'401':
description: Authentication required
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'403':
description: Insufficient permissions
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'404':
description: Resource not found
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'500':
description: Internal server error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
tags:
- operations
summary: Get pending operations for a domain
description: |
Retrieve a list of operations that are currently in progress for the specified domain. Useful for checking if there are any active operations before initiating new changes.
/domains/{name}/renewals:
get:
operationId: getDomainRenewalInfo
parameters:
- name: name
required: true
in: path
schema:
type: string
responses:
'200':
description: Domain renewal pricing and eligibility
content:
application/json:
schema:
$ref: '#/components/schemas/IcannDomainRenewalInfoResponse'
'400':
description: Invalid request
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'401':
description: Authentication required
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'403':
description: Insufficient permissions
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'404':
description: Resource not found
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'500':
description: Internal server error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
tags:
- domain-registration
summary: Get domain renewal info
description: |
Retrieve renewal eligibility and pricing for the specified domain, including the current expiration date, grace period expiration, and available renewal periods.
post:
operationId: postDomainRenewal
parameters:
- name: name
required: true
in: path
schema:
type: string
- name: $preview
required: true
in: query
schema:
default: false
type: boolean
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/DomainRenewalRequestBody'
responses:
'201':
description: Domain renewal operation created
content:
application/json:
schema:
$ref: '#/components/schemas/DomainOperationResponse'
'400':
description: Invalid request
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'401':
description: Authentication required
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'403':
description: Insufficient permissions
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'404':
description: Resource not found
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'409':
description: Resource conflict
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'500':
description: Internal server error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
tags:
- domain-registration
summary: Renew a domain
description: |
Renew the specified domain for a given period (in years). Use `$preview=true` to get a renewal price quote without executing the renewal.
/domains/{name}/dns:
get:
operationId: getDomainDnsMetadata
parameters:
- name: name
required: true
in: path
schema:
type: string
responses:
'200':
description: DNS metadata for domain
content:
application/json:
schema:
$ref: '#/components/schemas/IcannDomainDnsMetadataResponse'
'400':
description: Invalid request
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'401':
description: Authentication required
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'403':
description: Insufficient permissions
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'404':
description: Resource not found
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'500':
description: Internal server error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
tags:
- dns-records
summary: Get DNS metadata
description: |
Retrieve DNS metadata for the specified domain, including the DNS provider and registration status.
/domains/{name}/dns/authorization-code:
get:
operationId: getAuthorizationCode
parameters:
- name: name
required: true
in: path
schema:
type: string
responses:
'200':
description: Transfer authorization code
content:
application/json:
schema:
$ref: '#/components/schemas/DomainTransferAuthorizationCodeResponse'
'400':
description: Invalid request
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'401':
description: Authentication required
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'403':
description: Insufficient permissions
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'404':
description: Resource not found
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'500':
description: Internal server error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
tags:
- domain-transfers
summary: Get transfer authorization code
description: |
Retrieve the authorization (EPP) code required to transfer the domain to another registrar. The domain must be eligible for transfer before requesting this code.
/domains/{name}/dns/records:
get:
operationId: getDnsRecords
parameters:
- name: name
required: true
in: path
schema:
type: string
- name: $cursor
required: false
in: query
schema:
type: string
- name: type
required: false
in: query
schema:
maxItems: 50
type: array
items:
$ref: '#/components/schemas/DnsRecordType'
- name: subName
required: false
in: query
schema:
maxItems: 50
type: array
items:
type: string
responses:
'200':
description: List of DNS records
content:
application/json:
schema:
$ref: '#/components/schemas/DomainDnsRecordsResponse'
'400':
description: Invalid request
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'401':
description: Authentication required
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'403':
description: Insufficient permissions
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'404':
description: Resource not found
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'500':
description: Internal server error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
tags:
- dns-records
summary: List DNS records
description: |
Retrieve DNS records for the specified domain. Supports filtering by record type and subdomain name, and cursor-based pagination.
post:
operationId: createDnsRecord
parameters:
- name: name
required: true
in: path
schema:
type: string
- name: $preview
required: true
in: query
schema:
default: false
type: boolean
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/DomainDnsRecordCreateRequestBody'
responses:
'201':
description: DNS record creation operation created
content:
application/json:
schema:
$ref: '#/components/schemas/DomainDnsRecordOperationResponse'
'400':
description: Invalid request
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'401':
description: Authentication required
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'403':
description: Insufficient permissions
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'404':
description: Resource not found
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'409':
description: Resource conflict
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'500':
description: Internal server error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
tags:
- dns-records
summary: Create a DNS record
description: |
Create a new DNS record for the specified domain. Supports all standard DNS record types. Use `$preview=true` to validate the request without creating the record.
The `$upsert` option controls behavior when a matching record already exists: `REPLACE` overwrites, `APPEND` adds values, `DISALLOWED` rejects the request.
/domains/{name}/dns/records/{id}:
patch:
operationId: updateDomainRecord
parameters:
- name: name
required: true
in: path
schema:
type: string
- name: id
required: true
in: path
schema:
type: string
pattern: ^rr-[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$
example: rr-a1b2c3d4-e5f6-7890-abcd-ef1234567890
description: 'DNS record ID (format: rr-<uuid>)'
- name: $preview
required: true
in: query
schema:
default: false
type: boolean
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/DomainDnsRecordUpdateRequestBody'
responses:
'200':
description: DNS record update operation created
content:
application/json:
schema:
$ref: '#/components/schemas/DomainDnsRecordOperationResponse'
'400':
description: Invalid request
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'401':
description: Authentication required
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'403':
description: Insufficient permissions
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'404':
description: Resource not found
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'500':
description: Internal server error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
tags:
- dns-records
summary: Update a DNS record
description: |
Update an existing DNS record by ID. You can modify the record values and TTL. Use `$preview=true` to validate the request without applying the change.
delete:
operationId: deleteDomainRecord
parameters:
- name: name
required: true
in: path
schema:
type: string
- name: id
required: true
in: path
schema:
type: string
pattern: ^rr-[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$
example: rr-a1b2c3d4-e5f6-7890-abcd-ef1234567890
description: 'DNS record ID (format: rr-<uuid>)'
- name: $preview
required: true
in: query
schema:
default: false
type: boolean
responses:
'200':
description: DNS record deletion operation created
content:
application/json:
schema:
$ref: '#/components/schemas/DomainDnsRecordOperationResponse'
'400':
description: Invalid request
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'401':
description: Authentication required
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'403':
description: Insufficient permissions
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'404':
description: Resource not found
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'500':
description: Internal server error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
tags:
- dns-records
summary: Delete a DNS record
description: |
Delete a DNS record by ID. Use `$preview=true` to validate the request without deleting the record.
/domains/{name}/dns/security:
get:
operationId: getDnsSecurityStatus
parameters:
- name: name
required: true
in: path
schema:
type: string
responses:
'200':
description: DNSSEC status
content:
application/json:
schema:
$ref: '#/components/schemas/DomainDnsSecurityStatusResponse'
'400':
description: Invalid request
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'401':
description: Authentication required
content:
application/json:
schema:
$ref:
# --- truncated at 32 KB (179 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/unstoppable-domains/refs/heads/main/openapi/unstoppable-domains-reseller-api-openapi.yaml