openapi: 3.1.0 info: title: Web3 Partner API v3 account operations 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: operations x-displayName: Operations description: '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. ' paths: /operations: get: operationId: getOperationList summary: Get list of operations description: 'Get paginated list of past operations, with the ability to filter based on various criteria. Results ordered with newest operations first. ' parameters: - name: domain required: false in: query schema: maxItems: 50 type: array items: type: string - name: status required: false in: query schema: type: array items: $ref: '#/components/schemas/OperationStatus' - name: type required: false in: query schema: type: array items: $ref: '#/components/schemas/OperationType' - name: $cursor required: false description: The `next.$cursor` value from the previous page response in: query schema: type: string responses: '200': description: '' content: application/json: schema: $ref: '#/components/schemas/OperationListResponse' 400: description: '' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' examples: ValidationError: $ref: '#/components/examples/ValidationError' tags: - operations /operations/{id}: get: operationId: checkOperation summary: Check operation status description: 'Use this endpoint to check on the status for any Operation being processed by the API. ' parameters: - name: id required: true in: path schema: type: string responses: 200: description: '' content: application/json: schema: $ref: '#/components/schemas/OperationCheckResponse' 400: description: '' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' examples: ValidationError: $ref: '#/components/examples/ValidationError' 404: description: '' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' examples: NotFound: $ref: '#/components/examples/OperationNotFound' tags: - operations /operations/{id}/dependencies/{depId}: patch: operationId: patchOperationDependency summary: Update operation dependency description: Sign operation dependency with status `SIGNATURE_REQUIRED` so it can continue processing parameters: - name: id required: true in: path schema: type: string - name: depId required: true in: path schema: type: string requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/OperationDependencyUpdateRequestBody' responses: '200': description: '' content: application/json: schema: $ref: '#/components/schemas/OperationCheckResponse' 400: description: '' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' examples: ValidationError: $ref: '#/components/examples/ValidationError' InvalidSignature: $ref: '#/components/examples/InvalidSignature' 404: description: '' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' examples: NotFound: $ref: '#/components/examples/OperationNotFound' tags: - operations /domains/{name}/pending-operations: get: operationId: getDomainPendingOperations summary: Pending Operations for a domain description: '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. ' parameters: - name: name required: true in: path schema: type: string responses: 200: description: '' content: application/json: schema: $ref: '#/components/schemas/DomainPendingOperationsListResponse' 403: $ref: '#/components/responses/403Forbidden' tags: - operations components: schemas: UpdateRecordsParametersResponse: type: object properties: recordUpdates: $ref: '#/components/schemas/DomainRecords' resetRecords: type: boolean required: - recordUpdates - resetRecords WebhookCreateParametersResponse: type: object properties: type: $ref: '#/components/schemas/WebhookType' url: type: string format: uri required: - type - url OperationDependencyUpdateRequestBody: type: object properties: transaction: $ref: '#/components/schemas/OperationDependencyTransactionUpdateRequestBody' required: - transaction WebhookDeleteParametersResponse: type: object properties: id: type: string required: - id OperationType: type: string enum: - DOMAIN_CLAIM - DOMAIN_UPDATE - DOMAIN_RETURN - WALLET_CREATE - WALLET_UPDATE - WALLET_VERIFY - ACCOUNT_UPDATE WalletCreateSubOperationResponse: allOf: - $ref: '#/components/schemas/PlatformSubOperationResponse' - type: object properties: result: $ref: '#/components/schemas/WalletCreateResultResponse' type: type: string enum: - WALLET_CREATE required: - type SubOperationTransactionResponse: type: object properties: hash: type: string blockchain: $ref: '#/components/schemas/BlockchainType' required: - blockchain PlatformSubOperationResponse: allOf: - $ref: '#/components/schemas/SubOperationResponse' - type: object properties: '@type': type: string enum: - unstoppabledomains.com/partner.v3.PlatformOperation required: - '@type' EvmOwnerAddress: type: string example: '0xb4783AeF93923a2d4eEA29C84f347F26E62e4321' pattern: ^0x[a-fA-F0-9]{40}$ TransferSubOperationResponse: allOf: - $ref: '#/components/schemas/BlockchainSubOperationResponse' - type: object properties: type: type: string enum: - TRANSFER parameters: $ref: '#/components/schemas/TransferParametersResponse' required: - type - parameters SubOperationResponse: type: object properties: id: type: string example: bc-2db427bd-5613-40c7-85b1-ab38beed0ed0 status: $ref: '#/components/schemas/OperationStatus' required: - status - id MintParametersResponse: type: object properties: initialRecords: $ref: '#/components/schemas/DomainRecords' toAddress: $ref: '#/components/schemas/OwnerAddress' required: - toAddress WebhookCreateSubOperationResponse: allOf: - $ref: '#/components/schemas/PlatformSubOperationResponse' - type: object properties: parameters: $ref: '#/components/schemas/WebhookCreateParametersResponse' result: $ref: '#/components/schemas/WebhookCreateResultResponse' type: type: string enum: - WEBHOOK_CREATE required: - parameters - type OwnerAddress: oneOf: - $ref: '#/components/schemas/EvmOwnerAddress' OperationStatus: type: string enum: - QUEUED - SIGNATURE_REQUIRED - PROCESSING - COMPLETED - FAILED - CANCELLED UpdateRecordsSubOperationResponse: allOf: - $ref: '#/components/schemas/BlockchainSubOperationResponse' - type: object properties: type: type: string enum: - UPDATE_RECORDS parameters: $ref: '#/components/schemas/UpdateRecordsParametersResponse' required: - type - parameters WalletSetDefaultSubOperationResponse: allOf: - $ref: '#/components/schemas/PlatformSubOperationResponse' - type: object properties: parameters: $ref: '#/components/schemas/WalletSetDefaultParametersResponse' type: type: string enum: - WALLET_SET_DEFAULT required: - parameters - type ErrorResponse: oneOf: - $ref: '#/components/schemas/ErrorResponseSingle' - $ref: '#/components/schemas/ErrorResponseMulti' ErrorResponseContextEntityMulti: type: object properties: type: type: string enum: - MULTI_VALUE values: type: array items: $ref: '#/components/schemas/ErrorResponseContextEntitySingle' required: - type - values OperationMinimalResponse: type: object properties: id: type: string example: op-4abb409c-9283-4589-bd36-d27a757a2165 '@type': type: string enum: - unstoppabledomains.com/partner.v3.OperationMinimal status: $ref: '#/components/schemas/OperationStatus' type: $ref: '#/components/schemas/OperationType' domain: $ref: '#/components/schemas/DomainName' lastUpdatedTimestamp: type: number example: 1684356429790 required: - '@type' - id - status - type - lastUpdatedTimestamp OperationListResponse: type: object properties: '@type': type: string enum: - unstoppabledomains.com/partner.v3.CursorList items: type: array items: $ref: '#/components/schemas/OperationMinimalResponse' next: oneOf: - type: 'null' - $ref: '#/components/schemas/CursorListResponseNext' required: - '@type' - items - next DomainPendingOperationsListResponse: type: object properties: '@type': type: string enum: - unstoppabledomains.com/partner.v3.List items: type: array items: $ref: '#/components/schemas/DomainPendingOperationResponse' required: - '@type' - items BlockchainSubOperationResponse: allOf: - $ref: '#/components/schemas/SubOperationResponse' - type: object properties: '@type': type: string enum: - unstoppabledomains.com/partner.v3.BlockchainOperation transaction: $ref: '#/components/schemas/SubOperationTransactionResponse' required: - '@type' ErrorResponseSingle: type: object properties: code: type: string message: type: string context: $ref: '#/components/schemas/ErrorResponseContext' DomainName: type: string example: matt.crypto ErrorResponseContextEntitySingle: type: object properties: type: type: string value: type: string required: - type - value DomainRecords: type: object additionalProperties: type: string example: crypto.ETH.address: '0xb4783AeF93923a2d4eEA29C84f347F26E62e4321' crypto.MATIC.version.MATIC.address: '0xb4783AeF93923a2d4eEA29C84f347F26E62e5678' crypto.MATIC.version.ERC20.address: '0xb4783AeF93923a2d4eEA29C84f347F26E62e0921' OperationDependencyTransactionUpdateRequestBody: type: object properties: signature: type: string maxLength: 2000 required: - signature ErrorResponseContext: type: object properties: entities: type: array items: $ref: '#/components/schemas/ErrorResponseContextEntity' required: - entities CursorListResponseNext: type: object properties: $cursor: oneOf: - type: string - type: 'null' required: - $cursor OperationCheckResponse: type: object properties: id: type: string example: op-4abb409c-9283-4589-bd36-d27a757a2165 '@type': type: string enum: - unstoppabledomains.com/partner.v3.Operation status: $ref: '#/components/schemas/OperationStatus' type: $ref: '#/components/schemas/OperationType' domain: $ref: '#/components/schemas/DomainName' lastUpdatedTimestamp: type: number example: 1684356429790 dependencies: type: array items: anyOf: - $ref: '#/components/schemas/MintSubOperationResponse' - $ref: '#/components/schemas/UpdateRecordsSubOperationResponse' - $ref: '#/components/schemas/TransferSubOperationResponse' - $ref: '#/components/schemas/ReturnSubOperationResponse' - $ref: '#/components/schemas/WalletCreateSubOperationResponse' - $ref: '#/components/schemas/WalletSetDefaultSubOperationResponse' - $ref: '#/components/schemas/WebhookCreateSubOperationResponse' - $ref: '#/components/schemas/WebhookDeleteSubOperationResponse' required: - id - status - type - dependencies - '@type' - lastUpdatedTimestamp WalletCreateResultResponse: type: object properties: address: $ref: '#/components/schemas/OwnerAddress' required: - address TransferParametersResponse: type: object properties: fromAddress: $ref: '#/components/schemas/OwnerAddress' toAddress: $ref: '#/components/schemas/OwnerAddress' resetRecords: type: boolean required: - fromAddress - toAddress - resetRecords WalletSetDefaultParametersResponse: type: object properties: address: $ref: '#/components/schemas/OwnerAddress' required: - address BlockchainType: type: string enum: - MATIC - ETH - BASE WebhookCreateResultResponse: type: object properties: id: type: string required: - id DomainPendingOperationResponse: type: object properties: '@type': type: string enum: - unstoppabledomains.com/partner.v3.DomainPendingOperation type: oneOf: - type: string enum: - UNKNOWN - $ref: '#/components/schemas/OperationType' example: DOMAIN_UPDATE description: 'Will be `UNKNOWN` if the operation is a blockchain operation not supported by the API but currently taking place on the blockchain. ' id: type: string example: op-4abb409c-9283-4589-bd36-d27a757a2165 description: ID of the operation. Will only be included if the operation is associated with your account. required: - '@type' - type ErrorResponseMulti: type: object properties: code: type: string enum: - MULTIPLE_ERRORS message: type: string context: $ref: '#/components/schemas/ErrorResponseContext' errors: type: array items: $ref: '#/components/schemas/ErrorResponseSingle' required: - code - errors WebhookDeleteSubOperationResponse: allOf: - $ref: '#/components/schemas/PlatformSubOperationResponse' - type: object properties: parameters: $ref: '#/components/schemas/WebhookDeleteParametersResponse' type: type: string enum: - WEBHOOK_DELETE required: - parameters - type MintSubOperationResponse: allOf: - $ref: '#/components/schemas/BlockchainSubOperationResponse' - type: object properties: type: type: string enum: - MINT parameters: $ref: '#/components/schemas/MintParametersResponse' required: - type - parameters ErrorResponseContextEntity: oneOf: - $ref: '#/components/schemas/ErrorResponseContextEntitySingle' - $ref: '#/components/schemas/ErrorResponseContextEntityMulti' WebhookType: type: string enum: - OPERATION_FINISHED - OPERATION_ACTION_REQUIRED ReturnSubOperationResponse: allOf: - $ref: '#/components/schemas/BlockchainSubOperationResponse' - type: object properties: type: type: string enum: - RETURN required: - type examples: ValidationError: description: Validation error due to incorrect parameters. value: code: VALIDATION InvalidSignature: description: Wallet signature is not valid value: code: SIGNATURE_INVALID OperationNotFound: description: No operation found with the provided Operation ID. value: code: NOT_FOUND responses: 403Forbidden: description: Access to the resource or the ability to perform the requested operation is not allowed for your account. content: application/json: schema: type: object properties: code: type: string example: FORBIDDEN securitySchemes: bearer: type: http scheme: bearer bearerFormat: JWT