CloudPaya Documentation
Everything you need to accept cryptocurrency payments. Integrate CloudPaya into your website, app, or platform with our REST API, embeddable widget, or one of 8 ready-made plugins.
Quick Start
Get from zero to accepting payments in under 5 minutes with our step-by-step guide.
REST API
40+ endpoints — create transactions, manage checkouts, configure settings, and more.
8 Plugins
WordPress, WooCommerce, Shopify, PrestaShop, Magento, OpenCart, WHMCS, EDD.
Webhooks
Real-time POST notifications when transactions complete. HMAC‑SHA256 signed.
50+ Coins
BTC, ETH, USDT, SOL, XRP, DOGE, LTC, BNB and many more across 10+ chains.
Non-Custodial
Payments go directly to your wallet. CloudPaya never holds your funds.
Quick Start #
Follow these three steps to accept your first crypto payment:
Get Your API Key
Log in to your Dashboard, go to Settings → Account, and copy your API Key.
Add Wallet Addresses
Go to Settings → Cryptocurrencies. Add a receiving wallet address for each coin you want to accept (e.g. USDT on Tron, BTC, ETH).
Create a Payment
Redirect customers to the hosted checkout URL, or call the create-transaction API for full control.
Authentication #
All API requests require your API Key. Include it as a POST parameter or query parameter:
curl -X POST https://cloudpaya.com/api.php \
-d "api-key=YOUR_API_KEY" \
-d "function=get-transactions"
Integration Methods #
Redirect users to a hosted payment page — no backend code required:
https://cloudpaya.com/pay.php?checkout_id=custom&price=50¤cy=USD&external_reference=ORDER_123&title=Your+Product&redirect=https://yoursite.com/success&cloud=YOUR_API_KEY
| Parameter | Description |
|---|---|
checkout_id | Set to custom for dynamic pricing |
price | Amount in fiat (e.g. 50) |
currency | Fiat currency code (USD, EUR, etc.) |
external_reference | Your order/reference ID |
title | Product or order title (URL-encoded) |
redirect | URL to redirect after payment |
cloud | Your API Key |
Create a transaction for a specific cryptocurrency via API:
curl -X POST https://cloudpaya.com/api.php \
-d "api-key=YOUR_API_KEY" \
-d "function=create-transaction" \
-d "amount=50" \
-d "cryptocurrency_code=usdt_tron" \
-d "currency_code=USD" \
-d "external_reference=ORDER_123"
Then get the hosted payment page URL:
curl -X POST https://cloudpaya.com/api.php \
-d "api-key=YOUR_API_KEY" \
-d "function=payment-link" \
-d "transaction_id=456"
# Response: https://cloudpaya.com/id/ENCRYPTED_ID?cloud=YOUR_API_KEY
Supported Currencies #
Cryptocurrencies
| Code | Currency | Network | Address Setting |
|---|---|---|---|
btc | Bitcoin | Bitcoin | address-btc |
btc_ln | Bitcoin Lightning | Lightning | LN Node |
eth | Ethereum | Ethereum | address-eth |
eth_base | Ethereum | Base | address-eth_base |
eth_arb | Ethereum | Arbitrum | address-eth_arb |
eth_op | Ethereum | Optimism | address-eth_op |
usdt | Tether USDT | ERC-20 | address-usdt |
usdt_tron | Tether USDT | TRC-20 | address-usdt_tron |
usdt_bsc | Tether USDT | BEP-20 | address-usdt_bsc |
usdc | USD Coin | Ethereum | address-usdc |
ltc | Litecoin | Litecoin | address-ltc |
sol | Solana | Solana | address-sol |
xrp | Ripple | XRP Ledger | address-xrp |
doge | Dogecoin | Dogecoin | address-doge |
bnb | Binance Coin | BSC | address-bnb |
busd | Binance USD | BSC | address-busd |
pol | Polygon | Polygon | address-pol |
bch | Bitcoin Cash | BCH | address-bch |
trx | Tron | Tron | address-trx |
xmr | Monero | Monero | address-xmr |
link | Chainlink | Ethereum | address-link |
shib | Shiba Inu | Ethereum | address-shib |
bat | Basic Attention Token | Ethereum | address-bat |
algo | Algorand | Algorand | address-algo |
Fiat Payment Methods
| Code | Provider | Description |
|---|---|---|
stripe | Stripe | Credit/Debit cards |
paypal | PayPal | PayPal payments |
verifone | Verifone | Verifone gateway |
Custom Tokens
Add any ERC-20, BEP-20, or TRC-20 token in Settings → Custom Tokens:
| Setting | Description |
|---|---|
custom-token-code | Unique code (e.g. mytoken) |
custom-token-type | erc-20, bep-20, or trc-20 |
custom-token-name | Display name |
custom-token-address | Your wallet address |
custom-token-contract-address | Token contract address |
custom-token-decimals | Decimals (usually 18) |
custom-token-rate | Fixed USD rate (or empty for auto) |
Exchange Rates & Exact Amounts #
Why Stablecoin Amounts Differ Slightly
When requesting $80 in USDT, you might see 79.96 USDT — stablecoins fluctuate slightly. CloudPaya uses real-time rates:
80 / 1.0004 = 79.968 USDTHow to Get Exact Amounts
Method 1: Set currency to the stablecoin
curl -X POST https://cloudpaya.com/api.php \
-d "api-key=YOUR_API_KEY" \
-d "function=create-transaction" \
-d "amount=80" \
-d "currency_code=USDT" \
-d "cryptocurrency_code=usdt_bsc"
# Result: exactly 80.00 USDT
Method 2: Use currency=crypto
-d "currency_code=crypto" # skips conversion entirely
| Scenario | Currency Setting | Result |
|---|---|---|
| 80 USD → USDT | currency_code=USD | ~79.96 USDT (converted) |
| 80 USDT exact | currency_code=USDT | 80.00 USDT ✓ |
| 80 USDT exact | currency_code=crypto | 80.00 USDT ✓ |
Unique Amount System
With a single wallet address, CloudPaya creates micro-unique amounts to identify transactions. To avoid this, add 3+ addresses (comma-separated) to enable address rotation:
# In Settings → USDT BSC Address:
0x706914810dC2445870736AA3BbC2AB2C649a3072,
0x31648324f0Ac44124EBd418b5B3386563b442C38,
0xDC1F5f39c3645c7954f7a752c57aE2688638694E
| # Addresses | Behavior |
|---|---|
| 1–2 | Unique micro-amounts per transaction |
| 3+ | Exact amounts — addresses rotate |
currency_code=USDT AND 3+ addresses for the cleanest stablecoin experience.Dashboard Overview #
Your CloudPaya dashboard is the control center for payments, wallets, and settings.
API Key
Your unique key to authenticate all API requests. Never share publicly.
Credit Balance
View remaining credits. Credits cover per-transaction processing fees.
Transactions
Monitor all payments — status, amounts, crypto used, and confirmations.
Settings
Configure wallets, webhooks, notifications, and payment page customization.
Cryptocurrencies
Add wallets for each coin. Only configured wallets appear on payment pages.
Webhooks
Set your webhook URL and secret to receive real-time payment notifications.
Setup Guide #
Follow these steps to start accepting crypto payments:
Create Your Account
Sign up at cloudpaya.com. Instant dashboard access with a unique API key.
Add Wallet Addresses
In Settings → Cryptocurrencies, add a wallet for each coin. Payments go directly to your wallets.
Set Up Webhook
In Settings → General, enter your webhook URL and secret key for real-time payment notifications.
Add Credits
In your Dashboard, click Add Credits. Credits cover the processing fee on each transaction.
Integrate
Use the Quick Checkout URL or the create-transaction API to start accepting payments.
Test
Create a small test transaction to verify: API call → payment page → webhook → dashboard confirmation.
Settings Reference #
General Settings
| Setting | Description |
|---|---|
| Webhook URL | URL that receives POST notifications on transaction status changes |
| Webhook Secret | Secret key to sign webhook payloads — verify on your server |
| Default Currency | Default fiat currency (USD, EUR, GBP, etc.) |
| Payment Page Title | Custom title on your hosted payment page |
| Redirect URL | URL to redirect after payment submission |
Cryptocurrency Settings
| Setting | Description |
|---|---|
| Wallet Addresses | Receiving address for each crypto. Only configured coins appear as options. |
| Multiple Addresses | 3+ comma-separated addresses enable rotation (exact amounts). |
| Custom Tokens | Add ERC-20/BEP-20/TRC-20 tokens by contract address. |
Fiat Gateways (Optional)
| Setting | Description |
|---|---|
| Stripe Keys | Publishable + secret keys for credit/debit card payments |
| PayPal Client ID | PayPal credentials for PayPal payment option |
| Verifone Keys | Verifone payment gateway credentials |
Credits & Pricing #
CloudPaya charges a per-transaction fee deducted from your pre-purchased credit balance. Credits never expire.
Go-Live Checklist
- Created account and logged in
- Added wallet addresses for all desired cryptocurrencies
- Copied API key to your backend
- Set webhook URL and secret
- Implemented webhook handler with signature verification
- Added credits to your account
- Tested end-to-end with a small transaction
- Configured redirect URL for post-payment flow
Wallet Auto-Generation #
Generate secure cryptocurrency wallet addresses and private keys directly from your dashboard — no external tools needed.
How It Works #
Generate
In Settings → Crypto, click 🔑 next to any address field. A new wallet is generated and filled automatically.
Save
Click Save Settings. The address is active. Private key is encrypted with your account key and stored securely.
Access Keys
Go to Account → Private Keys to view, email, or decrypt your keys offline.
Supported Coins #
| Cryptocurrency | Address Format | Algorithm | Key Format |
|---|---|---|---|
| Bitcoin (BTC) | Starts with 1, 34 chars | secp256k1 (P2PKH) | WIF |
| Ethereum & EVM ETH, USDT, USDC, LINK, SHIB, BAT, BNB, BUSD, POL | Starts with 0x, 42 chars | secp256k1 + Keccak-256 | 64-char hex |
| TRON (TRX) TRX, USDT-TRC20 | Starts with T | secp256k1 + Base58Check | 64-char hex |
| Litecoin (LTC) | Starts with L/M | secp256k1 (v0x30) | WIF |
| Dogecoin (DOGE) | Starts with D | secp256k1 (v0x1E) | WIF |
| Bitcoin Cash (BCH) | Starts with 1 | secp256k1 (P2PKH) | WIF |
| XRP | Starts with r | secp256k1 + XRP Base58 | 64-char hex |
| Solana (SOL) | Base58, 44 chars | Ed25519 | Base58 (88) |
| Algorand (ALGO) | Base32, 58 chars | Ed25519 + SHA-512/256 | Base58 (88) |
| Monero (XMR) | Starts with 4, 95 chars | Ed25519 + Keccak-256 | 64-char hex |
Shared Address Groups
| Group | Shared Coins |
|---|---|
| ETH / EVM | ETH, ETH (Base/Arbitrum/Optimism), USDT (ERC-20/BSC), USDC, LINK, SHIB, BAT, BNB, BUSD, POL |
| TRON | TRX, USDT (TRC-20) |
| Individual | BTC, LTC, DOGE, BCH, XRP, SOL, ALGO, XMR |
Private Key Security #
How Keys Are Protected
- AES-256-CBC encryption — keys encrypted before storage
- Per-user key — derived from your password + email
- Never stored in plaintext
- Server-side CSPRNG —
random_bytes()
Decrypting Keys Offline
Copy your Decryption Key (64-char hex) and IV (16-char hex) from Account → Private Keys:
echo "ENCRYPTED_KEY_DATA" | openssl enc -aes-256-cbc -d -a \
-K YOUR_DECRYPTION_KEY_HEX \
-iv YOUR_IV_HEX
from Crypto.Cipher import AES
import base64
key = bytes.fromhex('YOUR_DECRYPTION_KEY_HEX')
iv = bytes.fromhex('YOUR_IV_HEX')
cipher = AES.new(key, AES.MODE_CBC, iv)
data = base64.b64decode('ENCRYPTED_KEY_DATA')
print(cipher.decrypt(data).rstrip(b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10').decode())
Multiple Addresses
Click 🔑 multiple times — each click appends a new address (comma-separated). With 3+ addresses, customers see exact amounts instead of micro-adjusted unique amounts.
API Reference #
https://cloudpaya.com/api.phpMethod: POST (all requests)
Content-Type:
application/x-www-form-urlencodedAuth:
api-key parameter in every request
| Status | Code | Description |
|---|---|---|
P | Pending | Waiting for payment |
C | Completed | Payment confirmed |
R | Refunded | Payment refunded |
X | Cancelled | Transaction cancelled |
create-transaction #
Creates a new payment transaction for a specific cryptocurrency.
| Parameter | Type | Required | Description |
|---|---|---|---|
api-key | string | Required | Your API Key |
function | string | Required | create-transaction |
amount | number | Required | Amount in fiat currency |
cryptocurrency_code | string | Required | Crypto code (e.g. btc, usdt_tron) |
currency_code | string | Optional | Fiat currency (default: USD) |
external_reference | string | Optional | Your order/reference ID |
title | string | Optional | Transaction title |
description | string | Optional | Transaction description |
url | string | Optional | Redirect URL after payment |
Example
curl -X POST https://cloudpaya.com/api.php \
-d "api-key=YOUR_API_KEY" \
-d "function=create-transaction" \
-d "amount=100" \
-d "cryptocurrency_code=usdt_tron" \
-d "currency_code=USD" \
-d "external_reference=order_12345" \
-d "title=Pro Subscription"
Response
{
"success": true,
"response": [
456, // Transaction ID
"100.00123", // Crypto amount
"TRx1234...", // Wallet address
3, // Required confirmations
"encrypted..." // Encrypted data
]
}
payment-link #
Generates a hosted payment page URL for an existing transaction.
| Parameter | Type | Required | Description |
|---|---|---|---|
api-key | string | Required | Your API Key |
function | string | Required | payment-link |
transaction_id | integer | Required | Transaction ID from create-transaction |
Response
{
"success": true,
"response": "https://cloudpaya.com/id/ENCRYPTED_ID?cloud=YOUR_API_KEY"
}
get-transaction #
Retrieves details of a specific transaction by ID.
| Parameter | Type | Required | Description |
|---|---|---|---|
api-key | string | Required | Your API Key |
function | string | Required | get-transaction |
transaction_id | integer | Required | Transaction ID |
Response
{
"success": true,
"response": {
"id": "456",
"from": "",
"to": "TRx1234...",
"hash": "",
"title": "Pro Subscription",
"amount": "100.00123",
"amount_fiat": "100",
"cryptocurrency": "usdt_tron",
"currency": "USD",
"external_reference": "order_12345",
"creation_time": "2025-12-11 10:30:00",
"status": "P"
}
}
get-transactions #
Retrieves a paginated list of transactions with optional filters.
| Parameter | Type | Required | Description |
|---|---|---|---|
api-key | string | Required | Your API Key |
function | string | Required | get-transactions |
pagination | integer | Optional | Page number (default: 0) |
search | string | Optional | Search by ID, hash, or reference |
status | string | Optional | Filter: P, C, R, or X |
check-transactions #
Checks blockchain and updates a transaction's status.
| Parameter | Type | Required | Description |
|---|---|---|---|
api-key | string | Required | Your API Key |
function | string | Required | check-transactions |
transaction_id | integer | Required | Transaction ID to check |
get-balances #
Returns wallet balances for all configured cryptocurrencies.
| Parameter | Type | Required | Description |
|---|---|---|---|
api-key | string | Required | Your API Key |
function | string | Required | get-balances |
get-settings #
Retrieves your account settings.
| Parameter | Type | Required | Description |
|---|---|---|---|
api-key | string | Required | Your API Key |
function | string | Required | get-settings |
save-settings #
Updates your account settings (wallet addresses, webhook URL, etc.).
| Parameter | Type | Required | Description |
|---|---|---|---|
api-key | string | Required | Your API Key |
function | string | Required | save-settings |
settings | string | Required | JSON string of settings |
Example
curl -X POST https://cloudpaya.com/api.php \
-d "api-key=YOUR_API_KEY" \
-d "function=save-settings" \
-d 'settings={"address-btc":"bc1q...","address-eth":"0x...","webhook":"https://yoursite.com/webhook"}'
Webhook Setup #
Receive real-time notifications when transaction status changes.
- Log in to your Dashboard
- Go to Settings → General
- Set Webhook URL (e.g.
https://yoursite.com/webhook/cloudpaya) - Set a Webhook Secret Key
- Save settings
Webhook Payload #
CloudPaya sends a POST request with JSON body when a transaction status changes:
{
"transaction": {
"id": "456",
"hash": "0xabc123...",
"from": "TRx9876...",
"to": "TRx1234...",
"amount": "100.00123",
"amount_fiat": "100",
"cryptocurrency": "usdt_tron",
"currency": "USD",
"external_reference": "order_12345",
"title": "Pro Subscription",
"status": "C",
"creation_time": "2025-12-11 10:30:00",
"confirmations": 3
}
}
| Status | Code | Description |
|---|---|---|
P | Pending | Waiting for payment |
C | Completed | Payment confirmed |
R | Refunded | Refunded |
X | Cancelled | Cancelled |
Signature Verification #
Verify the X-Signature header to ensure the webhook is from CloudPaya:
<?php
$webhook_secret = 'your_secret_key';
$payload = file_get_contents('php://input');
$signature = $_SERVER['HTTP_X_SIGNATURE'] ?? '';
$expected = hash_hmac('sha256', $payload, $webhook_secret);
if (hash_equals($expected, $signature)) {
$data = json_decode($payload, true);
$transaction = $data['transaction'];
if ($transaction['status'] === 'C') {
// Payment confirmed — fulfill order
$order_id = $transaction['external_reference'];
}
http_response_code(200);
echo 'OK';
} else {
http_response_code(401);
echo 'Invalid signature';
}
const crypto = require('crypto');
app.post('/webhook/cloudpaya', (req, res) => {
const secret = 'your_secret_key';
const payload = JSON.stringify(req.body);
const signature = req.headers['x-signature'];
const expected = crypto
.createHmac('sha256', secret)
.update(payload)
.digest('hex');
if (crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(signature))) {
const { transaction } = req.body;
if (transaction.status === 'C') {
// Payment confirmed — fulfill order
}
res.status(200).send('OK');
} else {
res.status(401).send('Invalid signature');
}
});
Plugins & Integrations #
Ready-to-use plugins for the most popular platforms. All free, all supporting 50+ cryptocurrencies.
WordPress Plugin #
Installation
- Download cloudpaya-wordpress.zip
- WordPress Admin → Plugins → Add New → Upload Plugin
- Upload ZIP → Install Now → Activate
- Settings → CloudPaya → enter API Key, Checkout ID, Currency
Shortcode
[cloudpaya_pay amount="29.99" currency="USD" title="Premium Plan" description="Monthly subscription" reference="order_123" redirect="https://yoursite.com/thank-you"]
Webhook URL
https://yoursite.com/wp-json/cloudpaya/v1/webhook
WooCommerce Plugin #
Installation
- Download cloudpaya-woocommerce.zip
- WordPress Admin → Plugins → Add New → Upload
- WooCommerce → Settings → Payments → enable CloudPaya Crypto
How It Works
- Customer selects "Pay with Crypto" at checkout
- Order created with "Pending" status
- Customer redirected to CloudPaya (or embedded widget)
- Webhook marks order as Completed
Webhook URL
https://yoursite.com/wc-api/cloudpaya_webhook
PrestaShop Module #
Installation
- Download cloudpaya-prestashop.zip
- Admin → Modules → Module Manager → Upload
- Configure: CloudPaya URL, API Key, Checkout ID
Webhook URL
https://yourshop.com/module/cloudpaya/validation
Magento 2 Extension #
Installation
- Download cloudpaya-magento2.zip
- Extract to
app/code/Cloudpaya/Payment/ - Run:
php bin/magento module:enable Cloudpaya_Payment
php bin/magento setup:upgrade
php bin/magento cache:clean
Configure in Stores → Configuration → Sales → Payment Methods → CloudPaya
Webhook URL
https://yourstore.com/cloudpaya/webhook
OpenCart Extension #
Installation
- Download cloudpaya-opencart.zip
- Extract → copy
admin/+catalog/to OpenCart root - Extensions → Payments → Install CloudPaya → Edit → Enable
Webhook URL
https://yourstore.com/index.php?route=extension/payment/cloudpaya/webhook
WHMCS Gateway #
Installation
- Download cloudpaya-whmcs.zip
- Copy files to
modules/gateways/cloudpaya.phpandmodules/gateways/callback/cloudpaya.php - Setup → Payments → Payment Gateways → activate CloudPaya
Webhook URL
https://yourwhmcs.com/modules/gateways/callback/cloudpaya.php
Easy Digital Downloads #
Installation
- Download cloudpaya-edd.zip
- WordPress Admin → Plugins → Upload → Activate
- Downloads → Settings → Payment Gateways → enable CloudPaya
Webhook URL
https://yoursite.com/wp-json/cloudpaya-edd/v1/webhook
Shopify Integration #
Installation
- Download cloudpaya-shopify.zip
- Shopify Admin → Online Store → Themes → Edit Code
- Under Snippets, add new snippet:
cloudpaya-pay - Paste contents of
cloudpaya-pay.liquid - Edit config at top:
{% assign cloudpaya_url = 'https://cloudpaya.com/' %}
{% assign cloudpaya_checkout_id = '1' %}
In your product template, add:
{% render 'cloudpaya-pay', product: product %}
Common Configuration #
Prerequisites for All Plugins
- CloudPaya Account (free)
- API Key from Dashboard → Settings
- Checkout Form ID from Dashboard → Checkouts
- Wallet addresses configured in Settings
Webhook Flow
- CloudPaya sends POST to your webhook URL with transaction data
- Plugin verifies Webhook Secret
- Order marked as Paid / Completed
Swagger UI #
Interactive API explorer — try endpoints directly from your browser.