API Reference
Download OpenAPI Spec
Authentication
The API accepts two types of Bearer tokens:
- JWT — Obtain one instantly by completing the Sign-In with Ethereum (SIWE) flow below (GET /nonce → POST /verify). JWTs are short-lived session tokens.
- API Key — Long-lived platform keys for server-to-server integrations. Contact us at support@clkd.xyz to request one.
Pass either token in the Authorization header — the server auto-detects the format.
Important: The address used for authentication must be the address derived from your private spending key (privateKeyToAccount(p_spend)), NOT your connected wallet address. The server identity is this derived auth address — your wallet address never touches the server.
Endpoints marked with 🔒 require a valid Bearer token.
Get HPKE public key
/v1/.well-known/hpke-public-keyRetrieve the server's HPKE public key. Clients must encrypt stealth key material with this key before submitting it during account creation or signer enrollment.
200Default Response
{
"publicKey": "0x...",
"publicKeyBase64": "...",
"format": "hex",
"kem": "X25519-HKDF-SHA256",
"aead": "AES-128-GCM"
}Try it
curl -X GET \
"https://api-stg.clkd.xyz/v1/.well-known/hpke-public-key"Get nonce
/v1/nonceGenerate a one-time nonce tied to the given address. This is the first step of Sign-In with Ethereum (SIWE) — the nonce must be included in the SIWE message passed to verifySignin. Nonces expire after 5 minutes.
| Name | In | Type | Description |
|---|---|---|---|
address* | query | string | The auth address to tie the nonce to. This must be the address derived from your private spending key (i.e. `privateKeyToAccount(p_spend).address`), not your connected wallet address. |
200Random nonce string
"a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6"400Default Response
{
"error": "Bad request",
"message": "string",
"code": "BAD_REQUEST",
"available": "0",
"tokenSymbol": "ETH",
"tokenAddress": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
"tokenDecimals": 18,
"minAmount": "0.00036 ETH",
"maxSendable": "0.018 ETH",
"feeEstimate": "1000000000000000",
"required": "1010000000000000000",
"shortfall": "1000000000000000",
"spendableCount": 1,
"maxInputs": 50,
"selectedAmount": "0.02 ETH",
"relayFee": "0.0042 ETH",
"feeLimit": "0.001 ETH",
"maxRelayFeeBPS": 1000,
"requiredRelayFeeBPS": "1523",
"selectedCount": 2,
"resolvedAddress": "string"
}429Default Response
{
"error": "Too Many Requests",
"message": "Rate limit exceeded. Maximum 20 requests per 1 minute."
}Try it
addresscurl -X GET \
"https://api-stg.clkd.xyz/v1/nonce"Verify sign-in
/v1/verifyComplete Sign-In with Ethereum by submitting the signed SIWE message. Returns a JWT session token and the associated accountId if the address already has an account, or null if the user still needs to register.
200Default Response
{
"ok": true,
"address": "0x...",
"token": "string",
"accountId": "string"
}400Default Response
{
"error": "Bad request",
"message": "string",
"code": "BAD_REQUEST",
"available": "0",
"tokenSymbol": "ETH",
"tokenAddress": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
"tokenDecimals": 18,
"minAmount": "0.00036 ETH",
"maxSendable": "0.018 ETH",
"feeEstimate": "1000000000000000",
"required": "1010000000000000000",
"shortfall": "1000000000000000",
"spendableCount": 1,
"maxInputs": 50,
"selectedAmount": "0.02 ETH",
"relayFee": "0.0042 ETH",
"feeLimit": "0.001 ETH",
"maxRelayFeeBPS": 1000,
"requiredRelayFeeBPS": "1523",
"selectedCount": 2,
"resolvedAddress": "string"
}422Default Response
{
"error": "Unprocessable Entity",
"message": "string",
"code": "UNPROCESSABLE_ENTITY"
}429Default Response
{
"error": "Too Many Requests",
"message": "Rate limit exceeded. Maximum 10 requests per 1 minute."
}Try it
curl -X POST \
-H "Content-Type: application/json" \
-d '{
"message": "",
"signature": "",
"authType": ""
}' \
"https://api-stg.clkd.xyz/v1/verify"Logout
/v1/logoutClear the server-side cache for the authenticated user. JWT tokens are stateless, so the client should also discard the token. Auth is optional — unauthenticated calls succeed without clearing any cache.
200Default Response
{
"ok": true
}Try it
curl -X POST \
"https://api-stg.clkd.xyz/v1/logout"Account Management
Account creation, signers, subdomains, and setup
Check subdomain availability
/v1/subdomain/checkCheck whether a subdomain name is available for registration. Public endpoint — no authentication required. Use before calling setSubdomain to avoid conflicts.
| Name | In | Type | Description |
|---|---|---|---|
name* | query | string | — |
inviteCode | query | string | — |
200Default Response
{
"available": true,
"reason": "string"
}400Default Response
{
"error": "Bad request",
"message": "string",
"code": "BAD_REQUEST",
"available": "0",
"tokenSymbol": "ETH",
"tokenAddress": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
"tokenDecimals": 18,
"minAmount": "0.00036 ETH",
"maxSendable": "0.018 ETH",
"feeEstimate": "1000000000000000",
"required": "1010000000000000000",
"shortfall": "1000000000000000",
"spendableCount": 1,
"maxInputs": 50,
"selectedAmount": "0.02 ETH",
"relayFee": "0.0042 ETH",
"feeLimit": "0.001 ETH",
"maxRelayFeeBPS": 1000,
"requiredRelayFeeBPS": "1523",
"selectedCount": 2,
"resolvedAddress": "string"
}Try it
nameinviteCodecurl -X GET \
"https://api-stg.clkd.xyz/v1/subdomain/check"Get referral availability
/v1/referrals/availabilityCheck whether referral links may be accepted or generated for the current request location.
200Default Response
{
"available": true
}429Default Response
{
"error": "Too Many Requests",
"message": "Rate limit exceeded. Maximum 30 requests per 1 minute."
}Try it
curl -X GET \
"https://api-stg.clkd.xyz/v1/referrals/availability"Get referral preview
/v1/referrals/{code}/previewReturn the public display name and current terms for an eligible referral link.
| Name | In | Type | Description |
|---|---|---|---|
code* | path | string | — |
200Default Response
{
"referrerName": "string",
"referrerShareBps": null,
"referredDiscountBps": null,
"earningDurationDays": null,
"minimumRewardUsdCents": null
}403Default Response
{
"error": "Forbidden",
"message": "string"
}404Default Response
{
"error": "Not found",
"message": "string"
}429Default Response
{
"error": "Too Many Requests",
"message": "Rate limit exceeded. Maximum 30 requests per 1 minute."
}Try it
codecurl -X GET \
"https://api-stg.clkd.xyz/v1/referrals/{code}/preview"Create account
/v1/accounts/🔒Register a new account by submitting HPKE-encrypted key material. The caller must already have a JWT from the SIWE sign-in flow, which proves ownership of the Ethereum address. The server decrypts and stores the keys, enabling payment address generation for this account. Requires an invite code when gated access is enabled. Returns the new accountId, or indicates if the address already has an account.
201Default Response
{
"accountId": "string",
"alreadyExisted": true,
"referralApplied": true
}409Default Response
{
"error": "Conflict",
"message": "string",
"code": "QUOTE_LOCK_CONFLICT"
}503Default Response
{
"error": "Service Unavailable",
"message": "string",
"code": "SERVER_BUSY"
}Try it
curl -X POST \
-H "Content-Type: application/json" \
-d '{
"ciphertext": "",
"encapsulatedKey": "",
"inviteCode": "",
"onboardingExperimentId": "",
"experimentKey": "",
"variantKey": "",
"referralCode": ""
}' \
"https://api-stg.clkd.xyz/v1/accounts/"Get account
/v1/accounts/{accountId}🔒Retrieve account metadata including the owner address, registration status, and ENS subdomain. Useful for determining onboarding state (e.g., whether the user still needs to claim a subdomain).
| Name | In | Type | Description |
|---|---|---|---|
accountId* | path | string (uuid) | Account ID |
200Default Response
{
"accountId": "string",
"address": "string",
"isRegistered": true,
"createdAt": "string",
"subdomain": "string",
"encryptedCustomEnsName": "string",
"activationOfferClaimExpiresAt": "string",
"lastConsumedNonce": 0,
"cloakie": {
"active": true,
"deposits": [
{
"tokenId": "string",
"imageUrl": "string",
"depositAddress": "string"
}
]
},
"hasPoolDeposits": true,
"dismissedProfilePrompts": [
"string"
]
}Try it
accountIdcurl -X GET \
"https://api-stg.clkd.xyz/v1/accounts/{accountId}"Get dapp addresses
/v1/accounts/{accountId}/dapp-addresses🔒List addresses used in successful onchain browser-extension dApp actions.
| Name | In | Type | Description |
|---|---|---|---|
limit | query | integer | — |
offset | query | integer | — |
accountId* | path | string (uuid) | Account ID |
200Default Response
{
"items": [
{
"address": "string",
"app": {
"origin": "string",
"displayName": "string",
"iconUrl": "string"
},
"lastUsedAt": "string"
}
],
"hasMore": true
}401Default Response
{
"error": "Unauthorized",
"message": "string",
"code": "UNAUTHORIZED"
}403Default Response
{
"error": "Forbidden",
"message": "string"
}429Default Response
{
"error": "Too Many Requests",
"message": "Rate limit exceeded. Maximum 60 requests per 1 minute."
}Try it
accountIdlimitoffsetcurl -X GET \
"https://api-stg.clkd.xyz/v1/accounts/{accountId}/dapp-addresses"Get address ownership
/v1/accounts/{accountId}/address-ownership🔒Check whether an Ethereum address belongs to the authenticated account.
| Name | In | Type | Description |
|---|---|---|---|
address* | query | string | — |
accountId* | path | string (uuid) | Account ID |
200Default Response
{
"owned": true
}400Default Response
{
"error": "Bad request",
"message": "string",
"code": "BAD_REQUEST",
"available": "0",
"tokenSymbol": "ETH",
"tokenAddress": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
"tokenDecimals": 18,
"minAmount": "0.00036 ETH",
"maxSendable": "0.018 ETH",
"feeEstimate": "1000000000000000",
"required": "1010000000000000000",
"shortfall": "1000000000000000",
"spendableCount": 1,
"maxInputs": 50,
"selectedAmount": "0.02 ETH",
"relayFee": "0.0042 ETH",
"feeLimit": "0.001 ETH",
"maxRelayFeeBPS": 1000,
"requiredRelayFeeBPS": "1523",
"selectedCount": 2,
"resolvedAddress": "string"
}401Default Response
{
"error": "Unauthorized",
"message": "string",
"code": "UNAUTHORIZED"
}403Default Response
{
"error": "Forbidden",
"message": "string"
}429Default Response
{
"error": "Too Many Requests",
"message": "Rate limit exceeded. Maximum 60 requests per 1 minute."
}Try it
accountIdaddresscurl -X GET \
"https://api-stg.clkd.xyz/v1/accounts/{accountId}/address-ownership"List account tokens
/v1/accounts/{accountId}/tokens🔒List active token imports for the authenticated account.
| Name | In | Type | Description |
|---|---|---|---|
include | query | string | Comma-separated optional enrichments. Supported values: market,sources. |
accountId* | path | string (uuid) | Account ID |
200Default Response
{
"tokens": [
{
"address": "string",
"symbol": "string",
"name": "string",
"decimals": 0,
"chainId": 0,
"logoURI": "string",
"isClanker": true,
"visibility": "string",
"metadataSource": "string",
"market": {
"provider": "string",
"providerAssetId": "string",
"vsCurrency": "string",
"price": "string",
"marketCap": "string",
"marketCapRank": 0,
"fullyDilutedValuation": "string",
"totalVolume": "string",
"high24h": "string",
"low24h": "string",
"priceChange24h": "string",
"priceChangePercentage24h": "string",
"marketCapChange24h": "string",
"marketCapChangePercentage24h": "string",
"circulatingSupply": "string",
"totalSupply": "string",
"maxSupply": "string",
"ath": "string",
"athChangePercentage": "string",
"athDate": "string",
"atl": "string",
"atlChangePercentage": "string",
"atlDate": "string",
"providerUpdatedAt": "string",
"fetchedAt": "string",
"stale": true
},
"sources": [
{
"source": "string",
"sourceId": "string",
"name": "string",
"symbol": "string",
"decimals": 0,
"logoUrl": "string",
"externalUrl": "string",
"firstSeenAt": "string",
"lastSeenAt": "string"
}
]
}
]
}404Default Response
{
"error": "Not found",
"message": "string"
}Try it
accountIdincludecurl -X GET \
"https://api-stg.clkd.xyz/v1/accounts/{accountId}/tokens"Import account token
/v1/accounts/{accountId}/tokens🔒Import an allowed canonical token for the authenticated account.
| Name | In | Type | Description |
|---|---|---|---|
include | query | string | Comma-separated optional enrichments. Supported values: market,sources. |
accountId* | path | string (uuid) | Account ID |
200Default Response
{
"token": {
"address": "string",
"symbol": "string",
"name": "string",
"decimals": 0,
"chainId": 0,
"logoURI": "string",
"isClanker": true,
"visibility": "string",
"metadataSource": "string",
"market": {
"provider": "string",
"providerAssetId": "string",
"vsCurrency": "string",
"price": "string",
"marketCap": "string",
"marketCapRank": 0,
"fullyDilutedValuation": "string",
"totalVolume": "string",
"high24h": "string",
"low24h": "string",
"priceChange24h": "string",
"priceChangePercentage24h": "string",
"marketCapChange24h": "string",
"marketCapChangePercentage24h": "string",
"circulatingSupply": "string",
"totalSupply": "string",
"maxSupply": "string",
"ath": "string",
"athChangePercentage": "string",
"athDate": "string",
"atl": "string",
"atlChangePercentage": "string",
"atlDate": "string",
"providerUpdatedAt": "string",
"fetchedAt": "string",
"stale": true
},
"sources": [
{
"source": "string",
"sourceId": "string",
"name": "string",
"symbol": "string",
"decimals": 0,
"logoUrl": "string",
"externalUrl": "string",
"firstSeenAt": "string",
"lastSeenAt": "string"
}
]
}
}400Default Response
{
"error": "Bad request",
"message": "string",
"code": "BAD_REQUEST",
"available": "0",
"tokenSymbol": "ETH",
"tokenAddress": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
"tokenDecimals": 18,
"minAmount": "0.00036 ETH",
"maxSendable": "0.018 ETH",
"feeEstimate": "1000000000000000",
"required": "1010000000000000000",
"shortfall": "1000000000000000",
"spendableCount": 1,
"maxInputs": 50,
"selectedAmount": "0.02 ETH",
"relayFee": "0.0042 ETH",
"feeLimit": "0.001 ETH",
"maxRelayFeeBPS": 1000,
"requiredRelayFeeBPS": "1523",
"selectedCount": 2,
"resolvedAddress": "string"
}403Default Response
{
"error": "Forbidden",
"message": "string"
}404Default Response
{
"error": "Not found",
"message": "string"
}429Default Response
{
"error": "Too Many Requests",
"message": "Rate limit exceeded. Maximum 10 requests per 1 minute."
}Try it
accountIdincludecurl -X POST \
-H "Content-Type: application/json" \
-d '{
"chainId": 0,
"address": ""
}' \
"https://api-stg.clkd.xyz/v1/accounts/{accountId}/tokens"Get account token detail
/v1/accounts/{accountId}/tokens/{chainId}/{address}🔒Return canonical token metadata and this account’s balance for one token. Use include=market,sources to attach current market data and provider provenance.
| Name | In | Type | Description |
|---|---|---|---|
include | query | string | Comma-separated optional enrichments. Supported values: market,sources. |
accountId* | path | string (uuid) | Account ID |
chainId* | path | string | Chain ID |
address* | path | string | Token contract address |
200Default Response
{
"token": {
"address": "string",
"symbol": "string",
"name": "string",
"decimals": 0,
"chainId": 0,
"logoURI": "string",
"isClanker": true,
"visibility": "string",
"metadataSource": "string",
"market": {
"provider": "string",
"providerAssetId": "string",
"vsCurrency": "string",
"price": "string",
"marketCap": "string",
"marketCapRank": 0,
"fullyDilutedValuation": "string",
"totalVolume": "string",
"high24h": "string",
"low24h": "string",
"priceChange24h": "string",
"priceChangePercentage24h": "string",
"marketCapChange24h": "string",
"marketCapChangePercentage24h": "string",
"circulatingSupply": "string",
"totalSupply": "string",
"maxSupply": "string",
"ath": "string",
"athChangePercentage": "string",
"athDate": "string",
"atl": "string",
"atlChangePercentage": "string",
"atlDate": "string",
"providerUpdatedAt": "string",
"fetchedAt": "string",
"stale": true
},
"sources": [
{
"source": "string",
"sourceId": "string",
"name": "string",
"symbol": "string",
"decimals": 0,
"logoUrl": "string",
"externalUrl": "string",
"firstSeenAt": "string",
"lastSeenAt": "string"
}
]
},
"balance": {
"chainId": 8453,
"chainName": "Base",
"token": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"tokenSymbol": "USDC",
"decimals": 6,
"logoUrl": "https://assets.coingecko.com/coins/images/6319/small/usdc.png",
"visible": {
"available": "1000000",
"pending": "500000"
},
"incognito": {
"pooled": {
"available": "750000",
"pendingApproval": "250000",
"pendingWithdrawal": "500000",
"declined": "0"
}
},
"usdAmount": 1.5,
"pricePerToken": 2000.42,
"priceStale": false,
"spam": false
}
}400Default Response
{
"error": "Bad request",
"message": "string",
"code": "BAD_REQUEST",
"available": "0",
"tokenSymbol": "ETH",
"tokenAddress": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
"tokenDecimals": 18,
"minAmount": "0.00036 ETH",
"maxSendable": "0.018 ETH",
"feeEstimate": "1000000000000000",
"required": "1010000000000000000",
"shortfall": "1000000000000000",
"spendableCount": 1,
"maxInputs": 50,
"selectedAmount": "0.02 ETH",
"relayFee": "0.0042 ETH",
"feeLimit": "0.001 ETH",
"maxRelayFeeBPS": 1000,
"requiredRelayFeeBPS": "1523",
"selectedCount": 2,
"resolvedAddress": "string"
}403Default Response
{
"error": "Forbidden",
"message": "string"
}404Default Response
{
"error": "Not found",
"message": "string"
}429Default Response
{
"error": "Too Many Requests",
"message": "Rate limit exceeded. Maximum 60 requests per 1 minute."
}Try it
accountIdchainIdaddressincludecurl -X GET \
"https://api-stg.clkd.xyz/v1/accounts/{accountId}/tokens/{chainId}/{address}"Claim subdomain
/v1/accounts/{accountId}/subdomain🔒Claim an ENS subdomain (e.g. alice.clkd.eth) for this account so senders can pay via a human-readable name instead of a raw address. Each account may claim one subdomain.
| Name | In | Type | Description |
|---|---|---|---|
accountId* | path | string (uuid) | Account ID |
200Default Response
{
"success": true,
"message": "string",
"subdomain": "string"
}Try it
accountIdcurl -X POST \
-H "Content-Type: application/json" \
-d '{
"subdomain": ""
}' \
"https://api-stg.clkd.xyz/v1/accounts/{accountId}/subdomain"Generate subdomain
/v1/accounts/{accountId}/subdomain/generate🔒Generate a random available subdomain for the user to preview during onboarding. The name is not reserved — call setSubdomain to claim it.
| Name | In | Type | Description |
|---|---|---|---|
accountId* | path | string (uuid) | Account ID |
200Default Response
{
"subdomain": "example-123.clkd.eth"
}Try it
accountIdcurl -X GET \
"https://api-stg.clkd.xyz/v1/accounts/{accountId}/subdomain/generate"Get account referral attribution
/v1/accounts/{accountId}/referrals/attribution🔒Return this account's referral relationship, including its snapshotted terms and current status.
| Name | In | Type | Description |
|---|---|---|---|
accountId* | path | string (uuid) | Account ID |
200Default Response
{
"referrerName": "string",
"referrerShareBps": null,
"referredDiscountBps": null,
"minimumRewardUsdCents": null,
"earningStartsAt": "string",
"earningEndsAt": "string",
"revokedAt": "string",
"status": "string"
}401Default Response
{
"error": "Unauthorized",
"message": "string",
"code": "UNAUTHORIZED"
}404Default Response
{
"error": "Not found",
"message": "string"
}429Default Response
{
"error": "Too Many Requests",
"message": "Rate limit exceeded. Maximum 60 requests per 1 minute."
}Try it
accountIdcurl -X GET \
"https://api-stg.clkd.xyz/v1/accounts/{accountId}/referrals/attribution"End account referral attribution
/v1/accounts/{accountId}/referrals/attribution🔒Permanently end this account's future referral discount and its referrer's future fee share.
| Name | In | Type | Description |
|---|---|---|---|
accountId* | path | string (uuid) | Account ID |
200Default Response
{
"referrerName": "string",
"referrerShareBps": null,
"referredDiscountBps": null,
"minimumRewardUsdCents": null,
"earningStartsAt": "string",
"earningEndsAt": "string",
"revokedAt": "string",
"status": "string"
}401Default Response
{
"error": "Unauthorized",
"message": "string",
"code": "UNAUTHORIZED"
}404Default Response
{
"error": "Not found",
"message": "string"
}429Default Response
{
"error": "Too Many Requests",
"message": "Rate limit exceeded. Maximum 60 requests per 1 minute."
}Try it
accountIdcurl -X DELETE \
"https://api-stg.clkd.xyz/v1/accounts/{accountId}/referrals/attribution"Get referrals made summary
/v1/accounts/{accountId}/referrals/summary🔒Return aggregate referral counts and successfully paid reward value without identifying referred accounts or their activity.
| Name | In | Type | Description |
|---|---|---|---|
accountId* | path | string (uuid) | Account ID |
200Default Response
{
"totalReferrals": null,
"activeReferrals": null,
"totalEarnedUsd": "string"
}401Default Response
{
"error": "Unauthorized",
"message": "string",
"code": "UNAUTHORIZED"
}429Default Response
{
"error": "Too Many Requests",
"message": "Rate limit exceeded. Maximum 60 requests per 1 minute."
}Try it
accountIdcurl -X GET \
"https://api-stg.clkd.xyz/v1/accounts/{accountId}/referrals/summary"Get or create referral profile
/v1/accounts/{accountId}/referrals/profile🔒Return the account's active referral profile, creating its standard member profile on first use.
| Name | In | Type | Description |
|---|---|---|---|
accountId* | path | string (uuid) | Account ID |
200Default Response
{
"code": "string",
"referrerShareBps": null,
"referredDiscountBps": null,
"earningDurationDays": null,
"minimumRewardUsdCents": null
}401Default Response
{
"error": "Unauthorized",
"message": "string",
"code": "UNAUTHORIZED"
}403Default Response
{
"error": "Forbidden",
"message": "string"
}429Default Response
{
"error": "Too Many Requests",
"message": "Rate limit exceeded. Maximum 60 requests per 1 minute."
}Try it
accountIdcurl -X POST \
"https://api-stg.clkd.xyz/v1/accounts/{accountId}/referrals/profile"Receive
Payment address generation and ENS resolution
Create payment address
/v1/accounts/{accountId}/payment-address🔒Derive a one-time payment address so a sender can transfer tokens to this account without revealing the recipient on-chain.
| Name | In | Type | Description |
|---|---|---|---|
accountId* | path | string (uuid) | Account ID |
idempotency-key | header | string | Client-generated key for one account, HTTP operation, and exact request body. Reuse it only to retry that same operation; a completed retry returns the stored response. Keys expire after 24 hours. |
201Default Response
{
"address": "string",
"nonce": "string",
"reused": true,
"limitResetsAt": "string"
}Try it
accountIdidempotency-keycurl -X POST \
-H "Content-Type: application/json" \
-d '{}' \
"https://api-stg.clkd.xyz/v1/accounts/{accountId}/payment-address"Balance & Activity
Balance queries, transaction history, and supported tokens
List supported chains
/v1/supported-chainsList every chain the platform supports, including explorer URLs, logo base names, and testnet/mainnet mapping. Use to populate chain pickers or build explorer links.
200Default Response
[
{
"name": "string",
"chainId": 0,
"isTestnet": true,
"explorerUrl": "string",
"explorerTxPath": "string",
"mainnetChainId": 0,
"logoBaseName": "string",
"isSquareLogo": true
}
]Try it
curl -X GET \
"https://api-stg.clkd.xyz/v1/supported-chains"Get token catalog
/v1/token-catalogPublic, read-only access to the existing supported token catalog, pinned symbols for the swap picker, and testnet-to-mainnet chain-ID mapping. This endpoint never discovers tokens or persists token data.
| Name | In | Type | Description |
|---|---|---|---|
q | query | string | — |
chainId | query | number | — |
limit | query | number | — |
cursor | query | string | — |
include | query | string | Comma-separated optional enrichments. Supported values: market,sources. |
200Default Response
{
"tokens": [
{
"address": "string",
"symbol": "string",
"name": "string",
"decimals": 0,
"chainId": 0,
"logoURI": "string",
"isClanker": true,
"visibility": "string",
"metadataSource": "string",
"market": {
"provider": "string",
"providerAssetId": "string",
"vsCurrency": "string",
"price": "string",
"marketCap": "string",
"marketCapRank": 0,
"fullyDilutedValuation": "string",
"totalVolume": "string",
"high24h": "string",
"low24h": "string",
"priceChange24h": "string",
"priceChangePercentage24h": "string",
"marketCapChange24h": "string",
"marketCapChangePercentage24h": "string",
"circulatingSupply": "string",
"totalSupply": "string",
"maxSupply": "string",
"ath": "string",
"athChangePercentage": "string",
"athDate": "string",
"atl": "string",
"atlChangePercentage": "string",
"atlDate": "string",
"providerUpdatedAt": "string",
"fetchedAt": "string",
"stale": true
},
"sources": [
{
"source": "string",
"sourceId": "string",
"name": "string",
"symbol": "string",
"decimals": 0,
"logoUrl": "string",
"externalUrl": "string",
"firstSeenAt": "string",
"lastSeenAt": "string"
}
]
}
],
"pinnedSymbols": [
"string"
],
"testnetToMainnet": null,
"nextCursor": "string"
}Try it
qchainIdlimitcursorincludecurl -X GET \
"https://api-stg.clkd.xyz/v1/token-catalog"Lookup token
/v1/token-lookup🔒Look up token metadata by contract address for an authenticated account. Checks cached sources first, then may query trusted token providers and on-chain ERC-20 metadata and persist newly discovered sources.
| Name | In | Type | Description |
|---|---|---|---|
address* | query | string | — |
chainId* | query | number | — |
include | query | string | Comma-separated optional enrichments. Supported values: market,sources. |
200Default Response
{
"address": "string",
"symbol": "string",
"name": "string",
"decimals": 0,
"chainId": 0,
"logoURI": "string",
"isClanker": true,
"visibility": "string",
"metadataSource": "string",
"market": {
"provider": "string",
"providerAssetId": "string",
"vsCurrency": "string",
"price": "string",
"marketCap": "string",
"marketCapRank": 0,
"fullyDilutedValuation": "string",
"totalVolume": "string",
"high24h": "string",
"low24h": "string",
"priceChange24h": "string",
"priceChangePercentage24h": "string",
"marketCapChange24h": "string",
"marketCapChangePercentage24h": "string",
"circulatingSupply": "string",
"totalSupply": "string",
"maxSupply": "string",
"ath": "string",
"athChangePercentage": "string",
"athDate": "string",
"atl": "string",
"atlChangePercentage": "string",
"atlDate": "string",
"providerUpdatedAt": "string",
"fetchedAt": "string",
"stale": true
},
"sources": [
{
"source": "string",
"sourceId": "string",
"name": "string",
"symbol": "string",
"decimals": 0,
"logoUrl": "string",
"externalUrl": "string",
"firstSeenAt": "string",
"lastSeenAt": "string"
}
]
}400Default Response
{
"error": "Bad request",
"message": "string",
"code": "BAD_REQUEST",
"available": "0",
"tokenSymbol": "ETH",
"tokenAddress": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
"tokenDecimals": 18,
"minAmount": "0.00036 ETH",
"maxSendable": "0.018 ETH",
"feeEstimate": "1000000000000000",
"required": "1010000000000000000",
"shortfall": "1000000000000000",
"spendableCount": 1,
"maxInputs": 50,
"selectedAmount": "0.02 ETH",
"relayFee": "0.0042 ETH",
"feeLimit": "0.001 ETH",
"maxRelayFeeBPS": 1000,
"requiredRelayFeeBPS": "1523",
"selectedCount": 2,
"resolvedAddress": "string"
}401Default Response
{
"error": "Unauthorized",
"message": "string",
"code": "UNAUTHORIZED"
}404Default Response
{
"error": "Not found",
"message": "string"
}Try it
addresschainIdincludecurl -X GET \
"https://api-stg.clkd.xyz/v1/token-lookup"Get balances
/v1/accounts/{accountId}/balance🔒Retrieve token balances across every supported chain for this account. Each balance contains visible (standard on-chain) available and pending amounts. Returns a totalUsdAmount summarizing all holdings.
| Name | In | Type | Description |
|---|---|---|---|
accountId* | path | string (uuid) | Account ID |
200Default Response
{
"balances": [
{
"chainId": 8453,
"chainName": "Base",
"token": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"tokenSymbol": "USDC",
"decimals": 6,
"logoUrl": "https://assets.coingecko.com/coins/images/6319/small/usdc.png",
"visible": {
"available": "1000000",
"pending": "500000"
},
"incognito": {
"pooled": {
"available": "750000",
"pendingApproval": "250000",
"pendingWithdrawal": "500000",
"declined": "0"
}
},
"usdAmount": 1.5,
"pricePerToken": 2000.42,
"priceStale": false,
"spam": false
}
],
"totalUsdAmount": 1.5,
"feeWaiver": {
"active": true,
"source": "string",
"activeUntil": "string"
}
}401Default Response
{
"error": "Unauthorized",
"message": "string",
"code": "UNAUTHORIZED"
}404Default Response
{
"error": "Not found",
"message": "string"
}429Default Response
{
"error": "Too Many Requests",
"message": "Rate limit exceeded. Maximum 60 requests per 1 minute."
}503Default Response
{
"error": "Service Unavailable",
"message": "string",
"code": "SERVER_BUSY"
}Try it
accountIdcurl -X GET \
"https://api-stg.clkd.xyz/v1/accounts/{accountId}/balance"Get chain balances
/v1/accounts/{accountId}/balance/{chainId}🔒Retrieve token balances filtered to a single chain. Same response shape as getBalances (visible available/pending) but scoped to the given chainId.
| Name | In | Type | Description |
|---|---|---|---|
accountId* | path | string (uuid) | Account ID |
chainId* | path | string | Chain ID (e.g., 8453 for Base) |
200Default Response
{
"balances": [
{
"chainId": 8453,
"chainName": "Base",
"token": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"tokenSymbol": "USDC",
"decimals": 6,
"logoUrl": "https://assets.coingecko.com/coins/images/6319/small/usdc.png",
"visible": {
"available": "1000000",
"pending": "500000"
},
"incognito": {
"pooled": {
"available": "750000",
"pendingApproval": "250000",
"pendingWithdrawal": "500000",
"declined": "0"
}
},
"usdAmount": 1.5,
"pricePerToken": 2000.42,
"priceStale": false,
"spam": false
}
],
"totalUsdAmount": 1.5,
"feeWaiver": {
"active": true,
"source": "string",
"activeUntil": "string"
}
}400Default Response
{
"error": "Bad request",
"message": "string",
"code": "BAD_REQUEST",
"available": "0",
"tokenSymbol": "ETH",
"tokenAddress": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
"tokenDecimals": 18,
"minAmount": "0.00036 ETH",
"maxSendable": "0.018 ETH",
"feeEstimate": "1000000000000000",
"required": "1010000000000000000",
"shortfall": "1000000000000000",
"spendableCount": 1,
"maxInputs": 50,
"selectedAmount": "0.02 ETH",
"relayFee": "0.0042 ETH",
"feeLimit": "0.001 ETH",
"maxRelayFeeBPS": 1000,
"requiredRelayFeeBPS": "1523",
"selectedCount": 2,
"resolvedAddress": "string"
}401Default Response
{
"error": "Unauthorized",
"message": "string",
"code": "UNAUTHORIZED"
}403Default Response
{
"error": "Forbidden",
"message": "string"
}404Default Response
{
"error": "Not found",
"message": "string"
}429Default Response
{
"error": "Too Many Requests",
"message": "Rate limit exceeded. Maximum 60 requests per 1 minute."
}503Default Response
{
"error": "Service Unavailable",
"message": "string",
"code": "SERVER_BUSY"
}Try it
accountIdchainIdcurl -X GET \
"https://api-stg.clkd.xyz/v1/accounts/{accountId}/balance/{chainId}"Get token balance
/v1/accounts/{accountId}/balance/{chainId}/{token}🔒Retrieve the balance for a single token on a specific chain. Returns visible available and pending amounts. Returns a zero-balance object if the token has never been received.
| Name | In | Type | Description |
|---|---|---|---|
accountId* | path | string (uuid) | Account ID |
chainId* | path | string | Chain ID |
token* | path | string | Token address (0x...) |
200Balance for a single token on a single chain. Contains visible available and pending amounts for standard on-chain stealth address holdings.
{
"chainId": 8453,
"chainName": "Base",
"token": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"tokenSymbol": "USDC",
"decimals": 6,
"logoUrl": "https://assets.coingecko.com/coins/images/6319/small/usdc.png",
"visible": {
"available": "1000000",
"pending": "500000"
},
"incognito": {
"pooled": {
"available": "750000",
"pendingApproval": "250000",
"pendingWithdrawal": "500000",
"declined": "0"
}
},
"usdAmount": 1.5,
"pricePerToken": 2000.42,
"priceStale": false,
"spam": false
}400Default Response
{
"error": "Bad request",
"message": "string",
"code": "BAD_REQUEST",
"available": "0",
"tokenSymbol": "ETH",
"tokenAddress": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
"tokenDecimals": 18,
"minAmount": "0.00036 ETH",
"maxSendable": "0.018 ETH",
"feeEstimate": "1000000000000000",
"required": "1010000000000000000",
"shortfall": "1000000000000000",
"spendableCount": 1,
"maxInputs": 50,
"selectedAmount": "0.02 ETH",
"relayFee": "0.0042 ETH",
"feeLimit": "0.001 ETH",
"maxRelayFeeBPS": 1000,
"requiredRelayFeeBPS": "1523",
"selectedCount": 2,
"resolvedAddress": "string"
}401Default Response
{
"error": "Unauthorized",
"message": "string",
"code": "UNAUTHORIZED"
}403Default Response
{
"error": "Forbidden",
"message": "string"
}404Default Response
{
"error": "Not found",
"message": "string"
}429Default Response
{
"error": "Too Many Requests",
"message": "Rate limit exceeded. Maximum 60 requests per 1 minute."
}503Default Response
{
"error": "Service Unavailable",
"message": "string",
"code": "SERVER_BUSY"
}Try it
accountIdchainIdtokencurl -X GET \
"https://api-stg.clkd.xyz/v1/accounts/{accountId}/balance/{chainId}/{token}"Get activities
/v1/accounts/{accountId}/activities🔒List confirmed (on-chain) transactions for the account with cursor-based pagination. The response uses a discriminated union on kind: SEND/RECEIVE/SELF/INCOGNITO_*/NFT_WITHDRAW/DAPP_CALL include a transfers array, SWAP includes a swap object with source and dest token info, BRIDGE and CROSS_CHAIN_SWAP include a bridge object with source, dest, and chain info. For in-flight transactions, use GET /activities/pending.
| Name | In | Type | Description |
|---|---|---|---|
limit | query | string | Maximum number of activities to return (1-500, default: 100) |
cursor | query | string | Base64-encoded cursor for pagination |
hideLikelySpam | query | any | When true, likely spam activities are filtered before applying the page limit. |
address | query | string | Owned address to scope the activity feed to. |
accountId* | path | string (uuid) | Account ID |
200Default Response
{
"provenanceLabelGroups": null,
"activity": [
{
"txHash": "0x...",
"quoteId": "string",
"chainId": 8453,
"chainName": "Base",
"explorerTxUrlBase": "https://basescan.org/tx/",
"date": "string",
"kind": "string",
"lifecycle": {
"state": "string"
},
"isExternal": false,
"isLikelySpam": false,
"fees": [
{
"tokenAddress": "0x...",
"decimals": 18,
"tokenSymbol": "ETH",
"logoUrl": "string",
"value": "1000000000000000",
"usdAmount": 0.001
}
],
"cloakedFeeBps": 0,
"sourceProvenance": {
"status": "string",
"outputSystemTags": [
{
"type": "string",
"provider": "string",
"text": "string",
"explanationKey": "string",
"evidence": {
"chainId": null,
"txHash": "string",
"transferOrLogIndex": null,
"receiveFromAddress": "string",
"poolAddress": "string",
"entrypointAddress": "string",
"poolTransferOrLogIndex": null
}
}
],
"sourceLabelGroupId": "string",
"olderFundsCount": null,
"unresolvedReasons": [
"string"
],
"displayContext": {
"reason": "string",
"currentOutputCount": null,
"sourceCount": null,
"actionTypes": [
"string"
]
},
"funding": {
"labelGroupId": "string",
"olderFundsCount": null,
"unresolvedReasons": [
"string"
]
},
"association": {
"status": "string",
"labelGroupId": "string",
"olderFundsCount": null,
"unresolvedReasons": [
"string"
],
"ignoredUnsolicitedCount": null,
"summary": {
"sourceCount": null,
"userTaggedSourceCount": null,
"untaggedSourceCount": null,
"olderFundsCount": null,
"unknownCount": null
}
},
"display": {
"badgeKind": "string",
"label": "string",
"fundingLabel": "string",
"associationLabel": "string"
},
"editableSource": {
"id": "string",
"kind": "string",
"origin": {
"chainId": null,
"txHash": "string",
"transferOrLogIndex": null
},
"address": "string",
"tagPayloadCiphertext": "string",
"tagPayloadUpdatedAt": "string",
"tagEligibility": "string",
"tagEditable": true,
"systemTags": [
{
"type": "string",
"text": "string",
"explanationKey": "string",
"evidence": {
"address": "string",
"origins": [
{
"origin": "string",
"displayName": "string",
"iconUrl": "string",
"lastUsedAt": "string"
}
],
"matchedOrigin": "string",
"latestUsedAt": "string"
}
}
]
}
},
"fundingAddresses": [
"string"
],
"transfers": [
{
"tokenAddress": "0x...",
"decimals": 6,
"tokenSymbol": "USDC",
"logoUrl": "string",
"fromAddress": "0x...",
"toAddress": "0x...",
"value": "1000000",
"usdAmount": 1,
"provenance": {
"status": "string",
"outputSystemTags": [
{
"type": "string",
"provider": "string",
"text": "string",
"explanationKey": "string",
"evidence": {
"chainId": null,
"txHash": "string",
"transferOrLogIndex": null,
"receiveFromAddress": "string",
"poolAddress": "string",
"entrypointAddress": "string",
"poolTransferOrLogIndex": null
}
}
],
"sourceLabelGroupId": "string",
"olderFundsCount": null,
"unresolvedReasons": [
"string"
],
"displayContext": {
"reason": "string",
"currentOutputCount": null,
"sourceCount": null,
"actionTypes": [
"string"
]
},
"funding": {
"labelGroupId": "string",
"olderFundsCount": null,
"unresolvedReasons": [
"string"
]
},
"association": {
"status": "string",
"labelGroupId": "string",
"olderFundsCount": null,
"unresolvedReasons": [
"string"
],
"ignoredUnsolicitedCount": null,
"summary": {
"sourceCount": null,
"userTaggedSourceCount": null,
"untaggedSourceCount": null,
"olderFundsCount": null,
"unknownCount": null
}
},
"display": {
"badgeKind": "string",
"label": "string",
"fundingLabel": "string",
"associationLabel": "string"
},
"editableSource": {
"id": "string",
"kind": "string",
"origin": {
"chainId": null,
"txHash": "string",
"transferOrLogIndex": null
},
"address": "string",
"tagPayloadCiphertext": "string",
"tagPayloadUpdatedAt": "string",
"tagEligibility": "string",
"tagEditable": true,
"systemTags": [
{
"type": "string",
"text": "string",
"explanationKey": "string",
"evidence": {
"address": "string",
"origins": [
{
"origin": "string",
"displayName": "string",
"iconUrl": "string",
"lastUsedAt": "string"
}
],
"matchedOrigin": "string",
"latestUsedAt": "string"
}
}
]
}
}
}
],
"swap": {
"sourceTokenAddress": "0x...",
"sourceDecimals": 6,
"sourceTokenSymbol": "USDC",
"sourceLogoUrl": "string",
"sourceAmount": "1000000",
"sourceUsdAmount": 1,
"destTokenAddress": "0x...",
"destTokenSymbol": "WETH",
"destDecimals": 18,
"destLogoUrl": "string",
"destAmount": "500000000000000",
"destUsdAmount": 0.5,
"outputRecipient": "0x...",
"outputRecipientIsOwnAddress": true
},
"bridge": {
"sourceTokenAddress": "0x...",
"sourceDecimals": 6,
"sourceTokenSymbol": "USDC",
"sourceLogoUrl": "string",
"sourceAmount": "1000000",
"sourceUsdAmount": 1,
"destTokenAddress": "0x...",
"destTokenSymbol": "USDC",
"destDecimals": 6,
"destLogoUrl": "string",
"destAmount": "1000000",
"destUsdAmount": 1,
"outputRecipient": "0x...",
"outputRecipientIsOwnAddress": true,
"bridgeStatus": "pending",
"destChainId": 8453,
"destChainName": "Base",
"destExplorerTxUrlBase": "string",
"estimatedFillTimeMs": 0,
"destTxHash": "0x...",
"refundTxHash": "0x...",
"refundEligibleAt": "string"
},
"pool": {
"poolAddress": "0x...",
"tokenAddress": "0x...",
"decimals": 18,
"tokenSymbol": "ETH",
"logoUrl": "string",
"amount": "1000000000000000",
"usdAmount": 1,
"aspStatus": "string",
"commitmentId": "string",
"vettingFee": "string",
"vettingFeeUsd": 0,
"depositFee": "string",
"depositFeeUsd": 0
},
"dappMeta": {
"origin": "string",
"description": "string",
"iconUrl": "string",
"connectedAddress": "string",
"isAccountSetup": true
},
"calldata": "string"
}
],
"pagination": {
"limit": 100,
"nextCursor": "string"
}
}400Default Response
{
"error": "Bad request",
"message": "string",
"code": "BAD_REQUEST",
"available": "0",
"tokenSymbol": "ETH",
"tokenAddress": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
"tokenDecimals": 18,
"minAmount": "0.00036 ETH",
"maxSendable": "0.018 ETH",
"feeEstimate": "1000000000000000",
"required": "1010000000000000000",
"shortfall": "1000000000000000",
"spendableCount": 1,
"maxInputs": 50,
"selectedAmount": "0.02 ETH",
"relayFee": "0.0042 ETH",
"feeLimit": "0.001 ETH",
"maxRelayFeeBPS": 1000,
"requiredRelayFeeBPS": "1523",
"selectedCount": 2,
"resolvedAddress": "string"
}401Default Response
{
"error": "Unauthorized",
"message": "string",
"code": "UNAUTHORIZED"
}404Default Response
{
"error": "Not found",
"message": "string"
}503Default Response
{
"error": "Service Unavailable",
"message": "string",
"code": "SERVER_BUSY"
}Try it
accountIdlimitcursorhideLikelySpamaddresscurl -X GET \
"https://api-stg.clkd.xyz/v1/accounts/{accountId}/activities"Search activities
/v1/accounts/{accountId}/activities/search🔒Search confirmed account activity directly involving one Ethereum address.
| Name | In | Type | Description |
|---|---|---|---|
accountId* | path | string (uuid) | Account ID |
200Default Response
{
"provenanceLabelGroups": null,
"searchSummary": {
"address": "string",
"interactionCount": 0,
"chainIds": [
0
]
},
"activity": [
{
"txHash": "0x...",
"quoteId": "string",
"chainId": 8453,
"chainName": "Base",
"explorerTxUrlBase": "https://basescan.org/tx/",
"date": "string",
"kind": "string",
"lifecycle": {
"state": "string"
},
"isExternal": false,
"isLikelySpam": false,
"fees": [
{
"tokenAddress": "0x...",
"decimals": 18,
"tokenSymbol": "ETH",
"logoUrl": "string",
"value": "1000000000000000",
"usdAmount": 0.001
}
],
"cloakedFeeBps": 0,
"sourceProvenance": {
"status": "string",
"outputSystemTags": [
{
"type": "string",
"provider": "string",
"text": "string",
"explanationKey": "string",
"evidence": {
"chainId": null,
"txHash": "string",
"transferOrLogIndex": null,
"receiveFromAddress": "string",
"poolAddress": "string",
"entrypointAddress": "string",
"poolTransferOrLogIndex": null
}
}
],
"sourceLabelGroupId": "string",
"olderFundsCount": null,
"unresolvedReasons": [
"string"
],
"displayContext": {
"reason": "string",
"currentOutputCount": null,
"sourceCount": null,
"actionTypes": [
"string"
]
},
"funding": {
"labelGroupId": "string",
"olderFundsCount": null,
"unresolvedReasons": [
"string"
]
},
"association": {
"status": "string",
"labelGroupId": "string",
"olderFundsCount": null,
"unresolvedReasons": [
"string"
],
"ignoredUnsolicitedCount": null,
"summary": {
"sourceCount": null,
"userTaggedSourceCount": null,
"untaggedSourceCount": null,
"olderFundsCount": null,
"unknownCount": null
}
},
"display": {
"badgeKind": "string",
"label": "string",
"fundingLabel": "string",
"associationLabel": "string"
},
"editableSource": {
"id": "string",
"kind": "string",
"origin": {
"chainId": null,
"txHash": "string",
"transferOrLogIndex": null
},
"address": "string",
"tagPayloadCiphertext": "string",
"tagPayloadUpdatedAt": "string",
"tagEligibility": "string",
"tagEditable": true,
"systemTags": [
{
"type": "string",
"text": "string",
"explanationKey": "string",
"evidence": {
"address": "string",
"origins": [
{
"origin": "string",
"displayName": "string",
"iconUrl": "string",
"lastUsedAt": "string"
}
],
"matchedOrigin": "string",
"latestUsedAt": "string"
}
}
]
}
},
"fundingAddresses": [
"string"
],
"transfers": [
{
"tokenAddress": "0x...",
"decimals": 6,
"tokenSymbol": "USDC",
"logoUrl": "string",
"fromAddress": "0x...",
"toAddress": "0x...",
"value": "1000000",
"usdAmount": 1,
"provenance": {
"status": "string",
"outputSystemTags": [
{
"type": "string",
"provider": "string",
"text": "string",
"explanationKey": "string",
"evidence": {
"chainId": null,
"txHash": "string",
"transferOrLogIndex": null,
"receiveFromAddress": "string",
"poolAddress": "string",
"entrypointAddress": "string",
"poolTransferOrLogIndex": null
}
}
],
"sourceLabelGroupId": "string",
"olderFundsCount": null,
"unresolvedReasons": [
"string"
],
"displayContext": {
"reason": "string",
"currentOutputCount": null,
"sourceCount": null,
"actionTypes": [
"string"
]
},
"funding": {
"labelGroupId": "string",
"olderFundsCount": null,
"unresolvedReasons": [
"string"
]
},
"association": {
"status": "string",
"labelGroupId": "string",
"olderFundsCount": null,
"unresolvedReasons": [
"string"
],
"ignoredUnsolicitedCount": null,
"summary": {
"sourceCount": null,
"userTaggedSourceCount": null,
"untaggedSourceCount": null,
"olderFundsCount": null,
"unknownCount": null
}
},
"display": {
"badgeKind": "string",
"label": "string",
"fundingLabel": "string",
"associationLabel": "string"
},
"editableSource": {
"id": "string",
"kind": "string",
"origin": {
"chainId": null,
"txHash": "string",
"transferOrLogIndex": null
},
"address": "string",
"tagPayloadCiphertext": "string",
"tagPayloadUpdatedAt": "string",
"tagEligibility": "string",
"tagEditable": true,
"systemTags": [
{
"type": "string",
"text": "string",
"explanationKey": "string",
"evidence": {
"address": "string",
"origins": [
{
"origin": "string",
"displayName": "string",
"iconUrl": "string",
"lastUsedAt": "string"
}
],
"matchedOrigin": "string",
"latestUsedAt": "string"
}
}
]
}
}
}
],
"swap": {
"sourceTokenAddress": "0x...",
"sourceDecimals": 6,
"sourceTokenSymbol": "USDC",
"sourceLogoUrl": "string",
"sourceAmount": "1000000",
"sourceUsdAmount": 1,
"destTokenAddress": "0x...",
"destTokenSymbol": "WETH",
"destDecimals": 18,
"destLogoUrl": "string",
"destAmount": "500000000000000",
"destUsdAmount": 0.5,
"outputRecipient": "0x...",
"outputRecipientIsOwnAddress": true
},
"bridge": {
"sourceTokenAddress": "0x...",
"sourceDecimals": 6,
"sourceTokenSymbol": "USDC",
"sourceLogoUrl": "string",
"sourceAmount": "1000000",
"sourceUsdAmount": 1,
"destTokenAddress": "0x...",
"destTokenSymbol": "USDC",
"destDecimals": 6,
"destLogoUrl": "string",
"destAmount": "1000000",
"destUsdAmount": 1,
"outputRecipient": "0x...",
"outputRecipientIsOwnAddress": true,
"bridgeStatus": "pending",
"destChainId": 8453,
"destChainName": "Base",
"destExplorerTxUrlBase": "string",
"estimatedFillTimeMs": 0,
"destTxHash": "0x...",
"refundTxHash": "0x...",
"refundEligibleAt": "string"
},
"pool": {
"poolAddress": "0x...",
"tokenAddress": "0x...",
"decimals": 18,
"tokenSymbol": "ETH",
"logoUrl": "string",
"amount": "1000000000000000",
"usdAmount": 1,
"aspStatus": "string",
"commitmentId": "string",
"vettingFee": "string",
"vettingFeeUsd": 0,
"depositFee": "string",
"depositFeeUsd": 0
},
"dappMeta": {
"origin": "string",
"description": "string",
"iconUrl": "string",
"connectedAddress": "string",
"isAccountSetup": true
},
"calldata": "string"
}
],
"pagination": {
"limit": 100,
"nextCursor": "string"
}
}400Default Response
{
"error": "Bad request",
"message": "string",
"code": "BAD_REQUEST",
"available": "0",
"tokenSymbol": "ETH",
"tokenAddress": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
"tokenDecimals": 18,
"minAmount": "0.00036 ETH",
"maxSendable": "0.018 ETH",
"feeEstimate": "1000000000000000",
"required": "1010000000000000000",
"shortfall": "1000000000000000",
"spendableCount": 1,
"maxInputs": 50,
"selectedAmount": "0.02 ETH",
"relayFee": "0.0042 ETH",
"feeLimit": "0.001 ETH",
"maxRelayFeeBPS": 1000,
"requiredRelayFeeBPS": "1523",
"selectedCount": 2,
"resolvedAddress": "string"
}401Default Response
{
"error": "Unauthorized",
"message": "string",
"code": "UNAUTHORIZED"
}404Default Response
{
"error": "Not found",
"message": "string"
}503Default Response
{
"error": "Service Unavailable",
"message": "string",
"code": "SERVER_BUSY"
}Try it
accountIdcurl -X POST \
-H "Content-Type: application/json" \
-d '{
"address": "",
"filters": {
"hideLikelySpam": true
},
"pagination": {
"limit": null,
"cursor": ""
},
"include": {
"summary": true
}
}' \
"https://api-stg.clkd.xyz/v1/accounts/{accountId}/activities/search"Get pending activity statuses
/v1/accounts/{accountId}/activities/pending/status🔒Return the current lifecycle projection for known pending activity quote IDs. Missing or no-longer-pending IDs are omitted.
| Name | In | Type | Description |
|---|---|---|---|
accountId* | path | string (uuid) | Account ID |
200Default Response
{
"statuses": [
{
"quoteId": "string",
"txHash": "string",
"lifecycle": {
"state": "string",
"relayStatus": "string"
},
"updatedAt": "string"
}
]
}400Default Response
{
"error": "Bad request",
"message": "string",
"code": "BAD_REQUEST",
"available": "0",
"tokenSymbol": "ETH",
"tokenAddress": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
"tokenDecimals": 18,
"minAmount": "0.00036 ETH",
"maxSendable": "0.018 ETH",
"feeEstimate": "1000000000000000",
"required": "1010000000000000000",
"shortfall": "1000000000000000",
"spendableCount": 1,
"maxInputs": 50,
"selectedAmount": "0.02 ETH",
"relayFee": "0.0042 ETH",
"feeLimit": "0.001 ETH",
"maxRelayFeeBPS": 1000,
"requiredRelayFeeBPS": "1523",
"selectedCount": 2,
"resolvedAddress": "string"
}401Default Response
{
"error": "Unauthorized",
"message": "string",
"code": "UNAUTHORIZED"
}404Default Response
{
"error": "Not found",
"message": "string"
}429Default Response
{
"error": "Too Many Requests",
"message": "Rate limit exceeded. Maximum 60 requests per 1 minute."
}503Default Response
{
"error": "Service Unavailable",
"message": "string",
"code": "SERVER_BUSY"
}Try it
accountIdcurl -X POST \
-H "Content-Type: application/json" \
-d '{
"quoteIds": [
""
]
}' \
"https://api-stg.clkd.xyz/v1/accounts/{accountId}/activities/pending/status"Get pending activities
/v1/accounts/{accountId}/activities/pending🔒List in-flight relay transactions (queued, pending, stuck) and recently confirmed/failed transactions for the account. The response uses the same shape as GET /activities: same kind values, same payload sub-objects. The lifecycle.state discriminates between 'in_flight', 'indexed', and 'failed'. Recently confirmed transactions are included for up to 5 minutes so the client can show continuous state while the transaction is indexed.
| Name | In | Type | Description |
|---|---|---|---|
address | query | string | Owned address to scope pending activity to. |
accountId* | path | string (uuid) | Account ID |
200Default Response
{
"provenanceLabelGroups": null,
"pending": [
{
"txHash": "0x...",
"quoteId": "string",
"chainId": 8453,
"chainName": "Base",
"explorerTxUrlBase": "https://basescan.org/tx/",
"date": "string",
"kind": "string",
"lifecycle": {
"state": "string"
},
"isExternal": false,
"isLikelySpam": false,
"fees": [
{
"tokenAddress": "0x...",
"decimals": 18,
"tokenSymbol": "ETH",
"logoUrl": "string",
"value": "1000000000000000",
"usdAmount": 0.001
}
],
"cloakedFeeBps": 0,
"sourceProvenance": {
"status": "string",
"outputSystemTags": [
{
"type": "string",
"provider": "string",
"text": "string",
"explanationKey": "string",
"evidence": {
"chainId": null,
"txHash": "string",
"transferOrLogIndex": null,
"receiveFromAddress": "string",
"poolAddress": "string",
"entrypointAddress": "string",
"poolTransferOrLogIndex": null
}
}
],
"sourceLabelGroupId": "string",
"olderFundsCount": null,
"unresolvedReasons": [
"string"
],
"displayContext": {
"reason": "string",
"currentOutputCount": null,
"sourceCount": null,
"actionTypes": [
"string"
]
},
"funding": {
"labelGroupId": "string",
"olderFundsCount": null,
"unresolvedReasons": [
"string"
]
},
"association": {
"status": "string",
"labelGroupId": "string",
"olderFundsCount": null,
"unresolvedReasons": [
"string"
],
"ignoredUnsolicitedCount": null,
"summary": {
"sourceCount": null,
"userTaggedSourceCount": null,
"untaggedSourceCount": null,
"olderFundsCount": null,
"unknownCount": null
}
},
"display": {
"badgeKind": "string",
"label": "string",
"fundingLabel": "string",
"associationLabel": "string"
},
"editableSource": {
"id": "string",
"kind": "string",
"origin": {
"chainId": null,
"txHash": "string",
"transferOrLogIndex": null
},
"address": "string",
"tagPayloadCiphertext": "string",
"tagPayloadUpdatedAt": "string",
"tagEligibility": "string",
"tagEditable": true,
"systemTags": [
{
"type": "string",
"text": "string",
"explanationKey": "string",
"evidence": {
"address": "string",
"origins": [
{
"origin": "string",
"displayName": "string",
"iconUrl": "string",
"lastUsedAt": "string"
}
],
"matchedOrigin": "string",
"latestUsedAt": "string"
}
}
]
}
},
"fundingAddresses": [
"string"
],
"transfers": [
{
"tokenAddress": "0x...",
"decimals": 6,
"tokenSymbol": "USDC",
"logoUrl": "string",
"fromAddress": "0x...",
"toAddress": "0x...",
"value": "1000000",
"usdAmount": 1,
"provenance": {
"status": "string",
"outputSystemTags": [
{
"type": "string",
"provider": "string",
"text": "string",
"explanationKey": "string",
"evidence": {
"chainId": null,
"txHash": "string",
"transferOrLogIndex": null,
"receiveFromAddress": "string",
"poolAddress": "string",
"entrypointAddress": "string",
"poolTransferOrLogIndex": null
}
}
],
"sourceLabelGroupId": "string",
"olderFundsCount": null,
"unresolvedReasons": [
"string"
],
"displayContext": {
"reason": "string",
"currentOutputCount": null,
"sourceCount": null,
"actionTypes": [
"string"
]
},
"funding": {
"labelGroupId": "string",
"olderFundsCount": null,
"unresolvedReasons": [
"string"
]
},
"association": {
"status": "string",
"labelGroupId": "string",
"olderFundsCount": null,
"unresolvedReasons": [
"string"
],
"ignoredUnsolicitedCount": null,
"summary": {
"sourceCount": null,
"userTaggedSourceCount": null,
"untaggedSourceCount": null,
"olderFundsCount": null,
"unknownCount": null
}
},
"display": {
"badgeKind": "string",
"label": "string",
"fundingLabel": "string",
"associationLabel": "string"
},
"editableSource": {
"id": "string",
"kind": "string",
"origin": {
"chainId": null,
"txHash": "string",
"transferOrLogIndex": null
},
"address": "string",
"tagPayloadCiphertext": "string",
"tagPayloadUpdatedAt": "string",
"tagEligibility": "string",
"tagEditable": true,
"systemTags": [
{
"type": "string",
"text": "string",
"explanationKey": "string",
"evidence": {
"address": "string",
"origins": [
{
"origin": "string",
"displayName": "string",
"iconUrl": "string",
"lastUsedAt": "string"
}
],
"matchedOrigin": "string",
"latestUsedAt": "string"
}
}
]
}
}
}
],
"swap": {
"sourceTokenAddress": "0x...",
"sourceDecimals": 6,
"sourceTokenSymbol": "USDC",
"sourceLogoUrl": "string",
"sourceAmount": "1000000",
"sourceUsdAmount": 1,
"destTokenAddress": "0x...",
"destTokenSymbol": "WETH",
"destDecimals": 18,
"destLogoUrl": "string",
"destAmount": "500000000000000",
"destUsdAmount": 0.5,
"outputRecipient": "0x...",
"outputRecipientIsOwnAddress": true
},
"bridge": {
"sourceTokenAddress": "0x...",
"sourceDecimals": 6,
"sourceTokenSymbol": "USDC",
"sourceLogoUrl": "string",
"sourceAmount": "1000000",
"sourceUsdAmount": 1,
"destTokenAddress": "0x...",
"destTokenSymbol": "USDC",
"destDecimals": 6,
"destLogoUrl": "string",
"destAmount": "1000000",
"destUsdAmount": 1,
"outputRecipient": "0x...",
"outputRecipientIsOwnAddress": true,
"bridgeStatus": "pending",
"destChainId": 8453,
"destChainName": "Base",
"destExplorerTxUrlBase": "string",
"estimatedFillTimeMs": 0,
"destTxHash": "0x...",
"refundTxHash": "0x...",
"refundEligibleAt": "string"
},
"pool": {
"poolAddress": "0x...",
"tokenAddress": "0x...",
"decimals": 18,
"tokenSymbol": "ETH",
"logoUrl": "string",
"amount": "1000000000000000",
"usdAmount": 1,
"aspStatus": "string",
"commitmentId": "string",
"vettingFee": "string",
"vettingFeeUsd": 0,
"depositFee": "string",
"depositFeeUsd": 0
},
"dappMeta": {
"origin": "string",
"description": "string",
"iconUrl": "string",
"connectedAddress": "string",
"isAccountSetup": true
},
"calldata": "string"
}
]
}400Default Response
{
"error": "Bad request",
"message": "string",
"code": "BAD_REQUEST",
"available": "0",
"tokenSymbol": "ETH",
"tokenAddress": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
"tokenDecimals": 18,
"minAmount": "0.00036 ETH",
"maxSendable": "0.018 ETH",
"feeEstimate": "1000000000000000",
"required": "1010000000000000000",
"shortfall": "1000000000000000",
"spendableCount": 1,
"maxInputs": 50,
"selectedAmount": "0.02 ETH",
"relayFee": "0.0042 ETH",
"feeLimit": "0.001 ETH",
"maxRelayFeeBPS": 1000,
"requiredRelayFeeBPS": "1523",
"selectedCount": 2,
"resolvedAddress": "string"
}401Default Response
{
"error": "Unauthorized",
"message": "string",
"code": "UNAUTHORIZED"
}404Default Response
{
"error": "Not found",
"message": "string"
}503Default Response
{
"error": "Service Unavailable",
"message": "string",
"code": "SERVER_BUSY"
}Try it
accountIdaddresscurl -X GET \
"https://api-stg.clkd.xyz/v1/accounts/{accountId}/activities/pending"List activity notes
/v1/accounts/{accountId}/activity-notes🔒List client-encrypted private notes attached to account activity.
| Name | In | Type | Description |
|---|---|---|---|
limit | query | integer | — |
cursor | query | string | — |
accountId* | path | string (uuid) | Account ID |
200Default Response
{
"notes": [
{
"reference": {
"type": "string",
"quoteId": "string"
},
"notePayloadCiphertext": "string",
"notePayloadUpdatedAt": "string"
}
],
"pagination": {
"limit": null,
"nextCursor": "string"
}
}400Default Response
{
"error": "Bad request",
"message": "string",
"code": "BAD_REQUEST",
"available": "0",
"tokenSymbol": "ETH",
"tokenAddress": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
"tokenDecimals": 18,
"minAmount": "0.00036 ETH",
"maxSendable": "0.018 ETH",
"feeEstimate": "1000000000000000",
"required": "1010000000000000000",
"shortfall": "1000000000000000",
"spendableCount": 1,
"maxInputs": 50,
"selectedAmount": "0.02 ETH",
"relayFee": "0.0042 ETH",
"feeLimit": "0.001 ETH",
"maxRelayFeeBPS": 1000,
"requiredRelayFeeBPS": "1523",
"selectedCount": 2,
"resolvedAddress": "string"
}401Default Response
{
"error": "Unauthorized",
"message": "string",
"code": "UNAUTHORIZED"
}403Default Response
{
"error": "Forbidden",
"message": "string"
}429Default Response
{
"error": "Too Many Requests",
"message": "Rate limit exceeded. Maximum 60 requests per 1 minute."
}Try it
accountIdlimitcursorcurl -X GET \
"https://api-stg.clkd.xyz/v1/accounts/{accountId}/activity-notes"Set activity note
/v1/accounts/{accountId}/activity-notes🔒Set or clear a client-encrypted private note on one account activity.
| Name | In | Type | Description |
|---|---|---|---|
accountId* | path | string (uuid) | Account ID |
200Default Response
{
"note": {
"reference": {
"type": "string",
"quoteId": "string"
},
"notePayloadCiphertext": "string",
"notePayloadUpdatedAt": "string"
}
}400Default Response
{
"error": "Bad request",
"message": "string",
"code": "BAD_REQUEST",
"available": "0",
"tokenSymbol": "ETH",
"tokenAddress": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
"tokenDecimals": 18,
"minAmount": "0.00036 ETH",
"maxSendable": "0.018 ETH",
"feeEstimate": "1000000000000000",
"required": "1010000000000000000",
"shortfall": "1000000000000000",
"spendableCount": 1,
"maxInputs": 50,
"selectedAmount": "0.02 ETH",
"relayFee": "0.0042 ETH",
"feeLimit": "0.001 ETH",
"maxRelayFeeBPS": 1000,
"requiredRelayFeeBPS": "1523",
"selectedCount": 2,
"resolvedAddress": "string"
}401Default Response
{
"error": "Unauthorized",
"message": "string",
"code": "UNAUTHORIZED"
}403Default Response
{
"error": "Forbidden",
"message": "string"
}404Default Response
{
"error": "Not found",
"message": "string"
}429Default Response
{
"error": "Too Many Requests",
"message": "Rate limit exceeded. Maximum 60 requests per 1 minute."
}Try it
accountIdcurl -X PUT \
-H "Content-Type: application/json" \
-d '{
"reference": {
"type": "",
"quoteId": ""
},
"notePayloadCiphertext": ""
}' \
"https://api-stg.clkd.xyz/v1/accounts/{accountId}/activity-notes"Get deposit review summary
/v1/accounts/{accountId}/deposit-review/summary🔒Return deposit review counts and address markers for the account.
| Name | In | Type | Description |
|---|---|---|---|
accountId* | path | string (uuid) | Account ID |
200Default Response
{
"needsReviewCount": null,
"unseenNeedsReview": null,
"markers": [
{
"address": "string"
}
]
}401Default Response
{
"error": "Unauthorized",
"message": "string",
"code": "UNAUTHORIZED"
}403Default Response
{
"error": "Forbidden",
"message": "string"
}429Default Response
{
"error": "Too Many Requests",
"message": "Rate limit exceeded. Maximum 60 requests per 1 minute."
}503Default Response
{
"error": "Service Unavailable",
"message": "string",
"code": "SERVER_BUSY"
}Try it
accountIdcurl -X GET \
"https://api-stg.clkd.xyz/v1/accounts/{accountId}/deposit-review/summary"Get deposit review
/v1/accounts/{accountId}/deposit-review🔒Return one review row per fresh inbound address, including current review state, visible assets, tags, and Incognito deposit progress.
| Name | In | Type | Description |
|---|---|---|---|
tab | query | any | — |
cursor | query | string | — |
limit | query | integer | — |
accountId* | path | string (uuid) | Account ID |
200Default Response
{
"items": [
{
"id": "string",
"address": "string",
"reviewStatus": "string",
"statusReason": "string",
"provenanceSources": [
{
"id": "string",
"kind": "string",
"origin": {
"chainId": null,
"txHash": "string",
"transferOrLogIndex": null
},
"address": "string",
"tagPayloadCiphertext": "string",
"tagPayloadUpdatedAt": "string",
"tagEligibility": "string",
"tagEditable": true,
"systemTags": [
{
"type": "string",
"text": "string",
"explanationKey": "string",
"evidence": {
"address": "string",
"origins": [
{
"origin": "string",
"displayName": "string",
"iconUrl": "string",
"lastUsedAt": "string"
}
],
"matchedOrigin": "string",
"latestUsedAt": "string"
}
}
]
}
],
"assets": [
{
"id": "string",
"address": "string",
"reviewStatus": "string",
"statusReason": "string",
"chainId": null,
"chainName": "string",
"tokenAddress": "string",
"tokenSymbol": "string",
"decimals": null,
"logoUrl": "string",
"amount": "string",
"available": "string",
"pending": "string",
"receiveCount": null,
"rawReceiveCount": null,
"trustedReceiveActionCount": null,
"trustedReceiveActionTypes": [
"string"
],
"lastReceivedAt": "string",
"receiveTxHash": "string",
"usdAmount": 0,
"pricePerToken": 0,
"poolMinDeposit": "string",
"canConvert": true,
"convertUnavailableReason": "string",
"poolDeposit": {
"commitmentId": "string",
"status": "string",
"txHash": "string",
"amount": "string",
"updatedAt": "string"
}
}
],
"primaryAsset": {
"id": "string",
"address": "string",
"reviewStatus": "string",
"statusReason": "string",
"chainId": null,
"chainName": "string",
"tokenAddress": "string",
"tokenSymbol": "string",
"decimals": null,
"logoUrl": "string",
"amount": "string",
"available": "string",
"pending": "string",
"receiveCount": null,
"rawReceiveCount": null,
"trustedReceiveActionCount": null,
"trustedReceiveActionTypes": [
"string"
],
"lastReceivedAt": "string",
"receiveTxHash": "string",
"usdAmount": 0,
"pricePerToken": 0,
"poolMinDeposit": "string",
"canConvert": true,
"convertUnavailableReason": "string",
"poolDeposit": {
"commitmentId": "string",
"status": "string",
"txHash": "string",
"amount": "string",
"updatedAt": "string"
}
},
"receiveCount": null,
"rawReceiveCount": null,
"trustedReceiveActionCount": null,
"trustedReceiveActionTypes": [
"string"
],
"assetCount": null,
"chainCount": null,
"lastReceivedAt": "string",
"usdAmount": 0,
"canConvert": true
}
],
"counts": {
"needsReview": null,
"inProgress": null,
"done": null
},
"pageInfo": {
"nextCursor": "string",
"hasMore": true,
"limit": null
},
"unseenNeedsReview": null
}401Default Response
{
"error": "Unauthorized",
"message": "string",
"code": "UNAUTHORIZED"
}403Default Response
{
"error": "Forbidden",
"message": "string"
}429Default Response
{
"error": "Too Many Requests",
"message": "Rate limit exceeded. Maximum 60 requests per 1 minute."
}503Default Response
{
"error": "Service Unavailable",
"message": "string",
"code": "SERVER_BUSY"
}Try it
accountIdtabcursorlimitcurl -X GET \
"https://api-stg.clkd.xyz/v1/accounts/{accountId}/deposit-review"Mark deposit review seen
/v1/accounts/{accountId}/deposit-review/seen🔒Mark the account's deposit-review notifications as seen, clearing the Review badge. Idempotent; the marker only moves forward.
| Name | In | Type | Description |
|---|---|---|---|
accountId* | path | string (uuid) | Account ID |
200Default Response
{
"seenAt": "string"
}401Default Response
{
"error": "Unauthorized",
"message": "string",
"code": "UNAUTHORIZED"
}403Default Response
{
"error": "Forbidden",
"message": "string"
}429Default Response
{
"error": "Too Many Requests",
"message": "Rate limit exceeded. Maximum 60 requests per 1 minute."
}Try it
accountIdcurl -X POST \
"https://api-stg.clkd.xyz/v1/accounts/{accountId}/deposit-review/seen"Transact
Sending, swapping, bridging, converting to incognito, and cashing out all follow the same flow: get a quote, then submit.
Get quote signer public key
/v1/.well-known/quote-signer-public-keyRetrieve the server's P-256 ECDSA public key so clients can verify that quote responses were authentically signed by the server and haven't been tampered with.
200Default Response
{
"publicKey": "04...",
"format": "hex",
"curve": "P-256",
"algorithm": "ECDSA"
}Try it
curl -X GET \
"https://api-stg.clkd.xyz/v1/.well-known/quote-signer-public-key"List supported pools
/v1/supported-pools🔒List privacy pools available to the authenticated user, including pool contract addresses, accepted tokens, deposit limits, and ASP (Association Set Provider) details. Feature-flagged pools are only included when the flag is enabled for the account.
200Default Response
[
{
"provider": "string",
"poolAddress": "0x...",
"chainId": 1,
"chainName": "Ethereum",
"token": "0x...",
"tokenSymbol": "ETH",
"decimals": 18,
"logoUrl": "https://...",
"minDeposit": "10000000000000000",
"maxDeposit": "100000000000000000000",
"totalBalance": "2659000000000000000000",
"scope": "12345678901234567890",
"asp": {
"name": "0xbow",
"policyUrl": "https://0xbow.io/policy"
},
"maxRelayFeeBPS": 1000,
"withdrawalFeePerProofWei": "95000000000000"
}
]Try it
curl -X GET \
"https://api-stg.clkd.xyz/v1/supported-pools"List provenance address tags
/v1/accounts/{accountId}/provenance-address-tags🔒List encrypted display tag payload ciphertexts for owned addresses.
| Name | In | Type | Description |
|---|---|---|---|
accountId* | path | string (uuid) | Account ID |
200Default Response
{
"tags": [
{
"address": "string",
"tagPayloadCiphertext": "string",
"tagPayloadUpdatedAt": "string"
}
]
}401Default Response
{
"error": "Unauthorized",
"message": "string",
"code": "UNAUTHORIZED"
}403Default Response
{
"error": "Forbidden",
"message": "string"
}429Default Response
{
"error": "Too Many Requests",
"message": "Rate limit exceeded. Maximum 60 requests per 1 minute."
}Try it
accountIdcurl -X GET \
"https://api-stg.clkd.xyz/v1/accounts/{accountId}/provenance-address-tags"Set provenance address tags
/v1/accounts/{accountId}/provenance-address-tags/{address}🔒Set or clear encrypted display tag payload ciphertext for an owned address.
| Name | In | Type | Description |
|---|---|---|---|
accountId* | path | string (uuid) | Account ID |
address* | path | string | Owned address whose private tags should be updated |
200Default Response
{
"tag": {
"address": "string",
"tagPayloadCiphertext": "string",
"tagPayloadUpdatedAt": "string"
}
}400Default Response
{
"error": "Bad request",
"message": "string",
"code": "BAD_REQUEST",
"available": "0",
"tokenSymbol": "ETH",
"tokenAddress": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
"tokenDecimals": 18,
"minAmount": "0.00036 ETH",
"maxSendable": "0.018 ETH",
"feeEstimate": "1000000000000000",
"required": "1010000000000000000",
"shortfall": "1000000000000000",
"spendableCount": 1,
"maxInputs": 50,
"selectedAmount": "0.02 ETH",
"relayFee": "0.0042 ETH",
"feeLimit": "0.001 ETH",
"maxRelayFeeBPS": 1000,
"requiredRelayFeeBPS": "1523",
"selectedCount": 2,
"resolvedAddress": "string"
}401Default Response
{
"error": "Unauthorized",
"message": "string",
"code": "UNAUTHORIZED"
}403Default Response
{
"error": "Forbidden",
"message": "string"
}404Default Response
{
"error": "Not found",
"message": "string"
}429Default Response
{
"error": "Too Many Requests",
"message": "Rate limit exceeded. Maximum 60 requests per 1 minute."
}Try it
accountIdaddresscurl -X PUT \
-H "Content-Type: application/json" \
-d '{
"tagPayloadCiphertext": ""
}' \
"https://api-stg.clkd.xyz/v1/accounts/{accountId}/provenance-address-tags/{address}"Get address balances
/v1/accounts/{accountId}/address-balances🔒List address-held balances grouped by address, enriched with token metadata, dApp usage, receive history, and provenance metadata.
| Name | In | Type | Description |
|---|---|---|---|
purpose | query | string | Select addresses with unlocked funds that may fund a transaction, excluding addresses reserved for active Cloakie deposits. Use available for the fundable amount; amount, usdAmount, and totalUsdBalance continue to include locked funds. Requires chainId and token. |
address | query | string | Return balances for this exact owned address only |
chainId | query | number | Filter balances to one chain ID |
token | query | string | Filter balances to one token address |
dappOrigin | query | string | Filter recently-used addresses by this dApp origin |
limit | query | number | Max addresses to return. Omit to return all. |
offset | query | number | — |
accountId* | path | string (uuid) | Account ID |
200Default Response
{
"provenanceLabelGroups": null,
"dapp": {
"origin": "string",
"displayName": "string",
"iconUrl": "string",
"recognitionStatus": "string",
"verified": true
},
"addresses": [
{
"address": "string",
"nonce": "string",
"usedOrigins": [
"string"
],
"usedApps": [
{
"origin": "string",
"displayName": "string",
"iconUrl": "string"
}
],
"recentlyUsedByDapp": true,
"totalUsdBalance": 0,
"balances": [
{
"chainId": 0,
"chainName": "string",
"token": "string",
"tokenSymbol": "string",
"decimals": 0,
"logoUrl": "string",
"amount": "string",
"available": "string",
"pending": "string",
"usdAmount": 0,
"pricePerToken": 0,
"priceStale": true,
"listed": true,
"idCount": 0,
"addressSummary": {
"receiveCount": 0,
"rawReceiveCount": 0,
"trustedReceiveActionCount": 0,
"trustedReceiveActionTypes": [
"string"
],
"assetCount": 0,
"chainCount": 0,
"assets": [
{
"chainId": 0,
"chainName": "string",
"token": "string",
"tokenSymbol": "string",
"decimals": 0,
"logoUrl": "string",
"amount": "string",
"usdAmount": 0,
"pricePerToken": 0
}
]
},
"provenance": {
"status": "string",
"outputSystemTags": [
{
"type": "string",
"provider": "string",
"text": "string",
"explanationKey": "string",
"evidence": {
"chainId": null,
"txHash": "string",
"transferOrLogIndex": null,
"receiveFromAddress": "string",
"poolAddress": "string",
"entrypointAddress": "string",
"poolTransferOrLogIndex": null
}
}
],
"sourceLabelGroupId": "string",
"olderFundsCount": null,
"unresolvedReasons": [
"string"
],
"displayContext": {
"reason": "string",
"currentOutputCount": null,
"sourceCount": null,
"actionTypes": [
"string"
]
},
"funding": {
"labelGroupId": "string",
"olderFundsCount": null,
"unresolvedReasons": [
"string"
]
},
"association": {
"status": "string",
"labelGroupId": "string",
"olderFundsCount": null,
"unresolvedReasons": [
"string"
],
"ignoredUnsolicitedCount": null,
"summary": {
"sourceCount": null,
"userTaggedSourceCount": null,
"untaggedSourceCount": null,
"olderFundsCount": null,
"unknownCount": null
}
},
"display": {
"badgeKind": "string",
"label": "string",
"fundingLabel": "string",
"associationLabel": "string"
},
"editableSource": {
"id": "string",
"kind": "string",
"origin": {
"chainId": null,
"txHash": "string",
"transferOrLogIndex": null
},
"address": "string",
"tagPayloadCiphertext": "string",
"tagPayloadUpdatedAt": "string",
"tagEligibility": "string",
"tagEditable": true,
"systemTags": [
{
"type": "string",
"text": "string",
"explanationKey": "string",
"evidence": {
"address": "string",
"origins": [
{
"origin": "string",
"displayName": "string",
"iconUrl": "string",
"lastUsedAt": "string"
}
],
"matchedOrigin": "string",
"latestUsedAt": "string"
}
}
]
}
},
"lastReceivedAt": "string"
}
]
}
],
"total": 0
}400Default Response
{
"error": "Bad request",
"message": "string",
"code": "BAD_REQUEST",
"available": "0",
"tokenSymbol": "ETH",
"tokenAddress": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
"tokenDecimals": 18,
"minAmount": "0.00036 ETH",
"maxSendable": "0.018 ETH",
"feeEstimate": "1000000000000000",
"required": "1010000000000000000",
"shortfall": "1000000000000000",
"spendableCount": 1,
"maxInputs": 50,
"selectedAmount": "0.02 ETH",
"relayFee": "0.0042 ETH",
"feeLimit": "0.001 ETH",
"maxRelayFeeBPS": 1000,
"requiredRelayFeeBPS": "1523",
"selectedCount": 2,
"resolvedAddress": "string"
}401Default Response
{
"error": "Unauthorized",
"message": "string",
"code": "UNAUTHORIZED"
}403Default Response
{
"error": "Forbidden",
"message": "string"
}429Default Response
{
"error": "Too Many Requests",
"message": "Rate limit exceeded. Maximum 60 requests per 1 minute."
}503Default Response
{
"error": "Service Unavailable",
"message": "string",
"code": "SERVER_BUSY"
}Try it
accountIdpurposeaddresschainIdtokendappOriginlimitoffsetcurl -X GET \
"https://api-stg.clkd.xyz/v1/accounts/{accountId}/address-balances"Create quote
/v1/accounts/{accountId}/quote🔒Unified quote endpoint. For type=send: reserves balances and returns signing data. For type=swap: reserves balances and returns swap intents via Uniswap.
| Name | In | Type | Description |
|---|---|---|---|
accountId* | path | string (uuid) | Account ID |
idempotency-key | header | string | Client-generated key for one account, HTTP operation, and exact request body. Reuse it only to retry that same operation; a completed retry returns the stored response. Keys expire after 24 hours. |
200Default Response
{
"intents": [
{
"chainId": 0,
"eoa": "string",
"executionData": "string",
"nonce": "string",
"derivationNonce": "string",
"payer": "string",
"paymentToken": "string",
"paymentMaxAmount": "string",
"combinedGas": "string",
"encodedPreCalls": [
"string"
],
"encodedFundTransfers": [
"string"
],
"settler": "string",
"expiry": "string",
"isMultichain": true,
"funder": "string",
"funderSignature": "string",
"settlerContext": "string",
"paymentAmount": "string",
"paymentRecipient": "string",
"paymentSignature": "string",
"supportedAccountImplementation": "string",
"domain": {
"name": "string",
"version": "string",
"chainId": 0,
"verifyingContract": "string"
},
"types": null,
"primaryType": "string"
}
],
"delegations": [
{
"chainId": 0,
"address": "string",
"contractAddress": "string",
"derivationNonce": 0,
"authorizationNonce": 0
}
],
"signingReview": {
"version": 0,
"intents": [
{
"userActionCallIndices": [
null
],
"simulationCallIndices": [
null
],
"calldataCaveats": [
{
"callIndex": null,
"kind": "string",
"policyVersion": 0,
"verifier": "string",
"suffixLength": null,
"canonicalCalldataHash": "string",
"suffixHash": "string"
}
]
}
]
},
"quoteId": "string",
"expiresAt": "string",
"signature": "string",
"expectedOutput": "string",
"minimumOutput": "string",
"outputToken": "string",
"outputDecimals": 0,
"outputSymbol": "string",
"outputRecipient": "string",
"outputRecipientOwned": true,
"recoveryRecipient": "string",
"slippageMode": "string",
"slippageBps": 0,
"requestedSlippageBps": 0,
"routing": "string",
"bridgeProvider": "string",
"protocolFeeBps": 0,
"protocolFeeAmount": "string",
"amountIn": "string",
"selectedFundingSources": [
{
"chainId": 0,
"token": "string",
"address": "string",
"amount": "string",
"idCount": 0,
"addressSummary": {
"receiveCount": 0,
"rawReceiveCount": 0,
"trustedReceiveActionCount": 0,
"trustedReceiveActionTypes": [
"string"
],
"assetCount": 0,
"chainCount": 0
},
"provenance": {
"status": "string",
"outputSystemTags": [
{
"type": "string",
"provider": "string",
"text": "string",
"explanationKey": "string",
"evidence": {
"chainId": null,
"txHash": "string",
"transferOrLogIndex": null,
"receiveFromAddress": "string",
"poolAddress": "string",
"entrypointAddress": "string",
"poolTransferOrLogIndex": null
}
}
],
"sourceLabelGroupId": "string",
"olderFundsCount": null,
"unresolvedReasons": [
"string"
],
"displayContext": {
"reason": "string",
"currentOutputCount": null,
"sourceCount": null,
"actionTypes": [
"string"
]
},
"funding": {
"labelGroupId": "string",
"olderFundsCount": null,
"unresolvedReasons": [
"string"
]
},
"association": {
"status": "string",
"labelGroupId": "string",
"olderFundsCount": null,
"unresolvedReasons": [
"string"
],
"ignoredUnsolicitedCount": null,
"summary": {
"sourceCount": null,
"userTaggedSourceCount": null,
"untaggedSourceCount": null,
"olderFundsCount": null,
"unknownCount": null
}
},
"display": {
"badgeKind": "string",
"label": "string",
"fundingLabel": "string",
"associationLabel": "string"
},
"editableSource": {
"id": "string",
"kind": "string",
"origin": {
"chainId": null,
"txHash": "string",
"transferOrLogIndex": null
},
"address": "string",
"tagPayloadCiphertext": "string",
"tagPayloadUpdatedAt": "string",
"tagEligibility": "string",
"tagEditable": true,
"systemTags": [
{
"type": "string",
"text": "string",
"explanationKey": "string",
"evidence": {
"address": "string",
"origins": [
{
"origin": "string",
"displayName": "string",
"iconUrl": "string",
"lastUsedAt": "string"
}
],
"matchedOrigin": "string",
"latestUsedAt": "string"
}
}
]
}
}
}
],
"provenanceLabelGroups": null,
"priceImpact": 0,
"estimatedFillTimeMs": 0,
"fillDeadline": 0,
"planId": "string",
"fees": {
"network": "string",
"dust": "string",
"service": "string",
"networkUsdAmount": 0,
"totalUsdAmount": 0,
"vetting": "string",
"deposit": "string",
"total": "string",
"waived": true
}
}400Default Response
{
"error": "Bad request",
"message": "string",
"code": "BAD_REQUEST",
"available": "0",
"tokenSymbol": "ETH",
"tokenAddress": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
"tokenDecimals": 18,
"minAmount": "0.00036 ETH",
"maxSendable": "0.018 ETH",
"feeEstimate": "1000000000000000",
"required": "1010000000000000000",
"shortfall": "1000000000000000",
"spendableCount": 1,
"maxInputs": 50,
"selectedAmount": "0.02 ETH",
"relayFee": "0.0042 ETH",
"feeLimit": "0.001 ETH",
"maxRelayFeeBPS": 1000,
"requiredRelayFeeBPS": "1523",
"selectedCount": 2,
"resolvedAddress": "string"
}401Default Response
{
"error": "Unauthorized",
"message": "string",
"code": "UNAUTHORIZED"
}403Default Response
{
"error": "Forbidden",
"message": "string"
}409Default Response
{
"error": "Conflict",
"message": "string",
"code": "QUOTE_LOCK_CONFLICT"
}429Default Response
{
"error": "Too Many Requests",
"message": "Rate limit exceeded. Maximum 30 requests per 1 minute."
}451Default Response
{
"error": "Unavailable",
"message": "string",
"code": "string",
"recoveryUrl": "string"
}502Default Response
{
"error": "Bad Gateway",
"message": "string",
"code": "SWAP_UNAVAILABLE"
}503Default Response
{
"error": "Service Unavailable",
"message": "string",
"code": "SERVER_BUSY"
}Try it
accountIdidempotency-keycurl -X POST \
-H "Content-Type: application/json" \
-d '{
"type": "",
"chainId": 0,
"token": "",
"amount": "",
"decimals": 0,
"destinationAddress": "",
"spendableAddresses": [
""
],
"singleAddress": "",
"maxSend": true,
"executionSimulation": "",
"ttl": 0
}' \
"https://api-stg.clkd.xyz/v1/accounts/{accountId}/quote"Submit transaction
/v1/accounts/{accountId}/submit🔒Submit client-signed intents and delegations from a quote to relay the transaction on-chain. Validates signatures, checks price slippage, and submits via the server relayer so the user pays no gas directly.
| Name | In | Type | Description |
|---|---|---|---|
accountId* | path | string (uuid) | Account ID |
idempotency-key | header | string | Client-generated key for one account, HTTP operation, and exact request body. Reuse it only to retry that same operation; a completed retry returns the stored response. Keys expire after 24 hours. |
200Default Response
{
"success": true,
"quoteId": "string",
"status": "string",
"message": "string"
}400Default Response
{
"error": "Bad request",
"message": "string",
"code": "BAD_REQUEST",
"available": "0",
"tokenSymbol": "ETH",
"tokenAddress": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
"tokenDecimals": 18,
"minAmount": "0.00036 ETH",
"maxSendable": "0.018 ETH",
"feeEstimate": "1000000000000000",
"required": "1010000000000000000",
"shortfall": "1000000000000000",
"spendableCount": 1,
"maxInputs": 50,
"selectedAmount": "0.02 ETH",
"relayFee": "0.0042 ETH",
"feeLimit": "0.001 ETH",
"maxRelayFeeBPS": 1000,
"requiredRelayFeeBPS": "1523",
"selectedCount": 2,
"resolvedAddress": "string"
}401Default Response
{
"error": "Unauthorized",
"message": "string",
"code": "UNAUTHORIZED"
}403Default Response
{
"error": "Forbidden",
"message": "string"
}404Default Response
{
"error": "Not found",
"message": "string"
}409Default Response
{
"error": "Conflict",
"message": "string",
"code": "QUOTE_LOCK_CONFLICT"
}451Default Response
{
"error": "Unavailable",
"message": "string",
"code": "string",
"recoveryUrl": "string"
}503Default Response
{
"error": "Service Unavailable",
"message": "string",
"code": "SERVER_BUSY"
}Try it
accountIdidempotency-keycurl -X POST \
-H "Content-Type: application/json" \
-d '{
"intents": [
{
"chainId": 0,
"eoa": "",
"executionData": "",
"nonce": "",
"derivationNonce": "",
"payer": "",
"paymentToken": "",
"paymentMaxAmount": "",
"combinedGas": "",
"encodedPreCalls": [
""
],
"encodedFundTransfers": [
""
],
"settler": "",
"expiry": "",
"isMultichain": true,
"funder": "",
"funderSignature": "",
"settlerContext": "",
"paymentAmount": "",
"paymentRecipient": "",
"paymentSignature": "",
"supportedAccountImplementation": "",
"domain": {
"name": "",
"version": "",
"chainId": 0,
"verifyingContract": ""
},
"types": null,
"primaryType": "",
"signature": ""
}
],
"delegations": [
{
"chainId": 0,
"address": "",
"contractAddress": "",
"derivationNonce": 0,
"authorizationNonce": 0,
"signature": ""
}
],
"quoteId": "",
"submissionSignature": "",
"recoverCalldata": ""
}' \
"https://api-stg.clkd.xyz/v1/accounts/{accountId}/submit"Get relay status
/v1/accounts/{accountId}/relay-status/{quoteId}🔒Get the relay transaction status and hash for a submitted quote.
| Name | In | Type | Description |
|---|---|---|---|
accountId* | path | string (uuid) | — |
quoteId* | path | string | — |
200Default Response
{
"status": "string",
"chainId": 0,
"txHash": "string",
"confirmedTxHash": "string"
}404Default Response
{
"error": "Not found",
"message": "string"
}Try it
accountIdquoteIdcurl -X GET \
"https://api-stg.clkd.xyz/v1/accounts/{accountId}/relay-status/{quoteId}"Unlock quote
/v1/accounts/{accountId}/unlock🔒Release the lock held by a quote so the funds become available for a new transaction. Use when the user cancels a send or the client decides not to submit.
| Name | In | Type | Description |
|---|---|---|---|
accountId* | path | string (uuid) | Account ID |
200Default Response
{
"success": true,
"message": "string"
}400Default Response
{
"error": "Bad request",
"message": "string",
"code": "BAD_REQUEST",
"available": "0",
"tokenSymbol": "ETH",
"tokenAddress": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
"tokenDecimals": 18,
"minAmount": "0.00036 ETH",
"maxSendable": "0.018 ETH",
"feeEstimate": "1000000000000000",
"required": "1010000000000000000",
"shortfall": "1000000000000000",
"spendableCount": 1,
"maxInputs": 50,
"selectedAmount": "0.02 ETH",
"relayFee": "0.0042 ETH",
"feeLimit": "0.001 ETH",
"maxRelayFeeBPS": 1000,
"requiredRelayFeeBPS": "1523",
"selectedCount": 2,
"resolvedAddress": "string"
}404Default Response
{
"error": "Not found",
"message": "string"
}451Default Response
{
"error": "Unavailable",
"message": "string",
"code": "string",
"recoveryUrl": "string"
}Try it
accountIdcurl -X POST \
-H "Content-Type: application/json" \
-d '{
"quoteId": ""
}' \
"https://api-stg.clkd.xyz/v1/accounts/{accountId}/unlock"Get max spendable
/v1/accounts/{accountId}/max-spendable🔒Calculate the maximum spendable amount for a token, accounting for relay fees, swap gas, and pool fees when applicable. Use this to power the "max" button in send, swap, and pool UIs.
| Name | In | Type | Description |
|---|---|---|---|
accountId* | path | string (uuid) | Account ID |
200Default Response
{
"maxAmount": "string",
"feeEstimate": "string",
"feeEstimateUsdAmount": 0,
"spendableCount": 0,
"grossAmount": "string",
"fees": {
"network": "string",
"vetting": "string",
"deposit": "string",
"service": "string",
"total": "string"
},
"protocolFeeBps": 0,
"protocolFeeAmount": "string"
}400Default Response
{
"error": "Bad request",
"message": "string",
"code": "BAD_REQUEST",
"available": "0",
"tokenSymbol": "ETH",
"tokenAddress": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
"tokenDecimals": 18,
"minAmount": "0.00036 ETH",
"maxSendable": "0.018 ETH",
"feeEstimate": "1000000000000000",
"required": "1010000000000000000",
"shortfall": "1000000000000000",
"spendableCount": 1,
"maxInputs": 50,
"selectedAmount": "0.02 ETH",
"relayFee": "0.0042 ETH",
"feeLimit": "0.001 ETH",
"maxRelayFeeBPS": 1000,
"requiredRelayFeeBPS": "1523",
"selectedCount": 2,
"resolvedAddress": "string"
}403Default Response
{
"error": "Forbidden",
"message": "string"
}451Default Response
{
"error": "Unavailable",
"message": "string",
"code": "string",
"recoveryUrl": "string"
}Try it
accountIdcurl -X POST \
-H "Content-Type: application/json" \
-d '{
"chainId": 0,
"token": "",
"type": "",
"tokenOut": "",
"slippageMode": "",
"slippageBps": 0,
"tokenOutChainId": 0,
"spendableAddresses": [
""
],
"singleAddress": "",
"destinationAddress": ""
}' \
"https://api-stg.clkd.xyz/v1/accounts/{accountId}/max-spendable"Create pool deposit reservation
/v1/accounts/{accountId}/pool-deposit-reservations🔒Reserve funding inputs and return the exact privacy-pool deposit values for review before wallet authentication.
| Name | In | Type | Description |
|---|---|---|---|
accountId* | path | string (uuid) | Account ID |
200Default Response
{
"quoteId": "string",
"expiresAt": "string",
"reservation": "string",
"signature": "string",
"poolAddress": "string",
"grossAmount": "string",
"feeAmount": "string",
"feeBps": 0,
"netPoolValue": "string",
"cloakedFeeBps": 0,
"cloakedFlatFee": "string",
"cloakieFeeMode": "string",
"selectedFundingSources": [
{
"chainId": 0,
"token": "string",
"address": "string",
"amount": "string",
"idCount": 0,
"addressSummary": {
"receiveCount": 0,
"rawReceiveCount": 0,
"trustedReceiveActionCount": 0,
"trustedReceiveActionTypes": [
"string"
],
"assetCount": 0,
"chainCount": 0
},
"provenance": {
"status": "string",
"outputSystemTags": [
{
"type": "string",
"provider": "string",
"text": "string",
"explanationKey": "string",
"evidence": {
"chainId": null,
"txHash": "string",
"transferOrLogIndex": null,
"receiveFromAddress": "string",
"poolAddress": "string",
"entrypointAddress": "string",
"poolTransferOrLogIndex": null
}
}
],
"sourceLabelGroupId": "string",
"olderFundsCount": null,
"unresolvedReasons": [
"string"
],
"displayContext": {
"reason": "string",
"currentOutputCount": null,
"sourceCount": null,
"actionTypes": [
"string"
]
},
"funding": {
"labelGroupId": "string",
"olderFundsCount": null,
"unresolvedReasons": [
"string"
]
},
"association": {
"status": "string",
"labelGroupId": "string",
"olderFundsCount": null,
"unresolvedReasons": [
"string"
],
"ignoredUnsolicitedCount": null,
"summary": {
"sourceCount": null,
"userTaggedSourceCount": null,
"untaggedSourceCount": null,
"olderFundsCount": null,
"unknownCount": null
}
},
"display": {
"badgeKind": "string",
"label": "string",
"fundingLabel": "string",
"associationLabel": "string"
},
"editableSource": {
"id": "string",
"kind": "string",
"origin": {
"chainId": null,
"txHash": "string",
"transferOrLogIndex": null
},
"address": "string",
"tagPayloadCiphertext": "string",
"tagPayloadUpdatedAt": "string",
"tagEligibility": "string",
"tagEditable": true,
"systemTags": [
{
"type": "string",
"text": "string",
"explanationKey": "string",
"evidence": {
"address": "string",
"origins": [
{
"origin": "string",
"displayName": "string",
"iconUrl": "string",
"lastUsedAt": "string"
}
],
"matchedOrigin": "string",
"latestUsedAt": "string"
}
}
]
}
}
}
],
"provenanceLabelGroups": null,
"fees": {
"network": "string",
"dust": "string",
"service": "string",
"networkUsdAmount": 0,
"totalUsdAmount": 0,
"vetting": "string",
"deposit": "string",
"total": "string",
"waived": true
}
}400Default Response
{
"error": "Bad request",
"message": "string",
"code": "BAD_REQUEST",
"available": "0",
"tokenSymbol": "ETH",
"tokenAddress": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
"tokenDecimals": 18,
"minAmount": "0.00036 ETH",
"maxSendable": "0.018 ETH",
"feeEstimate": "1000000000000000",
"required": "1010000000000000000",
"shortfall": "1000000000000000",
"spendableCount": 1,
"maxInputs": 50,
"selectedAmount": "0.02 ETH",
"relayFee": "0.0042 ETH",
"feeLimit": "0.001 ETH",
"maxRelayFeeBPS": 1000,
"requiredRelayFeeBPS": "1523",
"selectedCount": 2,
"resolvedAddress": "string"
}401Default Response
{
"error": "Unauthorized",
"message": "string",
"code": "UNAUTHORIZED"
}403Default Response
{
"error": "Forbidden",
"message": "string"
}409Default Response
{
"error": "Conflict",
"message": "string",
"code": "QUOTE_LOCK_CONFLICT"
}429Default Response
{
"error": "Too Many Requests",
"message": "Rate limit exceeded. Maximum 30 requests per 1 minute."
}451Default Response
{
"error": "Unavailable",
"message": "string",
"code": "string",
"recoveryUrl": "string"
}503Default Response
{
"error": "Service Unavailable",
"message": "string",
"code": "SERVER_BUSY"
}Try it
accountIdcurl -X POST \
-H "Content-Type: application/json" \
-d '{
"chainId": 0,
"token": "",
"amount": "",
"decimals": 0,
"maxSend": true,
"spendableAddresses": [
""
],
"singleAddress": ""
}' \
"https://api-stg.clkd.xyz/v1/accounts/{accountId}/pool-deposit-reservations"Create swap preview
/v1/accounts/{accountId}/swap-preview🔒Get a swap preview (price discovery) without reserving balances.
| Name | In | Type | Description |
|---|---|---|---|
accountId* | path | string (uuid) | Account ID |
200Default Response
{
"expectedOutput": "string",
"minimumOutput": "string",
"outputToken": "string",
"outputDecimals": 0,
"outputSymbol": "string",
"routing": "string",
"slippageMode": "string",
"slippageBps": 0,
"requestedSlippageBps": 0,
"feeEstimate": "string",
"estimatedFillTimeMs": 0,
"protocolFeeBps": 0,
"protocolFeeAmount": "string",
"priceImpact": 0,
"rateOnly": true
}400Default Response
{
"error": "Bad request",
"message": "string",
"code": "BAD_REQUEST",
"available": "0",
"tokenSymbol": "ETH",
"tokenAddress": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
"tokenDecimals": 18,
"minAmount": "0.00036 ETH",
"maxSendable": "0.018 ETH",
"feeEstimate": "1000000000000000",
"required": "1010000000000000000",
"shortfall": "1000000000000000",
"spendableCount": 1,
"maxInputs": 50,
"selectedAmount": "0.02 ETH",
"relayFee": "0.0042 ETH",
"feeLimit": "0.001 ETH",
"maxRelayFeeBPS": 1000,
"requiredRelayFeeBPS": "1523",
"selectedCount": 2,
"resolvedAddress": "string"
}401Default Response
{
"error": "Unauthorized",
"message": "string",
"code": "UNAUTHORIZED"
}403Default Response
{
"error": "Forbidden",
"message": "string"
}429Default Response
{
"error": "Too Many Requests",
"message": "Rate limit exceeded. Maximum 30 requests per 1 minute."
}451Default Response
{
"error": "Unavailable",
"message": "string",
"code": "string",
"recoveryUrl": "string"
}502Default Response
{
"error": "Bad Gateway",
"message": "string",
"code": "SWAP_UNAVAILABLE"
}503Default Response
{
"error": "Service Unavailable",
"message": "string",
"code": "SERVER_BUSY"
}Try it
accountIdcurl -X POST \
-H "Content-Type: application/json" \
-d '{
"chainId": 0,
"tokenIn": "",
"tokenOut": "",
"amountIn": "",
"slippageMode": "",
"slippageBps": 0,
"tokenOutChainId": 0,
"spendableAddresses": [
""
],
"singleAddress": "",
"destinationAddress": ""
}' \
"https://api-stg.clkd.xyz/v1/accounts/{accountId}/swap-preview"Recover conversion prepare
/v1/accounts/{accountId}/pool-recover/prepare🔒Build an unsigned Porto intent and delegation for a pool recover (ragequit). The client calls this after generating the commitment proof, signs the returned intent and delegation, then submits via the standard submit endpoint.
| Name | In | Type | Description |
|---|---|---|---|
accountId* | path | string | — |
200Default Response
Try it
accountIdcurl -X POST \
-H "Content-Type: application/json" \
-d '{
"quoteId": "",
"recoverCalldata": ""
}' \
"https://api-stg.clkd.xyz/v1/accounts/{accountId}/pool-recover/prepare"Get pool state
/v1/accounts/{accountId}/pool/state🔒Get the current incognito pool state for an account and token. Returns the Merkle tree, ASP leaves, and your commitments — everything the client needs to build ZK withdrawal proofs.
| Name | In | Type | Description |
|---|---|---|---|
chainId* | query | number | Chain ID of the pool |
token* | query | string | Token address accepted by the pool (0x...) |
purpose | query | any | When set to withdraw, the route returns POOL_STATE_REFRESHING unless proof inputs are ready. |
accountId* | path | string (uuid) | Account ID |
200Default Response
{
"leaves": [
"string"
],
"currentRoot": "string",
"treeSize": 0,
"aspLeaves": [
"string"
],
"spentNullifiers": [
{
"nullifierHash": "string",
"withdrawnValue": "string",
"newCommitment": "string"
}
],
"nextDepositIndex": 0,
"commitments": [
{
"id": "string",
"depositIndex": 0,
"withdrawalIndex": 0,
"commitment": "string",
"label": "string",
"value": "string",
"aspStatus": "string"
}
]
}400Default Response
{
"error": "Bad request",
"message": "string",
"code": "BAD_REQUEST",
"available": "0",
"tokenSymbol": "ETH",
"tokenAddress": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
"tokenDecimals": 18,
"minAmount": "0.00036 ETH",
"maxSendable": "0.018 ETH",
"feeEstimate": "1000000000000000",
"required": "1010000000000000000",
"shortfall": "1000000000000000",
"spendableCount": 1,
"maxInputs": 50,
"selectedAmount": "0.02 ETH",
"relayFee": "0.0042 ETH",
"feeLimit": "0.001 ETH",
"maxRelayFeeBPS": 1000,
"requiredRelayFeeBPS": "1523",
"selectedCount": 2,
"resolvedAddress": "string"
}401Default Response
{
"error": "Unauthorized",
"message": "string",
"code": "UNAUTHORIZED"
}503Default Response
{
"error": "Service Unavailable",
"message": "string",
"code": "SERVER_BUSY"
}Try it
accountIdchainIdtokenpurposecurl -X GET \
"https://api-stg.clkd.xyz/v1/accounts/{accountId}/pool/state"Get pool commitments
/v1/accounts/{accountId}/pool/commitments🔒Get this account's current incognito commitments for a supported pool without loading Merkle proof state.
| Name | In | Type | Description |
|---|---|---|---|
chainId* | query | number | Chain ID of the pool |
token* | query | string | Token address accepted by the pool (0x...) |
accountId* | path | string (uuid) | Account ID |
200Default Response
{
"commitments": [
{
"id": "string",
"depositIndex": 0,
"withdrawalIndex": 0,
"commitment": "string",
"label": "string",
"value": "string",
"aspStatus": "string"
}
]
}400Default Response
{
"error": "Bad request",
"message": "string",
"code": "BAD_REQUEST",
"available": "0",
"tokenSymbol": "ETH",
"tokenAddress": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
"tokenDecimals": 18,
"minAmount": "0.00036 ETH",
"maxSendable": "0.018 ETH",
"feeEstimate": "1000000000000000",
"required": "1010000000000000000",
"shortfall": "1000000000000000",
"spendableCount": 1,
"maxInputs": 50,
"selectedAmount": "0.02 ETH",
"relayFee": "0.0042 ETH",
"feeLimit": "0.001 ETH",
"maxRelayFeeBPS": 1000,
"requiredRelayFeeBPS": "1523",
"selectedCount": 2,
"resolvedAddress": "string"
}401Default Response
{
"error": "Unauthorized",
"message": "string",
"code": "UNAUTHORIZED"
}Try it
accountIdchainIdtokencurl -X GET \
"https://api-stg.clkd.xyz/v1/accounts/{accountId}/pool/commitments"Reconcile pool commitment asp decline
/v1/accounts/{accountId}/pool/commitments/reconcile-asp-decline🔒Confirm that Privacy Pools explicitly declined a previously approved commitment, mark it recoverable, and release its unused withdrawal quote.
| Name | In | Type | Description |
|---|---|---|---|
accountId* | path | string (uuid) | Account ID |
200Default Response
{
"success": true,
"code": "string",
"message": "string"
}401Default Response
{
"error": "Unauthorized",
"message": "string",
"code": "UNAUTHORIZED"
}409Default Response
{
"error": "Conflict",
"message": "string",
"code": "QUOTE_LOCK_CONFLICT"
}503Default Response
{
"error": "Service Unavailable",
"message": "string",
"code": "SERVER_BUSY"
}Try it
accountIdcurl -X POST \
-H "Content-Type: application/json" \
-d '{
"commitmentId": "",
"quoteId": ""
}' \
"https://api-stg.clkd.xyz/v1/accounts/{accountId}/pool/commitments/reconcile-asp-decline"Cloakie
Cloakie NFT verification and withdrawal
Verify cloakie deposit
/v1/accounts/{accountId}/cloakie/verify🔒Scan recent unused stealth addresses for Cloakie NFTs on Base. Records any newly discovered deposits and activates the fee waiver.
| Name | In | Type | Description |
|---|---|---|---|
accountId* | path | string | — |
200Default Response
{
"active": true,
"deposits": [
{
"depositAddress": "string",
"tokenId": "string",
"imageUrl": "string"
}
]
}400Default Response
{
"error": "Bad request",
"message": "string",
"code": "BAD_REQUEST",
"available": "0",
"tokenSymbol": "ETH",
"tokenAddress": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
"tokenDecimals": 18,
"minAmount": "0.00036 ETH",
"maxSendable": "0.018 ETH",
"feeEstimate": "1000000000000000",
"required": "1010000000000000000",
"shortfall": "1000000000000000",
"spendableCount": 1,
"maxInputs": 50,
"selectedAmount": "0.02 ETH",
"relayFee": "0.0042 ETH",
"feeLimit": "0.001 ETH",
"maxRelayFeeBPS": 1000,
"requiredRelayFeeBPS": "1523",
"selectedCount": 2,
"resolvedAddress": "string"
}401Default Response
{
"error": "Unauthorized",
"message": "string",
"code": "UNAUTHORIZED"
}Try it
accountIdcurl -X POST \
"https://api-stg.clkd.xyz/v1/accounts/{accountId}/cloakie/verify"Withdraw cloakie
/v1/accounts/{accountId}/cloakie/withdraw🔒Build an intent to transfer a Cloakie NFT from a deposit address back to the user. Returns intents and delegations for client signing.
| Name | In | Type | Description |
|---|---|---|---|
accountId* | path | string | — |
200Default Response
{
"quoteId": "string",
"intents": [
{
"chainId": 0,
"eoa": "string",
"executionData": "string",
"nonce": "string",
"derivationNonce": "string",
"payer": "string",
"paymentToken": "string",
"paymentMaxAmount": "string",
"combinedGas": "string",
"encodedPreCalls": [
"string"
],
"encodedFundTransfers": [
"string"
],
"settler": "string",
"expiry": "string",
"isMultichain": true,
"funder": "string",
"funderSignature": "string",
"settlerContext": "string",
"paymentAmount": "string",
"paymentRecipient": "string",
"paymentSignature": "string",
"supportedAccountImplementation": "string",
"domain": {
"name": "string",
"version": "string",
"chainId": 0,
"verifyingContract": "string"
},
"types": null,
"primaryType": "string"
}
],
"delegations": [
{
"chainId": 0,
"address": "string",
"contractAddress": "string",
"derivationNonce": 0,
"authorizationNonce": 0
}
],
"expiresAt": "string",
"signature": "string",
"depositAddress": "string",
"recipientAddress": "string",
"tokenId": "string"
}400Default Response
{
"error": "Bad request",
"message": "string",
"code": "BAD_REQUEST",
"available": "0",
"tokenSymbol": "ETH",
"tokenAddress": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
"tokenDecimals": 18,
"minAmount": "0.00036 ETH",
"maxSendable": "0.018 ETH",
"feeEstimate": "1000000000000000",
"required": "1010000000000000000",
"shortfall": "1000000000000000",
"spendableCount": 1,
"maxInputs": 50,
"selectedAmount": "0.02 ETH",
"relayFee": "0.0042 ETH",
"feeLimit": "0.001 ETH",
"maxRelayFeeBPS": 1000,
"requiredRelayFeeBPS": "1523",
"selectedCount": 2,
"resolvedAddress": "string"
}401Default Response
{
"error": "Unauthorized",
"message": "string",
"code": "UNAUTHORIZED"
}404Default Response
{
"error": "Not found",
"message": "string"
}Try it
accountIdcurl -X POST \
-H "Content-Type: application/json" \
-d '{
"depositAddress": "",
"recipientAddress": "",
"tokenId": ""
}' \
"https://api-stg.clkd.xyz/v1/accounts/{accountId}/cloakie/withdraw"Relayer
Relayer details
/relayer/detailsGet relayer fee info for a given chain and asset
| Name | In | Type | Description |
|---|---|---|---|
chainId* | query | number | Chain ID |
assetAddress* | query | string | Asset address |
200Default Response
{
"feeBPS": "string",
"feeReceiverAddress": "string",
"chainId": 0,
"assetAddress": "string",
"minWithdrawAmount": "string",
"maxGasPrice": "string"
}400Default Response
{
"error": "Bad request",
"message": "string",
"code": "BAD_REQUEST",
"available": "0",
"tokenSymbol": "ETH",
"tokenAddress": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
"tokenDecimals": 18,
"minAmount": "0.00036 ETH",
"maxSendable": "0.018 ETH",
"feeEstimate": "1000000000000000",
"required": "1010000000000000000",
"shortfall": "1000000000000000",
"spendableCount": 1,
"maxInputs": 50,
"selectedAmount": "0.02 ETH",
"relayFee": "0.0042 ETH",
"feeLimit": "0.001 ETH",
"maxRelayFeeBPS": 1000,
"requiredRelayFeeBPS": "1523",
"selectedCount": 2,
"resolvedAddress": "string"
}503Default Response
{
"error": "Service Unavailable",
"message": "string",
"code": "SERVER_BUSY"
}Try it
chainIdassetAddresscurl -X GET \
"https://api-stg.clkd.xyz/relayer/details"Relayer quote
/relayer/quoteGet a fee commitment for relaying a privacy pool withdrawal
200Default Response
{
"baseFeeBPS": "string",
"feeBPS": "string",
"gasPrice": "string",
"feeCommitment": {
"expiration": 0,
"asset": "string",
"withdrawalData": "string",
"signedRelayerCommitment": "string",
"extraGas": true,
"amount": "string"
},
"detail": {
"relayTxCost": {
"gas": "string",
"eth": "string"
},
"extraGasFundAmount": {
"gas": "string",
"eth": "string"
},
"extraGasTxCost": {
"gas": "string",
"eth": "string"
}
}
}400Default Response
{
"error": "Bad request",
"message": "string",
"code": "BAD_REQUEST",
"available": "0",
"tokenSymbol": "ETH",
"tokenAddress": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
"tokenDecimals": 18,
"minAmount": "0.00036 ETH",
"maxSendable": "0.018 ETH",
"feeEstimate": "1000000000000000",
"required": "1010000000000000000",
"shortfall": "1000000000000000",
"spendableCount": 1,
"maxInputs": 50,
"selectedAmount": "0.02 ETH",
"relayFee": "0.0042 ETH",
"feeLimit": "0.001 ETH",
"maxRelayFeeBPS": 1000,
"requiredRelayFeeBPS": "1523",
"selectedCount": 2,
"resolvedAddress": "string"
}503Default Response
{
"error": "Service Unavailable",
"message": "string",
"code": "SERVER_BUSY"
}Try it
curl -X POST \
-H "Content-Type: application/json" \
-d '{
"chainId": 0,
"amount": "",
"asset": "",
"recipient": "",
"extraGas": true
}' \
"https://api-stg.clkd.xyz/relayer/quote"Relayer request
/relayer/requestSubmit a privacy pool withdrawal for relay
200Default Response
{
"success": true,
"txHash": "string",
"error": "string",
"timestamp": 0,
"requestId": "string"
}400Default Response
{
"error": "Bad request",
"message": "string",
"code": "BAD_REQUEST",
"available": "0",
"tokenSymbol": "ETH",
"tokenAddress": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
"tokenDecimals": 18,
"minAmount": "0.00036 ETH",
"maxSendable": "0.018 ETH",
"feeEstimate": "1000000000000000",
"required": "1010000000000000000",
"shortfall": "1000000000000000",
"spendableCount": 1,
"maxInputs": 50,
"selectedAmount": "0.02 ETH",
"relayFee": "0.0042 ETH",
"feeLimit": "0.001 ETH",
"maxRelayFeeBPS": 1000,
"requiredRelayFeeBPS": "1523",
"selectedCount": 2,
"resolvedAddress": "string"
}500Default Response
{
"error": "string",
"message": "string"
}503Default Response
{
"error": "Service Unavailable",
"message": "string",
"code": "SERVER_BUSY"
}Try it
curl -X POST \
-H "Content-Type: application/json" \
-d '{
"withdrawal": {
"processooor": "",
"data": ""
},
"proof": {
"pi_a": [
""
],
"pi_b": [
[
""
]
],
"pi_c": [
""
],
"protocol": "",
"curve": ""
},
"publicSignals": [
""
],
"scope": "",
"chainId": 0,
"feeCommitment": {
"expiration": 0,
"asset": "",
"withdrawalData": "",
"signedRelayerCommitment": "",
"extraGas": true,
"amount": ""
}
}' \
"https://api-stg.clkd.xyz/relayer/request"Send
Resolve send destination avatar
/v1/accounts/{accountId}/destination-avatar🔒Resolve the public ENS avatar URL for a send destination. Returns null when the destination is not an ENS name or no public avatar is configured.
| Name | In | Type | Description |
|---|---|---|---|
destinationAddress* | query | string | Destination address or ENS name entered in the send form. |
accountId* | path | string (uuid) | Account ID |
200Default Response
{
"avatarUrl": "string"
}401Default Response
{
"error": "Unauthorized",
"message": "string",
"code": "UNAUTHORIZED"
}403Default Response
{
"error": "Forbidden",
"message": "string"
}429Default Response
{
"error": "Too Many Requests",
"message": "Rate limit exceeded. Maximum 60 requests per 1 minute."
}Try it
accountIddestinationAddresscurl -X GET \
"https://api-stg.clkd.xyz/v1/accounts/{accountId}/destination-avatar"Classify send recipient address
/v1/accounts/{accountId}/recipient-address-kind🔒Classify a send recipient address as an EOA, EIP-7702 delegated EOA, or contract on the selected chain.
| Name | In | Type | Description |
|---|---|---|---|
chainId* | query | number | Chain ID selected in the send form. |
address* | query | string | Raw 0x recipient address to inspect. |
accountId* | path | string (uuid) | Account ID |
200Default Response
{
"kind": "string"
}400Default Response
{
"error": "Bad request",
"message": "string",
"code": "BAD_REQUEST",
"available": "0",
"tokenSymbol": "ETH",
"tokenAddress": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
"tokenDecimals": 18,
"minAmount": "0.00036 ETH",
"maxSendable": "0.018 ETH",
"feeEstimate": "1000000000000000",
"required": "1010000000000000000",
"shortfall": "1000000000000000",
"spendableCount": 1,
"maxInputs": 50,
"selectedAmount": "0.02 ETH",
"relayFee": "0.0042 ETH",
"feeLimit": "0.001 ETH",
"maxRelayFeeBPS": 1000,
"requiredRelayFeeBPS": "1523",
"selectedCount": 2,
"resolvedAddress": "string"
}401Default Response
{
"error": "Unauthorized",
"message": "string",
"code": "UNAUTHORIZED"
}403Default Response
{
"error": "Forbidden",
"message": "string"
}429Default Response
{
"error": "Too Many Requests",
"message": "Rate limit exceeded. Maximum 60 requests per 1 minute."
}502Default Response
{
"error": "Bad Gateway",
"message": "string",
"code": "SWAP_UNAVAILABLE"
}Try it
accountIdchainIdaddresscurl -X GET \
"https://api-stg.clkd.xyz/v1/accounts/{accountId}/recipient-address-kind"Account
Get contact email
/v1/accounts/{accountId}/contact-email🔒Return the account's optional contact email, or null if none is set.
| Name | In | Type | Description |
|---|---|---|---|
accountId* | path | string (uuid) | Account ID |
200Default Response
{
"email": "string"
}401Default Response
{
"error": "Unauthorized",
"message": "string",
"code": "UNAUTHORIZED"
}403Default Response
{
"error": "Forbidden",
"message": "string"
}429Default Response
{
"error": "Too Many Requests",
"message": "Rate limit exceeded. Maximum 60 requests per 1 minute."
}Try it
accountIdcurl -X GET \
"https://api-stg.clkd.xyz/v1/accounts/{accountId}/contact-email"Set contact email
/v1/accounts/{accountId}/contact-email🔒Set or replace the account's optional contact email. Used for account updates, product news, and support/feedback outreach.
| Name | In | Type | Description |
|---|---|---|---|
accountId* | path | string (uuid) | Account ID |
200Default Response
{
"email": "string"
}401Default Response
{
"error": "Unauthorized",
"message": "string",
"code": "UNAUTHORIZED"
}403Default Response
{
"error": "Forbidden",
"message": "string"
}429Default Response
{
"error": "Too Many Requests",
"message": "Rate limit exceeded. Maximum 60 requests per 1 minute."
}Try it
accountIdcurl -X PUT \
-H "Content-Type: application/json" \
-d '{
"email": ""
}' \
"https://api-stg.clkd.xyz/v1/accounts/{accountId}/contact-email"Delete contact email
/v1/accounts/{accountId}/contact-email🔒Remove the account's contact email. Idempotent.
| Name | In | Type | Description |
|---|---|---|---|
accountId* | path | string (uuid) | Account ID |
200Default Response
{
"email": "string"
}401Default Response
{
"error": "Unauthorized",
"message": "string",
"code": "UNAUTHORIZED"
}403Default Response
{
"error": "Forbidden",
"message": "string"
}429Default Response
{
"error": "Too Many Requests",
"message": "Rate limit exceeded. Maximum 60 requests per 1 minute."
}Try it
accountIdcurl -X DELETE \
"https://api-stg.clkd.xyz/v1/accounts/{accountId}/contact-email"Dismiss profile prompt
/v1/accounts/{accountId}/profile-prompts/{promptId}/dismissal🔒Permanently dismiss an allowed profile prompt for this account across browsers and devices. Idempotent.
| Name | In | Type | Description |
|---|---|---|---|
accountId* | path | string (uuid) | Account ID |
promptId* | path | string | A profile prompt that supports permanent dismissal. |
200Default Response
{
"promptId": "string",
"dismissedAt": "string"
}400Default Response
{
"error": "Bad request",
"message": "string",
"code": "BAD_REQUEST",
"available": "0",
"tokenSymbol": "ETH",
"tokenAddress": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
"tokenDecimals": 18,
"minAmount": "0.00036 ETH",
"maxSendable": "0.018 ETH",
"feeEstimate": "1000000000000000",
"required": "1010000000000000000",
"shortfall": "1000000000000000",
"spendableCount": 1,
"maxInputs": 50,
"selectedAmount": "0.02 ETH",
"relayFee": "0.0042 ETH",
"feeLimit": "0.001 ETH",
"maxRelayFeeBPS": 1000,
"requiredRelayFeeBPS": "1523",
"selectedCount": 2,
"resolvedAddress": "string"
}401Default Response
{
"error": "Unauthorized",
"message": "string",
"code": "UNAUTHORIZED"
}403Default Response
{
"error": "Forbidden",
"message": "string"
}429Default Response
{
"error": "Too Many Requests",
"message": "Rate limit exceeded. Maximum 60 requests per 1 minute."
}Try it
accountIdpromptIdcurl -X PUT \
"https://api-stg.clkd.xyz/v1/accounts/{accountId}/profile-prompts/{promptId}/dismissal"Get address book
/v1/accounts/{accountId}/address-book🔒List the account's saved contacts, most recently used first.
| Name | In | Type | Description |
|---|---|---|---|
accountId* | path | string (uuid) | Account ID |
200Default Response
{
"entries": [
{
"address": "string",
"name": "string",
"lastUsedAt": "string",
"createdAt": "string",
"updatedAt": "string"
}
]
}401Default Response
{
"error": "Unauthorized",
"message": "string",
"code": "UNAUTHORIZED"
}403Default Response
{
"error": "Forbidden",
"message": "string"
}429Default Response
{
"error": "Too Many Requests",
"message": "Rate limit exceeded. Maximum 60 requests per 1 minute."
}Try it
accountIdcurl -X GET \
"https://api-stg.clkd.xyz/v1/accounts/{accountId}/address-book"Get address book address ownership
/v1/accounts/{accountId}/address-book/ownership/{address}🔒Check whether an address belongs to the current Cloaked account.
| Name | In | Type | Description |
|---|---|---|---|
accountId* | path | string (uuid) | Account ID |
address* | path | string | — |
200Default Response
{
"isOwnAddress": true
}400Default Response
{
"error": "Bad request",
"message": "string",
"code": "BAD_REQUEST",
"available": "0",
"tokenSymbol": "ETH",
"tokenAddress": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
"tokenDecimals": 18,
"minAmount": "0.00036 ETH",
"maxSendable": "0.018 ETH",
"feeEstimate": "1000000000000000",
"required": "1010000000000000000",
"shortfall": "1000000000000000",
"spendableCount": 1,
"maxInputs": 50,
"selectedAmount": "0.02 ETH",
"relayFee": "0.0042 ETH",
"feeLimit": "0.001 ETH",
"maxRelayFeeBPS": 1000,
"requiredRelayFeeBPS": "1523",
"selectedCount": 2,
"resolvedAddress": "string"
}401Default Response
{
"error": "Unauthorized",
"message": "string",
"code": "UNAUTHORIZED"
}403Default Response
{
"error": "Forbidden",
"message": "string"
}429Default Response
{
"error": "Too Many Requests",
"message": "Rate limit exceeded. Maximum 60 requests per 1 minute."
}Try it
accountIdaddresscurl -X GET \
"https://api-stg.clkd.xyz/v1/accounts/{accountId}/address-book/ownership/{address}"Upsert address book entry
/v1/accounts/{accountId}/address-book/{address}🔒Save or rename a contact. The address is normalized to EIP-55 checksummed form. Requires a member spend-key signature over the canonical save-contact message.
| Name | In | Type | Description |
|---|---|---|---|
accountId* | path | string (uuid) | Account ID |
address* | path | string | — |
200Default Response
{
"entry": {
"address": "string",
"name": "string",
"lastUsedAt": "string",
"createdAt": "string",
"updatedAt": "string"
}
}400Default Response
{
"error": "Bad request",
"message": "string",
"code": "BAD_REQUEST",
"available": "0",
"tokenSymbol": "ETH",
"tokenAddress": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
"tokenDecimals": 18,
"minAmount": "0.00036 ETH",
"maxSendable": "0.018 ETH",
"feeEstimate": "1000000000000000",
"required": "1010000000000000000",
"shortfall": "1000000000000000",
"spendableCount": 1,
"maxInputs": 50,
"selectedAmount": "0.02 ETH",
"relayFee": "0.0042 ETH",
"feeLimit": "0.001 ETH",
"maxRelayFeeBPS": 1000,
"requiredRelayFeeBPS": "1523",
"selectedCount": 2,
"resolvedAddress": "string"
}401Default Response
{
"error": "Unauthorized",
"message": "string",
"code": "UNAUTHORIZED"
}403Default Response
{
"error": "Forbidden",
"message": "string"
}429Default Response
{
"error": "Too Many Requests",
"message": "Rate limit exceeded. Maximum 60 requests per 1 minute."
}Try it
accountIdaddresscurl -X PUT \
-H "Content-Type: application/json" \
-d '{
"name": "",
"signature": "",
"issuedAt": ""
}' \
"https://api-stg.clkd.xyz/v1/accounts/{accountId}/address-book/{address}"Delete address book entry
/v1/accounts/{accountId}/address-book/{address}🔒Remove a saved contact. Idempotent.
| Name | In | Type | Description |
|---|---|---|---|
accountId* | path | string (uuid) | Account ID |
address* | path | string | — |
200Default Response
{
"deleted": true
}400Default Response
{
"error": "Bad request",
"message": "string",
"code": "BAD_REQUEST",
"available": "0",
"tokenSymbol": "ETH",
"tokenAddress": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
"tokenDecimals": 18,
"minAmount": "0.00036 ETH",
"maxSendable": "0.018 ETH",
"feeEstimate": "1000000000000000",
"required": "1010000000000000000",
"shortfall": "1000000000000000",
"spendableCount": 1,
"maxInputs": 50,
"selectedAmount": "0.02 ETH",
"relayFee": "0.0042 ETH",
"feeLimit": "0.001 ETH",
"maxRelayFeeBPS": 1000,
"requiredRelayFeeBPS": "1523",
"selectedCount": 2,
"resolvedAddress": "string"
}401Default Response
{
"error": "Unauthorized",
"message": "string",
"code": "UNAUTHORIZED"
}403Default Response
{
"error": "Forbidden",
"message": "string"
}429Default Response
{
"error": "Too Many Requests",
"message": "Rate limit exceeded. Maximum 60 requests per 1 minute."
}Try it
accountIdaddresscurl -X DELETE \
"https://api-stg.clkd.xyz/v1/accounts/{accountId}/address-book/{address}"Simulation
Simulate transaction
/v1/simulate🔒Simulate a transaction to preview asset changes before signing.
200Default Response
{
"success": true,
"provider": "string",
"gasUsed": 0,
"failureReason": "string",
"assetChangesComplete": true,
"assetChanges": [
{
"intentIndex": null,
"callIndex": null,
"type": "string",
"token": {
"address": "string",
"symbol": "string",
"decimals": null,
"name": "string"
},
"from": "string",
"to": "string",
"amount": "string",
"rawAmount": "string"
}
],
"error": "string"
}400Default Response
{
"error": "Bad request",
"message": "string",
"code": "BAD_REQUEST",
"available": "0",
"tokenSymbol": "ETH",
"tokenAddress": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
"tokenDecimals": 18,
"minAmount": "0.00036 ETH",
"maxSendable": "0.018 ETH",
"feeEstimate": "1000000000000000",
"required": "1010000000000000000",
"shortfall": "1000000000000000",
"spendableCount": 1,
"maxInputs": 50,
"selectedAmount": "0.02 ETH",
"relayFee": "0.0042 ETH",
"feeLimit": "0.001 ETH",
"maxRelayFeeBPS": 1000,
"requiredRelayFeeBPS": "1523",
"selectedCount": 2,
"resolvedAddress": "string"
}403Default Response
{
"error": "Forbidden",
"message": "string"
}Try it
curl -X POST \
-H "Content-Type: application/json" \
-d '{
"chainId": 0,
"from": "",
"to": "",
"value": "",
"data": ""
}' \
"https://api-stg.clkd.xyz/v1/simulate"Utilities
Lookup function signatures
/v1/function-signatures🔒Batch-resolve 4-byte function selectors to human-readable signatures. Uses a server-side cache backed by Sourcify's 4byte signature database.
200Default Response
{
"signatures": null,
"candidates": null
}403Default Response
{
"error": "Forbidden",
"message": "string"
}Try it
curl -X POST \
-H "Content-Type: application/json" \
-d '{
"selectors": [
""
]
}' \
"https://api-stg.clkd.xyz/v1/function-signatures"Get clear signing descriptor
/v1/clear-signing/descriptorResolve an ERC-7730 descriptor from Cloaked’s pinned, validated registry snapshot for a specific chain, contract, and calldata or EIP-712 format.
| Name | In | Type | Description |
|---|---|---|---|
chainId* | query | integer | — |
address* | query | string | — |
kind* | query | any | — |
caller | query | string | — |
selector | query | string | — |
formatKey | query | string | — |
200Default Response
{
"kind": "string",
"descriptor": null,
"source": {
"registry": "string",
"status": "string",
"repository": "string",
"commit": "string",
"path": "string",
"url": "string",
"descriptorHash": "string",
"pullRequest": "string"
},
"binding": {
"kind": "string",
"standard": "string",
"chainId": null,
"address": "string",
"evidence": {
"kind": "string",
"onchainDecimals": null,
"catalogSources": [
"string"
]
}
}
}404Default Response
{
"error": "Not found",
"message": "string"
}429Default Response
{
"error": "Too Many Requests",
"message": "Rate limit exceeded. Maximum 120 requests per 1 minute."
}502Default Response
{
"error": "Bad Gateway",
"message": "string",
"code": "SWAP_UNAVAILABLE"
}Try it
chainIdaddresskindcallerselectorformatKeycurl -X GET \
"https://api-stg.clkd.xyz/v1/clear-signing/descriptor"Get sourcify function
/v1/clear-signing/sourcify-functionResolve the exact ABI function from source Sourcify matched to the current direct-contract runtime or a freshly proven proxy implementation.
| Name | In | Type | Description |
|---|---|---|---|
chainId* | query | integer | — |
address* | query | string | — |
caller | query | string | — |
selector* | query | string | — |
200Default Response
{
"evidenceVersion": 0,
"chainId": null,
"address": "string",
"selector": "string",
"contractKind": "string",
"functionDeclaration": "string",
"functionHash": "string",
"runtimeCodeHash": "string",
"match": "string",
"runtimeMatch": "string",
"sourceUrl": "string"
}404Default Response
{
"error": "Not found",
"message": "string"
}429Default Response
{
"error": "Too Many Requests",
"message": "Rate limit exceeded. Maximum 120 requests per 1 minute."
}502Default Response
{
"error": "Bad Gateway",
"message": "string",
"code": "SWAP_UNAVAILABLE"
}Try it
chainIdaddresscallerselectorcurl -X GET \
"https://api-stg.clkd.xyz/v1/clear-signing/sourcify-function"
