# Profile API # Feature Overview The Profile API allows clients to retrieve and update domain profile details. There are both public and authenticated endpoints available for domain profiles. For authenticated endpoints, the API requires request signatures generated using the domain owner's private key. ## Public endpoint overview These endpoints are available without any authentication. - Retrieve public profile data associated with a domain - Domain owner controls which fields are public or private - Private data is always the default - Retrieve NFTs for addresses associated with domain - Domain can have any number of blockchain addresses associated for resolution services - Resolution addresses are stored on-chain - Query on-chain data for NFTs - Retrieve badges data for addresses associated with domain - Retrieve the following status of two domains ## Authenticated endpoint overview The owner of a domain may use this API to view or edit their private profile data. When managing profile data, authentication headers must be provided using the approach described below. ### How to authenticate - Determine the message that must be signed through the message generator endpoint - Request GET /api/user/{domain}/signature?device=true&expiry={timestamp} - Replace '{domain}' with desired domain - Replace '{expiry}' with desired Unix epoch timestamp - Response contains the message that must be signed - Message is a unique hash value - Represents combination of provided request parameters - Includes an expiration timestamp - User must sign the message returned by the message generator API - For example, the Metamask wallet could be used to sign the message - Generated signature is used in header of subsequent GET or POST request - Construct a request to the desired endpoint that requires user authentication - Must include headers - x-auth-domain - Must equal the {domain} in context - x-auth-expiration - Must equal the {expiry} timestamp in the signed message - x-auth-signature - Must be set to the value of the user generated signature Version: 1.0.0 ## Servers Production ``` https://api.unstoppabledomains.com/profile ``` Staging ``` https://api.ud-staging.com/profile ``` ## Download OpenAPI description [Profile API](https://docs.unstoppabledomains.com/_bundle/apis/profile-v1/openapi.yaml) ## Badge endpoints ### Retrieves holders of the badge - [GET /badges/{badge}/holders](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/badge-endpoints/paths/~1badges~1%7Bbadge%7D~1holders/get.md): Retrieves a list of addresses that hold the badge ### Retrieves details about a badge - [GET /badges/{badge}](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/badge-endpoints/paths/~1badges~1%7Bbadge%7D/get.md): Retrieves details about a badge, including definition and usage statistics. ### Validates that a given user holds a badge - [GET /badges/{badge}/validate/{address}](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/badge-endpoints/paths/~1badges~1%7Bbadge%7D~1validate~1%7Baddress%7D/get.md): Validates that a given user holds a badge ### Generates a badge based on a provided marketplace link - [POST /badges/claim](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/badge-endpoints/paths/~1badges~1claim/post.md): Creates a badge based on a provided marketplace link, such as OpenSea, Zuse.market, etc. The badge must be purchased to be activated before it can be claimed by other domains. ### Retrieve badge rankings by domain - [GET /badges/rankings/domains](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/badge-endpoints/paths/~1badges~1rankings~1domains/get.md): Generates a list of domains ordered by largest badge collection ### Retrieve badge rankings - [GET /badges/rankings](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/badge-endpoints/paths/~1badges~1rankings/get.md): Generates a list of badges ordered by number of holders ### Retrieve badge rankings by sponsor - [GET /badges/rankings/sponsors](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/badge-endpoints/paths/~1badges~1rankings~1sponsors/get.md): Generates a list of sponsors ordered by largest number of sponsored badges ### Updates badges for a wallet address - [POST /user/{address}/badges](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/badge-endpoints/paths/~1user~1%7Baddress%7D~1badges/post.md): Update specific badge visibility if provided in request body. If body has no elements, requests badge refresh for a wallet address. Authentication is required using domain owner signature. ## Follower endpoints ### Retrieves the following status of a domain - [GET /followers/{domain}/follow-status](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/follower-endpoints/paths/~1followers~1%7Bdomain%7D~1follow-status/get.md): Retrieves the following status of a domain ### Follow a domain - [POST /followers/{domain}](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/follower-endpoints/paths/~1followers~1%7Bdomain%7D/post.md): Follow a domain ### Unfollows a domain - [DELETE /followers/{domain}](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/follower-endpoints/paths/~1followers~1%7Bdomain%7D/delete.md): Unfollows a domain ### Returns a list of followers or following for a domain - [GET /followers/{domain}](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/follower-endpoints/paths/~1followers~1%7Bdomain%7D/get.md): Returns a list of followers or following for a domain ### Retrieve follower rankings - [GET /followers/rankings](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/follower-endpoints/paths/~1followers~1rankings/get.md): Generates a list of domains ordered by number of followers ## Profile data endpoints ### Retrieves badges associated with a domain - [GET /public/{domain}/badges](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/profile-data-endpoints/paths/~1public~1%7Bdomain%7D~1badges/get.md): Retrieves badge data associated with requested domain. ### Retrieves social graph connections for a given domain - [GET /public/{domain}/connections](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/profile-data-endpoints/paths/~1public~1%7Bdomain%7D~1connections/get.md): Retrieves recommended connections for a given domain, using an on-chain social graph. ### Retrieves publicly accessible domain profile - [GET /public/{domain}](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/profile-data-endpoints/paths/~1public~1%7Bdomain%7D/get.md): Retrieves public domain profile accessible to anyone on the internet. All domain profile data is considered private, unless explicitly authorized by the domain owner. In other words, data shown on the public API is controlled by the domain owner. ### Retrieves NFT data associated with blockchain accounts attached to a domain - [GET /public/{domain}/nfts](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/profile-data-endpoints/paths/~1public~1%7Bdomain%7D~1nfts/get.md): Retrieves NFT data associated with requested domain. Paging is supported using the limit and cursor query string parameters. ### Retrieves transaction data associated with blockchain accounts attached to a domain - [GET /public/{domain}/transactions](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/profile-data-endpoints/paths/~1public~1%7Bdomain%7D~1transactions/get.md): Retrieves transaction data associated with requested domain. Paging is supported using the cursor query string parameter. ### Retrieves badges associated with a list of domains - [POST /public/badges-bulk](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/profile-data-endpoints/paths/~1public~1badges-bulk/post.md): Retrieves badge data associated with a list of requested domains. ## Swap endpoints ### Retrieves swap quotes - [GET /public/{address}/swap](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/swap-endpoints/paths/~1public~1%7Baddress%7D~1swap/get.md): Retrieves swap quotes for a specified token pair ### Retrieves swap transaction plan - [POST /public/{address}/swap](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/swap-endpoints/paths/~1public~1%7Baddress%7D~1swap/post.md): Retrieves a swap transaction plan containing the required transactions that must be signed by the wallet to complete the swap. The wallet must sign each transaction in the order it is returned in the response. For example, the list of transactions may include a first a token approval transaction, and then a swap transaction. ### Retrieves a list of supported swap chains - [GET /public/swap/chains](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/swap-endpoints/paths/~1public~1swap~1chains/get.md): Retrieves a list of supported swap chains ### Retrieves supported tokens for a specified chain - [GET /public/swap/tokens](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/swap-endpoints/paths/~1public~1swap~1tokens/get.md): Retrieves supported tokens for a specified chain ## Search endpoints ### Retrieves reverse resolution details for an address - [GET /resolve/{address}](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/search-endpoints/paths/~1resolve~1%7Baddress%7D/get.md): Retrieves reverse resolution details for an address ### Retrieves a list of all supported resolver keys - [GET /resolve/keys](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/search-endpoints/paths/~1resolve~1keys/get.md): Retrieves a list of all supported resolver keys ### Retrieves list of domains based on query - [GET /search](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/search-endpoints/paths/~1search/get.md): This route retrieves a list of domains that match the query ## Status ### Status probe - [GET /status](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/status/paths/~1status/get.md): This route can be used to determine if the application service is alive ## Profile management endpoints ### Verify ownership of a blockchain address - [POST /user/{domain}/address/{symbol}](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/profile-management-endpoints/paths/~1user~1%7Bdomain%7D~1address~1%7Bsymbol%7D/post.md): Verify ownership of a blockchain address by signing a message with your private key. ### Upload an XMTP or Push Protocol attachment - [POST /user/{domain}/attachment](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/profile-management-endpoints/paths/~1user~1%7Bdomain%7D~1attachment/post.md): Upload an XMTP or Push Protocol attachment. Quota enforced per user. Authentication is required using domain owner signature. ### Retrieves domain's private profile data - [GET /user/{domain}](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/profile-management-endpoints/paths/~1user~1%7Bdomain%7D/get.md): While the public API retrieves only the data identified as shareable by the domain owner, this API returns both public and private data. Authentication is required using domain owner signature. ### Edit domain's private profile data - [POST /user/{domain}](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/profile-management-endpoints/paths/~1user~1%7Bdomain%7D/post.md): The POST call can be used to create a new domain profile or make updates to an existing profile. Authentication is required using domain owner signature. ### Update NFT preferences for a domain - [POST /user/{domain}/nfts](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/profile-management-endpoints/paths/~1user~1%7Bdomain%7D~1nfts/post.md): The POST call can be used to update NFT gallery preferences for addresses resolving to the domain. Authentication is required using domain owner signature. ### Modify domain notification preferences - [POST /user/{domain}/notifications/preferences](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/profile-management-endpoints/paths/~1user~1%7Bdomain%7D~1notifications~1preferences/post.md): Modify notifications preferences related to the domain, such as mobile push notifications and email. ### Get domain notification preferences - [GET /user/{domain}/notifications/preferences](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/profile-management-endpoints/paths/~1user~1%7Bdomain%7D~1notifications~1preferences/get.md): Get notifications preferences related to the domain, such as mobile push notifications and email. ### Confirm an update to a domain's on-chain records - [POST /user/{domain}/records/confirm](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/profile-management-endpoints/paths/~1user~1%7Bdomain%7D~1records~1confirm/post.md): The POST call can be used to complete the process of modifying a domain's on-chain records by submitting a signed transaction hash to confirm an operation. Authentication is required using domain owner signature. ### Retrieves pending on-chain record management operations - [GET /user/{domain}/records/manage](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/profile-management-endpoints/paths/~1user~1%7Bdomain%7D~1records~1manage/get.md): Retrieves a list of pending on-chain record operations for this domain. Authentication is required using domain owner signature. ### Request to update a domain's on-chain records - [POST /user/{domain}/records/manage](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/profile-management-endpoints/paths/~1user~1%7Bdomain%7D~1records~1manage/post.md): The POST call can be used to start the process of modifying a domain's on-chain records. Authentication is required using domain owner signature. ### Retrieves on-chain record management status - [GET /user/{domain}/wallet](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/profile-management-endpoints/paths/~1user~1%7Bdomain%7D~1wallet/get.md): Retrieves the domain management registration status. The owner wallet must be registered to manage on-chain records. Authentication is required using domain owner signature. ### Register for on-chain record management - [POST /user/{domain}/wallet](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/profile-management-endpoints/paths/~1user~1%7Bdomain%7D~1wallet/post.md): The POST call can be used to enable a wallet to manage a domain's on-chain records. Authentication is required using domain owner signature. ### Edit domain profile data in bulk - [POST /user/domains](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/profile-management-endpoints/paths/~1user~1domains/post.md): The POST call can be used to create new domain profiles or make updates to existing profiles. All domains in the bulk update list must belong to the same wallet address. Authentication is required using the domain owner signature from one of the domains in the bulk update list. ## Message generator endpoints ### Retrieves the message that must be signed to verify ownership of a blockchain address - [GET /user/{domain}/address/{symbol}/signature](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/message-generator-endpoints/paths/~1user~1%7Bdomain%7D~1address~1%7Bsymbol%7D~1signature/get.md): Retrieves the message that must be signed to verify ownership of a blockchain address. The message must be signed with the blockchain address private key and submitted using the POST call for verification. ### Retrieves the message that must be signed to view private domain profile data - [GET /user/{domain}/signature](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/message-generator-endpoints/paths/~1user~1%7Bdomain%7D~1signature/get.md): Retrieve the message text that must be signed by the domain owner. The request URL and any request data must match exactly the data that will be used on the signature required endpoint. ### Retrieves the message that must be signed to edit private domain profile data - [POST /user/{domain}/signature](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/message-generator-endpoints/paths/~1user~1%7Bdomain%7D~1signature/post.md): Retrieve the required message that must be signed by the domain owner to update a domain profile. A POST request must include the exact JSON body that will be used to make the update. The entire contents of the JSON body are included in the message hash, to ensure the signature cannot be used in combination with unauthorized modifications to the domain profile. ## Wallet data endpoints ### Retrieve domains - [GET /user/{address}/domains](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/wallet-data-endpoints/paths/~1user~1%7Baddress%7D~1domains/get.md): Returns a list of domains owned by the specified wallet address ### Retrieve NFT collections - [GET /user/{address}/nfts/collections](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/wallet-data-endpoints/paths/~1user~1%7Baddress%7D~1nfts~1collections/get.md): Retrieves NFT collections owned by the provided wallet address. Collections are filtered by spam using criteria such as floor price, trading volume and holder distribution. ### Retrieve NFTs - [GET /user/{address}/nfts](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/wallet-data-endpoints/paths/~1user~1%7Baddress%7D~1nfts/get.md): Retrieves NFT data for a given address. Authentication with an API key is required. ### Retrieve transactions - [GET /user/{address}/transactions](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/wallet-data-endpoints/paths/~1user~1%7Baddress%7D~1transactions/get.md): Retrieves wallet transactions for the provided wallet address. The address may be any supported MPC address. Authentication with an API key is required. ### RPC proxy - [POST /user/{address}/wallet/rpc](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/wallet-data-endpoints/paths/~1user~1%7Baddress%7D~1wallet~1rpc/post.md): Proxy requests to a blockchain specific RPC endpoint for EVM or Solana networks. Authentication with an API key is required. ### Simulate a wallet transaction - [POST /user/{address}/wallet/simulate](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/wallet-data-endpoints/paths/~1user~1%7Baddress%7D~1wallet~1simulate/post.md): Simulate a wallet transaction. Authentication with an API key is required. ### Retrieves wallet summary - [GET /user/{address}/wallets](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/wallet-data-endpoints/paths/~1user~1%7Baddress%7D~1wallets/get.md): Retrieves a detailed summary of wallet data for a given address. Supported addresses include EVM, Solana and Bitcoin. Authentication with an API key is required. ## Market data endpoints ### Retrieves detailed market data about the domain - [GET /user/{domain}/market-data](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/market-data-endpoints/paths/~1user~1%7Bdomain%7D~1market-data/get.md): Retrieves detailed market data about the domain. API key authentication is required. ## Wallet management endpoints ### Retrieves account status for an account specified by an identifier - [POST /user/{identifier}/wallet/account](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/wallet-management-endpoints/paths/~1user~1%7Bidentifier%7D~1wallet~1account/post.md): Retrieves account status for an account specified by an identifier ### Request to synchronize wallet addresses with tokenized identity - [POST /user/{address}/wallet/identity](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/wallet-management-endpoints/paths/~1user~1%7Baddress%7D~1wallet~1identity/post.md): Request to synchronize wallet addresses with tokenized identity ### Sends an Unstoppable Lite Wallet invitation to a specified contact - [POST /user/{address}/wallet/invite](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/wallet-management-endpoints/paths/~1user~1%7Baddress%7D~1wallet~1invite/post.md): Sends an Unstoppable Lite Wallet invitation to a specified contact ### An asynchronous request to claim a wallet to self custody - [POST /user/wallet/claim](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/wallet-management-endpoints/paths/~1user~1wallet~1claim/post.md): An asynchronous request to claim a wallet to self custody, using a server generated secret. ### Get status of a wallet claim to self custody - [GET /user/wallet/claim](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/wallet-management-endpoints/paths/~1user~1wallet~1claim/get.md): Get status of a wallet claim to self custody. ### An asynchronous request to create a wallet - [POST /user/wallet/launch](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/wallet-management-endpoints/paths/~1user~1wallet~1launch/post.md): An asynchronous request to create a wallet. The resulting wallet will be custodial, but the user can claim custody at a later time using the server generated secret provided in the response. ### Get status of a wallet - [GET /user/wallet/launch](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/wallet-management-endpoints/paths/~1user~1wallet~1launch/get.md): Get status of a wallet associated with a server generated secret. The secret is provided to the client at wallet create time. ### Request a one time code required to setup a new wallet (deprecated) - [POST /user/wallet](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/wallet-management-endpoints/paths/~1user~1wallet/post.md): If a wallet does not already exist, a one time code will created and sent to the provided email address. ### Create a wallet with a verified email address (deprecated) - [POST /user/wallet/register](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/wallet-management-endpoints/paths/~1user~1wallet~1register/post.md): The one time code generated with the associated POST request must be provided in the request body. ## Solana wallet endpoints ### Sign a message with a Solana wallet - [POST /user/{address}/wallet/solana/signature](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/solana-wallet-endpoints/paths/~1user~1%7Baddress%7D~1wallet~1solana~1signature/post.md): Sign a message with a Solana wallet. Authentication with an API key is required. ### Retrieve status of a transaction hash - [GET /user/{address}/wallet/solana/status](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/solana-wallet-endpoints/paths/~1user~1%7Baddress%7D~1wallet~1solana~1status/get.md): Retrieve status of a transaction hash. Authentication with an API key is required. ### Sign a transaction with a Solana wallet - [POST /user/{address}/wallet/solana/transaction](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/solana-wallet-endpoints/paths/~1user~1%7Baddress%7D~1wallet~1solana~1transaction/post.md): Sign a transaction with a Solana wallet. Authentication with an API key is required. ### Transfer Solana tokens to another wallet - [POST /user/{address}/wallet/solana/transfer](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/solana-wallet-endpoints/paths/~1user~1%7Baddress%7D~1wallet~1solana~1transfer/post.md): Transfer Solana tokens to another wallet. Authentication with an API key is required. ## Wallet storage endpoints ### Retrieve wallet storage data - [GET /user/{account}/wallet/storage/{key}](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/wallet-storage-endpoints/paths/~1user~1%7Baccount%7D~1wallet~1storage~1%7Bkey%7D/get.md): Retrieves data associated with a wallet specific storage key. Authentication is required using domain owner signature. ### Edit wallet storage data - [POST /user/{account}/wallet/storage/{key}](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/wallet-storage-endpoints/paths/~1user~1%7Baccount%7D~1wallet~1storage~1%7Bkey%7D/post.md): Create a new wallet storage data entry or make updates to an existing wallet storage data entry. The body should contain a JSON serialized string that conforms to the Zod schema for the specified storage key. See below for an example of saving an array with two values. Specific schemas and examples can be retrieved using the associated /keys list endpoint. Authentication is required using domain owner signature. ### Delete wallet storage data - [DELETE /user/{account}/wallet/storage/{key}](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/wallet-storage-endpoints/paths/~1user~1%7Baccount%7D~1wallet~1storage~1%7Bkey%7D/delete.md): Delete wallet storage data. Authentication is required using domain owner signature. ### Retrieve a list of keys that can be used with wallet storage - [GET /user/{account}/wallet/storage/keys](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/wallet-storage-endpoints/paths/~1user~1%7Baccount%7D~1wallet~1storage~1keys/get.md): Retrieve a list of keys that can be used with wallet storage. Authentication with an API key is required. ## Identity management endpoints ### Request tokenization status of a user identity - [GET /user/identity](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/identity-management-endpoints/paths/~1user~1identity/get.md): Request tokenization status of a user identity ### Request tokenization of user identity - [POST /user/identity](https://docs.unstoppabledomains.com/apis/profile-v1/openapi/identity-management-endpoints/paths/~1user~1identity/post.md): Request tokenization of user identity