Base URL (local):
http://localhost:8000Base URL (prod): set to your Render URL
All protected routes require: Authorization: Bearer <jwt_token>
Login via Telegram initData.
Headers: X-Telegram-Init-Data: <raw initData string> OR send in body.
Body:
{ "initData": "query_id=...&user=...&hash=..." }Response:
{
"success": true,
"token": "eyJ...",
"user": { "id": "123456789", "username": "davedev", "first_name": "Dave" }
}Live balances + deposit address + current rates.
{
"status": "success",
"data": {
"ngn": 250500.00,
"usdt": 45.50,
"usd": 0,
"usdt_address": "0x71C765...d897",
"rates": { "usdt_ngn": 1620.00, "usd_ngn": 1620.00 }
}
}Top up wallet (dev/demo use).
{ "amount": 100, "currency": "USDT" }Send to another user by their MongoDB _id.
{ "toUserId": "664abc...", "amount": 10, "currency": "USDT", "description": "Lunch" }Convert between USDT and NGN at live rate.
{ "from": "USDT", "to": "NGN", "amount": 10 }Response:
{ "status": "success", "data": { "converted": 16200, "rate": 1620, "wallet": { ... } } }Paginated transaction history.
{
"status": "success",
"data": [
{
"id": "664...",
"type": "bill",
"amount": 5000,
"currency": "NGN",
"description": "Bill payment: mtn β 1000 NGN",
"timestamp": "2026-06-11T10:30:00Z",
"status": "completed"
}
]
}type values: transfer Β· receive Β· fund Β· split Β· autobill Β· convert
List VTpass providers. No auth needed.
category values: data Β· airtime Β· tv-subscription Β· electricity-bill
List plans/bundles for a provider. No auth needed.
Pay a bill. Deducts USDT at live rate + 2% buffer.
{
"serviceID": "mtn-data",
"amount": 1000,
"phone": "08011111111",
"variation_code": "mtn-100mb-1000"
}Response:
{
"status": "success",
"data": {
"vtpass": { ... },
"usdtCharged": 0.6375,
"ngnAmount": 1000,
"rate": 1620
}
}Verify electricity meter before payment.
{ "provider": "EKEDC", "meterNumber": "1234567890", "variationCode": "prepaid" }Schedule a recurring bill.
{
"type": "Data",
"provider": "MTN",
"amount": 1000,
"currency": "NGN",
"frequency": "weekly",
"billersCode": "08011111111",
"variationCode": "mtn-100mb-1000"
}type: Airtime Β· Data Β· Electricity
frequency: daily Β· weekly Β· monthly
billersCode: phone number for airtime/data Β· meter number for electricity
List all active recurring bills.
Delete a recurring bill.
Deposits lock the exact NGN amount at the time of saving. You save β¦1,500 today β you withdraw β¦1,500, regardless of what happens to exchange rates. The vault is a discipline tool, not a speculation vehicle. (Interest/yield is a future feature.)
{
"status": "success",
"data": [
{
"id": "664...",
"title": "New Laptop",
"targetAmount": 850000,
"currentAmount": 425000,
"currency": "NGN",
"category": "Electronics",
"isCompleted": false,
"createdAt": "2026-06-01T00:00:00Z"
}
]
}Create a savings goal.
{
"name": "New Laptop",
"targetAmount": 850000,
"currency": "NGN",
"category": "Electronics",
"deadline": "2026-12-01"
}category: Electronics Β· Security Β· Business Β· Personal Β· Travel
{ "amount": 50000 }Amount is NGN β deducted from NGN wallet, stored as-is.
{ "amount": 50000 }Amount is NGN β returned directly to NGN wallet. You get back exactly what you saved.
Deletes goal. Any remaining NGN balance is refunded to wallet.
Create an escrow payment link. USDT equivalent is locked immediately.
{ "amount": 5000, "currency": "NGN", "note": "Lunch money" }Response:
{
"status": "success",
"data": { "token": "a1b2c3...", "amount": 5000, "expiresAt": "2026-06-12T10:00:00Z" }
}{
"status": "success",
"data": [
{
"id": "664...",
"amount": 5000,
"currency": "NGN",
"token": "a1b2c3...",
"status": "active",
"note": "Lunch money",
"expiryDate": "2026-06-12T10:00:00Z"
}
]
}Claim a link. Transfers funds to authenticated user's wallet.
Create a split.
{
"totalAmount": 20000,
"currency": "NGN",
"description": "Dinner",
"participants": [
{ "userId": "664abc...", "amount": 10000 },
{ "userId": "664def...", "amount": 10000 }
]
}Get split details and participant status.
Pay your share of a split.
Natural language β structured action.
{ "text": "Buy MTN data every Friday for 3000 NGN" }Response:
{
"action": "CREATE_AUTOBILL",
"type": "Data",
"provider": "MTN",
"amount": 3000,
"frequency": "weekly"
}action values: CREATE_AUTOBILL Β· SPLIT_PAY Β· CONVERT_CURRENCY Β· SEND_MONEY
Fund a wallet with fake balance for testing.
{ "amount": 100, "currency": "USDT" }All errors return:
{ "status": "error", "message": "Human-readable reason" }- VTpass test phone (airtime/data):
08011111111 - VTpass test DSTV smartcard:
1212121212 - Telegram auth hash verification is active β use real
initDatafrom the Mini App