Quick Start Guide
Prerequisites
Before you begin, make sure you have:
- A Bakkt API Key (see below for Sandbox key)
- A tool to make API requests:
curl, Postman, or Insomnia
Environments
Bakkt operates two environments:
| Environment | Base URL | Purpose |
|---|---|---|
| Sandbox | https://sandbox.api.bakkt.com | Development and testing with simulated data |
| Production | https://api.bakkt.com | Live transactions with real funds |
Sandbox API Key
Use this public Sandbox API key to start exploring immediately:
API-Key +74/0TAhXh0sFWyaeoHcY7XfVCAEqLvIwqKnOz7rjHB5a36By9E3ibevU09zNWNQ
Warning: This is a shared public key for exploration only. For dedicated testing, complete the Onboarding Form to receive a private Sandbox key.
Step 1: Make Your First API Call
Let's fetch the current exchange rate as a quick test:
curl --request GET \
--url 'https://sandbox.api.bakkt.com/stablecoin/exchange-rates/?base_currency=EUR&target_currency=USD' \
--header 'Authorization: API-Key +74/0TAhXh0sFWyaeoHcY7XfVCAEqLvIwqKnOz7rjHB5a36By9E3ibevU09zNWNQ' \
--header 'accept: application/json'Expected Response (200 OK):
{
"base_currency": "EUR",
"target_currency": "USD",
"exchange_rate": "1.0876"
}Step 2: Check Supported Chains
See which blockchain networks are available:
curl --request GET \
--url 'https://sandbox.api.bakkt.com/stablecoin/supported/chains' \
--header 'Authorization: API-Key +74/0TAhXh0sFWyaeoHcY7XfVCAEqLvIwqKnOz7rjHB5a36By9E3ibevU09zNWNQ' \
--header 'accept: application/json'Expected Response:
["polygon", "celo", "optimism", "arbitrum", "tron", "mainnet", "solana", "base", "bsc", "avalanche"]Step 3: Get a User Wallet Address
Once you have a user created and KYC-verified via the Onboarding API, retrieve their stablecoin wallet address:
curl --request GET \
--url 'https://sandbox.api.bakkt.com/stablecoin/user/wallet/polygon' \
--header 'Authorization: API-Key +74/0TAhXh0sFWyaeoHcY7XfVCAEqLvIwqKnOz7rjHB5a36By9E3ibevU09zNWNQ' \
--header 'user-uuid: YOUR_USER_UUID' \
--header 'accept: application/json'Expected Response:
[
{
"wallet": "0xf7571e12301E70aCb89D5ACf0258F55c88AD097f",
"address": "0xf7571e12301E70aCb89D5ACf0258F55c88AD097f",
"chain": "polygon",
"active": true
}
]Step 4: Add a Remote Bank Account
Set up a bank account for receiving fiat after stablecoin-to-fiat conversion:
curl --request POST \
--url 'https://sandbox.api.bakkt.com/stablecoin/user/bank-account/remote' \
--header 'Authorization: API-Key +74/0TAhXh0sFWyaeoHcY7XfVCAEqLvIwqKnOz7rjHB5a36By9E3ibevU09zNWNQ' \
--header 'bakkt-session-id: YOUR_SESSION_ID' \
--header 'Content-Type: application/json' \
--header 'accept: application/json' \
--data '{
"account_name": "My EUR Account",
"main_recipient": true,
"account_details": {
"currency": "EUR",
"iban": "DE89370400440532013000"
}
}'Expected Response (201 Created):
{
"uuid": "5594401c-0072-4df2-be9c-d491c0754c21",
"receiving_address": "0xCC0964076916291c8CBB198F350CcAa012345F67"
}Authentication
Bakkt uses dual authentication:
| Header | Purpose | Required For |
|---|---|---|
Authorization | Merchant API key (API-Key YOUR_KEY) | All requests |
bakkt-session-id | User session (from OTP or SIWE login) | POST/PATCH requests that modify user data |
user-uuid | Identifies the user | GET requests for user data |
Obtaining a Session ID:
# 1. Initiate OTP login
curl --request POST \
--url 'https://sandbox.api.bakkt.com/auth/login' \
--header 'Authorization: API-Key YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{"user_uuid": "USER_UUID"}'
# 2. Submit OTP received via email
curl --request POST \
--url 'https://sandbox.api.bakkt.com/auth/otp' \
--header 'Authorization: API-Key YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{"user_uuid": "USER_UUID", "otp": "123456"}'
# Response includes bakkt-session-id (valid for 4 hours)Warning: Never expose API keys in client-side code or public repositories. Keys are for backend server-side use only.
Sandbox Testing Tips
- Simulated KYC: Use the Onboarding API sandbox to simulate KYC approval without real documents
- Test Blockchains: Sandbox uses testnets — no real stablecoins or fiat involved
- Testnet Tokens: Contact [email protected] for testnet USDC to test the full offramp flow
- Periodic Resets: Sandbox data may be reset periodically — don't store critical data there
End-to-End Sandbox Flow
const BASE_URL = 'https://sandbox.api.bakkt.com';
const API_KEY = 'API-Key +74/0TAhXh0sFWyaeoHcY7XfVCAEqLvIwqKnOz7rjHB5a36By9E3ibevU09zNWNQ';
// 1. Check exchange rates (no auth needed beyond API key)
const rates = await fetch(`${BASE_URL}/stablecoin/exchange-rates/?base_currency=EUR&target_currency=USD`, {
headers: { 'Authorization': API_KEY }
}).then(r => r.json());
console.log(`EUR/USD rate: ${rates.exchange_rate}`);
// 2. Get user wallet address
const wallets = await fetch(`${BASE_URL}/stablecoin/user/wallet/polygon`, {
headers: {
'Authorization': API_KEY,
'user-uuid': userUuid
}
}).then(r => r.json());
console.log(`Deposit address: ${wallets[0].address}`);
// 3. Add remote bank account (requires session)
const bankAccount = await fetch(`${BASE_URL}/stablecoin/user/bank-account/remote`, {
method: 'POST',
headers: {
'Authorization': API_KEY,
'bakkt-session-id': sessionId,
'Content-Type': 'application/json'
},
body: JSON.stringify({
account_name: 'Test Account',
main_recipient: true,
account_details: { currency: 'EUR', iban: 'DE89370400440532013000' }
})
}).then(r => r.json());
console.log(`Receiving address: ${bankAccount.receiving_address}`);
// 4. Calculate fees
const fees = await fetch(
`${BASE_URL}/stablecoin/fees/?payment_method=bank_transfer&direction=cryptoToFiat&input_currency=USDC&output_currency=EUR&amount=100`,
{ headers: { 'Authorization': API_KEY } }
).then(r => r.json());
console.log(`Total fee: ${fees.total_fee_percentage * 100}%`);
// 5. User sends USDC to wallet address → auto-converts → fiat sent to bank
// Monitor via webhooks or poll GET /stablecoin/process/?process_uuid=...Next Steps
- On-Ramp Guide: Set up automatic fiat-to-stablecoin conversion
- Off-Ramp Guide: Convert stablecoin back to fiat
- Custody Wallets: Hold stablecoins without auto-conversion
- Supported Assets: Chains, tokens, and currencies
- Integration & Monitoring: Webhooks, transaction tracking, and fees
Updated 3 days ago
