Unstoppable Domains Reseller API

RESTful API for resellers offering traditional DNS domain registration and management alongside Web3 domains. Supports domain search with pricing and availability, registration workflows, DNS record management, and lifecycle operations through a single unified interface.

OpenAPI Specification

unstoppable-domains-reseller-api-openapi.yaml Raw ↑
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