Are you an LLM? Read llms.txt for a summary of the docs, or llms-full.txt for the full context.
Skip to content

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

GET/.well-known/hpke-public-key

Retrieve the server's HPKE public key. Clients must encrypt stealth key material with this key before submitting it during account creation or signer enrollment.

Responses
200Default Response
Schema
publicKeyrequiredstring
e.g. "0x..."
publicKeyBase64requiredstring
e.g. "..."
formatrequiredstring
e.g. "hex"
kemrequiredstring
e.g. "X25519-HKDF-SHA256"
aeadrequiredstring
e.g. "AES-128-GCM"
json
{
  "publicKey": "0x...",
  "publicKeyBase64": "...",
  "format": "hex",
  "kem": "X25519-HKDF-SHA256",
  "aead": "AES-128-GCM"
}
Try it
curl -X GET \
  "https://api-stg.clkd.xyz/.well-known/hpke-public-key"

Validate invite code

GET/invite-codes/validate

Check whether an invite code is valid and unused, without consuming it. Public endpoint used during onboarding to give the user immediate feedback before they attempt account creation.

Parameters
NameInTypeDescription
code*querystringThe invite code to validate
Responses
200Default Response
Schema
validrequiredboolean
reservedSubdomainrequiredstring | null
json
{
  "valid": true,
  "reservedSubdomain": "string"
}
Try it
Query Parameters
code
curl -X GET \
  "https://api-stg.clkd.xyz/invite-codes/validate"

Get nonce

GET/nonce

Generate 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.

Parameters
NameInTypeDescription
address*querystringThe 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.
Responses
200Random nonce string
Schema
string — Random nonce string
json
"a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6"
400Default Response
Schema
errorrequiredstring
e.g. "Bad request"
messagerequiredstring
codestring
e.g. "BAD_REQUEST"
json
{
  "error": "Bad request",
  "message": "string",
  "code": "BAD_REQUEST"
}
429Default Response
Schema
errorrequiredstring
e.g. "Too Many Requests"
messagerequiredstring
e.g. "Rate limit exceeded. Maximum 20 requests per 1 minute."
json
{
  "error": "Too Many Requests",
  "message": "Rate limit exceeded. Maximum 20 requests per 1 minute."
}
Try it
Query Parameters
address
curl -X GET \
  "https://api-stg.clkd.xyz/nonce"

Verify sign-in

POST/verify

Complete Sign-In with Ethereum by submitting the signed SIWE message. Returns a JWT session token and the associated accountId if the address already has a stealth account, or null if the user still needs to register.

Request Body
messagerequiredstring
SIWE message string
signaturerequiredstring
Signature from wallet
Responses
200Default Response
Schema
okrequiredboolean
e.g. true
addressrequiredstring
e.g. "0x..."
tokenrequiredstring
JWT authentication token
accountIdrequiredstring | null
Stealth account ID if user is registered, null otherwise
json
{
  "ok": true,
  "address": "0x...",
  "token": "string",
  "accountId": "string"
}
400Default Response
Schema
errorrequiredstring
e.g. "Bad request"
messagerequiredstring
codestring
e.g. "BAD_REQUEST"
json
{
  "error": "Bad request",
  "message": "string",
  "code": "BAD_REQUEST"
}
422Default Response
Schema
errorrequiredstring
e.g. "Unprocessable Entity"
messagerequiredstring
codestring
e.g. "UNPROCESSABLE_ENTITY"
json
{
  "error": "Unprocessable Entity",
  "message": "string",
  "code": "UNPROCESSABLE_ENTITY"
}
429Default Response
Schema
errorrequiredstring
e.g. "Too Many Requests"
messagerequiredstring
e.g. "Rate limit exceeded. Maximum 10 requests per 1 minute."
json
{
  "error": "Too Many Requests",
  "message": "Rate limit exceeded. Maximum 10 requests per 1 minute."
}
Try it
Request Body
curl -X POST \
  -H "Content-Type: application/json" \
  -d '{
  "message": "",
  "signature": ""
}' \
  "https://api-stg.clkd.xyz/verify"

Logout

POST/logout

Clear 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.

Responses
200Default Response
Schema
okrequiredboolean
e.g. true
json
{
  "ok": true
}
Try it
curl -X POST \
  "https://api-stg.clkd.xyz/logout"

Account Management

Account creation, signers, subdomains, and setup

Check subdomain availability

GET/subdomain/check

Check whether a subdomain name is available for registration. Public endpoint — no authentication required. Use before calling setSubdomain to avoid conflicts.

Parameters
NameInTypeDescription
name*querystring
Responses
200Default Response
Schema
availablerequiredboolean
json
{
  "available": true
}
400Default Response
Schema
errorrequiredstring
e.g. "Bad request"
messagerequiredstring
codestring
e.g. "BAD_REQUEST"
json
{
  "error": "Bad request",
  "message": "string",
  "code": "BAD_REQUEST"
}
Try it
Query Parameters
name
curl -X GET \
  "https://api-stg.clkd.xyz/subdomain/check"

Create account

POST/accounts/🔒

Register a new stealth 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 stealth keys, enabling stealth 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.

Request Body
ciphertextrequiredstring
Base64-encoded encrypted payload
encapsulatedKeyrequiredstring
Base64-encoded HPKE encapsulated key
inviteCodestring
Invite code for gated access
Responses
200Default Response
Schema
accountIdrequiredstring | null
Created account ID (null if already existed)
alreadyExistedrequiredboolean
json
{
  "accountId": "string",
  "alreadyExisted": true
}
Try it
Request Body
curl -X POST \
  -H "Content-Type: application/json" \
  -d '{
  "ciphertext": "",
  "encapsulatedKey": "",
  "inviteCode": ""
}' \
  "https://api-stg.clkd.xyz/accounts/"

Get account

GET/accounts/{accountId}🔒

Retrieve account metadata including the owner address, stealth material status, and ENS subdomain. Useful for determining onboarding state (e.g., whether the user still needs to claim a subdomain).

Parameters
NameInTypeDescription
accountId*pathstring (uuid)Stealth account ID
Responses
200Default Response
Schema
accountIdrequiredstring
addressrequiredstring | null
hasStealthMaterialrequiredboolean
hasEnsNamerequiredboolean
subdomainrequiredstring | null
lastConsumedNoncerequirednumber | null
Last consumed stealth address nonce (0-indexed). null if no addresses generated yet.
json
{
  "accountId": "string",
  "address": "string",
  "hasStealthMaterial": true,
  "hasEnsName": true,
  "subdomain": "string",
  "lastConsumedNonce": 0
}
Try it
Path Parameters
accountId
curl -X GET \
  "https://api-stg.clkd.xyz/accounts/{accountId}"

List account signers

GET/accounts/{accountId}/signers🔒

List every signer enrolled in the account, with their address and enrollment date. Use to display co-signers in a group account or to verify multi-device enrollment.

Parameters
NameInTypeDescription
accountId*pathstring (uuid)Stealth account ID
Responses
200Default Response
Schema
signersrequiredobject[]
signerIdrequiredstring
addressrequiredstring
enrolledAtrequiredstring
ownerIdstring | null
json
{
  "signers": [
    {
      "signerId": "string",
      "address": "string",
      "enrolledAt": "string",
      "ownerId": "string"
    }
  ]
}
Try it
Path Parameters
accountId
curl -X GET \
  "https://api-stg.clkd.xyz/accounts/{accountId}/signers"

Add account signer

POST/accounts/{accountId}/signers🔒

Enroll an additional signer (device or co-owner) into a stealth account by submitting their stealth key material. Supports HPKE-encrypted or plaintext (dev-only) payloads. Used for multi-device access and group (multi-sig) accounts.

Parameters
NameInTypeDescription
accountId*pathstring (uuid)Stealth account ID
Request Body
Variant 1
ciphertextrequiredstring
Base64-encoded encrypted payload
encapsulatedKeyrequiredstring
Base64-encoded HPKE encapsulated key
ownerIdstring
Opaque integrator-provided user ID
Variant 2
P_spendrequiredstring
Spending public key (hex)
P_viewrequiredstring
Viewing public key (hex)
child_p_viewrequiredstring
Child viewing private key (hex)
ownerIdstring
Opaque integrator-provided user ID
Responses
200Default Response
Schema
signerIdrequiredstring
json
{
  "signerId": "string"
}
Try it
Path Parameters
accountId
Request Body
curl -X POST \
  -H "Content-Type: application/json" \
  -d '{
  "ciphertext": "",
  "encapsulatedKey": "",
  "ownerId": ""
}' \
  "https://api-stg.clkd.xyz/accounts/{accountId}/signers"

Get account config

GET/accounts/{accountId}/config🔒

Retrieve the signer configuration history for the account, showing threshold and signer changes over time. Useful for auditing multi-sig setup changes.

Parameters
NameInTypeDescription
accountId*pathstring (uuid)Stealth account ID
Responses
200Default Response
Schema
configsrequiredobject[]
idrequiredstring
versionrequirednumber
thresholdrequirednumber
signerIdsrequiredstring[]
statusrequiredstring
createdAtrequiredstring
retiredAtstring | null
json
{
  "configs": [
    {
      "id": "string",
      "version": 0,
      "threshold": 0,
      "signerIds": [
        "string"
      ],
      "status": "string",
      "createdAt": "string",
      "retiredAt": "string"
    }
  ]
}
Try it
Path Parameters
accountId
curl -X GET \
  "https://api-stg.clkd.xyz/accounts/{accountId}/config"

Set subdomain

POST/accounts/{accountId}/subdomain🔒

Claim an ENS subdomain (e.g. alice.clkd.eth) for this account so senders can pay the user via a human-readable name instead of a raw address.

Parameters
NameInTypeDescription
accountId*pathstring (uuid)Stealth account ID
Request Body
subdomainrequiredstring
Subdomain name (will be normalized and stored as {subdomain}.clkd.eth)
Responses
200Default Response
Schema
successrequiredboolean
messagerequiredstring
subdomainrequiredstring
json
{
  "success": true,
  "message": "string",
  "subdomain": "string"
}
Try it
Path Parameters
accountId
Request Body
curl -X POST \
  -H "Content-Type: application/json" \
  -d '{
  "subdomain": ""
}' \
  "https://api-stg.clkd.xyz/accounts/{accountId}/subdomain"

Generate subdomain

GET/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.

Parameters
NameInTypeDescription
accountId*pathstring (uuid)Stealth account ID
Responses
200Default Response
Schema
subdomainrequiredstring
e.g. "example-123.clkd.eth"
json
{
  "subdomain": "example-123.clkd.eth"
}
Try it
Path Parameters
accountId
curl -X GET \
  "https://api-stg.clkd.xyz/accounts/{accountId}/subdomain/generate"

Recovery

Optional recovery hierarchy — orgs recover teams, teams recover accounts. Without a team, an account can only be recovered by its own signers.

Create team

POST/teams/

Create a team whose multisig serves as the recovery signer for its member accounts. Accounts deployed with this team can be recovered by the team's signers if all device keys are lost. If no org is provided, a default one is auto-created.

Request Body
namerequiredstring
orgIdstring (uuid)
externalIdstring
accountsobject[]
accountIdrequiredstring (uuid)
labelstring
Responses
201Default Response
Schema
idrequiredstring
namerequiredstring
orgIdrequiredstring
externalIdrequiredstring | null
accountsrequiredobject[]
accountIdrequiredstring
labelrequiredstring | null
json
{
  "id": "string",
  "name": "string",
  "orgId": "string",
  "externalId": "string",
  "accounts": [
    {
      "accountId": "string",
      "label": "string"
    }
  ]
}
Try it
Request Body
curl -X POST \
  -H "Content-Type: application/json" \
  -d '{
  "name": "",
  "orgId": "",
  "externalId": "",
  "accounts": [
    {
      "accountId": "",
      "label": ""
    }
  ]
}' \
  "https://api-stg.clkd.xyz/teams/"

Get team

GET/teams/{teamId}🔒

Retrieve team details and its member accounts, including each account's threshold and signer count. Use to see which accounts this team can recover. Only accessible by team members.

Parameters
NameInTypeDescription
teamId*pathstring (uuid)
Responses
200Default Response
Schema
idrequiredstring
namerequiredstring
orgIdrequiredstring
externalIdrequiredstring | null
createdAtrequiredstring
accountsrequiredobject[]
accountIdrequiredstring
labelrequiredstring | null
thresholdrequirednumber
signerCountrequirednumber
json
{
  "id": "string",
  "name": "string",
  "orgId": "string",
  "externalId": "string",
  "createdAt": "string",
  "accounts": [
    {
      "accountId": "string",
      "label": "string",
      "threshold": 0,
      "signerCount": 0
    }
  ]
}
Try it
Path Parameters
teamId
curl -X GET \
  "https://api-stg.clkd.xyz/teams/{teamId}"

Add team account

POST/teams/{teamId}/accounts🔒

Add an existing stealth account to a team, making it recoverable by the team's multisig. The account must be redeployed with the team's recovery keys to take effect on-chain.

Parameters
NameInTypeDescription
teamId*pathstring (uuid)
Request Body
accountIdrequiredstring (uuid)
labelstring
Responses
201Default Response
Schema
teamIdrequiredstring
accountIdrequiredstring
labelrequiredstring | null
json
{
  "teamId": "string",
  "accountId": "string",
  "label": "string"
}
Try it
Path Parameters
teamId
Request Body
curl -X POST \
  -H "Content-Type: application/json" \
  -d '{
  "accountId": "",
  "label": ""
}' \
  "https://api-stg.clkd.xyz/teams/{teamId}/accounts"

Create org

POST/orgs/

Create an organization whose multisig serves as the recovery signer for its teams. The org is the root of the recovery hierarchy.

Request Body
namerequiredstring
externalIdstring
accountIdstring (uuid)
Responses
201Default Response
Schema
idrequiredstring
namerequiredstring
accountIdrequiredstring | null
externalIdrequiredstring | null
json
{
  "id": "string",
  "name": "string",
  "accountId": "string",
  "externalId": "string"
}
Try it
Request Body
curl -X POST \
  -H "Content-Type: application/json" \
  -d '{
  "name": "",
  "externalId": "",
  "accountId": ""
}' \
  "https://api-stg.clkd.xyz/orgs/"

Get org

GET/orgs/{orgId}🔒

Retrieve the organization and its full recovery tree — teams and their member accounts. Only accessible by accounts that belong to a team within the org.

Parameters
NameInTypeDescription
orgId*pathstring (uuid)
Responses
200Default Response
Schema
idrequiredstring
namerequiredstring
accountIdrequiredstring | null
externalIdrequiredstring | null
createdAtrequiredstring
teamsrequiredobject[]
idrequiredstring
namerequiredstring
accountIdrequiredstring | null
externalIdrequiredstring | null
accountsrequiredobject[]
accountIdrequiredstring
labelrequiredstring | null
thresholdrequirednumber
signerCountrequirednumber
json
{
  "id": "string",
  "name": "string",
  "accountId": "string",
  "externalId": "string",
  "createdAt": "string",
  "teams": [
    {
      "id": "string",
      "name": "string",
      "accountId": "string",
      "externalId": "string",
      "accounts": [
        {
          "accountId": "string",
          "label": "string",
          "threshold": 0,
          "signerCount": 0
        }
      ]
    }
  ]
}
Try it
Path Parameters
orgId
curl -X GET \
  "https://api-stg.clkd.xyz/orgs/{orgId}"

Receive

Payment address generation, receive pages, and ENS resolution

Get receive page

GET/u/{username}

Serve the public payment page for a username. Generates a fresh stealth address on every visit and renders an HTML page with a QR code for receiving funds. Supports optional invoice query params (?amount=&token=&chain=) for pre-filled payment requests. Development only — production uses hostname routing (https://<username>.clkd.id).

Parameters
NameInTypeDescription
username*pathstringUsername/subdomain
Responses
200HTML page with stealth address and QR code
Schema
string
json
"string"
400Default Response
Schema
errorrequiredstring
e.g. "Bad request"
messagerequiredstring
codestring
e.g. "BAD_REQUEST"
json
{
  "error": "Bad request",
  "message": "string",
  "code": "BAD_REQUEST"
}
404Default Response
Schema
errorrequiredstring
e.g. "Not found"
messagerequiredstring
json
{
  "error": "Not found",
  "message": "string"
}
Try it
Path Parameters
username
curl -X GET \
  "https://api-stg.clkd.xyz/u/{username}"

Create payment address

POST/accounts/{accountId}/payment-address🔒

Derive a one-time stealth payment address so a sender can transfer tokens to this account without revealing the recipient on-chain.

Parameters
NameInTypeDescription
accountId*pathstring (uuid)Stealth account ID
Request Body
memostring
Optional memo for reference
chainIdnumber
Chain ID (defaults to 11155111 / Sepolia)
Responses
200Default Response
Schema
addressrequiredstring
chainIdrequirednumber
noncerequiredstring
Nonce used for derivation (stringified bigint)
json
{
  "address": "string",
  "chainId": 0,
  "nonce": "string"
}
Try it
Path Parameters
accountId
Request Body
curl -X POST \
  -H "Content-Type: application/json" \
  -d '{
  "memo": "",
  "chainId": 0
}' \
  "https://api-stg.clkd.xyz/accounts/{accountId}/payment-address"

Resolve ENS

POST/ens/gateway/{sender}

EIP-3668 (CCIP-Read) gateway that resolves Cloaked ENS subdomains. Called automatically by ENS clients — generates a fresh stealth address for addr() lookups and returns signed responses for text records, contenthash, and multicall batches.

Parameters
NameInTypeDescription
sender*pathstringThe address making the request (0x...)
Request Body
datarequiredstring
Encoded function call (addr, text, multicall, etc.)
Responses
200Default Response
Schema
datarequiredstring
e.g. "0x..."
json
{
  "data": "0x..."
}
400Default Response
Schema
errorrequiredstring
e.g. "Bad request"
messagerequiredstring
codestring
e.g. "BAD_REQUEST"
json
{
  "error": "Bad request",
  "message": "string",
  "code": "BAD_REQUEST"
}
429Default Response
Schema
errorrequiredstring
e.g. "Too Many Requests"
messagerequiredstring
e.g. "Rate limit exceeded. Maximum 200 requests per 5 minutes."
json
{
  "error": "Too Many Requests",
  "message": "Rate limit exceeded. Maximum 200 requests per 5 minutes."
}
503Default Response
Schema
errorrequiredstring
e.g. "Service Unavailable"
messagerequiredstring
json
{
  "error": "Service Unavailable",
  "message": "string"
}
Try it
Path Parameters
sender
Request Body
curl -X POST \
  -H "Content-Type: application/json" \
  -d '{
  "data": ""
}' \
  "https://api-stg.clkd.xyz/ens/gateway/{sender}"

Send

Quoting, submitting, and managing transactions

Get quote signer public key

GET/.well-known/quote-signer-public-key

Retrieve 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.

Responses
200Default Response
Schema
publicKeyrequiredstring
e.g. "04..."
formatrequiredstring
e.g. "hex"
curverequiredstring
e.g. "P-256"
algorithmrequiredstring
e.g. "ECDSA"
json
{
  "publicKey": "04...",
  "format": "hex",
  "curve": "P-256",
  "algorithm": "ECDSA"
}
Try it
curl -X GET \
  "https://api-stg.clkd.xyz/.well-known/quote-signer-public-key"

Create quote

POST/accounts/{accountId}/quote🔒

Build a send quote that locks spendable UTXOs and returns signing data. Individual accounts receive intents and delegations for immediate client-side signing; group accounts receive a stored quoteId for multi-sig signature collection.

Parameters
NameInTypeDescription
accountId*pathstring (uuid)Stealth account ID
Request Body
chainIdrequirednumber
Chain ID (must support Porto)
tokenrequiredstring
Token address (0x...)
amountrequiredstring
Amount in smallest unit (stringified bigint)
decimalsrequirednumber
Token decimals (0-255)
destinationAddressrequiredstring
Destination address (0x... or ENS)
ttlnumber
Lock TTL in seconds (default: 86400, max: 86400)
Responses
200Default Response
Schema
intentsarray
delegationsarray
lockIdstring
expiresAtstring
resolvedDestinationstring
selfSendboolean
tokenPriceInEthnumber
priceValidUntilstring
signaturestring
quoteIdstring
json
{
  "intents": [
    null
  ],
  "delegations": [
    null
  ],
  "lockId": "string",
  "expiresAt": "string",
  "resolvedDestination": "string",
  "selfSend": true,
  "tokenPriceInEth": 0,
  "priceValidUntil": "string",
  "signature": "string",
  "quoteId": "string"
}
400Default Response
Schema
errorrequiredstring
e.g. "Bad request"
messagerequiredstring
codestring
e.g. "BAD_REQUEST"
json
{
  "error": "Bad request",
  "message": "string",
  "code": "BAD_REQUEST"
}
Try it
Path Parameters
accountId
Request Body
curl -X POST \
  -H "Content-Type: application/json" \
  -d '{
  "chainId": 0,
  "token": "",
  "amount": "",
  "decimals": 0,
  "destinationAddress": "",
  "ttl": 0
}' \
  "https://api-stg.clkd.xyz/accounts/{accountId}/quote"

List quotes

GET/accounts/{accountId}/quotes🔒

List active (pending and submitted) quotes for the account so signers can see which transactions await their signature or have already been relayed.

Parameters
NameInTypeDescription
accountId*pathstring (uuid)Stealth account ID
Responses
200Default Response
Schema
quotesrequiredobject[]
quoteIdrequiredstring
statusrequiredstring
chainIdrequirednumber
tokenrequiredstring
amountrequiredstring
destinationAddressrequiredstring
intentCountrequirednumber
signatureCountrequirednumber
thresholdrequirednumber
expiresAtrequiredstring
txHashstring | null
createdAtrequiredstring
json
{
  "quotes": [
    {
      "quoteId": "string",
      "status": "string",
      "chainId": 0,
      "token": "string",
      "amount": "string",
      "destinationAddress": "string",
      "intentCount": 0,
      "signatureCount": 0,
      "threshold": 0,
      "expiresAt": "string",
      "txHash": "string",
      "createdAt": "string"
    }
  ]
}
Try it
Path Parameters
accountId
curl -X GET \
  "https://api-stg.clkd.xyz/accounts/{accountId}/quotes"

Submit quote signatures

POST/accounts/{accountId}/quotes/{quoteId}/signatures🔒

Submit one signer's EIP-712 signatures for a multi-sig quote. When enough signers have signed (threshold met), the transaction is automatically relayed on-chain.

Parameters
NameInTypeDescription
accountId*pathstring (uuid)
quoteId*pathstring (uuid)
Request Body
signerAddressrequiredstring
Address of the signing member
signaturesrequiredobject[]
intentIndexrequirednumber
Index into the quote intents array
signaturerequiredstring
EIP-712 signature (0x + 130 hex chars)
Responses
200Default Response
Schema
acceptedrequiredboolean
thresholdMetrequiredboolean
signatureCountrequirednumber
thresholdrequirednumber
txHashstring
json
{
  "accepted": true,
  "thresholdMet": true,
  "signatureCount": 0,
  "threshold": 0,
  "txHash": "string"
}
Try it
Path Parameters
accountId
quoteId
Request Body
curl -X POST \
  -H "Content-Type: application/json" \
  -d '{
  "signerAddress": "",
  "signatures": [
    {
      "intentIndex": 0,
      "signature": ""
    }
  ]
}' \
  "https://api-stg.clkd.xyz/accounts/{accountId}/quotes/{quoteId}/signatures"

Submit transaction

POST/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.

Parameters
NameInTypeDescription
accountId*pathstring (uuid)Stealth account ID
Request Body
intentsrequiredarray
delegationsrequiredarray
lockIdrequiredstring
Lock ID from quote response
tokenPriceInEthnumber
Token price in ETH from quote
priceValidUntilstring
ISO timestamp until which the quoted price is valid
Responses
200Default Response
Schema
successrequiredboolean
txHashrequiredstring
statusrequiredstring
messagerequiredstring
json
{
  "success": true,
  "txHash": "string",
  "status": "string",
  "message": "string"
}
400Default Response
Schema
errorrequiredstring
e.g. "Bad request"
messagerequiredstring
codestring
e.g. "BAD_REQUEST"
json
{
  "error": "Bad request",
  "message": "string",
  "code": "BAD_REQUEST"
}
404Default Response
Schema
errorrequiredstring
e.g. "Not found"
messagerequiredstring
json
{
  "error": "Not found",
  "message": "string"
}
Try it
Path Parameters
accountId
Request Body
curl -X POST \
  -H "Content-Type: application/json" \
  -d '{
  "intents": [
    null
  ],
  "delegations": [
    null
  ],
  "lockId": "",
  "tokenPriceInEth": 0,
  "priceValidUntil": ""
}' \
  "https://api-stg.clkd.xyz/accounts/{accountId}/submit"

Unlock spendables

POST/accounts/{accountId}/unlock🔒

Release the UTXO 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.

Parameters
NameInTypeDescription
accountId*pathstring (uuid)Stealth account ID
Request Body
lockIdrequiredstring
Lock ID from quote response
Responses
200Default Response
Schema
successrequiredboolean
messagerequiredstring
json
{
  "success": true,
  "message": "string"
}
400Default Response
Schema
errorrequiredstring
e.g. "Bad request"
messagerequiredstring
codestring
e.g. "BAD_REQUEST"
json
{
  "error": "Bad request",
  "message": "string",
  "code": "BAD_REQUEST"
}
404Default Response
Schema
errorrequiredstring
e.g. "Not found"
messagerequiredstring
json
{
  "error": "Not found",
  "message": "string"
}
Try it
Path Parameters
accountId
Request Body
curl -X POST \
  -H "Content-Type: application/json" \
  -d '{
  "lockId": ""
}' \
  "https://api-stg.clkd.xyz/accounts/{accountId}/unlock"

Get max sendable

POST/accounts/{accountId}/max-sendable🔒

Calculate the maximum sendable amount for a token after deducting relay fees, so the UI can show a reliable "max" button without over-committing funds.

Parameters
NameInTypeDescription
accountId*pathstring (uuid)Stealth account ID
Request Body
chainIdrequirednumber
Chain ID (must support Porto)
tokenrequiredstring
Token address (0x...)
Responses
200Default Response
Schema
maxSendablerequiredstring
feeEstimaterequiredstring
spendableCountrequirednumber
json
{
  "maxSendable": "string",
  "feeEstimate": "string",
  "spendableCount": 0
}
400Default Response
Schema
errorrequiredstring
e.g. "Bad request"
messagerequiredstring
codestring
e.g. "BAD_REQUEST"
json
{
  "error": "Bad request",
  "message": "string",
  "code": "BAD_REQUEST"
}
Try it
Path Parameters
accountId
Request Body
curl -X POST \
  -H "Content-Type: application/json" \
  -d '{
  "chainId": 0,
  "token": ""
}' \
  "https://api-stg.clkd.xyz/accounts/{accountId}/max-sendable"

Balance & Activity

Balance queries, transaction history, and supported tokens

List supported chains

GET/supported-chains

List every chain the platform supports, including explorer URLs, logo base names, and testnet/mainnet mapping. Use to populate chain pickers or build explorer links.

Responses
200Default Response
Schema (item)
namerequiredstring
chainIdrequirednumber
isTestnetrequiredboolean
explorerUrlrequiredstring
explorerTxPathrequiredstring
mainnetChainIdrequirednumber
logoBaseNamerequiredstring
isSquareLogorequiredboolean
json
[
  {
    "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/supported-chains"

Get token catalog

GET/token-catalog

Return the full curated token list (Uniswap default list + native ETH + testnet extras), pinned symbols for the swap picker, and testnet-to-mainnet chain-ID mapping.

Responses
200Default Response
Schema
tokensrequiredobject[]
addressrequiredstring
symbolrequiredstring
namerequiredstring
decimalsrequirednumber
chainIdrequirednumber
logoURIstring
pinnedSymbolsrequiredstring[]
testnetToMainnetrequiredobject
json
{
  "tokens": [
    {
      "address": "string",
      "symbol": "string",
      "name": "string",
      "decimals": 0,
      "chainId": 0,
      "logoURI": "string"
    }
  ],
  "pinnedSymbols": [
    "string"
  ],
  "testnetToMainnet": null
}
Try it
curl -X GET \
  "https://api-stg.clkd.xyz/token-catalog"

Get balances

GET/accounts/{accountId}/balance🔒

Retrieve token balances across every supported chain for this account, including available and pending amounts and USD values. Returns a totalUsdAmount summarizing all holdings.

Parameters
NameInTypeDescription
accountId*pathstring (uuid)Stealth account ID
Responses
200Default Response
Schema
balancesrequiredobject[]
chainIdrequirednumber
e.g. 8453
chainNamerequiredstring
e.g. "Base"
tokenrequiredstring
e.g. "0x..."
tokenSymbolrequiredstring
e.g. "USDC"
decimalsrequirednumber
e.g. 6
logoUrlrequiredstring | null
e.g. "https://..."
availablerequiredstring
e.g. "1000000"
pendingrequiredstring
e.g. "500000"
usdAmountrequirednumber | null
e.g. 1.5
spamrequiredboolean
e.g. false
totalUsdAmountrequirednumber | null
e.g. 1.5
json
{
  "balances": [
    {
      "chainId": 8453,
      "chainName": "Base",
      "token": "0x...",
      "tokenSymbol": "USDC",
      "decimals": 6,
      "logoUrl": "https://...",
      "available": "1000000",
      "pending": "500000",
      "usdAmount": 1.5,
      "spam": false
    }
  ],
  "totalUsdAmount": 1.5
}
401Default Response
Schema
errorrequiredstring
e.g. "Unauthorized"
messagerequiredstring
codestring
e.g. "UNAUTHORIZED"
json
{
  "error": "Unauthorized",
  "message": "string",
  "code": "UNAUTHORIZED"
}
404Default Response
Schema
errorrequiredstring
e.g. "Not found"
messagerequiredstring
json
{
  "error": "Not found",
  "message": "string"
}
429Default Response
Schema
errorrequiredstring
e.g. "Too Many Requests"
messagerequiredstring
e.g. "Rate limit exceeded. Maximum 60 requests per 1 minute."
json
{
  "error": "Too Many Requests",
  "message": "Rate limit exceeded. Maximum 60 requests per 1 minute."
}
Try it
Path Parameters
accountId
curl -X GET \
  "https://api-stg.clkd.xyz/accounts/{accountId}/balance"

Get chain balances

GET/accounts/{accountId}/balance/{chainId}🔒

Retrieve token balances filtered to a single chain. Same response shape as getBalances but scoped to the given chainId.

Parameters
NameInTypeDescription
accountId*pathstring (uuid)Stealth account ID
chainId*pathstringChain ID (e.g., 8453 for Base)
Responses
200Default Response
Schema
balancesrequiredobject[]
chainIdrequirednumber
e.g. 8453
chainNamerequiredstring
e.g. "Base"
tokenrequiredstring
e.g. "0x..."
tokenSymbolrequiredstring
e.g. "USDC"
decimalsrequirednumber
e.g. 6
logoUrlrequiredstring | null
e.g. "https://..."
availablerequiredstring
e.g. "1000000"
pendingrequiredstring
e.g. "500000"
usdAmountrequirednumber | null
e.g. 1.5
spamrequiredboolean
e.g. false
totalUsdAmountrequirednumber | null
e.g. 1.5
json
{
  "balances": [
    {
      "chainId": 8453,
      "chainName": "Base",
      "token": "0x...",
      "tokenSymbol": "USDC",
      "decimals": 6,
      "logoUrl": "https://...",
      "available": "1000000",
      "pending": "500000",
      "usdAmount": 1.5,
      "spam": false
    }
  ],
  "totalUsdAmount": 1.5
}
400Default Response
Schema
errorrequiredstring
e.g. "Bad request"
messagerequiredstring
codestring
e.g. "BAD_REQUEST"
json
{
  "error": "Bad request",
  "message": "string",
  "code": "BAD_REQUEST"
}
401Default Response
Schema
errorrequiredstring
e.g. "Unauthorized"
messagerequiredstring
codestring
e.g. "UNAUTHORIZED"
json
{
  "error": "Unauthorized",
  "message": "string",
  "code": "UNAUTHORIZED"
}
404Default Response
Schema
errorrequiredstring
e.g. "Not found"
messagerequiredstring
json
{
  "error": "Not found",
  "message": "string"
}
429Default Response
Schema
errorrequiredstring
e.g. "Too Many Requests"
messagerequiredstring
e.g. "Rate limit exceeded. Maximum 60 requests per 1 minute."
json
{
  "error": "Too Many Requests",
  "message": "Rate limit exceeded. Maximum 60 requests per 1 minute."
}
Try it
Path Parameters
accountId
chainId
curl -X GET \
  "https://api-stg.clkd.xyz/accounts/{accountId}/balance/{chainId}"

Get token balance

GET/accounts/{accountId}/balance/{chainId}/{token}🔒

Retrieve the balance for a single token on a specific chain. Returns a zero-balance object if the token has never been received.

Parameters
NameInTypeDescription
accountId*pathstring (uuid)Stealth account ID
chainId*pathstringChain ID
token*pathstringToken address (0x...)
Responses
200Default Response
Schema
chainIdrequirednumber
e.g. 8453
chainNamerequiredstring
e.g. "Base"
tokenrequiredstring
e.g. "0x..."
tokenSymbolrequiredstring
e.g. "USDC"
decimalsrequirednumber
e.g. 6
logoUrlrequiredstring | null
e.g. "https://..."
availablerequiredstring
e.g. "1000000"
pendingrequiredstring
e.g. "500000"
usdAmountrequirednumber | null
e.g. 1.5
spamrequiredboolean
e.g. false
json
{
  "chainId": 8453,
  "chainName": "Base",
  "token": "0x...",
  "tokenSymbol": "USDC",
  "decimals": 6,
  "logoUrl": "https://...",
  "available": "1000000",
  "pending": "500000",
  "usdAmount": 1.5,
  "spam": false
}
400Default Response
Schema
errorrequiredstring
e.g. "Bad request"
messagerequiredstring
codestring
e.g. "BAD_REQUEST"
json
{
  "error": "Bad request",
  "message": "string",
  "code": "BAD_REQUEST"
}
401Default Response
Schema
errorrequiredstring
e.g. "Unauthorized"
messagerequiredstring
codestring
e.g. "UNAUTHORIZED"
json
{
  "error": "Unauthorized",
  "message": "string",
  "code": "UNAUTHORIZED"
}
404Default Response
Schema
errorrequiredstring
e.g. "Not found"
messagerequiredstring
json
{
  "error": "Not found",
  "message": "string"
}
429Default Response
Schema
errorrequiredstring
e.g. "Too Many Requests"
messagerequiredstring
e.g. "Rate limit exceeded. Maximum 60 requests per 1 minute."
json
{
  "error": "Too Many Requests",
  "message": "Rate limit exceeded. Maximum 60 requests per 1 minute."
}
Try it
Path Parameters
accountId
chainId
token
curl -X GET \
  "https://api-stg.clkd.xyz/accounts/{accountId}/balance/{chainId}/{token}"

Get activities

GET/accounts/{accountId}/activities🔒

List send, receive, and self-transfer transactions for the account with cursor-based pagination. Each activity includes transfer details, fees, USD amounts, and a failure flag.

Parameters
NameInTypeDescription
limitquerystringMaximum number of activities to return (1-500, default: 100)
cursorquerystringBase64-encoded cursor for pagination
accountId*pathstring (uuid)Stealth account ID
Responses
200Default Response
Schema
activityrequiredobject[]
txHashrequiredstring
e.g. "0x..."
chainIdrequirednumber
e.g. 8453
chainNamerequiredstring
e.g. "Base"
activityTyperequiredstring | string | string | string
daterequiredstring (date-time)
transferrequiredobject | null
transferInrequiredobject | null
feerequiredobject | null
isFailurerequiredboolean
e.g. false
isLikelySpamrequiredboolean
e.g. false
paginationrequiredobject
limitrequirednumber
e.g. 100
nextCursorrequiredstring | null
Base64-encoded cursor for next page
json
{
  "activity": [
    {
      "txHash": "0x...",
      "chainId": 8453,
      "chainName": "Base",
      "activityType": "string",
      "date": "string",
      "transfer": {
        "tokenAddress": "0x...",
        "decimals": 6,
        "tokenSymbol": "USDC",
        "logoUrl": "https://...",
        "fromAddress": "0x...",
        "toAddress": "0x...",
        "value": "1000000",
        "usdAmount": 1
      },
      "transferIn": {
        "tokenAddress": "0x...",
        "decimals": 6,
        "tokenSymbol": "USDC",
        "logoUrl": "string",
        "fromAddress": "0x...",
        "toAddress": "0x...",
        "value": "1000000",
        "usdAmount": 1
      },
      "fee": {
        "tokenAddress": "0x...",
        "decimals": 18,
        "tokenSymbol": "ETH",
        "logoUrl": "string",
        "value": "1000000000000000",
        "usdAmount": 0.001
      },
      "isFailure": false,
      "isLikelySpam": false
    }
  ],
  "pagination": {
    "limit": 100,
    "nextCursor": "string"
  }
}
400Default Response
Schema
errorrequiredstring
e.g. "Bad request"
messagerequiredstring
codestring
e.g. "BAD_REQUEST"
json
{
  "error": "Bad request",
  "message": "string",
  "code": "BAD_REQUEST"
}
401Default Response
Schema
errorrequiredstring
e.g. "Unauthorized"
messagerequiredstring
codestring
e.g. "UNAUTHORIZED"
json
{
  "error": "Unauthorized",
  "message": "string",
  "code": "UNAUTHORIZED"
}
404Default Response
Schema
errorrequiredstring
e.g. "Not found"
messagerequiredstring
json
{
  "error": "Not found",
  "message": "string"
}
Try it
Path Parameters
accountId
Query Parameters
limit
cursor
curl -X GET \
  "https://api-stg.clkd.xyz/accounts/{accountId}/activities"

Swap

Get max swappable

POST/accounts/{accountId}/max-swappable🔒

Calculate the maximum swappable amount for a token after deducting relay + swap fees, so the UI can show a reliable "max" button for swaps.

Parameters
NameInTypeDescription
accountId*pathstring (uuid)Stealth account ID
Request Body
chainIdrequirednumber
Chain ID (must support Porto)
tokenrequiredstring
Token address (0x...)
Responses
200Default Response
Schema
maxSwappablerequiredstring
feeEstimaterequiredstring
spendableCountrequirednumber
json
{
  "maxSwappable": "string",
  "feeEstimate": "string",
  "spendableCount": 0
}
400Default Response
Schema
errorrequiredstring
e.g. "Bad request"
messagerequiredstring
codestring
e.g. "BAD_REQUEST"
json
{
  "error": "Bad request",
  "message": "string",
  "code": "BAD_REQUEST"
}
Try it
Path Parameters
accountId
Request Body
curl -X POST \
  -H "Content-Type: application/json" \
  -d '{
  "chainId": 0,
  "token": ""
}' \
  "https://api-stg.clkd.xyz/accounts/{accountId}/max-swappable"

Create swap preview

POST/accounts/{accountId}/swap-preview🔒

Get a swap preview (price discovery) without locking spendables.

Parameters
NameInTypeDescription
accountId*pathstring (uuid)Stealth account ID
Request Body
chainIdrequirednumber
Chain ID
tokenInrequiredstring
Token address being sold
tokenOutrequiredstring
Token address being bought
amountInrequiredstring
Amount to swap in smallest unit (stringified bigint)
slippageBpsrequirednumber
Slippage tolerance in basis points (e.g. 50 = 0.5%, max: 500 = 5%)
tokenOutChainIdnumber
Destination chain ID for cross-chain swaps
Responses
200Default Response
Schema
expectedOutputrequiredstring
minimumOutputrequiredstring
outputTokenrequiredstring
outputDecimalsrequirednumber
outputSymbolrequiredstring
routingrequiredstring
slippageBpsrequirednumber
feeEstimaterequiredstring
estimatedFillTimeMsnumber
protocolFeeBpsrequirednumber
protocolFeeAmountrequiredstring
json
{
  "expectedOutput": "string",
  "minimumOutput": "string",
  "outputToken": "string",
  "outputDecimals": 0,
  "outputSymbol": "string",
  "routing": "string",
  "slippageBps": 0,
  "feeEstimate": "string",
  "estimatedFillTimeMs": 0,
  "protocolFeeBps": 0,
  "protocolFeeAmount": "string"
}
400Default Response
Schema
errorrequiredstring
e.g. "Bad request"
messagerequiredstring
codestring
e.g. "BAD_REQUEST"
json
{
  "error": "Bad request",
  "message": "string",
  "code": "BAD_REQUEST"
}
429Default Response
Schema
errorrequiredstring
e.g. "Bad request"
messagerequiredstring
codestring
e.g. "BAD_REQUEST"
json
{
  "error": "Bad request",
  "message": "string",
  "code": "BAD_REQUEST"
}
502Default Response
Schema
errorrequiredstring
e.g. "Bad request"
messagerequiredstring
codestring
e.g. "BAD_REQUEST"
json
{
  "error": "Bad request",
  "message": "string",
  "code": "BAD_REQUEST"
}
503Default Response
Schema
errorrequiredstring
e.g. "Service Unavailable"
messagerequiredstring
json
{
  "error": "Service Unavailable",
  "message": "string"
}
Try it
Path Parameters
accountId
Request Body
curl -X POST \
  -H "Content-Type: application/json" \
  -d '{
  "chainId": 0,
  "tokenIn": "",
  "tokenOut": "",
  "amountIn": "",
  "slippageBps": 0,
  "tokenOutChainId": 0
}' \
  "https://api-stg.clkd.xyz/accounts/{accountId}/swap-preview"

Create swap quote

POST/accounts/{accountId}/swap-quote🔒

Get a swap quote via Uniswap. Returns intents and delegations for client signing.

Parameters
NameInTypeDescription
accountId*pathstring (uuid)Stealth account ID
Request Body
chainIdrequirednumber
Chain ID
tokenInrequiredstring
Token address being sold
tokenOutrequiredstring
Token address being bought
amountInrequiredstring
Amount to swap in smallest unit (stringified bigint)
slippageBpsrequirednumber
Slippage tolerance in basis points (e.g. 50 = 0.5%, max: 500 = 5%)
tokenOutChainIdnumber
Destination chain ID for cross-chain swaps
Responses
200Default Response
Schema
intentsrequiredarray
delegationsrequiredarray
lockIdrequiredstring
expiresAtrequiredstring
expectedOutputrequiredstring
minimumOutputrequiredstring
outputTokenrequiredstring
outputDecimalsrequirednumber
outputSymbolrequiredstring
outputRecipientrequiredstring
slippageBpsrequirednumber
routingrequiredstring
signaturestring
estimatedFillTimeMsnumber
fillDeadlinenumber
protocolFeeBpsrequirednumber
protocolFeeAmountrequiredstring
planIdstring
json
{
  "intents": [
    null
  ],
  "delegations": [
    null
  ],
  "lockId": "string",
  "expiresAt": "string",
  "expectedOutput": "string",
  "minimumOutput": "string",
  "outputToken": "string",
  "outputDecimals": 0,
  "outputSymbol": "string",
  "outputRecipient": "string",
  "slippageBps": 0,
  "routing": "string",
  "signature": "string",
  "estimatedFillTimeMs": 0,
  "fillDeadline": 0,
  "protocolFeeBps": 0,
  "protocolFeeAmount": "string",
  "planId": "string"
}
400Default Response
Schema
errorrequiredstring
e.g. "Bad request"
messagerequiredstring
codestring
e.g. "BAD_REQUEST"
json
{
  "error": "Bad request",
  "message": "string",
  "code": "BAD_REQUEST"
}
429Default Response
Schema
errorrequiredstring
e.g. "Bad request"
messagerequiredstring
codestring
e.g. "BAD_REQUEST"
json
{
  "error": "Bad request",
  "message": "string",
  "code": "BAD_REQUEST"
}
502Default Response
Schema
errorrequiredstring
e.g. "Bad request"
messagerequiredstring
codestring
e.g. "BAD_REQUEST"
json
{
  "error": "Bad request",
  "message": "string",
  "code": "BAD_REQUEST"
}
503Default Response
Schema
errorrequiredstring
e.g. "Service Unavailable"
messagerequiredstring
json
{
  "error": "Service Unavailable",
  "message": "string"
}
Try it
Path Parameters
accountId
Request Body
curl -X POST \
  -H "Content-Type: application/json" \
  -d '{
  "chainId": 0,
  "tokenIn": "",
  "tokenOut": "",
  "amountIn": "",
  "slippageBps": 0,
  "tokenOutChainId": 0
}' \
  "https://api-stg.clkd.xyz/accounts/{accountId}/swap-quote"

Bridge

Get bridge status

GET/accounts/{accountId}/bridge-status🔒

Get the status of a cross-chain bridge swap.

Parameters
NameInTypeDescription
txHash*querystringSource chain transaction hash
chainId*querynumberSource chain ID
accountId*pathstring (uuid)Stealth account ID
Responses
200Default Response
Schema
statusrequiredstring
swapTyperequiredstring
json
{
  "status": "string",
  "swapType": "string"
}
400Default Response
Schema
errorrequiredstring
e.g. "Bad request"
messagerequiredstring
codestring
e.g. "BAD_REQUEST"
json
{
  "error": "Bad request",
  "message": "string",
  "code": "BAD_REQUEST"
}
502Default Response
Schema
errorrequiredstring
e.g. "Bad request"
messagerequiredstring
codestring
e.g. "BAD_REQUEST"
json
{
  "error": "Bad request",
  "message": "string",
  "code": "BAD_REQUEST"
}
503Default Response
Schema
errorrequiredstring
e.g. "Service Unavailable"
messagerequiredstring
json
{
  "error": "Service Unavailable",
  "message": "string"
}
Try it
Path Parameters
accountId
Query Parameters
txHash
chainId
curl -X GET \
  "https://api-stg.clkd.xyz/accounts/{accountId}/bridge-status"

Get bridge swaps

GET/accounts/{accountId}/bridge-swaps🔒

List bridge swap records for the account.

Parameters
NameInTypeDescription
accountId*pathstring (uuid)Stealth account ID
Responses
200Default Response
Schema
bridgeSwapsrequiredobject[]
idrequiredstring (uuid)
sourceTxHashrequiredstring | null
sourceChainIdrequirednumber
sourceChainNamerequiredstring
sourceTokenAddressrequiredstring
sourceTokenSymbolrequiredstring
sourceDecimalsrequirednumber
sourceLogoUrlrequiredstring | null
sourceAmountrequiredstring
destChainIdrequirednumber
destChainNamerequiredstring
destTokenAddressrequiredstring
destTokenSymbolrequiredstring
destDecimalsrequirednumber
destLogoUrlrequiredstring | null
destExpectedAmountrequiredstring
outputRecipientrequiredstring
estimatedFillTimeMsrequirednumber | null
fillDeadlinerequirednumber | null
planIdrequiredstring | null
statusrequiredstring | string | string | string | string
destTxHashrequiredstring | null
destActualAmountrequiredstring | null
createdAtrequiredstring (date-time)
updatedAtrequiredstring (date-time)
json
{
  "bridgeSwaps": [
    {
      "id": "string",
      "sourceTxHash": "string",
      "sourceChainId": 0,
      "sourceChainName": "string",
      "sourceTokenAddress": "string",
      "sourceTokenSymbol": "string",
      "sourceDecimals": 0,
      "sourceLogoUrl": "string",
      "sourceAmount": "string",
      "destChainId": 0,
      "destChainName": "string",
      "destTokenAddress": "string",
      "destTokenSymbol": "string",
      "destDecimals": 0,
      "destLogoUrl": "string",
      "destExpectedAmount": "string",
      "outputRecipient": "string",
      "estimatedFillTimeMs": 0,
      "fillDeadline": 0,
      "planId": "string",
      "status": "string",
      "destTxHash": "string",
      "destActualAmount": "string",
      "createdAt": "string",
      "updatedAt": "string"
    }
  ]
}
401Default Response
Schema
errorrequiredstring
e.g. "Unauthorized"
messagerequiredstring
codestring
e.g. "UNAUTHORIZED"
json
{
  "error": "Unauthorized",
  "message": "string",
  "code": "UNAUTHORIZED"
}
Try it
Path Parameters
accountId
curl -X GET \
  "https://api-stg.clkd.xyz/accounts/{accountId}/bridge-swaps"

Create bridge swap

POST/accounts/{accountId}/bridge-swaps🔒

Create a bridge swap tracking record for a cross-chain swap.

Parameters
NameInTypeDescription
accountId*pathstring (uuid)Stealth account ID
Request Body
sourceTxHashrequiredstring | null
sourceChainIdrequirednumber
sourceTokenAddressrequiredstring
sourceTokenSymbolrequiredstring
sourceDecimalsrequirednumber
sourceLogoUrlrequiredstring | null
sourceAmountrequiredstring
destChainIdrequirednumber
destTokenAddressrequiredstring
destTokenSymbolrequiredstring
destDecimalsrequirednumber
destLogoUrlrequiredstring | null
destExpectedAmountrequiredstring
outputRecipientrequiredstring
estimatedFillTimeMsrequirednumber | null
fillDeadlinerequirednumber | null
planIdstring | null
Responses
201Default Response
Schema
idrequiredstring (uuid)
json
{
  "id": "string"
}
400Default Response
Schema
errorrequiredstring
e.g. "Bad request"
messagerequiredstring
codestring
e.g. "BAD_REQUEST"
json
{
  "error": "Bad request",
  "message": "string",
  "code": "BAD_REQUEST"
}
401Default Response
Schema
errorrequiredstring
e.g. "Unauthorized"
messagerequiredstring
codestring
e.g. "UNAUTHORIZED"
json
{
  "error": "Unauthorized",
  "message": "string",
  "code": "UNAUTHORIZED"
}
Try it
Path Parameters
accountId
Request Body
curl -X POST \
  -H "Content-Type: application/json" \
  -d '{
  "sourceTxHash": "",
  "sourceChainId": 0,
  "sourceTokenAddress": "",
  "sourceTokenSymbol": "",
  "sourceDecimals": 0,
  "sourceLogoUrl": "",
  "sourceAmount": "",
  "destChainId": 0,
  "destTokenAddress": "",
  "destTokenSymbol": "",
  "destDecimals": 0,
  "destLogoUrl": "",
  "destExpectedAmount": "",
  "outputRecipient": "",
  "estimatedFillTimeMs": 0,
  "fillDeadline": 0,
  "planId": ""
}' \
  "https://api-stg.clkd.xyz/accounts/{accountId}/bridge-swaps"