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:

EnvironmentBase URLPurpose
Sandboxhttps://sandbox.api.bakkt.comDevelopment and testing with simulated data
Productionhttps://api.bakkt.comLive 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:

HeaderPurposeRequired For
AuthorizationMerchant API key (API-Key YOUR_KEY)All requests
bakkt-session-idUser session (from OTP or SIWE login)POST/PATCH requests that modify user data
user-uuidIdentifies the userGET 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