Skip to content

Crypto Payment Gateway

Accept cryptocurrency payments from customers worldwide — no blockchain experience required.

The Rach Crypto Payment Gateway lets you accept USDT, USDC, and native crypto across 9 blockchains through a single API. You create a checkout session, hand the customer a payment_url, and we handle detection, confirmation, and merchant crediting automatically.

Base URL: https://payments-api-dev-966260606560.europe-west2.run.app
Auth: X-API-Key: live_sk_* (production) · X-API-Key: test_sk_* (sandbox)
SDKs: JavaScript · Python · Go · Flutter


How It Works

1.  Your backend  →  POST /api/v1/checkout/create
                      (amount, currency, reference, customer_email)

2.                    Rach assigns a unique deposit address
                      per network, generates a QR code

3.  Rach  →  You  →  { session_id, payment_url, expires_at }

4.  You redirect customer to payment_url  (/pay/{uuid})
    OR embed your own UI using the Public Checkout API

5.  Customer selects network & sends crypto

6.  Tatum blockchain node detects the deposit

7.  Rach fires webhook  →  Your endpoint
    event: "payment.confirmed"

8.  You fulfill the order

Supported Networks & Currencies

NetworkCodeUSDTUSDCNativeConfirmationsAvg Time
Binance Smart ChainBSCBNB12 blocks~36s
EthereumETHETH12 blocks~3 min
PolygonPOLPOL128 blocks~4 min
TronTRXTRXSettlement delay~1 min
SolanaSOLSOLSettlement delay~20s
BitcoinBTCBTC6 blocks~60 min
Bitcoin CashBCHBCH6 blocks~60 min
LitecoinLTCLTCSettlement delay~10 min
XRPXRPXRPSettlement delay~5s

TRX, SOL, LTC, BCH, XRP use a settlement delay instead of block-depth counting. Webhooks for these networks always show "confirmations": 0 even when fully confirmed — this is expected. Use status === "paid" as your authoritative signal.


Plans & Limits

PlanMonthly TransactionsPrice
Starter5,000$13/mo
Professional50,000$42/mo
Business500,000$129/mo
EnterpriseUnlimitedCustom

Limits are automatically skipped in test/sandbox mode (test_sk_*).


Quick Start

1. Install SDK

bash
npm install rachfinance
# or
pip install rachfinance

2. Create a Checkout Session

javascript
const RachFinance = require('rachfinance');
const rach = new RachFinance({ apiKey: 'live_sk_...' });

const session = await rach.checkout.create({
  amount: 100,
  currency: 'USD',
  customerEmail: 'customer@example.com',
  reference: 'ORDER-001',
  callbackUrl: 'https://yoursite.com/webhooks/payment',
  description: 'Premium subscription',
  metadata: { orderId: 'ord_abc123', userId: 'usr_xyz' }
});

// Redirect customer
res.redirect(session.payment_url);
python
from rachfinance import RachFinance
rach = RachFinance(api_key='live_sk_...')

session = rach.checkout.create(
    amount=100,
    currency='USD',
    customer_email='customer@example.com',
    reference='ORDER-001',
    callback_url='https://yoursite.com/webhooks/payment'
)

redirect_to(session['payment_url'])
go
c, _ := rachfinance.New(rachfinance.WithAPIKey("live_sk_..."))
session, err := c.Checkout.Create(ctx, rachfinance.CreateCheckoutRequest{
    Amount:        100,
    Currency:      "USD",
    CustomerEmail: "customer@example.com",
    Reference:     "ORDER-001",
    CallbackURL:   "https://yoursite.com/webhooks/payment",
})
bash
curl -X POST 'https://payments-api-dev-966260606560.europe-west2.run.app/api/v1/checkout/create' \
  -H 'X-API-Key: live_sk_...' \
  -H 'Content-Type: application/json' \
  -d '{
    "amount": 100.00,
    "currency": "USD",
    "reference": "ORDER-001",
    "customer_email": "customer@example.com",
    "callback_url": "https://yoursite.com/webhooks/payment",
    "payment_method": "crypto"
  }'

Response 201 Created:

json
{
  "session_id": "a1b2c3d4-e5f6-...",
  "payment_url": "https://payments-api-dev-966260606560.europe-west2.run.app/pay/a1b2c3d4-e5f6-...",
  "amount": 100,
  "currency": "USD",
  "status": "pending",
  "expires_at": "2026-06-25T14:30:00Z"
}

3. Handle the Webhook

javascript
const crypto = require('crypto');

app.post('/webhooks/payment', express.raw({ type: 'application/json' }), (req, res) => {
  const signature = req.headers['x-webhook-signature'];
  const expected = crypto
    .createHmac('sha256', process.env.WEBHOOK_SECRET) // whsec_...
    .update(req.body)
    .digest('hex');

  if (signature !== expected) return res.status(401).send('Invalid signature');

  const event = JSON.parse(req.body);

  if (event.event === 'payment.confirmed') {
    const { session_id, reference, amount, currency } = event.data;
    await fulfillOrder(reference);
  }

  res.sendStatus(200);
});

Next Steps

Rach Payments API