DirectCryptoPay Docs

Frequently Asked Questions

General#

What is DirectCryptoPay?#

DirectCryptoPay is a non-custodial crypto payment gateway that enables merchants to accept cryptocurrency payments directly to their wallets. We never hold, custody, or control your funds.

How is DirectCryptoPay different from other crypto payment gateways?#

Most crypto payment gateways are custodial -- they receive customer payments, hold the funds, and pay you out later (often after converting to fiat). DirectCryptoPay is non-custodial: payments go directly from the customer's wallet to yours on the blockchain. There is no intermediary holding your funds.

Do I need a crypto wallet to use DirectCryptoPay?#

Yes. For EVM chains, you need an EVM-compatible wallet (MetaMask, Rabby, Ledger, etc.). For Solana, you need a Solana wallet (Phantom, Solflare, etc.). For Tron, use TronLink. For Ton, use Tonkeeper, MyTonWallet, or the Telegram in-app wallet (connected via TonConnect). Your wallet address is where customer payments are sent directly.

Which blockchains are supported?#

DirectCryptoPay supports Ethereum, Polygon, BNB Chain, Base, Arbitrum, Optimism, Avalanche, Solana, Tron, and Ton -- ten blockchain networks (seven EVM chains plus three non-EVM networks: Solana, Tron, and Ton). On testnet, it supports Sepolia, Amoy, BSC Testnet, Base Sepolia, Arbitrum Sepolia, Optimism Sepolia, Avalanche Fuji, Solana Devnet, Tron Nile, and Ton Testnet.

Which tokens can my customers pay with?#

Your customers can pay with native tokens (ETH, POL, BNB, AVAX, SOL, TRX, TON) and major stablecoins (USDC, USDT — including USDT Jetton on Ton and USDT-TRC20 on Tron). The available tokens depend on the chain. See Supported Tokens for details.

What's the difference between EVM and Solana payout wallets?#

EVM chains (Ethereum, Polygon, BNB Chain, Base, Arbitrum, Optimism, Avalanche) all use the same 0x... address format, so a single EVM wallet works across all seven networks. Solana uses its own Base58 address format, Tron uses a Base58Check format starting with T, and Ton uses base64url (EQ.../UQ...) or raw 0:<hex> format. So if you accept payments on Solana, Tron, or Ton, you need dedicated payout wallets for each. All four are configured in Dashboard > Settings > Payout Wallets.

Can I accept payments on multiple chains simultaneously?#

Yes. Create an integration and select which chains and tokens to accept. You can enable any combination of EVM chains, Solana, Tron, and Ton. For each chain type you enable, you'll need the corresponding payout wallet configured (EVM wallet for EVM chains, Solana wallet for Solana, Tron wallet for Tron, Ton wallet for Ton).

Why do I need separate wallets for EVM and Solana?#

EVM chains, Solana, Tron, and Ton all use incompatible address formats. EVM addresses start with 0x and are 42 characters long. Solana addresses are Base58-encoded strings (32-44 characters). Tron addresses are Base58Check strings starting with T (34 characters). Ton addresses are 48-char base64url (EQ.../UQ...) or raw 0:<64-hex>. Sending funds to the wrong address format would result in permanent loss, so DirectCryptoPay requires separate payout wallets for each network type.

Pricing & Billing#

What does DirectCryptoPay cost?#

DirectCryptoPay charges a flat monthly subscription fee. There are no per-transaction percentage fees from DCP. The only variable cost is the blockchain gas fee, which is paid by the customer.

Is there a free trial?#

Testnet is completely free to use. You can set up and test your entire integration using test tokens at no cost. A subscription is only required when you switch to mainnet.

Who pays the gas fees?#

The customer pays the gas fee as part of the blockchain transaction. Gas fees vary by chain: near-zero on Polygon, a few cents on BNB Chain, and $1-5 on Ethereum. See Gas Fees for details.

Integration#

Do I need to be a developer to use DirectCryptoPay?#

No. You can use DirectCryptoPay without writing any code:

  • Payment Links -- Create and share payment links from the dashboard
  • WordPress Plugin -- Install the plugin and configure it in WooCommerce settings
  • Payment Buttons -- Create embeddable buttons from the dashboard

For custom integrations, the widget requires basic HTML/JavaScript knowledge.

Can I use DirectCryptoPay with WordPress/WooCommerce?#

Yes. We provide a dedicated WooCommerce plugin that integrates directly into the checkout flow. See the WordPress guide for installation instructions.

Do you have a REST API?#

The public REST API is currently under development. See the API Reference for planned endpoints. In the meantime, the widget, payment links, and WordPress plugin provide full payment functionality.

How do I know when a payment is confirmed?#

Set up a webhook endpoint. When a payment is confirmed on the blockchain, DCP sends an HMAC-signed POST request to your server with the payment details. Never rely on client-side callbacks alone.

Payments#

How long does a payment take to confirm?#

Confirmation time depends on the blockchain:

Chain Approximate Time
Ethereum 2-3 minutes (12 confirmations)
Polygon ~1 minute (30 confirmations)
BNB Chain ~45 seconds (15 confirmations)
Base ~30 seconds (12 confirmations)
Arbitrum ~15 seconds (12 confirmations)
Optimism ~30 seconds (12 confirmations)
Avalanche ~2 seconds (1 confirmation)
Solana ~2 seconds (32 confirmations)
Tron ~1 minute (19 confirmations)
Ton ~15 seconds (3 masterchain confirmations)

What happens if a payment fails?#

If a customer's transaction fails (reverts on-chain), the payment intent status is updated to "failed" and you receive a payment.failed webhook. The customer is not charged, as the transaction was reverted by the blockchain.

What if the crypto price changes while my customer is paying?#

The widget displays a guaranteed price estimate with a countdown timer (10 minutes for volatile tokens like ETH, 15 minutes for stablecoins). If the timer expires before the customer pays, they can click "Refresh Price" to get an updated quote. Additionally, the backend applies a 2% slippage tolerance, so minor price movements during block confirmation won't cause a payment to be rejected.

Can I issue refunds?#

Since DirectCryptoPay is non-custodial, refunds are handled directly by you. To refund a customer, send tokens from your wallet to their wallet address (which is included in the webhook payload and visible in the dashboard).

What about chargebacks?#

Blockchain transactions are final and irreversible. There are no chargebacks with crypto payments. Once a transaction is confirmed on-chain, it cannot be reversed by anyone.

Can customers pay with credit/debit cards?#

No. DirectCryptoPay is a crypto-only payment gateway. Customers need a crypto wallet with sufficient token balance to make payments.

Security#

Is DirectCryptoPay secure?#

Yes. The security model is built on several principles:

  1. Non-custodial -- We never hold your funds, so there is nothing for us to lose or be hacked for
  2. Zero-trust verification -- All payment confirmations are done by the backend reading the blockchain directly; the frontend cannot fake payments
  3. HMAC-signed webhooks -- Every webhook is cryptographically signed so your server can verify authenticity
  4. No private keys -- DCP never has access to your wallet's private keys
  5. Two-Factor Authentication -- Optional TOTP-based 2FA protects your merchant account from unauthorized access

Does DirectCryptoPay support Two-Factor Authentication (2FA)?#

Yes. You can enable TOTP-based 2FA from Settings > Security in the dashboard. It works with Google Authenticator, Authy, 1Password, and any TOTP-compatible app. When enabled, every login (Magic Link, Google, Wallet) requires a 6-digit verification code. You also receive 8 one-time recovery codes as backup. See Account Security (2FA) for setup instructions.

What if DirectCryptoPay goes down?#

Since DCP is non-custodial, your funds are always in your wallet. If DCP experiences downtime, new payments cannot be initiated, but all confirmed payments remain safely in your wallet. There is no risk of losing funds due to DCP downtime.

How do I verify webhook authenticity?#

Every webhook includes an X-DCP-Signature header in the format t=<timestamp>,v1=<hmac_hex>. Verify this by computing HMAC-SHA256(secret, "<timestamp>.<rawBody>") and comparing the result against the v1 value. See Webhooks for code examples in Node.js, Python, PHP, and Go.

Troubleshooting#

The payment widget is not loading#

  1. Check that the widget script is loaded correctly
  2. Verify your Integration ID is valid
  3. Check the browser console for JavaScript errors
  4. Try in an incognito window to rule out cache issues
  5. Ensure your Content Security Policy allows the widget domain

I am not receiving webhooks#

  1. Verify your webhook URL is publicly accessible (not localhost)
  2. Check that the URL is correct in the dashboard
  3. Ensure your server returns a 2xx response within 10 seconds
  4. Check server logs for incoming requests
  5. For local development, use ngrok to expose your local server

Payment shows as pending but never confirms#

  1. Check the transaction hash on a block explorer (Etherscan, Polygonscan, etc.)
  2. Verify the transaction was not reverted
  3. Ensure the DCP backend has access to the correct RPC endpoint
  4. Contact support if the issue persists
Need more help? Contact us at [email protected].