Skip to content

Create a payment

Creates a new payment request for your store. The store is implied entirely by your credentials — you never name it in the request body.

Field Type Required Description
asset string Yes One of BTC, LTC, DOGE, DASH, USDC, USDT.
chain string Only for multi-chain assets Required only for assets that span more than one chain (USDC/USDT — base or polygon). Inferred automatically otherwise.
amount.minor integer Yes Charge amount in minor units of amount.currency (e.g. 500 = $5.00).
amount.currency string Yes ISO 4217 currency code.
payerIp string No Your end customer’s IP, forwarded for screening. Falls back to your server’s own request IP if omitted. Can only add scrutiny — never bypasses it.
Terminal window
curl -s https://api.sendchain.example/v1/store-api/payments \
-u "$API_KEY:$SECRET_KEY" \
-H "Content-Type: application/json" \
-d '{
"asset": "LTC",
"chain": "litecoin",
"amount": { "minor": 5000, "currency": "GBP" },
"payerIp": "203.0.113.7"
}'
{
"id": "pay_...",
"status": "awaiting_payment",
"address": "ltc1q...",
"payAmount": { "base": "...", "asset": "LTC", "decimals": 8 },
"displayAmount": { "minor": 5000, "currency": "GBP" },
"rate": { "pricePerWholeUnit": "...", "expiresAt": "..." },
"chain": "litecoin",
"uri": "litecoin:ltc1q...?amount=...",
"quoteExpiresAt": "..."
}

Render this exactly like a normal pay page would: address + payAmount + uri (QR-able) — the payer never needs to visit Send Chain directly.

Field Type Description
id string The payment’s id — use it to poll status or match a webhook.
status string Starts as awaiting_payment.
address string The address to display to the payer.
payAmount.base string The exact amount to send, in the asset’s smallest unit.
payAmount.asset / payAmount.decimals string / integer Asset code and its decimal precision.
displayAmount { minor, currency } Echoes the requested fiat amount.
rate.pricePerWholeUnit / rate.expiresAt string / timestamp The locked exchange rate and when the quote lock expires.
chain string The settlement chain.
uri string A scannable payment URI (e.g. bitcoin:… / ethereum:…@chainId).
quoteExpiresAt ISO 8601 timestamp Send before this.
Status error Meaning
401 invalid_credentials Missing, malformed, or mismatched Basic auth.
403 screening_failed The payer/caller failed jurisdiction or sanctions screening.
409 store_disabled The store is toggled off for new payments.
409 currency_unavailable No verified wallet for that asset, or the chain’s indexer is down.
429 rate_limited Exceeded your per-minute cap — respect Retry-After.