Getting started
Integrate with our API in minutes.
This guide walks technical users (integrators) through the process of spending via the Bando Spending Protocol (BSP). The flow involves retrieving products, creating a quote, paying with a wallet, registering the transaction, and tracking its status.
Full Flow Summary
1. 🔎 Discover Available Products
Endpoint: GET /products/grouped/
This endpoint returns all spendable products grouped by category.
Brand to filter
2 letter ISO code for the destination country to filter
Product type to filter
Offer subtype to filter
Product category name to filter. Supports multiple categories with comma-separated values: category=Mobile Data,Gaming Cards
OK
Bad Request
Unauthorized - API Token Missing or Unrecognized
Forbidden - IP Not Allowed
Internal Server Error
GET /api/v1/products/grouped/ HTTP/1.1
Host: api.bando.cool
Accept: */*
{
"products": [
{
"productType": "text",
"brands": [
{
"brandName": "text",
"brandSlug": "text",
"imageUrl": "text",
"order": 1,
"variants": [
{
"id": "text",
"fupId": "text",
"brand": "text",
"country": "text",
"notes": "text",
"sku": "text",
"price": {
"fiatCurrency": "text",
"fiatValue": "text",
"stableCoinCurrency": "text",
"stableCoinValue": "text"
},
"productType": "text",
"referenceType": {
"name": "text",
"valueType": "text",
"regex": "text"
},
"requiredFields": [
{
"name": "text",
"valueType": "text",
"regex": "text"
}
],
"shortNotes": "text",
"subTypes": [
"text"
],
"supportedCountries": [
"text"
],
"imageUrl": "text",
"evmServiceId": 1,
"svmServiceId": 1,
"dataGB": "text",
"dataSpeeds": [
"text"
],
"dataUnlimited": true,
"durationDays": "text",
"smsNumber": "text",
"smsUnlimited": true,
"voiceMinutes": "text",
"voiceUnlimited": true,
"roamingCountryIso2": "text",
"roamingDataSpeeds": [
"text"
]
}
]
}
]
}
]
}
2. Fetch available chains and supported assets
Endpoints:
GET /networks/
GET /tokens/{networkKey}
User's wallet address
List of supported networks
API error responses
Internal Server Error
GET /api/v1/networks/ HTTP/1.1
Host: api.bando.cool
Accept: */*
{
"success": true,
"data": [
{
"name": "Arbitrum",
"key": "arb",
"logoUrl": "https://example.com",
"chainId": 42161,
"rpcUrl": "https://example.com",
"explorerUrl": "https://example.com",
"isTestnet": true,
"networkType": "EVM",
"isActive": true,
"rank": 1,
"protocolContracts": {},
"nativeToken": {
"name": "text",
"symbol": "text",
"coinKey": "text",
"address": "text",
"decimals": 1,
"logoURI": "https://example.com"
}
}
]
}
Network key identifier (e.g., arb, sol)
User's wallet address
List of supported tokens
API error responses
GET /api/v1/tokens/{networkKey}/ HTTP/1.1
Host: api.bando.cool
Accept: */*
{
"success": true,
"data": [
{
"id": 1,
"name": "text",
"symbol": "text",
"key": "text",
"address": "text",
"decimals": 1,
"friendlyDecimals": 1,
"imageUrl": "https://example.com",
"minAllowance": "text",
"maxAllowance": "text"
}
]
}
3. 💬 Create a Quote
Endpoint: POST /quotes/
Fiat currency for request.
Requested stable coin used for pricing (e.g., USDC)
Product identifier
Network identifier
Integrator name
Sender address for the transaction
Quote retrieved successfully
Bad Request - Invalid or missing parameters
POST /api/v1/quotes/ HTTP/1.1
Host: api.bando.cool
Content-Type: application/json
Accept: */*
Content-Length: 106
{
"fiatCurrency": "text",
"digitalAsset": "text",
"sku": "text",
"chainId": 1,
"integrator": "text",
"sender": "text"
}
{
"id": 1,
"fiatCurrency": "text",
"fiatAmount": "text",
"digitalAsset": "text",
"digitalAssetAmount": "text",
"totalAmount": "text",
"feeAmount": "text",
"sku": "text",
"transactionRequest": {
"chainId": 1,
"type": 2,
"to": "text",
"data": "text",
"value": "text",
"gas": "text",
"gasLimit": "text",
"maxFeePerGas": "text",
"maxPriorityFeePerGas": "text"
}
}
4. 💸 Perform Wallet Payment
When you're outside the BSP, you can use the quote response transactionRequest
property to send crypto using a wallet (such as MetaMask, WalletConnect, CLI, etc.).
Here's what you do:
Wait for the transaction to get a receipt. We recommend to wait for at last one confirmation on the blockchain.
Start the transfer and make sure to grab the payment transaction hash.
Th transaction returned by the API is compatible with most JS clients. But make sure to format it according to your implementation.
5. 📝 Register Spending Transaction
Endpoint: POST /wallets/{address}/transactions/
Use the sender’s wallet address in the path. Submit both quoteId
and the paymentTxHash
from the previous step.
Creates a new spending transaction in the Bando Spending Protocol.
User's wallet address
Integrator slug unique identifier
bando
Quote Unique key that makes this request idempotent.
Created spend transaction
Bad Request
Unauthorized - API Token Missing or Unrecognized
Forbidden - IP Not Allowed
Transactions not found
Duplicate request detected for this Idempotency-Key.
Too Many Requests
Internal Server Error
Indicates the client should retry the spending transaction due to an on-chain failure caused by network congestion.
POST /api/v1/wallets/{address}/transactions/ HTTP/1.1
Host: api.bando.cool
Idempotency-Key: text
Content-Type: application/json
Accept: */*
Content-Length: 463
{
"reference": "[email protected]",
"requiredFields": [
{
"key": "Name",
"value": "Linus"
}
],
"transactionIntent": {
"sku": "SOME_SKU",
"quantity": 1,
"amount": 125.5,
"chain": "42161",
"token": "0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9",
"wallet": "0xd8da6bf26964af9d7eed9e03e53415d37aa96045",
"integrator": "bando",
"hasAcceptedTerms": true,
"quoteId": 1
},
"transactionReceipt": {
"hash": "0x6fd1f2b0c8cc2d63df046de3f3479a819efc954ed1ed363c1dbb43111488ea05",
"virtualMachineType": "EVM"
}
}
{
"integrator": "text",
"transactionId": "text",
"status": "PENDING",
"countryIsoAlpha2": "text",
"productType": "not_set",
"productSubType": "not_set",
"sku": "not_set",
"fiatUnitPrice": 0,
"fiatCurrency": "text",
"quantity": 1,
"product": {
"name": "Amazon PrePaid code",
"logoUrl": "..."
},
"userWalletAddress": "text",
"chainId": 1,
"tokenUsed": "text",
"tokenAmountPaid": 1,
"created": "2025-08-14T00:21:45.931Z",
"updated": "2025-08-14T00:21:45.931Z",
"isDeleted": false,
"givenReference": "text",
"recordId": 1
}
6. 🔍 Track Transaction Status
Endpoint: GET /wallets/{address}/transactions/{transactionId}/
Use this to check the current status (PENDING
, SUCCESS
, or FAILED
) of the transaction you registered.
User's wallet address
Transaction ID to retrieve
Integrator slug unique identifier
bando
Transaction retrieved successfully
Bad request
Transaction not found
Wrong transaction query parameters
Too Many Requests
Internal Server Error
GET /api/v1/wallets/{address}/transactions/{transactionId}/ HTTP/1.1
Host: api.bando.cool
Accept: */*
{
"integrator": "text",
"transactionId": "text",
"status": "PENDING",
"countryIsoAlpha2": "text",
"productType": "not_set",
"productSubType": "not_set",
"sku": "not_set",
"fiatUnitPrice": 0,
"fiatCurrency": "text",
"quantity": 1,
"product": {
"name": "Amazon PrePaid code",
"logoUrl": "..."
},
"userWalletAddress": "text",
"chainId": 1,
"tokenUsed": "text",
"tokenAmountPaid": 1,
"created": "2025-08-14T00:21:45.931Z",
"updated": "2025-08-14T00:21:45.931Z",
"isDeleted": false,
"givenReference": "text",
"recordId": 1
}
Last updated
Was this helpful?