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