White Label

With White Label, the entire payment flow runs under your own domain and brand — your customers never see payid19.com. You build the checkout page; Payid19 handles the blockchain side invisibly in the background.

Why White Label? Checkout stays on your domain from start to finish: customers never leave your site, no third-party name appears at the payment step, and Payid19’s payment-confirmation emails to the buyer are suppressed — the completion flow stays under your brand. The whole integration is just two API calls.

Step 1 — Create the invoice and get the coin list

Call create_invoice with all your usual parameters plus white_label=1. Instead of a payment page URL, the response carries the invoice ID and, in the message field, a JSON list of the coins you can accept:

{
  "status": "success",
  "invoice_id": 123456,
  "message": "[{\"name\":\"USDT\",\"long_name\":\"USD Tether\",\"network\":\"TRC20\",\"icon\":\"...\",\"decimals\":2,\"price\":100.5,\"invoice_id\":123456}, ...]"
}
Each coin in the list
namestring
Coin code — USDT, USDC, BTC, ETH, BNB, TRX, LTC.
long_namestring
Display name — USD Tether, Bitcoin, Ethereum, Binance Coin, Tron, Litecoin.
networkstring
Network of this entry — e.g. USDT appears once per network (TRC20, ERC20, BEP20). Coins you excluded with banned_coins using bare coin codes (e.g. "BTC") are already filtered out of this list.
pricedecimal
The invoice amount converted to this coin at the current rate, network fee included — the exact amount to show your customer.
iconstring
Icon URL, ready to use on your checkout page.
decimalsinteger
Decimal places for human-readable display of the amount.
invoice_idinteger
ID of the created invoice — you will need it in step 2.

Render this list on your own checkout page so the customer can pick a coin and network.

Step 2 — Get the deposit address

When the customer picks a coin, request the deposit address to display (amount and QR codes included):

POSThttps://payid19.com/api/v1/get_address

Request parameters

invoice_idintegerREQUIRED
The invoice ID from step 1.
emailstringREQUIRED
Your customer’s email address.
coinstringREQUIRED
The coin the customer picked, exactly as returned in the step 1 list.
networkstringoptional
The network for the selected coin. Technically optional, but always send it for multi-network coins like USDT so the deposit address is created on the chain your customer picked.

Errors from this endpoint come with HTTP status 401 and a plain-string message (e.g. There is no invoice.).

Response

addressstring
The unique deposit address to show your customer.
amountnumber
The exact amount your customer must send, network fee included. Tell them to send exactly this amount.
coin / network / iconstring
Echo of the selection, plus the coin icon URL for your UI.
expiration_dateinteger
Time remaining until the invoice expires, in minutes — drive your checkout countdown with it.
address_qrcode / amount_qrcodestring
QR codes of the address and the amount, as base64-encoded SVG — embeddable without any QR library on your side.

Embed a QR code like this:

<img height="100%" src="data:image/svg+xml;base64,ADDRESS_QRCODE_VALUE">

Step 3 — Get notified

Payment detection is fully automatic. When the customer’s payment is confirmed, the callback you set on the invoice fires as usual (see payment callback), and you can always poll get_invoices for the status. Show your own success screen when the payment completes.

Checkout UX tips: show the amount, address and QR side by side with copy buttons for both; keep the countdown from expiration_date visible; and after the callback arrives, flip the page to your success state automatically (poll your own backend, or push over a websocket). Everything the customer sees is yours — Payid19 stays invisible.

Example: getting the address

curl -X POST https://payid19.com/api/v1/get_address \
  -d invoice_id=123456 \
  -d [email protected] \
  -d coin=USDT \
  -d network=TRC20
<?php
$post = [
    'invoice_id' => 123456,                  // from step 1
    'email'      => '[email protected]',
    'coin'       => 'USDT',
    'network'    => 'TRC20',
];

$ch = curl_init('https://payid19.com/api/v1/get_address');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post));
$result = curl_exec($ch);
curl_close($ch);

$response = json_decode($result);
if ($response->status == 'error') {
    echo $response->message;
} else {
    echo 'Send ' . $response->amount . ' ' . $response->coin
       . ' (' . $response->network . ') to: ' . $response->address;
    // $response->address_qrcode -> base64 SVG QR code
}
const axios = require('axios');

axios.post('https://payid19.com/api/v1/get_address', {
    invoice_id: 123456,                 // from step 1
    email:      '[email protected]',
    coin:       'USDT',
    network:    'TRC20',
})
.then(({ data }) => {
    if (data.status === 'error') return console.error(data.message);
    console.log(`Send ${data.amount} ${data.coin} (${data.network}) to: ${data.address}`);
    // data.address_qrcode -> base64 SVG QR code
})
.catch(err => console.error(err.message));
import requests

response = requests.post('https://payid19.com/api/v1/get_address', data={
    'invoice_id': 123456,                  # from step 1
    'email':      '[email protected]',
    'coin':       'USDT',
    'network':    'TRC20',
})

result = response.json()
if result['status'] == 'error':
    print(result['message'])
else:
    print('Send', result['amount'], result['coin'],
          '(' + result['network'] + ') to:', result['address'])
    # result['address_qrcode'] -> base64 SVG QR code