CARDAXO API
The CARDAXO API enables you to programmatically manage users, wallet addresses, balances, transactions, and withdrawals. All API requests require authentication via HMAC-SHA256 signatures.
Base URL
https://www.cardaxowallets.com/api/v1
Authentication
All API requests must include three authentication headers:
| Header | Description |
|---|---|
| X-Api-Key | Your API key (starts with ck_) |
| X-Timestamp | Unix timestamp (seconds). Must be within 5 minutes of server time. |
| X-Signature | HMAC-SHA256 signature of the request |
Generating the Signature
The signature is computed by concatenating the Unix timestamp and the raw request body with a period, then computing HMAC-SHA256 using your API secret:
Signature Payload Format:
{timestamp}.{request_body}
For GET requests with no body, use empty string: 1733659200.
Rate Limiting
API requests are rate-limited per API client. The default limit is 1000 requests per minute.
| Response Header | Description |
|---|---|
| X-RateLimit-Limit | Maximum requests per minute |
| X-RateLimit-Remaining | Remaining requests in current window |
| Retry-After | Seconds until rate limit resets (only when exceeded) |
API Endpoints
/user/register
Register a new user in the CARDAXO system. If the user already exists (by external_id), returns the existing user.
Permission: user.register
Request Body
Success Response (201)
/address/enable
Enable a wallet address for a user on a specific blockchain. Creates a new wallet if one doesn't exist.
Permission: address.enable
Request Body
Success Response (201)
/user/{id}/addresses
Get all wallet addresses and balances for a user.
Permission: address.read
Success Response (200)
/user/{id}/balance
Get detailed balance information for a user across all chains or a specific chain.
Permission: balance.read
Query Parameters
chain | Optional - Filter by chain symbol (BNB, ETH, etc.) |
Success Response (200)
/user/{id}/transactions
Get transaction history for a user with optional filters.
Permission: transaction.read
Query Parameters
chain | Optional - Filter by chain symbol |
type | Optional - Filter by type: receive, send |
status | Optional - Filter by status: pending, confirmed, failed |
from_date | Optional - Start date (YYYY-MM-DD) |
to_date | Optional - End date (YYYY-MM-DD) |
page | Optional - Page number (default: 1) |
per_page | Optional - Items per page (default: 20, max: 100) |
Success Response (200)
/wallet/debit
Debit funds from a user's wallet for card recharges or internal transactions. This is an internal operation that does not involve blockchain transactions.
Permission: wallet.debit
Request Body
Success Response (201)
/wallet/credit
Credit funds to a user's wallet. This is an internal operation for refunds or rewards.
Permission: wallet.credit
Request Body
Success Response (201)
/withdrawal/request
Request a withdrawal to an external address. Withdrawals require admin approval.
Permission: withdrawal.request
Request Body
Success Response (201)
/withdrawal/fee-preview
Preview withdrawal fees before submitting a request.
Permission: withdrawal.read
Request Body
Success Response (200)
/withdrawal/{id}
Get the status of a withdrawal request.
Permission: withdrawal.read
Success Response (200)
/chains
Get list of supported blockchains.
Permission: chains.read
Success Response (200)
Webhook Management
Manage webhook configurations for receiving event notifications.
/webhooks
List all configured webhooks.
Permission: webhook.read
Success Response (200)
/webhooks
Create a new webhook configuration.
Permission: webhook.write
Request Body
Success Response (201)
/webhooks/{id}
Get a single webhook configuration by ID.
Permission: webhook.read
Success Response (200)
/webhooks/{id}
Update webhook configuration. All fields are optional — only provided fields are updated.
Permission: webhook.write
Request Body
/webhooks/{id}
Permanently delete a webhook configuration.
Permission: webhook.write
Success Response (200)
/webhooks/{id}/rotate-secret
Rotate the webhook secret. The new secret is returned once — update your server immediately. Old deliveries signed with the previous secret will no longer verify.
Permission: webhook.write
Success Response (200)
Webhook Events
When events occur, we send POST requests to your configured webhook URLs. Verify the signature using the webhook secret.
Verifying Webhook Signatures
Event Types
deposit.pending
Sent when a deposit is detected but not yet confirmed.
deposit.confirmed
Sent when a deposit has been confirmed on the blockchain.
withdrawal.pending
Sent when a withdrawal request is created and awaiting admin approval.
withdrawal.approved
Sent when a withdrawal request has been approved and is queued for processing.
withdrawal.completed
Sent when a withdrawal has been processed and confirmed on the blockchain.
withdrawal.rejected
Sent when a withdrawal request is rejected. The rejection_reason field contains the reason provided.
withdrawal.failed
Sent when a withdrawal was attempted on-chain but the transaction failed (e.g. insufficient gas, reverted transaction). The withdrawal may be retried after investigation.
Error Handling
All errors return a consistent JSON structure:
Error Codes
| HTTP Status | Error Code | Description |
|---|---|---|
| 400 | chain_not_supported | The specified chain is not available |
| 400 | token_not_supported | The token is not supported on this chain |
| 400 | wallet_not_found | User doesn't have a wallet for this chain |
| 400 | insufficient_balance | Not enough funds for the operation |
| 400 | duplicate_webhook | Webhook URL already exists |
| 401 | missing_headers | Required auth headers are missing |
| 401 | timestamp_expired | Request timestamp is too old |
| 401 | invalid_api_key | API key is invalid or inactive |
| 401 | invalid_signature | HMAC signature verification failed |
| 403 | ip_not_allowed | IP address not in whitelist |
| 403 | permission_denied | API key lacks required permission |
| 404 | user_not_found | User not found or wrong API client |
| 404 | withdrawal_not_found | Withdrawal request not found |
| 404 | webhook_not_found | Webhook configuration not found |
| 422 | validation_error | Request validation failed |
| 429 | rate_limit_exceeded | Too many requests |
| 500 | server_error | Internal server error |
Push Notifications
Register and unregister user devices to receive push notifications for deposit and withdrawal events via Firebase Cloud Messaging (FCM).
/device/register
Register a device FCM token for a user. If the token is already registered, the record is updated. Call this on every app launch to keep tokens fresh.
Permission: device.register
Request Body
Success Response (200)
/device/unregister
Remove a device FCM token. Call this on logout so the user stops receiving notifications on that device.
Permission: device.register
Request Body
Success Response (200)
Error Response (404)
Market Prices API
A self-hosted price feed powered by CoinGecko data, refreshed every minute. This API is separate from the main v1 API — it uses a different base path and a different authentication header.
/api/marketAuthentication: Optional. If a market API key is configured on the server, include the header
X-Market-Key: <key> on every request. Without it you will receive a 401. If no key is configured, requests are open.No HMAC signing required — this API does not use the v1 signature scheme.
data key. On success it holds the result; on error it is [] (list endpoints) or null (single-item endpoints). Always check success before using data.
/api/market/prices
Returns a paginated list of cryptocurrency prices sorted by market cap rank. Data is cached for 30 seconds.
Query Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
| page | integer | 1 | Page number |
| per_page | integer | 100 | Results per page (max 500) |
| symbol | string | — | Filter by exact symbol (e.g. btc) |
| search | string | — | Search by name, symbol, or coin ID |
Success Response 200
{
"success": true,
"data": [
{
"coin_id": "bitcoin",
"symbol": "btc",
"name": "Bitcoin",
"price_usd": 83241.50,
"market_cap_usd": 1640000000000,
"market_cap_rank": 1,
"price_change_24h": 1.25,
"volume_24h": 28000000000
}
],
"meta": {
"total": 545,
"per_page": 100,
"current_page": 1,
"last_page": 6
},
"last_synced": "2026-04-11T07:07:08+00:00",
"attribution": "Price data by CoinGecko (https://www.coingecko.com)"
}
Error Response 401 / 503
{
"success": false,
"error": "Invalid or missing API key. Pass X-Market-Key header.",
"data": [],
"meta": { "total": 0, "per_page": 100, "current_page": 1, "last_page": 1 }
}
/api/market/prices/{symbol}
Returns current price data for a single coin by symbol or CoinGecko ID (e.g. btc, bitcoin, usdt). Case-insensitive.
Success Response 200
{
"success": true,
"data": {
"coin_id": "tether",
"symbol": "usdt",
"name": "Tether",
"price_usd": 1.00,
"market_cap_rank": 3
},
"last_synced": "2026-04-11T07:07:08+00:00",
"attribution": "Price data by CoinGecko (https://www.coingecko.com)"
}
Not Found 404
{
"success": false,
"error": "Coin 'xyz' not found in market data.",
"data": null
}
/api/market/ticker
Lightweight price ticker — returns only id, symbol, and price_usd for fast lookups. Ideal for populating a price table or converting balances. Optional query param: ?limit=500 (max 500, default 500).
Success Response 200
{
"success": true,
"count": 500,
"data": [
{ "id": "bitcoin", "symbol": "BTC", "price_usd": 83241.50 },
{ "id": "ethereum", "symbol": "ETH", "price_usd": 1612.30 },
{ "id": "tether", "symbol": "USDT", "price_usd": 1.00 }
],
"last_synced": "2026-04-11T07:07:08+00:00",
"attribution": "Price data by CoinGecko (https://www.coingecko.com)"
}
Permissions
API clients can be granted specific permissions. Use * for full access.
| Permission | Description |
|---|---|
| user.register | Register new users |
| address.enable | Enable wallet addresses |
| address.read | Read user addresses |
| balance.read | Read user balances |
| transaction.read | Read transaction history |
| wallet.debit | Debit funds from wallets |
| wallet.credit | Credit funds to wallets |
| withdrawal.request | Create withdrawal requests |
| withdrawal.read | Read withdrawal status |
| chains.read | List supported chains |
| webhook.read | List webhooks |
| webhook.write | Create/update/delete webhooks |
| device.register | Register push notification devices |