Skip to main content
This walks through the smallest real integration: one customer, one deposit address, one transaction. Every example uses a test key (kp_test_…) against KeyPair’s testnet — nothing here touches mainnet funds.
Every mutating call below takes an idempotencyKey. Derive it from your own domain object — an order id, a signup id — never generate it randomly. See Idempotency for why that matters the first time a request times out.
1

Create a customer

2

Open an account and issue a deposit address

Send this address to your customer, or render it as a QR code. Once the chain confirms a deposit, you’ll get a deposit.confirmed webhook and the balance lands in their account — no polling required.
3

Move money

Balances move out with a single signed request, to another customer of yours (toEntityId) or to a blockchain address (toAddress) — see Authentication for why moving money is signed rather than bearer-only.
cURL
4

Check the balance

cURL
Amounts are always signed integer strings in minor units — see why in Idempotency & amounts.

Next

Every event you can receive

deposit.confirmed, withdrawal.finalised, and four others — with the exact payload for each.
The full set of endpoints, grouped the same way as this guide, is in the API Reference tab above.