Unstoppable Domains contacts API

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.

OpenAPI Specification

unstoppable-domains-contacts-api-openapi.yml Raw ↑
openapi: 3.1.0
info:
  title: Web3 Partner API v3 account contacts API
  version: 3.0.0
  contact:
    name: Unstoppable Domains (Partner Engineering)
    email: partnerengineering@unstoppabledomains.com
  description: "# Feature Overview\nThe Web3 Partner API v3 provides you with the ability to lookup, register and manage Web3 domains. The API exposes a RESTful interface for interacting with Web3 domains and the Unstoppable Domains registry.\n- Lookup Domains: Search for specific domains or find suggested alternatives, to determine pricing, availability and on-chain details\n- Registering Domains: Secure domains into your dedicated Custody wallets to maintain the domains on the blockchain\n- Manage Domains: Update records on the blockchain or transfer the domain to external owners, all through a simple API interface\n\n## Custody Solution\nThe API takes the hassle of Web3 out of the equation. Unstoppable Domains will handle all blockchain interactions and concepts, while Partners simply use a RESTful API for managing domains.\n\nSince the domains will be in custody of the Partner, through Unstoppable Domains, the Partner is empowered to make any and all changes to the domains on behalf of their users.\n\nUnder the hood, Unstoppable Domains will manage dedicated custodial wallets for Partner-owned domains. These wallets are not shared between Partners and will uniquely identify the Partner on the various supported blockchains.\n\nShould the need arise to remove domains from custody, this is supported by changing the owner of domains to external owners.\n\n## Payments\nThe API will keep track of a running balance of charges and Unstoppable Domains will periodically invoice Partners to settle that balance. This empowers Partners to build payment processing in a way that works best for them.\n\n\n## Blockchain Support\nDomain details can be viewed across all of our supported blockchains:\n- Ethereum (ETH)\n- Polygon PoS (MATIC)\n- Base (BASE)\n\nDomains can **only be managed on Polygon PoS (MATIC) and Base (BASE)**. Domains on Ethereum (ETH) are readonly, but management support is coming soon.\n\n# Important Concepts\nThe API has some important concepts, in addition to Web3 Domains, that provide added utility, consistency and information.\n\n## Domain Ownership Type\nWeb3 domains exist on the supported Blockchains, and are owned by wallet addresses associated with those Blockchains. \nWe take ownership a step further, to provide improved security and reliability, by including an owner `type` in our ownership data.\nThe result is that a Domain's owner is defined by two values: `address` and `type`\n\nThe owner `type` can be one of the following:\n- `NONE`: Either the domain has never been owned or belongs to a \"burn\" address\n- `UD`: Owned by Unstoppable Domains\n- `SELF`: Domain belongs to a wallet addressed associated with your account, indicating you are able to manage it via the API\n- `EXTERNAL`: Owner doesn't qualify as any of the above. Changing to an `EXTERNAL` owner will result in the domain belonging to an address outside of the management of Unstoppable Domains and we will have no way to recover it.\n\nBy defining an owner in two parts (`address` and `type`) we ensure any irreversible action, such as transferring ownership, is deliberate and intended by requiring both the `address` and `type` in the request.\n\n## Operations\nAll interactions with the API that initiate changes will create an Operation for tracking that change.\nOperations can complete immediately or run in the background over the course of several minutes, depending on the Operation type and current conditions on the Blockchain.\n\nOperations include dependencies that represent the smaller units of work associated with the overall operation. These dependencies can also be tracked through the API and each have their own status and metadata.\n\nYour integration should properly handle and anticipate all of the following possible statuses for Operations and their dependencies:\n- `QUEUED` : The Operation has not started processing yet, but should be started shortly\n- `PROCESSING` : The Operation has started, often involving sending transactions to the Blockchain\n- `SIGNATURE_REQUIRED`: The operation is awaiting a signature in order to continue processing. This is only relevant to Self-Custody domain management.\n- `COMPLETED` : The Operation has finished processing successfully\n- `FAILED` : The Operation has finished processing and has either fully or partially failed\n- `CANCELLED` : The Operation has been cancelled, usually due to a failure with a sibling dependency\n\nSee the [Operations](/openapi/partner/v3/#tag/operations) API for additional information.\n\n## Wallets\nDomains ownership on the Blockchain is handled by associating a Domain with an \"address\". These addresses are typically managed by Wallets (usually in the form of an application on your computer or mobile device) that manage the private key for the public \"address\".\n\nThe API provides endpoints for creating/managing Wallets within your account to enable you to handle Domain ownership distribution in whatever way works for you. Any Domain that is owned by one of your account's Wallets is fully in your control to manage.\n\nSee the [Wallets](/openapi/partner/v3/#tag/wallets) API for additional information.\n\n# Get Access\nSee our quickstart guide for getting your Partner API key: [Set up Partner API Access](https://docs.unstoppabledomains.com/domain-distribution-and-management/quickstart/retrieve-an-api-key/)\n\nIf you have any questions, contact our [Partner Engineering Team](mailto:partnerengineering@unstoppabledomains.com?subject=Partner%20API%20v3%20Inquiry) to help with API access or learn more.\n"
servers:
- url: https://api.unstoppabledomains.com/partner/v3
  description: Production
- url: https://api.ud-sandbox.com/partner/v3
  description: Sandbox
security:
- bearer: []
tags:
- 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
paths:
  /contacts/{contactId}:
    get:
      operationId: getContact
      parameters:
      - name: contactId
        required: true
        in: path
        schema:
          type: string
          pattern: ^ct-[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$
          example: ct-a1b2c3d4-e5f6-7890-abcd-ef1234567890
        description: 'Contact ID (format: ct-<uuid>)'
      responses:
        '200':
          description: Contact details
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ContactResponse'
        '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:
      - contacts
      summary: Get a contact
      description: 'Retrieve the details of a specific contact by ID, including personal information, address, phone, email, and verification status.

        '
  /contacts:
    post:
      operationId: createContact
      parameters:
      - name: $preview
        required: true
        in: query
        schema:
          default: false
          type: boolean
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ContactCreateRequestBody'
      responses:
        '201':
          description: Contact creation operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ContactCreateOperationResponse'
        '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:
      - contacts
      summary: Create a contact
      description: 'Create a new contact for use in domain registration and management. A verification email will be sent to the contact''s email address. Use `$preview=true` to validate without creating the contact.

        '
  /mcp/v1/actions/ud_contacts_list:
    post:
      operationId: contactsList
      summary: List ICANN contacts
      description: List ICANN contacts configured for the authenticated user's account. Required for DNS domain registration (.com, .org, etc.).
      tags:
      - contacts
      security:
      - bearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                includeDisabled:
                  type: boolean
                  description: 'Include disabled contacts (default: false)'
      responses:
        '200':
          description: List of ICANN contacts
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ContactsListResponse'
        '401':
          description: Authentication required
  /mcp/v1/actions/ud_contact_create:
    post:
      operationId: contactCreate
      summary: Create ICANN contact
      description: Create a new ICANN contact for DNS domain registration. Required for .com, .org, .net, etc.
      tags:
      - contacts
      security:
      - bearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
              - firstName
              - lastName
              - email
              - phone
              - street
              - city
              - stateProvince
              - postalCode
              - countryCode
              properties:
                firstName:
                  type: string
                  description: Contact first name
                lastName:
                  type: string
                  description: Contact last name
                email:
                  type: string
                  format: email
                  description: Contact email address
                phone:
                  type: object
                  required:
                  - dialingPrefix
                  - number
                  properties:
                    dialingPrefix:
                      type: string
                      description: Phone country code (e.g., "1")
                    number:
                      type: string
                      description: Phone number
                street:
                  type: string
                  description: Street address
                city:
                  type: string
                  description: City
                stateProvince:
                  type: string
                  description: State/province code
                postalCode:
                  type: string
                  description: Postal/ZIP code
                countryCode:
                  type: string
                  description: Two-letter ISO country code
                organization:
                  type: string
                  description: Company name (optional)
      responses:
        '200':
          description: Contact created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ContactCreateResponse'
        '401':
          description: Authentication required
components:
  schemas:
    PlatformOperationDnsRecordDelete:
      type: object
      description: Deletes a DNS record
      properties:
        id:
          type: string
          example: plop_abc12345-1234-1234-1234-abc123456789
        '@type':
          type: string
          enum:
          - unstoppabledomains.com/partner.v3.PlatformOperation
        status:
          $ref: '#/components/schemas/PlatformOperationStatus'
        type:
          type: string
          enum:
          - DNS_RECORD_DELETE
        parameters:
          type: object
          properties:
            id:
              type: string
              description: DNS record ID to delete
          required:
          - id
        error:
          $ref: '#/components/schemas/OperationDependencyError'
      required:
      - id
      - '@type'
      - status
      - type
      - parameters
    ContactAssignment:
      type: object
      description: Reference to an existing or newly created contact
      properties:
        new:
          type: boolean
          description: Whether this contact is being newly created as part of this operation
        id:
          type: string
          description: Contact ID (present when new is false)
          example: con_abc12345-1234-1234-1234-abc123456789
      required:
      - new
    PlatformOperationDnsRecordUpdate:
      type: object
      description: Updates an existing DNS record
      properties:
        id:
          type: string
          example: plop_abc12345-1234-1234-1234-abc123456789
        '@type':
          type: string
          enum:
          - unstoppabledomains.com/partner.v3.PlatformOperation
        status:
          $ref: '#/components/schemas/PlatformOperationStatus'
        type:
          type: string
          enum:
          - DNS_RECORD_UPDATE
        parameters:
          type: object
          properties:
            id:
              type: string
              description: DNS record ID to update
            values:
              type: array
              items:
                type: string
            ttl:
              type: integer
              description: Time-to-live in seconds
          required:
          - id
        error:
          $ref: '#/components/schemas/OperationDependencyError'
      required:
      - id
      - '@type'
      - status
      - type
      - parameters
    ContactCreateRequestBody:
      type: object
      properties:
        firstName:
          type: string
          maxLength: 100
        lastName:
          type: string
          maxLength: 100
        organization:
          type: string
          maxLength: 100
        countryCode:
          type: string
          description: ISO 3166-1 alpha-2 country code (e.g., "US", "CA", "GB")
        street:
          type: string
          maxLength: 100
        city:
          type: string
          maxLength: 100
        postalCode:
          type: string
          description: Postal/ZIP code. Validated against the provided countryCode.
        stateProvince:
          type: string
          description: State or province. Validated against the provided countryCode.
        phone:
          $ref: '#/components/schemas/ContactPhoneRequestBody'
        email:
          type: string
          maxLength: 100
          format: email
      required:
      - firstName
      - lastName
      - countryCode
      - street
      - city
      - postalCode
      - stateProvince
      - phone
      - email
      description: Create a standalone contact that can be referenced by ID in domain registration and contact update operations.
    PlatformOperationContactCreate:
      type: object
      description: Creates a new contact for use in domain registration or management
      properties:
        id:
          type: string
          example: plop_abc12345-1234-1234-1234-abc123456789
        '@type':
          type: string
          enum:
          - unstoppabledomains.com/partner.v3.PlatformOperation
        status:
          $ref: '#/components/schemas/PlatformOperationStatus'
        type:
          type: string
          enum:
          - CONTACT_CREATE
        parameters:
          type: object
          properties:
            purposes:
              type: array
              items:
                $ref: '#/components/schemas/ContactPurpose'
              description: Intended roles for this contact
              example:
              - OWNER
              - ADMIN
          required:
          - purposes
        result:
          type: object
          properties:
            id:
              type: string
              description: ID of the created contact
              example: ct-a1b2c3d4-e5f6-7890-abcd-ef1234567890
          required:
          - id
        error:
          $ref: '#/components/schemas/OperationDependencyError'
      required:
      - id
      - '@type'
      - status
      - type
      - parameters
    PlatformOperationDomainDnsContactSet:
      type: object
      description: Updates contact role assignments for the domain
      properties:
        id:
          type: string
          example: plop_abc12345-1234-1234-1234-abc123456789
        '@type':
          type: string
          enum:
          - unstoppabledomains.com/partner.v3.PlatformOperation
        status:
          $ref: '#/components/schemas/PlatformOperationStatus'
        type:
          type: string
          enum:
          - DOMAIN_DNS_CONTACT_SET
        parameters:
          type: object
          properties:
            owner:
              $ref: '#/components/schemas/ContactAssignment'
            admin:
              $ref: '#/components/schemas/ContactAssignment'
            billing:
              $ref: '#/components/schemas/ContactAssignment'
            tech:
              $ref: '#/components/schemas/ContactAssignment'
        error:
          $ref: '#/components/schemas/OperationDependencyError'
      required:
      - id
      - '@type'
      - status
      - type
      - parameters
    PlatformOperationDomainDnsSecurityDeleteDnssec:
      type: object
      description: Removes DNSSEC DS records from the registry for a domain
      properties:
        id:
          type: string
          example: plop_abc12345-1234-1234-1234-abc123456789
        '@type':
          type: string
          enum:
          - unstoppabledomains.com/partner.v3.PlatformOperation
        status:
          $ref: '#/components/schemas/PlatformOperationStatus'
        type:
          type: string
          enum:
          - DOMAIN_DNS_SECURITY_DELETE_DNSSEC
        parameters:
          type: object
          properties:
            domain:
              type: string
              description: Domain name
        error:
          $ref: '#/components/schemas/OperationDependencyError'
      required:
      - id
      - '@type'
      - status
      - type
      - parameters
    NonRegistrantContacts:
      type: object
      description: Non-registrant contact role assignments (admin, billing, tech)
      properties:
        admin:
          $ref: '#/components/schemas/ContactAssignment'
        billing:
          $ref: '#/components/schemas/ContactAssignment'
        tech:
          $ref: '#/components/schemas/ContactAssignment'
    PlatformOperationDomainFlagLockUpdate:
      type: object
      description: Updates domain flag lock settings (e.g., transfer lock, delete lock)
      properties:
        id:
          type: string
          example: plop_abc12345-1234-1234-1234-abc123456789
        '@type':
          type: string
          enum:
          - unstoppabledomains.com/partner.v3.PlatformOperation
        status:
          $ref: '#/components/schemas/PlatformOperationStatus'
        type:
          type: string
          enum:
          - DOMAIN_FLAG_LOCK_UPDATE
        parameters:
          type: object
          properties:
            locks:
              $ref: '#/components/schemas/DomainFlagLocks'
            policyLocks:
              $ref: '#/components/schemas/DomainFlagLocks'
        error:
          $ref: '#/components/schemas/OperationDependencyError'
      required:
      - id
      - '@type'
      - status
      - type
      - parameters
    ContactResponse:
      type: object
      properties:
        '@type':
          type: string
          enum:
          - unstoppabledomains.com/partner.v3.Contact
        id:
          type: string
          description: Contact ID
          pattern: ^ct-[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$
          example: ct-a1b2c3d4-e5f6-7890-abcd-ef1234567890
        firstName:
          type: string
        lastName:
          type: string
        organization:
          type: string
        countryCode:
          type: string
        street:
          type: string
        city:
          type: string
        postalCode:
          type: string
        stateProvince:
          type: string
        phone:
          $ref: '#/components/schemas/ContactPhoneResponse'
        email:
          type: string
        tldData:
          $ref: '#/components/schemas/DomainOwnerContactTldSpecificResponse'
        verification:
          $ref: '#/components/schemas/ContactVerificationResponse'
      required:
      - '@type'
      - id
      - firstName
      - lastName
      - countryCode
      - street
      - city
      - postalCode
      - stateProvince
      - phone
      - email
    ErrorResponse:
      type: object
      description: Standard error response
      properties:
        code:
          type: string
          description: Machine-readable error code
          example: VALIDATION
        message:
          type: string
          description: Human-readable error description
        errors:
          type: array
          description: Individual errors when code is MULTIPLE_ERRORS
          items:
            type: object
            properties:
              code:
                type: string
              message:
                type: string
            required:
            - code
      required:
      - code
    ContactPurpose:
      type: string
      enum:
      - OWNER
      - ADMIN
      - TECH
      - BILLING
    PlatformOperationDomainRegister:
      type: object
      description: Registers a new domain with the specified owner contact and optional role contacts
      properties:
        id:
          type: string
          example: plop_abc12345-1234-1234-1234-abc123456789
        '@type':
          type: string
          enum:
          - unstoppabledomains.com/partner.v3.PlatformOperation
        status:
          $ref: '#/components/schemas/PlatformOperationStatus'
        type:
          type: string
          enum:
          - DOMAIN_REGISTER
        parameters:
          type: object
          properties:
            owner:
              $ref: '#/components/schemas/ContactAssignment'
            contacts:
              $ref: '#/components/schemas/NonRegistrantContacts'
            period:
              type: integer
              description: Registration period in years
              example: 1
          required:
          - owner
        error:
          $ref: '#/components/schemas/OperationDependencyError'
      required:
      - id
      - '@type'
      - status
      - type
      - parameters
    PlatformOperationStatus:
      type: string
      enum:
      - PREVIEW
      - QUEUED
      - PROCESSING
      - FAILED
      - COMPLETED
      - CANCELLED
      - AWAITING_UPDATES
      description: Status of a platform operation dependency
    CiraLanguageCode:
      type: string
      enum:
      - en_US
      - fr_CA
      - en
      - fr
      description: CIRA preferred language code
    PlatformOperationDomainDnsSecurityUpdateZone:
      type: object
      description: Updates the DNS zone configuration for DNSSEC signing
      properties:
        id:
          type: string
          example: plop_abc12345-1234-1234-1234-abc123456789
        '@type':
          type: string
          enum:
          - unstoppabledomains.com/partner.v3.PlatformOperation
        status:
          $ref: '#/components/schemas/PlatformOperationStatus'
        type:
          type: string
          enum:
          - DOMAIN_DNS_SECURITY_UPDATE_ZONE
        parameters:
          type: object
          properties:
            domain:
              type: string
              description: Domain name
        error:
          $ref: '#/components/schemas/OperationDependencyError'
      required:
      - id
      - '@type'
      - status
      - type
      - parameters
    ContactCreateOperationResponse:
      type: object
      properties:
        '@type':
          type: string
          enum:
          - unstoppabledomains.com/partner.v3.ContactOperationResult
        operation:
          $ref: '#/components/schemas/OperationCheckResponse'
      required:
      - '@type'
      - operation
    PlatformOperationDnsRecordCreate:
      type: object
      description: Creates a new DNS record for the domain
      properties:
        id:
          type: string
          example: plop_abc12345-1234-1234-1234-abc123456789
        '@type':
          type: string
          enum:
          - unstoppabledomains.com/partner.v3.PlatformOperation
        status:
          $ref: '#/components/schemas/PlatformOperationStatus'
        type:
          type: string
          enum:
          - DNS_RECORD_CREATE
        parameters:
          type: object
          properties:
            subName:
              type: string
              description: Subdomain name (empty for apex domain)
              example: www
            type:
              $ref: '#/components/schemas/DnsRecordType'
            values:
              type: array
              items:
                type: string
              example:
              - 192.0.2.1
            ttl:
              type: integer
              description: Time-to-live in seconds
              example: 300
          required:
          - type
          - values
          - ttl
        result:
          type: object
          properties:
            id:
              type: string
              description: ID of the created DNS record
          required:
          - id
        error:
          $ref: '#/components/schemas/OperationDependencyError'
      required:
      - id
      - '@type'
      - status
      - type
      - parameters
    ContactPhoneResponse:
      type: object
      properties:
        number:
          type: string
        dialingPrefix:
          type: string
      required:
      - number
      - dialingPrefix
    OperationDependencyError:
      type: object
      description: Error details for a failed operation dependency
      properties:
        code:
          type: string
          description: Error code identifying the failure type
        message:
          type: string
          description: Human-readable error description
      required:
      - code
      - message
    ContactPhoneRequestBody:
      type: object
      properties:
        number:
          type: string
          minLength: 6
          maxLength: 14
          description: Phone number digits (numeric string, 6-14 characters).
        dialingPrefix:
          type: string
          description: International dialing prefix (e.g., "+1" for US/CA, "+44" for UK).
          example: '+1'
      required:
      - number
      - dialingPrefix
      description: Phone number with international dialing prefix.
    ContactsListResponse:
      type: object
      properties:
        contacts:
          type: array
          items:
            type: object
            properties:
              id:
                type: string
                description: Contact ID
              firstName:
                type: string
              lastName:
                type: string
              email:
                type: string
                description: Partially masked email
              phone:
                type: string
                description: Partially masked phone
              city:
                type: string
              stateProvince:
                type: string
              countryCode:
                type: string
              organization:
                type: string
              status:
                type: string
                enum:
                - active
                - draft
                - admin_disabled
                description: 'Contact status: "active" = ready for checkout, "draft" = syncing with registrar (wait a few seconds), "admin_disabled" = cannot be used'
        count:
          type: number
          description: Total number of contacts
        accountEmail:
          type:
          - string
          - 'null'
          description: User's account email (masked) - suggest using for new contacts for auto-verification
        accountEmailHint:
          type:
          - string
          - 'null'
          description: Tip about automatic verification when contact email matches account email
    PlatformOperationWebhookDelete:
      type: object
      description: Deletes a webhook subscription
      properties:
        id:
          type: string
          example: plop_abc12345-1234-1234-1234-abc123456789
        '@type':
          type: string
          enum:
          - unstoppabledomains.com/partner.v3.PlatformOperation
        status:
          $ref: '#/components/schemas/PlatformOperationStatus'
        type:
          type: string
          enum:
          - WEBHOOK_DELETE
        parameters:
          type: object
          properties:
            id:
              type: string
              description: Webhook ID to delete
          required:
          - id
        error:
          $ref: '#/components/schemas/OperationDependencyError'
      required:
      - id
      - '@type'
      - status
      - type
      - parameters
    CiraCanadianPresenceRequirement:
      type: string
      enum:
      - CCT
      - LGR
      - RES
      - ABO
      - CCO
      - ASS
      - PRT
      - TDM
      - TRD
      - PLT
      - TRS
      - LAM
      - EDU
      - HOP
      - GOV
      - INB
      - OMK
      - MAJ
      description: CIRA Canadian Presence Requirement category
    PlatformOperationWebhookCreate:
      type: object
      description: Creates a webhook subscription
      properties:
        id:
          type: string
          example: plop_abc12345-1234-1234-1234-abc123456789
        '@type':
          type: string
          enum:
          - unstoppabledomains.com/partner.v3.PlatformOperation
        status:
          $ref: '#/components/schemas/PlatformOperationStatus'
        type:
          type: string
          enum:
          - WEBHOOK_CREATE
        parameters:
          type: object
          properties:
            url:
              type: string
              description: Webhook callback URL
              example: https://example.com/webhooks
            type:
              $ref: '#/components/schemas/WebhookType'
          required:
          - url
          - type
        result:
          type: object
          properties:
            id:
              type: string
              description: ID of the created webhook
          required:
          - id
        error:
          $ref: '#/components/schemas/OperationDependencyError'
      required:
      - id
      - '@type'
      - status
      - type
      - parameters
    Oper

# --- truncated at 32 KB (41 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/unstoppable-domains/refs/heads/main/openapi/unstoppable-domains-contacts-api-openapi.yml