The 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.
The 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.
Since 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.
Under 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.
Should the need arise to remove domains from custody, this is supported by changing the owner of domains to external owners.
The 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.
Domain details can be viewed across all of our supported blockchains:
Domains can only be managed on Polygon PoS (MATIC) and Base (BASE). Domains on Ethereum (ETH) are readonly, but management support is coming soon.
The API has some important concepts, in addition to Web3 Domains, that provide added utility, consistency and information.
Web3 domains exist on the supported Blockchains, and are owned by wallet addresses associated with those Blockchains.
We take ownership a step further, to provide improved security and reliability, by including an owner type
in our ownership data.
The result is that a Domain's owner is defined by two values: address
and type
The owner type
can be one of the following:
NONE
: Either the domain has never been owned or belongs to a "burn" addressUD
: Owned by Unstoppable DomainsSELF
: Domain belongs to a wallet addressed associated with your account, indicating you are able to manage it via the APIEXTERNAL
: 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.By 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.
All interactions with the API that initiate changes will create an Operation for tracking that change. Operations 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.
Operations 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.
Your integration should properly handle and anticipate all of the following possible statuses for Operations and their dependencies:
QUEUED
: The Operation has not started processing yet, but should be started shortlyPROCESSING
: The Operation has started, often involving sending transactions to the BlockchainSIGNATURE_REQUIRED
: The operation is awaiting a signature in order to continue processing. This is only relevant to Self-Custody domain management.COMPLETED
: The Operation has finished processing successfullyFAILED
: The Operation has finished processing and has either fully or partially failedCANCELLED
: The Operation has been cancelled, usually due to a failure with a sibling dependencySee the Operations API for additional information.
Domains 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".
The 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.
See the Wallets API for additional information.
See our quickstart guide for getting your Partner API key: Set up Partner API Access
If you have any questions, contact our Partner Engineering Team to help with API access or learn more.
All domains returned by this route are available for registration
{- "@type": "unstoppabledomains.com/partner.v3.List",
- "items": [
- {
- "@type": "unstoppabledomains.com/partner.v3.DomainSuggestion",
- "name": "matt.crypto",
- "price": {
- "type": "STANDARD",
- "listPrice": {
- "usdCents": 1000
}, - "subTotal": {
- "usdCents": 1000
}
}
}
]
}
Get domain availability and owner details for multiple domains using the query string search options. Optionally, use the $expand
query string to include additional data in the response (ie. ?$expand=records&$expand=registration
).
If the domain is available to be registered it will have a availability.status
of AVAILABLE
and will include an availability.price
object.
{- "@type": "unstoppabledomains.com/partner.v3.List",
- "items": [
- {
- "@type": "unstoppabledomains.com/partner.v3.Domain",
- "records": { },
- "name": "matt.crypto",
- "owner": {
- "type": "NONE",
- "address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e4321"
}, - "availability": {
- "status": "AVAILABLE",
- "price": {
- "type": "STANDARD",
- "listPrice": {
- "usdCents": 1000
}, - "subTotal": {
- "usdCents": 1000
}
}, - "issuer": {
- "type": "NONE",
- "address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e4321"
}
}, - "registration": { },
- "blockchain": "MATIC"
}
]
}
If a domain is available, use this route to register it to your account. The domain will be minted or transfered to your custodial wallet where only Unstoppable Domains, on your behalf, will be able to make changes to it.
The price of the domain will be automatically added to your running balance with Unstoppable Domains. The pending balance of your account will be invoiced periodically.
If you do not provide an owner
in your request, your account's default wallet address will be used as the owner. Use GET /account
to confirm your default wallet address.
When providing an owner
object in your request, be sure the type
aligns with the address
. To register to one of your own wallets, the type
must be SELF
. Use GET /account/wallets
to see your list of available wallets.
Registering subdomains requires ownership of the parent domain. There are dedicated routes for subdomain registration:
{- "name": "matt.crypto",
- "records": {
- "crypto.ETH.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e4321",
- "crypto.MATIC.version.MATIC.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e5678",
- "crypto.MATIC.version.ERC20.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e0921"
}, - "owner": {
- "type": "NONE",
- "address": "string"
}
}
{- "@type": "unstoppabledomains.com/partner.v3.DomainOperationResult",
- "operation": {
- "id": "op-4abb409c-9283-4589-bd36-d27a757a2165",
- "@type": "unstoppabledomains.com/partner.v3.Operation",
- "status": "QUEUED",
- "type": "DOMAIN_CLAIM",
- "domain": "matt.crypto",
- "lastUpdatedTimestamp": 1684356429790,
- "dependencies": [
- {
- "id": "bc-2db427bd-5613-40c7-85b1-ab38beed0ed0",
- "status": "QUEUED",
- "@type": "unstoppabledomains.com/partner.v3.BlockchainOperation",
- "transaction": {
- "hash": "string",
- "blockchain": "MATIC"
}, - "type": "MINT",
- "parameters": {
- "initialRecords": {
- "crypto.ETH.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e4321",
- "crypto.MATIC.version.MATIC.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e5678",
- "crypto.MATIC.version.ERC20.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e0921"
}, - "toAddress": "0xb4783AeF93923a2d4eEA29C84f347F26E62e4321"
}
}
]
}
}
Get information about the domain's current owner and availability status. Optionally, use the $expand
query string to include additional data in the response (ie. ?$expand=records&$expand=registration
).
If the domain is available to be registered it will have a availability.status
of AVAILABLE
and will include an availability.price
object.
{- "@type": "unstoppabledomains.com/partner.v3.Domain",
- "records": { },
- "name": "matt.crypto",
- "owner": {
- "type": "NONE",
- "address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e4321"
}, - "availability": {
- "status": "AVAILABLE",
- "price": {
- "type": "STANDARD",
- "listPrice": {
- "usdCents": 1000
}, - "subTotal": {
- "usdCents": 1000
}
}, - "issuer": {
- "type": "NONE",
- "address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e4321"
}
}, - "registration": { },
- "blockchain": "MATIC"
}
Manage custody wallets used for storing and managing domains without any signature collection.
These wallets provide the most streamlined way to interact with domains since the initial management request is the only step needed to make changes.
Any domains held in the wallets of type SELF
can be managed by your account without any signature collection. You can use these SELF
wallets to distribute domains in whatever way works best for you.
This route will return both custody (SELF
) and self-custody (EXTERNAL
) wallets associated with your account. To only list custody wallets, simply include the ?type=SELF
query string parameter.
Paginated list of wallets associated with your account
{- "@type": "unstoppabledomains.com/partner.v3.CursorList",
- "items": [
- {
- "@type": "unstoppabledomains.com/partner.v3.WalletMinimal",
- "address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e4321",
- "type": "SELF",
- "primaryDomain": "matt.crypto"
}
], - "next": { }
}
Create an additional custodial wallet in your account.
{- "@type": "unstoppabledomains.com/partner.v3.InternalWalletCreateResult",
- "operation": {
- "id": "op-4abb409c-9283-4589-bd36-d27a757a2165",
- "@type": "unstoppabledomains.com/partner.v3.Operation",
- "status": "QUEUED",
- "type": "DOMAIN_CLAIM",
- "domain": "matt.crypto",
- "lastUpdatedTimestamp": 1684356429790,
- "dependencies": [
- {
- "id": "bc-2db427bd-5613-40c7-85b1-ab38beed0ed0",
- "status": "QUEUED",
- "@type": "unstoppabledomains.com/partner.v3.BlockchainOperation",
- "transaction": {
- "hash": "string",
- "blockchain": "MATIC"
}, - "type": "MINT",
- "parameters": {
- "initialRecords": {
- "crypto.ETH.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e4321",
- "crypto.MATIC.version.MATIC.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e5678",
- "crypto.MATIC.version.ERC20.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e0921"
}, - "toAddress": "0xb4783AeF93923a2d4eEA29C84f347F26E62e4321"
}
}
]
}
}
Get details for a wallet associated with your account. This route supports both custody (SELF
) and self-custody (EXTERNAL
) wallets.
Include the ?$expand=primaryDomain
to include the wallet's Primary Domain (also known as the Reverse Resolution) in the response.
Wallet does not exist in your account
{- "@type": "unstoppabledomains.com/partner.v3.WalletMinimal",
- "address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e4321",
- "type": "SELF",
- "primaryDomain": "matt.crypto"
}
Update details for a specific custody wallet in your account.
This can be used to set (or clear) the Primary Domain (also known as the Reverse Resolution) for a custody wallet.
To clear the Primary Domain for a wallet, pass a null
value for the primaryDomain
property within the request body.
required | DomainName (string) or null |
Wallet does not exist in your account
{- "primaryDomain": "matt.crypto"
}
{- "@type": "unstoppabledomains.com/partner.v3.WalletUpdateResult",
- "operation": {
- "id": "op-4abb409c-9283-4589-bd36-d27a757a2165",
- "@type": "unstoppabledomains.com/partner.v3.Operation",
- "status": "QUEUED",
- "type": "DOMAIN_CLAIM",
- "domain": "matt.crypto",
- "lastUpdatedTimestamp": 1684356429790,
- "dependencies": [
- {
- "id": "bc-2db427bd-5613-40c7-85b1-ab38beed0ed0",
- "status": "QUEUED",
- "@type": "unstoppabledomains.com/partner.v3.BlockchainOperation",
- "transaction": {
- "hash": "string",
- "blockchain": "MATIC"
}, - "type": "MINT",
- "parameters": {
- "initialRecords": {
- "crypto.ETH.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e4321",
- "crypto.MATIC.version.MATIC.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e5678",
- "crypto.MATIC.version.ERC20.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e0921"
}, - "toAddress": "0xb4783AeF93923a2d4eEA29C84f347F26E62e4321"
}
}
]
}
}
Manage your custody domains. All functionality applies to both second-level domains and subdomains, unless otherwise noted.
If a subdomain is available, and the Parent domain in your account's custody, use this route to register it to your account. The domain will be minted or transfered to your custodial wallet where only Unstoppable Domains, on your behalf, will be able to make changes to it.
The price of the domain will be automatically added to your running balance with Unstoppable Domains. The pending balance of your account will be invoiced periodically.
If you do not provide an owner
in your request, your account's default wallet address will be used as the owner. Use GET /account
to confirm your default wallet address.
When providing an owner
object in your request, be sure the type
aligns with the address
. To register to one of your own wallets, the type
must be SELF
. Use GET /account/wallets
to see your list of available wallets.
After successfully registering a subdomain to your account, you can use any of the Domain management APIs to manage it just like any other domain.
While registering subdomains uses a different process, in every other way a subdomain is just like a second-level domain.
{- "name": "matt.crypto",
- "records": {
- "crypto.ETH.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e4321",
- "crypto.MATIC.version.MATIC.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e5678",
- "crypto.MATIC.version.ERC20.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e0921"
}, - "owner": {
- "type": "NONE",
- "address": "string"
}
}
{- "@type": "unstoppabledomains.com/partner.v3.DomainOperationResult",
- "operation": {
- "id": "op-4abb409c-9283-4589-bd36-d27a757a2165",
- "@type": "unstoppabledomains.com/partner.v3.Operation",
- "status": "QUEUED",
- "type": "DOMAIN_CLAIM",
- "domain": "matt.crypto",
- "lastUpdatedTimestamp": 1684356429790,
- "dependencies": [
- {
- "id": "bc-2db427bd-5613-40c7-85b1-ab38beed0ed0",
- "status": "QUEUED",
- "@type": "unstoppabledomains.com/partner.v3.BlockchainOperation",
- "transaction": {
- "hash": "string",
- "blockchain": "MATIC"
}, - "type": "MINT",
- "parameters": {
- "initialRecords": {
- "crypto.ETH.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e4321",
- "crypto.MATIC.version.MATIC.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e5678",
- "crypto.MATIC.version.ERC20.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e0921"
}, - "toAddress": "0xb4783AeF93923a2d4eEA29C84f347F26E62e4321"
}
}
]
}
}
Perform Domain updates while preserving the existing records.
{
"owner": {
"type": "EXTERNAL",
"address": "0x123"
}
}
Changes owner to the new owner address without modifying the domain records.
When changing owner of a domain, you must provide both a type
and an address
to clearly indicate the intent of the change.
NONE
: Used when changing the owner to a "burn" address, which will result in nobody owning the domain0x0000000000000000000000000000000000000000
and 0x000000000000000000000000000000000000dEaD
UD
: Used when changing the owner to an addressed owned by Unstoppable DomainsSELF
: Used when changing the owner to another address that belongs to your accountEXTERNAL
: Used when changing the owner to address that doesn't qualify as any of the above. {
"records": {
"key2": "value2"
}
}
When applied to a domain with existing records, or with an existing key2
, will result in only the key2
value being set to the new value.
See our documentation for more information on standardized keys.
object (DomainUpdateRequestBodyOwner) | |
object (UpdateDomainRecords) <= 500 properties |
Validation error or bad request due to domain custody, unsupported blockchain, etc.
{- "owner": {
- "type": "NONE",
- "address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e4321"
}, - "records": {
- "crypto.ETH.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e4321",
- "crypto.MATIC.version.MATIC.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e5678",
- "crypto.MATIC.version.ERC20.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e0921"
}
}
{- "@type": "unstoppabledomains.com/partner.v3.DomainOperationResult",
- "operation": {
- "id": "op-4abb409c-9283-4589-bd36-d27a757a2165",
- "@type": "unstoppabledomains.com/partner.v3.Operation",
- "status": "QUEUED",
- "type": "DOMAIN_CLAIM",
- "domain": "matt.crypto",
- "lastUpdatedTimestamp": 1684356429790,
- "dependencies": [
- {
- "id": "bc-2db427bd-5613-40c7-85b1-ab38beed0ed0",
- "status": "QUEUED",
- "@type": "unstoppabledomains.com/partner.v3.BlockchainOperation",
- "transaction": {
- "hash": "string",
- "blockchain": "MATIC"
}, - "type": "MINT",
- "parameters": {
- "initialRecords": {
- "crypto.ETH.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e4321",
- "crypto.MATIC.version.MATIC.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e5678",
- "crypto.MATIC.version.ERC20.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e0921"
}, - "toAddress": "0xb4783AeF93923a2d4eEA29C84f347F26E62e4321"
}
}
]
}
}
Perform Domain updates while doing full resets of the records.
{
"owner": {
"type": "EXTERNAL",
"address": "0x123"
},
"records": {}
}
Clears all records from the domain, then changes owner to the new owner address.
NOTE: You must include "records": {}
to indicate the intent to clear records.
When changing owner of a domain, you must provide both a type
and an address
to clearly indicate the intent of the change.
NONE
: Used when changing the owner to a "burn" address, which will result in nobody owning the domain0x0000000000000000000000000000000000000000
and 0x000000000000000000000000000000000000dEaD
UD
: Used when changing the owner to an addressed owned by Unstoppable DomainsSELF
: Used when changing the owner to another address that belongs to your accountEXTERNAL
: Used when changing the owner to address that doesn't qualify as any of the above.{
"records": {
"key2": "value2"
}
}
When applied to a domain with existing records, only key2
will remain after the update is complete.
See our documentation for more information on standardized keys.
object (DomainUpdateRequestBodyOwner) | |
object (UpdateDomainRecords) <= 500 properties |
Validation error or bad request due to domain custody, unsupported blockchain, etc.
{- "owner": {
- "type": "NONE",
- "address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e4321"
}, - "records": {
- "crypto.ETH.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e4321",
- "crypto.MATIC.version.MATIC.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e5678",
- "crypto.MATIC.version.ERC20.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e0921"
}
}
{- "@type": "unstoppabledomains.com/partner.v3.DomainOperationResult",
- "operation": {
- "id": "op-4abb409c-9283-4589-bd36-d27a757a2165",
- "@type": "unstoppabledomains.com/partner.v3.Operation",
- "status": "QUEUED",
- "type": "DOMAIN_CLAIM",
- "domain": "matt.crypto",
- "lastUpdatedTimestamp": 1684356429790,
- "dependencies": [
- {
- "id": "bc-2db427bd-5613-40c7-85b1-ab38beed0ed0",
- "status": "QUEUED",
- "@type": "unstoppabledomains.com/partner.v3.BlockchainOperation",
- "transaction": {
- "hash": "string",
- "blockchain": "MATIC"
}, - "type": "MINT",
- "parameters": {
- "initialRecords": {
- "crypto.ETH.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e4321",
- "crypto.MATIC.version.MATIC.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e5678",
- "crypto.MATIC.version.ERC20.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e0921"
}, - "toAddress": "0xb4783AeF93923a2d4eEA29C84f347F26E62e4321"
}
}
]
}
}
Return the domain to Unstoppable Domains so it is once again considered available for registering. The amount previously added to your running balance will be removed after successfully returning a domain.
Returns are only allowed within 14 days of the original registration date, per our return policy.
{- "@type": "unstoppabledomains.com/partner.v3.DomainOperationResult",
- "operation": {
- "id": "op-4abb409c-9283-4589-bd36-d27a757a2165",
- "@type": "unstoppabledomains.com/partner.v3.Operation",
- "status": "QUEUED",
- "type": "DOMAIN_CLAIM",
- "domain": "matt.crypto",
- "lastUpdatedTimestamp": 1684356429790,
- "dependencies": [
- {
- "id": "bc-2db427bd-5613-40c7-85b1-ab38beed0ed0",
- "status": "QUEUED",
- "@type": "unstoppabledomains.com/partner.v3.BlockchainOperation",
- "transaction": {
- "hash": "string",
- "blockchain": "MATIC"
}, - "type": "MINT",
- "parameters": {
- "initialRecords": {
- "crypto.ETH.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e4321",
- "crypto.MATIC.version.MATIC.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e5678",
- "crypto.MATIC.version.ERC20.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e0921"
}, - "toAddress": "0xb4783AeF93923a2d4eEA29C84f347F26E62e4321"
}
}
]
}
}
Before you can initiate self-custody operations, you must first verify the self-custody wallet (only needs to be done once per wallet).
This involves:
personal_sign
signature from the wallet ownerAfter verifying a wallet, it will be returned by the Single-Wallet and Wallet List routes, with the type of EXTERNAL
.
In order to use an self-custody wallet within the API, you must first use it to sign a verification message. This endpoint will provide the specific substring that needs to be signed.
The response message
is meant to be included in personal_sign
request for the wallet owner to sign. The exact message that is signed simply needs to include the response message
, so you can include some human-friendly text, as well.
{- "@type": "unstoppabledomains.com/partner.v3.WalletUnsignedVerification",
- "message": "string"
}
After signing the verification message, submit the signature to have the self-custody wallet registered as a verified external wallet for management operations.
If the message the owner signed was not the exact message
from the verification response, you must also provide the exact message in the request body. It should be the non-hex string used in the personal_sign
request.
{- "message": "string",
- "signature": "string"
}
{- "@type": "unstoppabledomains.com/partner.v3.WalletVerificationResult",
- "operation": {
- "id": "op-4abb409c-9283-4589-bd36-d27a757a2165",
- "@type": "unstoppabledomains.com/partner.v3.Operation",
- "status": "QUEUED",
- "type": "DOMAIN_CLAIM",
- "domain": "matt.crypto",
- "lastUpdatedTimestamp": 1684356429790,
- "dependencies": [
- {
- "id": "bc-2db427bd-5613-40c7-85b1-ab38beed0ed0",
- "status": "QUEUED",
- "@type": "unstoppabledomains.com/partner.v3.BlockchainOperation",
- "transaction": {
- "hash": "string",
- "blockchain": "MATIC"
}, - "type": "MINT",
- "parameters": {
- "initialRecords": {
- "crypto.ETH.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e4321",
- "crypto.MATIC.version.MATIC.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e5678",
- "crypto.MATIC.version.ERC20.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e0921"
}, - "toAddress": "0xb4783AeF93923a2d4eEA29C84f347F26E62e4321"
}
}
]
}
}
These wallets are verified EXTERNAL
wallets that you can use for initiating self-custody domain operations. Any operation initiated for one of these wallets requires an external signature.
Paginated list of EXTERNAL
wallets
{- "@type": "unstoppabledomains.com/partner.v3.CursorList",
- "items": [
- {
- "@type": "unstoppabledomains.com/partner.v3.WalletMinimal",
- "address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e4321",
- "type": "SELF",
- "primaryDomain": "matt.crypto"
}
], - "next": { }
}
Get details for a single self-custody wallet that has verified for your account.
Include the ?$expand=primaryDomain
to include the wallet's Primary Domain (also known as the Reverse Resolution) in the response.
Wallet does not exist in your account
{- "@type": "unstoppabledomains.com/partner.v3.WalletMinimal",
- "address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e4321",
- "type": "SELF",
- "primaryDomain": "matt.crypto"
}
Update details for a specific self-custody wallet in your account.
This can be used to set (or clear) the Primary Domain (also known as the Reverse Resolution) for a domain.
To clear the Primary Domain for a wallet, pass a null
value for the primaryDomain
property within the request body.
Note: This will create an operation that requires a signature from the self-custody wallet owner.
Wallet does not exist in your account
{- "primaryDomain": "matt.crypto"
}
{- "@type": "unstoppabledomains.com/partner.v3.WalletUpdateResult",
- "operation": {
- "id": "op-4abb409c-9283-4589-bd36-d27a757a2165",
- "@type": "unstoppabledomains.com/partner.v3.Operation",
- "status": "QUEUED",
- "type": "DOMAIN_CLAIM",
- "domain": "matt.crypto",
- "lastUpdatedTimestamp": 1684356429790,
- "dependencies": [
- {
- "id": "bc-2db427bd-5613-40c7-85b1-ab38beed0ed0",
- "status": "QUEUED",
- "@type": "unstoppabledomains.com/partner.v3.BlockchainOperation",
- "transaction": {
- "hash": "string",
- "blockchain": "MATIC"
}, - "type": "MINT",
- "parameters": {
- "initialRecords": {
- "crypto.ETH.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e4321",
- "crypto.MATIC.version.MATIC.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e5678",
- "crypto.MATIC.version.ERC20.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e0921"
}, - "toAddress": "0xb4783AeF93923a2d4eEA29C84f347F26E62e4321"
}
}
]
}
}
Manage domains that are owned in external, self-custody wallets. All functionality applies to both second-level domains and subdomains, unless otherwise noted.
The key difference between Custody and Self-Custody operations is that all Self-Custody operations require a signature from the domain owner.
Before you can initiate self-custody operations, you must verify the self-custody wallet that owns the domain.
After you successfully initiate a self-custody operation, it will have a status of SIGNATURE_REQUIRED
. You then need to collect a signature of the messageToSign
from the operation.dependencies[].transaction
object.
After the owner has signed the message, you use the dependency update route to submit the signature and continue processing the operation.
Perform Self-Custody Domain updates while doing full resets of the records. Usage is the same as the custody variant.
Blockchain access is currently degraded
{- "owner": {
- "type": "NONE",
- "address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e4321"
}, - "records": {
- "crypto.ETH.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e4321",
- "crypto.MATIC.version.MATIC.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e5678",
- "crypto.MATIC.version.ERC20.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e0921"
}
}
{- "@type": "unstoppabledomains.com/partner.v3.DomainOperationResult",
- "operation": {
- "id": "op-4abb409c-9283-4589-bd36-d27a757a2165",
- "@type": "unstoppabledomains.com/partner.v3.Operation",
- "status": "QUEUED",
- "type": "DOMAIN_CLAIM",
- "domain": "matt.crypto",
- "lastUpdatedTimestamp": 1684356429790,
- "dependencies": [
- {
- "id": "bc-2db427bd-5613-40c7-85b1-ab38beed0ed0",
- "status": "QUEUED",
- "@type": "unstoppabledomains.com/partner.v3.BlockchainOperation",
- "transaction": {
- "hash": "string",
- "blockchain": "MATIC"
}, - "type": "MINT",
- "parameters": {
- "initialRecords": {
- "crypto.ETH.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e4321",
- "crypto.MATIC.version.MATIC.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e5678",
- "crypto.MATIC.version.ERC20.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e0921"
}, - "toAddress": "0xb4783AeF93923a2d4eEA29C84f347F26E62e4321"
}
}
]
}
}
Perform Self-Custody Domain updates while preserving the existing records. Usage is the same as the custody variant.
Blockchain access is currently degraded
{- "owner": {
- "type": "NONE",
- "address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e4321"
}, - "records": {
- "crypto.ETH.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e4321",
- "crypto.MATIC.version.MATIC.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e5678",
- "crypto.MATIC.version.ERC20.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e0921"
}
}
{- "@type": "unstoppabledomains.com/partner.v3.DomainOperationResult",
- "operation": {
- "id": "op-4abb409c-9283-4589-bd36-d27a757a2165",
- "@type": "unstoppabledomains.com/partner.v3.Operation",
- "status": "QUEUED",
- "type": "DOMAIN_CLAIM",
- "domain": "matt.crypto",
- "lastUpdatedTimestamp": 1684356429790,
- "dependencies": [
- {
- "id": "bc-2db427bd-5613-40c7-85b1-ab38beed0ed0",
- "status": "QUEUED",
- "@type": "unstoppabledomains.com/partner.v3.BlockchainOperation",
- "transaction": {
- "hash": "string",
- "blockchain": "MATIC"
}, - "type": "MINT",
- "parameters": {
- "initialRecords": {
- "crypto.ETH.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e4321",
- "crypto.MATIC.version.MATIC.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e5678",
- "crypto.MATIC.version.ERC20.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e0921"
}, - "toAddress": "0xb4783AeF93923a2d4eEA29C84f347F26E62e4321"
}
}
]
}
}
The parent domain must belong to a wallet that has been verified. Usage is the same as the custody variant.
Blockchain access is currently degraded
{- "name": "matt.crypto",
- "records": {
- "crypto.ETH.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e4321",
- "crypto.MATIC.version.MATIC.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e5678",
- "crypto.MATIC.version.ERC20.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e0921"
}, - "owner": {
- "type": "NONE",
- "address": "string"
}
}
{- "@type": "unstoppabledomains.com/partner.v3.DomainOperationResult",
- "operation": {
- "id": "op-4abb409c-9283-4589-bd36-d27a757a2165",
- "@type": "unstoppabledomains.com/partner.v3.Operation",
- "status": "QUEUED",
- "type": "DOMAIN_CLAIM",
- "domain": "matt.crypto",
- "lastUpdatedTimestamp": 1684356429790,
- "dependencies": [
- {
- "id": "bc-2db427bd-5613-40c7-85b1-ab38beed0ed0",
- "status": "QUEUED",
- "@type": "unstoppabledomains.com/partner.v3.BlockchainOperation",
- "transaction": {
- "hash": "string",
- "blockchain": "MATIC"
}, - "type": "MINT",
- "parameters": {
- "initialRecords": {
- "crypto.ETH.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e4321",
- "crypto.MATIC.version.MATIC.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e5678",
- "crypto.MATIC.version.ERC20.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e0921"
}, - "toAddress": "0xb4783AeF93923a2d4eEA29C84f347F26E62e4321"
}
}
]
}
}
All asynchronous processes handled by the API are represented as Operations. This includes registering a domain, updating a domain's records, changing a domain's owner, returning a domain and more.
Get paginated list of past operations, with the ability to filter based on various criteria.
Results ordered with newest operations first.
{- "@type": "unstoppabledomains.com/partner.v3.CursorList",
- "items": [
- {
- "id": "op-4abb409c-9283-4589-bd36-d27a757a2165",
- "@type": "unstoppabledomains.com/partner.v3.OperationMinimal",
- "status": "QUEUED",
- "type": "DOMAIN_CLAIM",
- "domain": "matt.crypto",
- "lastUpdatedTimestamp": 1684356429790
}
], - "next": { }
}
Use this endpoint to check on the status for any Operation being processed by the API.
{- "id": "op-4abb409c-9283-4589-bd36-d27a757a2165",
- "@type": "unstoppabledomains.com/partner.v3.Operation",
- "status": "QUEUED",
- "type": "DOMAIN_CLAIM",
- "domain": "matt.crypto",
- "lastUpdatedTimestamp": 1684356429790,
- "dependencies": [
- {
- "id": "bc-2db427bd-5613-40c7-85b1-ab38beed0ed0",
- "status": "QUEUED",
- "@type": "unstoppabledomains.com/partner.v3.BlockchainOperation",
- "transaction": {
- "hash": "string",
- "blockchain": "MATIC"
}, - "type": "MINT",
- "parameters": {
- "initialRecords": {
- "crypto.ETH.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e4321",
- "crypto.MATIC.version.MATIC.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e5678",
- "crypto.MATIC.version.ERC20.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e0921"
}, - "toAddress": "0xb4783AeF93923a2d4eEA29C84f347F26E62e4321"
}
}
]
}
Sign operation dependency with status SIGNATURE_REQUIRED
so it can continue processing
{- "transaction": {
- "signature": "string"
}
}
{- "id": "op-4abb409c-9283-4589-bd36-d27a757a2165",
- "@type": "unstoppabledomains.com/partner.v3.Operation",
- "status": "QUEUED",
- "type": "DOMAIN_CLAIM",
- "domain": "matt.crypto",
- "lastUpdatedTimestamp": 1684356429790,
- "dependencies": [
- {
- "id": "bc-2db427bd-5613-40c7-85b1-ab38beed0ed0",
- "status": "QUEUED",
- "@type": "unstoppabledomains.com/partner.v3.BlockchainOperation",
- "transaction": {
- "hash": "string",
- "blockchain": "MATIC"
}, - "type": "MINT",
- "parameters": {
- "initialRecords": {
- "crypto.ETH.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e4321",
- "crypto.MATIC.version.MATIC.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e5678",
- "crypto.MATIC.version.ERC20.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e0921"
}, - "toAddress": "0xb4783AeF93923a2d4eEA29C84f347F26E62e4321"
}
}
]
}
Unlike the operation list route, this endpoint will return a minimal representation of pending operations for a domain across all activity for a given domain.
Since we only allow a single concurrent operation for a domain (across all accounts), this endpoint should be checked before attempting any domain operations. This is particularly important for self-custody domains, as any account (or even the owner themself) can initiate operations.
Access to the resource or the ability to perform the requested operation is not allowed for your account.
{- "@type": "unstoppabledomains.com/partner.v3.List",
- "items": [
- {
- "@type": "unstoppabledomains.com/partner.v3.DomainPendingOperation",
- "type": "DOMAIN_UPDATE",
- "id": "op-4abb409c-9283-4589-bd36-d27a757a2165"
}
]
}
Receive a request when an asynchronous operation completes to registered webhooks of type OPERATION_FINISHED
Success
{- "@type": "unstoppabledomains.com/partner.v3.WebhookDelivery",
- "type": "OPERATION_FINISHED",
- "data": {
- "id": "op-4abb409c-9283-4589-bd36-d27a757a2165",
- "@type": "unstoppabledomains.com/partner.v3.Operation",
- "status": "QUEUED",
- "type": "DOMAIN_CLAIM",
- "domain": "matt.crypto",
- "lastUpdatedTimestamp": 1684356429790,
- "dependencies": [
- {
- "id": "bc-2db427bd-5613-40c7-85b1-ab38beed0ed0",
- "status": "QUEUED",
- "@type": "unstoppabledomains.com/partner.v3.BlockchainOperation",
- "transaction": {
- "hash": "string",
- "blockchain": "MATIC"
}, - "type": "MINT",
- "parameters": {
- "initialRecords": {
- "crypto.ETH.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e4321",
- "crypto.MATIC.version.MATIC.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e5678",
- "crypto.MATIC.version.ERC20.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e0921"
}, - "toAddress": "0xb4783AeF93923a2d4eEA29C84f347F26E62e4321"
}
}
]
}
}
Receive a request when an asynchronous operation reaches a status that requires an action to be taken for it to proceed. For example, when an operation changes to the SIGNATURE_REQUIRED
status, a webhook would be delivered since the operation cannot continue with collecting a signature.
Requests are sent to registered webhooks of type OPERATION_ACTION_REQUIRED
Success
{- "@type": "unstoppabledomains.com/partner.v3.WebhookDelivery",
- "type": "OPERATION_FINISHED",
- "data": {
- "id": "op-4abb409c-9283-4589-bd36-d27a757a2165",
- "@type": "unstoppabledomains.com/partner.v3.Operation",
- "status": "QUEUED",
- "type": "DOMAIN_CLAIM",
- "domain": "matt.crypto",
- "lastUpdatedTimestamp": 1684356429790,
- "dependencies": [
- {
- "id": "bc-2db427bd-5613-40c7-85b1-ab38beed0ed0",
- "status": "QUEUED",
- "@type": "unstoppabledomains.com/partner.v3.BlockchainOperation",
- "transaction": {
- "hash": "string",
- "blockchain": "MATIC"
}, - "type": "MINT",
- "parameters": {
- "initialRecords": {
- "crypto.ETH.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e4321",
- "crypto.MATIC.version.MATIC.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e5678",
- "crypto.MATIC.version.ERC20.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e0921"
}, - "toAddress": "0xb4783AeF93923a2d4eEA29C84f347F26E62e4321"
}
}
]
}
}
Change your default wallet address, which is used when no wallet address is specified during domain registration.
required | string (OwnerAddress) |
{- "defaultWalletAddress": "0xb4783AeF93923a2d4eEA29C84f347F26E62e4321"
}
{- "@type": "unstoppabledomains.com/partner.v3.AccountUpdateResult",
- "operation": {
- "id": "op-4abb409c-9283-4589-bd36-d27a757a2165",
- "@type": "unstoppabledomains.com/partner.v3.Operation",
- "status": "QUEUED",
- "type": "DOMAIN_CLAIM",
- "domain": "matt.crypto",
- "lastUpdatedTimestamp": 1684356429790,
- "dependencies": [
- {
- "id": "bc-2db427bd-5613-40c7-85b1-ab38beed0ed0",
- "status": "QUEUED",
- "@type": "unstoppabledomains.com/partner.v3.BlockchainOperation",
- "transaction": {
- "hash": "string",
- "blockchain": "MATIC"
}, - "type": "MINT",
- "parameters": {
- "initialRecords": {
- "crypto.ETH.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e4321",
- "crypto.MATIC.version.MATIC.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e5678",
- "crypto.MATIC.version.ERC20.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e0921"
}, - "toAddress": "0xb4783AeF93923a2d4eEA29C84f347F26E62e4321"
}
}
]
}
}
{- "@type": "unstoppabledomains.com/partner.v3.CursorList",
- "items": [
- {
- "@type": "unstoppabledomains.com/partner.v3.DomainMinimal",
- "name": "string",
- "blockchain": "MATIC",
- "owner": { },
- "availability": { },
- "registration": { },
- "records": { }
}
], - "next": { }
}
{- "@type": "unstoppabledomains.com/partner.v3.CursorList",
- "items": [
- {
- "@type": "unstoppabledomains.com/partner.v3.DomainMinimal",
- "name": "string",
- "blockchain": "MATIC",
- "owner": { },
- "availability": { },
- "registration": { },
- "records": { }
}
], - "next": { }
}
Manage webhooks used for asynchronous updates to your server.
You can follow our getting started guide here: Webhooks in the Partner API
{- "@type": "unstoppabledomains.com/partner.v3.CursorList",
- "items": [
- {
- "@type": "unstoppabledomains.com/partner.v3.Webhook",
- "id": "wh-9cc2fea1-52d9-484d-aac2-e28d5f7b1104",
- "type": "OPERATION_FINISHED"
}
], - "next": { }
}
Register a new webhook for a given webhook event type. You are limited to 3 webhook registrations per webhook type.
All webhook url
values should be complete, valid URLs, using either http
or https
procotols. All webhook deliveries will be POST
requests and sent to the registered URL exactly as provided.
{- "type": "OPERATION_FINISHED"
}
{- "@type": "unstoppabledomains.com/partner.v3.WebhookCreateResult",
- "operation": {
- "id": "op-4abb409c-9283-4589-bd36-d27a757a2165",
- "@type": "unstoppabledomains.com/partner.v3.Operation",
- "status": "QUEUED",
- "type": "DOMAIN_CLAIM",
- "domain": "matt.crypto",
- "lastUpdatedTimestamp": 1684356429790,
- "dependencies": [
- {
- "id": "bc-2db427bd-5613-40c7-85b1-ab38beed0ed0",
- "status": "QUEUED",
- "@type": "unstoppabledomains.com/partner.v3.BlockchainOperation",
- "transaction": {
- "hash": "string",
- "blockchain": "MATIC"
}, - "type": "MINT",
- "parameters": {
- "initialRecords": {
- "crypto.ETH.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e4321",
- "crypto.MATIC.version.MATIC.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e5678",
- "crypto.MATIC.version.ERC20.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e0921"
}, - "toAddress": "0xb4783AeF93923a2d4eEA29C84f347F26E62e4321"
}
}
]
}
}
Webhook with provided ID does not exist in your account
{- "@type": "unstoppabledomains.com/partner.v3.Webhook",
- "id": "wh-9cc2fea1-52d9-484d-aac2-e28d5f7b1104",
- "type": "OPERATION_FINISHED"
}
Webhook with provided ID does not exist in your account
{- "@type": "unstoppabledomains.com/partner.v3.WebhookDeleteResult",
- "operation": {
- "id": "op-4abb409c-9283-4589-bd36-d27a757a2165",
- "@type": "unstoppabledomains.com/partner.v3.Operation",
- "status": "QUEUED",
- "type": "DOMAIN_CLAIM",
- "domain": "matt.crypto",
- "lastUpdatedTimestamp": 1684356429790,
- "dependencies": [
- {
- "id": "bc-2db427bd-5613-40c7-85b1-ab38beed0ed0",
- "status": "QUEUED",
- "@type": "unstoppabledomains.com/partner.v3.BlockchainOperation",
- "transaction": {
- "hash": "string",
- "blockchain": "MATIC"
}, - "type": "MINT",
- "parameters": {
- "initialRecords": {
- "crypto.ETH.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e4321",
- "crypto.MATIC.version.MATIC.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e5678",
- "crypto.MATIC.version.ERC20.address": "0xb4783AeF93923a2d4eEA29C84f347F26E62e0921"
}, - "toAddress": "0xb4783AeF93923a2d4eEA29C84f347F26E62e4321"
}
}
]
}
}