Please wait — loading your balances…
Features unlock after approval
Collections, Wallets, Settlements, Reports, and API Keys will appear once your KYC is approved. You can review Account Info and API documentation in the meantime.
,
items need attention
Showing of
Money movement
Try another period or view all transactions.
Currency balances
Available funds
No balances yet
Recent transactions
No transactions yet
| Date & time | Reference | Type | Operator | Amount | Status |
|---|---|---|---|---|---|
Reports
Volumes are shown per currency. Optional USD equivalents never replace the source amounts.
Activity
Transactions
Completed
Pending
Failed
Completed volume by currency
No completed volume in this range.
| Currency | Transactions | Volume | USD equivalent |
|---|---|---|---|
No reports match these filters.
Weekly email summary
The owner email is always included when the report is enabled. Amounts in the email are listed separately per currency.
Export history
No exports yet.
| When | Report | Format | Status |
|---|---|---|---|
Transactions
Track collections, payouts, transfers, fees and adjustments across every currency.
Last updated
| Currency | Completed volume | Transactions |
|---|---|---|
Loading transactions…
|
|
Showing – of
Filters
Transaction details
Timeline
No timeline events yet.
References
- GlobPay reference
- Operator reference
- Customer operator
- Processing rail
- Technical channel
Customer
- Name
- Phone
Amounts
- Adjustment type
- Adjustment amount
- Balance effect
- Fee
- Original amount
- Platform fee
- Operator fee
- Net amount
- Exchange rate
Ledger
Running balance after entry:
Direction:
Entry ID:
Posted:
Webhook attempts
- #
No webhook attempts recorded.
Reversal
This transaction was reversed. Check the operator reference for linked reversal entries.
Wallets
Balances, transfers, and wallet ledger by country
All-Africa settlement value
USDT
≈ $ USD · confirmed
Balances by country
Search a country, then open its wallets.
| Country | Collection | Disbursement | Wallets | |
|---|---|---|---|---|
|
|
No countries match that search. No countries with a balance. Uncheck Hide zero-balance countries to see all. No wallets yet.
| Wallet | Country | Type | Currency | Available | Pending | Action |
|---|---|---|---|---|---|---|
|
|
No wallets match these filters.
Transfer collected funds
From wallet → To wallet → Amount → Review. Transfers stay on the same operator and currency.
- From
- To
- Amount
- Review
No collection wallets with available balance.
Destination is the matching disbursement wallet.
Available
Transfer requests
Loading…
No transfer requests yet.
| Reference | Operator | Amount | Status | Date |
|---|---|---|---|---|
Loading ledger…
No ledger entries for these filters.
| Date | Country | Wallet | Credit / debit | Amount | Balance after | Reason | Related ref |
|---|---|---|---|---|---|---|---|
Page of · entries
Settlements
Request and track settlement withdrawals to your bank account or crypto wallet
Waiting for your approval
A teammate submitted these settlements. You cannot approve a settlement you created.
Source collection wallet
Only collection wallets for this region are shown.
No available balance to settle
Settlements debit collected funds only. Choose another collection wallet, or view collection wallets.
Destination
Account on file
Amount and fees
Maximum:
Calculating fees…
Review and authorisation
- Source wallet
- Destination
- Settlement amount
- Platform fee
- Bank fee
- Net to destination
- Wallet deduction
- Estimated arrival
Status
- Settlement reference
- Amount
- Net amount
- Wallet deduction
Add bank account
Required for Kenya. Selecting a bank fills SWIFT automatically. PesaLink uses the 00xx code shown next to the bank name.
Add crypto wallet
Add Bank Account
Saved accounts appear in the settlement form immediately.
Required for Kenya PesaLink settlements. Use the 8–11 character BIC of the destination bank.
Add Crypto Wallet
TRC20, ERC20, or BEP20 for USDT settlements.
Settlement Summary
Please review the details below before confirming.
Same-day USDT settlement to your wallet.
Fees included in rate.
Settlement Receipt
Your settlement request has been submitted
Settlement History
| Reference | Operator | Amount | Type | Destination | Status | Date | Receipt |
|---|---|---|---|---|---|---|---|
|
|
|
Showing to of
Partner Commissions
View merchants assigned to you by admin and track your commission earnings
Your partner application is under review. An administrator will approve your account and assign merchants you bring to the platform.
Partner account
Commission rate will be set by admin when you are approved.
Share this link — merchants who register with it appear under Referred merchants
Total earned
Pending
Commission events
Referred merchants
| Business | Reference | Status | Joined |
|---|---|---|---|
No referred merchants yet. Share your referral link so merchants register with your code, or ask admin to assign an existing merchant.
USDT payouts
Commission is paid in USDT (TRC20) by admin via stable-coin. Add your TRC20 wallet under Account Info → Crypto.
| Date | Merchant | Transaction | Txn amount | Commission | Status |
|---|---|---|---|---|---|
No commission earnings yet.
Invoices
Bill a customer and share a payment link. Instructions follow the country and method you choose.
Invoice history
Loading invoices…
No invoices yet. Create one to get a payment link.
| Invoice number | Customer | Amount | Due date | Status | Actions |
|---|---|---|---|---|---|
|
|
Showing – of
Pay Links
Share a link for customers to pay you. Country comes first so the right operators and currency are available.
Pay Link History
Loading pay links…
No pay links yet. Create one to share with customers.
| Title | Amount | Country | Status | Uses | Actions |
|---|---|---|---|---|---|
|
|
Showing – of
Team & Account
Invite teammates, separate makers from checkers, and keep the business profile current.
Team invitations are available after admin approves your account.
Pending invitations
| Name | Role | Expires | Actions | |
|---|---|---|---|---|
|
|
Members
Loading team…
| Name | Role | Last active | 2FA | Status | Actions | |
|---|---|---|---|---|---|---|
|
|
The person who creates a payout or settlement cannot approve the same transaction. Set per-currency approval limits for non-owners.
| Member | Role | Permissions | Approval limits |
|---|---|---|---|
|
|
Your security
Email two-factor authentication is for your login. Use Account settings in the header to change it.
Financial dual control
Owners can send payouts and settlements immediately (typical for a single-user merchant).
Every other role submits payouts and settlements for a different teammate to approve. Creating and approving the same transaction is blocked, even if both permissions are granted.
Business profile
Business —
Email —
Country —
Status —
Deposit alerts
Weekly email summary
The account owner always receives the summary when it is enabled.
Account Information
Profile, verification, and payout destinations for settlements
Verification
Approved
Bank Accounts
For bank settlements
Crypto Wallets
For USDT settlements
Manage Bank Accounts
Add accounts for bank settlements
Manage Crypto Wallets
Add wallets for USDT payouts
Complete business verification
Submit your KYC details to unlock full account features.
KYC Verified
Approved on . Your account is fully active.
Business Information
Business Name
Business Type
Registration Number
Tax ID
Address
ID Verification
ID Type
ID Number
Uploaded Documents
Need to add or replace a file? Open the full KYC form or ask support to allow a KYC update.
Bank Accounts
Destinations for bank settlements
New bank account
Required for Kenya bank accounts.
Crypto Wallets
Destinations for USDT settlement payouts
New crypto wallet
Update Permission Granted
Admin has allowed you to update your business details. Make your changes and save. Permission will be revoked after saving.
Document re-upload required
Please replace the documents listed below, then save your KYC again.
- :
Send Money
Pay out to mobile money or bank accounts in a guided flow
Destination
Coming soon — use mobile money or bank for now.
Loading operators…
Disbursements debit your disbursement wallet only.
Insufficient balance — has available.
Recipient
No recent recipients.
Recipient verified
Amount and fees
Calculating fees…
Review and authorisation
- Recipient
- Destination
- Operator
- Source wallet
- Payment amount
- Platform fee
- Operator fee
- Total deduction
- Reference
- Description
- Delivery
Result
- GlobPay reference
- Provider reference
- Amount
- Total deducted
Batch Payout (CSV Upload)
Upload a CSV file or paste data to send money to multiple recipients at once. Maximum 500 recipients per batch. All rows use the selected currency.
Disbursement available
Give this batch a name to easily identify it later.
CSV Format
Your CSV must have columns: phone, amount. Optional: reference, description. Operator is auto-detected from the phone number.
0712345678,5000,REF001,Salary Jan
0652345678,3000,REF002,Bonus
0782345678,10000,REF003,Commission
Operator is detected automatically from the phone prefix (e.g. 072/074/075/076 = M-Pesa, 065/067/071 = Tigo Pesa)
| # | Phone | Amount | Service Fee | Reference | Description | Status | Remove |
|---|---|---|---|---|---|---|---|
|
|
Total: to recipient(s)
Batch Charges & Fees Summary
Batch Results
| # | Phone | Amount | Status | Reference | Error |
|---|---|---|---|---|---|
Add Recipient Manually
Create Bulk Batch
Maker → Checker → Approver workflow before funds are sent.
Bulk Payout Batches
| Reference | Name | Items | Amount | Status | Actions |
|---|---|---|---|---|---|
|
|
Status
Items
Total
Source
| Phone | Amount | Operator | Status |
|---|---|---|---|
Pending Payouts
0
Total Amount
0.00 TZS
Selected
0
Payouts Awaiting Approval
No pending payouts to approve.
| Reference | Phone | Amount | Operator | Description | Created By | Date | Actions | |
|---|---|---|---|---|---|---|---|---|
|
|
Recent Disbursements
| Reference | Receipt | Batch | Phone | Amount | Operator | Status | Date | Receipt |
|---|---|---|---|---|---|---|---|---|
|
|
Showing to of
Globpay.ai
Payout Receipt
Disbursement Transaction
Reference Number
Kenya Virtual Accounts — NCBA
One collection account per currency. KES, USD, and EUR settle through NCBA Kenya.
Prefix
Accounts
Loading virtual accounts…
No virtual accounts yet. Create KES, USD, or EUR above.
| VA number | Currency | Bank | Created | Last payment | Received | Status | Actions |
|---|---|---|---|---|---|---|---|
|
|
Crypto
Stablecoin balances, deposits, withdrawals and conversion
Crypto withdrawals are not enabled for this environment.
USDT
Pending
Locked
This asset/network has not been enabled by your custody provider.
USDC
Pending
Locked
This asset/network has not been enabled by your custody provider.
Total USD equivalent
Price source
Updated
Items requiring approval
Environment
Wallets
Each asset and network is a separate wallet.
This asset/network has not been enabled by your custody provider.
No crypto wallets are listed for this account.
Page of
No crypto transactions yet.
GlobPay generates a unique deposit address, verifies the blockchain, waits for confirmations, credits the ledger once, then sends a signed webhook. Do not fulfil the order from the customer browser.
| Payment | Reference | Amount | Network | Status | Address |
|---|---|---|---|---|---|
No crypto collection payments yet. Create one here or via POST /api/v1/crypto/payments.
Wallet address is reused for the merchant desk. Each collection payment gets its own deposit address so payments cannot be mixed.
| Purpose | Asset | Network | Address | Status |
|---|---|---|---|---|
No deposit addresses yet.
Merchants are notified only after GlobPay verifies the chain. Each event has a stable id, timestamp and HMAC signature. Failed deliveries retry automatically; you can also Resend.
| Event | Type | Status | HTTP | |
|---|---|---|---|---|
|
|
No crypto webhook events yet. API keys and the callback URL are in Developers.
Settlement settings
Collections credit the merchant USDT ledger. Optional conversion into a local currency waits for a live treasury rate.
API keys live in Developers.
Address book is for convenience. The withdrawal allowlist requires 2FA and a cooling period. Existing addresses cannot be edited — disable the old record and create a new one.
Available after
Address details
Name
Asset / network
Full address
Note
Status
Available after
Enter the 2FA code to disable this address. It cannot be edited; create a new record if you need a replacement.
No saved addresses yet.
| Date | Reference | Asset | Network | Amount | |
|---|---|---|---|---|---|
|
|
No crypto sends are waiting for approval.
Virtual Cards
Issue cards funded from your wallet, USDT, USDC, or bank balance
can_virtual_card on your account.
Issue New Card
Expires
Balance
Load Card
Operator Status
Are payment services currently working? Sandbox integration tests live under Developer Testing.
Loading operator status…
No operators for / .
| Country | Currency | Operator | Collection | Payout | Success rate | Avg response | Last successful | Last checked | Incident | Payout balance |
|---|---|---|---|---|---|---|---|---|---|---|
Developer Testing
Test your GlobPay integration without moving real money. Operator Status is the live health view — this page answers whether your integration behaves correctly.
Sandbox only — no real money
Use gp_test_ / gs_test_ keys against . Live keys and live payouts are blocked.
Submit several simulated sandbox payments in one request. No real money.
| Phone | Operator | Scenario | |
|---|---|---|---|
Send a signed sample event to your saved callback URL. Configure the URL under Webhooks first.
Call a sandbox endpoint with a gp_test_ key and inspect the response. Live keys are rejected.
Live credentials are blocked. Paste a gp_test_ key.
One-click sandbox outcomes using the selected operator. Amounts map to the public simulator (100–105).
Uses Test Collection (or Test Payout for insufficient balance) with the operator and phone currently selected on those tabs.
Request logs
No sandbox requests yet. Run a test to populate this log.
| When | Action | Status |
|---|---|---|
Request / response |
API Reference
Matching documentation for the tests on this page. Sandbox base URL:
API keys
Authenticate server requests with X-API-Key and X-API-Secret. The secret is shown once.
API keys are available after admin approves your account.
Loading keys…
No API keys yet.
| Name / key | Environment | Permissions | Created | Last used | Expires | Status | Actions |
|---|---|---|---|---|---|---|---|
|
|
|
Callback URL
HTTPS endpoint that receives signed payment events.
v2 is recommended for new integrations (event_id and granular events). REST /api/v1 and /api/v2 both stay available.
Verify hex(hmac_sha256(secret, timestamp + "." + raw_body)) against X-GlobPay-Signature using X-GlobPay-Timestamp. During rotation, also accept X-GlobPay-Signature-Previous.
Save a callback URL to generate a signing secret.
Previous secret remains valid until .
Recent deliveries
Loading deliveries…
No webhook deliveries yet.
| Time | Event / ref | HTTP | Attempts | Status | Action |
|---|---|---|---|---|---|
|
|
IP access
Once any IP is listed, only approved addresses may call the API. New IPs wait for admin approval.
Loading…
No IPs listed. API access is open from any address until you add one.
| IP | Label | Status | Actions |
|---|---|---|---|
|
|
Developer audit log
Key, webhook, and IP access changes for this account.
Loading audit log…
No developer activity yet.
| Time | Actor | Action | Detail | IP |
|---|---|---|---|---|
Payments & Webhooks
Every collection and payout with payment status and webhook delivery status.
| Date | Ref | Type | Phone | Amount | Operator | Payment status | Webhook | Actions |
|---|---|---|---|---|---|---|---|---|
|
|
Payment & webhook detail
Webhook delivery attempts
Currency Exchange
Choose currencies and collection or disbursement wallets. GlobPay routes internally — you do not pick operators.
These rates are stale and cannot be used for conversion. Request a fresh treasury quote.
- You send
- Exchange rate
- Exchange fee
- You receive
Rate updated · too old to convert
No exchange pairs are active for your currencies.
Convert
Available in source wallet:
Rate unavailable. Preview and conversion stay disabled until treasury publishes a current rate.
Min · Max
Quote
- You send
- Exchange rate
- Exchange fee
- You receive
Rate updated
A teammate must approve this exchange before funds move.
This quote expired. Preview again to lock a new rate.
Exchange History
Loading history…
No exchanges match these filters.
| When | Reference | You sent | You received | Fee | Status | |
|---|---|---|---|---|---|---|
|
|
Settings
Manage your password and security preferences.
Change Password
Min 8 chars, mixed case, numbers & symbols.
Security Settings
Manage your account security.
Two-Factor Authentication
Extra layer of security via email code
Account Information
API Documentation
Integration guides, endpoints and code examples for the Globpay.ai API
API Overview
Integrate Globpay.ai into your application using our REST API. All requests use JSON over HTTPS.
Base URL (sandbox)
https://api.sandbox.globpay.app/api/v1
API Key Prefix
gp_test_... / gs_test_...
Real Money?
NO — simulated only
https://api.sandbox.globpay.app/api/v1 with gp_test_ keys from Settings → API Keys.
Collections use the payment simulator — no real operator money.
Available Endpoints
| Method | Endpoint | Description |
|---|---|---|
| POST | /v1/send |
Unified send — collection or disbursement, single or multi-operator |
| POST | /v1/collection |
Collect money via USSD push |
| POST | /v1/invoice |
Create a payment invoice (C2B). KES/USD/EUR auto-assigns an NCBA virtual account |
| POST | /v1/paylink |
Payment link (card, virtual_account, or crypto) |
| GET | /v1/virtual-accounts |
List virtual accounts + NCBA SWIFT / PayBill instructions |
| POST | /v1/virtual-accounts |
Create a KES / USD / EUR virtual account |
| POST | /v1/disbursement |
Send money to mobile wallet |
| POST | /v1/card/collection |
Card Direct API (2D + 3DS — you send card data) |
| POST | /v1/card/session |
Card hosted checkout (Globpay page + 3DS, SAQ A) |
| GET | /v1/status/{request_ref} |
Check transaction status |
| GET | /v1/balance |
Get wallet balances |
| POST | /v1/transfer |
Collection → disbursement (requires Auto Transfer) |
| GET | /v1/transfers |
List internal transfers |
| GET | /v1/transactions |
List transactions with filters |
| GET | /v1/transaction/{ref} |
Look up a single transaction |
| GET | /v1/webhooks/{ref} |
Check webhook delivery status |
| GET | /v1/operators |
List active operators |
Quick Start
- Sign up at login.globpay.app and complete KYC for admin approval
- Go to Settings → API Keys and generate your API key & secret
- Set your callback URL in Account Info → Callback URL
- Optionally whitelist your server IPs in Settings → IP Whitelist
- Call
https://api.globpay.app/api/v1with theX-API-KeyandX-API-Secretheaders
Authentication
All API requests require two headers. Generate your credentials from Settings → API Keys.
| Header | Description |
|---|---|
X-API-Key |
Your API key (public identifier) |
X-API-Secret |
Your API secret (keep confidential) |
Content-Type |
application/json (for POST
requests) |
Example request headers
curl -X POST https://api.globpay.app/api/v1/collection \
-H "Content-Type: application/json" \
-H "X-API-Key: your_api_key_here" \
-H "X-API-Secret: your_api_secret_here" \
-d '{ ... }'
IP Whitelisting: For added security, whitelist your server IPs in Settings → IP Whitelist. Requests from non-whitelisted IPs will be rejected once enabled.
Supported Operators
| Operator | Code | Country | Collection | Disbursement |
|---|---|---|---|---|
| M-Pesa | mpesa |
Tanzania | ✓ | ✓ |
| Tigo Pesa | tigopesa |
Tanzania | ✓ | ✓ |
| Airtel Money | airtelmoney |
Tanzania | ✓ | ✓ |
| Halopesa | halopesa |
Tanzania | ✓ | ✓ |
Use GET /v1/operators to
programmatically fetch the current list.
Payment Endpoints
Collection (Globpay.ai)
Initiate a mobile money collection. The customer receives a USSD prompt on their phone to confirm the payment.
/v1/collectionRequest Body
| Field | Type | Required | Description |
|---|---|---|---|
phone |
string | Yes | Customer phone (e.g. 255712345678) |
amount |
number | Yes | Amount to collect (min: 100) |
operator |
string | Yes | Operator code (e.g. mpesa, tigopesa, airtelmoney) |
reference |
string | No | Your internal reference (max 100 chars) |
description |
string | No | Payment description (max 255 chars) |
currency |
string | No | Currency code (default: TZS) |
callback_url |
string | No | Override default callback URL for this request |
Example request
{
"phone": "255712345678",
"amount": 10000,
"operator": "mpesa",
"reference": "ORDER-001",
"description": "Payment for Order #001"
}
Success response (201)
{
"success": true,
"message": "Collection initiated",
"request_ref": "PAY-A1B2C3D4E5F6",
"status": "processing",
"amount": 10000,
"charge": 200,
"operator": "mpesa"
}
Invoice (Manual C2B)
Create a payment invoice that customers can pay using any supported operator. Unlike Collection, the customer initiates the payment — no USSD push is sent. A shareable payment link is generated.
/v1/invoiceRequest Body
| Field | Type | Required | Description |
|---|---|---|---|
amount |
number | Yes | Invoice amount (min: 100) |
reference |
string | Yes | Your internal reference (max 100 chars) |
description |
string | No | Invoice description (max 255 chars) |
currency |
string | No | Currency code (default: TZS). Use KES, USD, or EUR to auto-assign an NCBA virtual account |
payment_method |
string | No | Set to virtual_account to require a VA (currency must be KES, USD, or EUR) |
phone |
string | No | Customer phone (for reference only) |
expires_in |
integer | No | Expiry in minutes (1–43200, default: 10080 = 7 days) |
Example request
{
"amount": 25000,
"reference": "INV-2024-001",
"description": "Monthly subscription",
"expires_in": 1440
}
Success response (201)
{
"success": true,
"message": "Invoice created. Customer should pay using reference: INV-2024-001",
"request_ref": "INVX1Y2Z3A4B5C6",
"external_ref": "INV-2024-001",
"amount": 25000,
"currency": "TZS",
"status": "waiting",
"expires_at": "2026-01-16T10:30:00.000000Z",
"payment_token": "abc123...",
"pay_url": "https://api.globpay.app/pay/abc123..."
}
Tip: Share the pay_url with your customer — they can open it in a browser and
pay from any supported operator. You'll receive a webhook callback when payment completes.
Virtual account invoice — pass currency KES, USD, or EUR. Globpay assigns a VA; the VA number is the payment reference. Response includes deposit_instructions (M-Pesa PayBill for KES, NCBA SWIFT for all three).
{
"amount": 1500,
"reference": "INV-2026-0042",
"currency": "KES",
"payment_method": "virtual_account"
}
Virtual accounts (NCBA)
Create a dedicated KES, USD, or EUR account number. Customers pay by M-Pesa PayBill (KES) or SWIFT / bank transfer. You do not call /v1/collection — listen for the webhook. The VA number is both the account number and the payment reference.
/v1/virtual-accountsExample request
{
"currency": "USD",
"label": "Main USD collections"
}
deposit_instructions includes account_number, swift_code (CBAFKENXX), bank_name, account_name, bank_code, and payment_steps. List with GET /v1/virtual-accounts.
Or create a hosted link (VA is auto-created if you omit virtual_account_id):
POST /v1/paylink
{
"title": "Pay Globpay",
"currency": "USD",
"payment_method": "virtual_account"
}
Disbursement (Payout)
Send money from your disbursement wallet to a customer's mobile money account.
/v1/disbursementRequest Body
| Field | Type | Required | Description |
|---|---|---|---|
phone |
string | Yes | Recipient phone number (e.g. 255712345678) |
amount |
number | Yes | Amount to send (min: 100) |
operator |
string | Yes | Operator code (e.g. mpesa, tigopesa) |
reference |
string | No | Your internal reference (max 100 chars) |
description |
string | No | Payment description (max 255 chars) |
currency |
string | No | Currency code (default: TZS) |
Example request
{
"phone": "255712345678",
"amount": 5000,
"operator": "mpesa",
"reference": "PAYOUT-001",
"description": "Salary payment"
}
Success response (201)
{
"success": true,
"message": "Disbursement initiated",
"request_ref": "PAY-X9Y8Z7W6V5U4",
"status": "processing",
"amount": 5000,
"charge": 150,
"operator": "mpesa"
}
Note: Disbursements are deducted from
your disbursement wallet. Ensure sufficient balance before initiating. Move funds from
collection to disbursement via the dashboard (Wallets → Transfer) or
POST /v1/transfer (requires Auto Transfer).
Transfer (Collection → Disbursement)
Move money inside one operator wallet from collection to disbursement so you can fund payouts. The same action is available in the panel under Wallets → Transfer to Disbursement.
POST /v1/transfer returns
403 with
code: auto_transfer_disabled.
The panel can still request transfers that wait for admin approval when Auto Transfer is off.
1. Call GET /v1/balance and pick a
collection wallet.
2. Note operator /
currency (or use a code like
mpesake from
GET /v1/operators).
/v1/transfer| Parameter | Required | Description |
|---|---|---|
amount |
Yes | Amount to move (≥ 1) |
operator |
Yes | Code (mpesake) or name (M-Pesa Kenya) |
currency |
No | ISO code to pin the rail (e.g. KES) |
description |
No | Free text |
Example request
curl -X POST https://api.globpay.app/api/v1/transfer \
-H "X-API-Key: YOUR_API_KEY" \
-H "X-API-Secret: YOUR_API_SECRET" \
-H "Content-Type: application/json" \
-d '{
"amount": 1000,
"operator": "mpesake",
"currency": "KES",
"description": "Fund Kenya payouts"
}'
Example response (200)
{
"success": true,
"message": "Transfer auto-approved and executed.",
"transfer": {
"reference": "TRF-ABCDEF123456",
"operator": "M-Pesa Kenya",
"amount": "1000.00",
"currency": "KES",
"from": "collection",
"to": "disbursement",
"status": "approved"
}
}
/v1/transfers
optional ?status=approved
Query Endpoints
Transaction Status
Check the current status of a specific payment request by its reference.
/v1/status/{request_ref}Path Parameters
| Parameter | Description |
|---|---|
request_ref |
The request_ref returned when
the payment was initiated |
Example response (200)
{
"request_ref": "PAY-A1B2C3D4E5F6",
"type": "collection",
"amount": 10000,
"charge": 200,
"phone": "255712345678",
"operator": "mpesa",
"status": "completed",
"operator_ref": "MPESA123456",
"reference": "ORDER-001",
"created_at": "2026-01-15T10:30:00.000000Z",
"completed_at": "2026-01-15T10:30:45.000000Z"
}
Status Values
| Status | Description |
|---|---|
pending
|
Request submitted, waiting for operator |
processing
|
USSD push sent, waiting for customer confirmation |
completed
|
Payment successful |
failed
|
Payment failed (insufficient funds, timeout, rejected) |
reversed
|
Transaction was reversed |
waiting
|
Invoice created, waiting for customer to pay |
Wallet Balance
Retrieve your current wallet balances across all operators and wallet types.
/v1/balanceExample request
curl https://api.globpay.app/api/v1/balance \ -H "X-API-Key: YOUR_API_KEY" \ -H "X-API-Secret: YOUR_API_SECRET"
Example response (200)
{
"account_id": 1,
"currency": "KES",
"collection_total": "5000.00",
"disbursement_total": "1200.00",
"overall_balance": "6200.00",
"has_multiple_currencies": true,
"by_currency": [
{
"currency": "KES",
"collection_total": "5000.00",
"disbursement_total": "1200.00",
"overall_balance": "6200.00"
}
],
"wallets": [
{
"operator": "M-Pesa Kenya",
"wallet_type": "collection",
"balance": 5000,
"held_balance": 0,
"available": 5000,
"currency": "KES",
"status": "active"
},
{
"operator": "M-Pesa Kenya",
"wallet_type": "disbursement",
"balance": 1200,
"held_balance": 0,
"available": 1200,
"currency": "KES",
"status": "active"
}
]
}
List Transactions
Retrieve a paginated list of your transactions with optional filters.
/v1/transactionsQuery Parameters
| Parameter | Type | Description |
|---|---|---|
date_from |
string | Start date filter (YYYY-MM-DD) |
date_to |
string | End date filter (YYYY-MM-DD) |
status |
string | Filter by status (pending, completed, failed)
|
type |
string | Filter by type (collection, disbursement, manual_c2b) |
operator |
string | Filter by operator code |
per_page |
integer | Results per page (1–100, default: 20) |
Example: GET /v1/transactions?date_from=2026-01-01&status=completed&per_page=10
{
"data": [
{
"request_ref": "PAY-A1B2C3D4E5F6",
"external_ref": "ORDER-001",
"type": "collection",
"phone": "255712345678",
"amount": 10000,
"platform_charge": 200,
"currency": "TZS",
"operator": "M-Pesa",
"status": "completed",
"receipt_number": "RCP123456",
"created_at": "2026-01-15T10:30:00.000000Z",
"updated_at": "2026-01-15T10:30:45.000000Z"
}
],
"current_page": 1,
"per_page": 10,
"total": 156,
"last_page": 16
}
Transaction Lookup
Look up a single transaction by request_ref, your external_ref (reference), or receipt_number.
/v1/transaction/{ref}Example response (200)
{
"request_ref": "PAY-A1B2C3D4E5F6",
"external_ref": "ORDER-001",
"operator_ref": "MPESA123456",
"receipt_number": "RCP123456",
"type": "collection",
"phone": "255712345678",
"amount": 10000,
"platform_charge": 200,
"operator_charge": 0,
"currency": "TZS",
"operator": "M-Pesa",
"status": "completed",
"error": null,
"callback_status": "delivered",
"description": "Payment for Order #001",
"created_at": "2026-01-15T10:30:00.000000Z",
"updated_at": "2026-01-15T10:30:45.000000Z"
}
Webhook Delivery Status
Check the webhook (callback) delivery attempts for a specific transaction.
/v1/webhooks/{ref}Path Parameters
| Parameter | Description |
|---|---|
ref |
request_ref or your external_ref (reference) |
Example response (200)
{
"request_ref": "PAY-A1B2C3D4E5F6",
"external_ref": "ORDER-001",
"transaction_status": "completed",
"callback_status": "delivered",
"callback_url": "https://yoursite.com/webhook/payin",
"total_attempts": 1,
"webhooks": [
{
"attempt": 1,
"url": "https://yoursite.com/webhook/payin",
"http_status": 200,
"status": "delivered",
"response_time_ms": 245,
"error_message": null,
"sent_at": "2026-01-15T10:30:46.000000Z"
}
]
}
List Active Operators
Returns all currently active mobile money operators with their capabilities and limits.
/v1/operatorsExample response (200)
[
{
"name": "M-Pesa",
"code": "mpesa",
"country": "Tanzania",
"currency": "TZS",
"supports_collection": true,
"supports_disbursement": true,
"min_amount": 100,
"max_amount": 10000000
},
{
"name": "Tigo Pesa",
"code": "tigopesa",
"country": "Tanzania",
"currency": "TZS",
"supports_collection": true,
"supports_disbursement": true,
"min_amount": 100,
"max_amount": 5000000
}
]
Webhooks (Callbacks)
Webhook Notifications
When a payment completes, fails, or is reversed, Globpay.ai sends an HTTP POST to your configured callback URL. Set it in Account Info → Callback URL.
Callback Payload
{
"request_ref": "PAY-A1B2C3D4E5F6",
"type": "collection",
"status": "completed",
"amount": 10000,
"charge": 200,
"phone": "255712345678",
"operator": "mpesa",
"operator_ref": "MPESA123456",
"reference": "ORDER-001",
"completed_at": "2026-01-15T10:30:45.000000Z"
}
Delivery & Retry Policy
- Your endpoint must return HTTP
200within 10 seconds - Failed deliveries are retried automatically with exponential backoff
- Check delivery status via
GET /v1/webhooks/{ref}or the Webhook Logs tab in your dashboard
Security: Always verify payment status via
/v1/status/{request_ref} before fulfilling orders — never
trust callback data alone.
Webhook Handler Examples
PHP (Laravel)
// routes/api.php
Route::post('/webhook/payin', function (Request $request) {
$payload = $request->all();
// Always verify with Globpay.ai API
$status = Http::withHeaders([
'X-API-Key' => config('services.payin.key'),
'X-API-Secret' => config('services.payin.secret'),
])->get("https://api.globpay.app/api/v1/status/{$payload['request_ref']}");
if ($status->ok() && $status['status'] === 'completed') {
// Process the successful payment
Order::where('reference', $payload['reference'])
->update(['payment_status' => 'paid']);
}
return response()->json(['received' => true]);
});
Python (Flask)
@app.route('/webhook/payin', methods=['POST'])
def payin_webhook():
payload = request.get_json()
# Always verify with Globpay.ai API
status = requests.get(
f"https://api.globpay.app/api/v1/status/{payload['request_ref']}",
headers={
'X-API-Key': os.environ['PAYIN_API_KEY'],
'X-API-Secret': os.environ['PAYIN_API_SECRET'],
}
)
if status.status_code == 200 and status.json()['status'] == 'completed':
# Process the successful payment
db.orders.update_one(
{'reference': payload['reference']},
{'$set': {'payment_status': 'paid'}}
)
return jsonify({'received': True})
Node.js (Express)
app.post('/webhook/payin', async (req, res) => {
const payload = req.body;
// Always verify with Globpay.ai API
const status = await fetch(
`https://api.globpay.app/api/v1/status/${payload.request_ref}`,
{
headers: {
'X-API-Key': process.env.PAYIN_API_KEY,
'X-API-Secret': process.env.PAYIN_API_SECRET,
}
}
);
const data = await status.json();
if (status.ok && data.status === 'completed') {
// Process the successful payment
await Order.updateOne(
{ reference: payload.reference },
{ payment_status: 'paid' }
);
}
res.json({ received: true });
});
Card Payments — Visa / Mastercard
Accept Visa / Mastercard via Globpay Cards. Two integration modes on the same rail (vaultpay / vaultpay_card):
| Mode | Endpoint | When to use |
|---|---|---|
| Direct (2D + 3DS) | POST /v1/card/collection |
Your checkout collects the card (PCI SAQ D). 2D completes in JSON; 3DS returns a 3ds_url. |
| Hosted (3DS) | POST /v1/card/session |
Customer pays on a Globpay page — you never touch PAN/CVV (SAQ A). Remains available. |
A. Direct API — 2D + 3DS
POST /v1/card/collection with card fields →
if auth_mode=2d treat status=completed (no Globpay redirect);
if auth_mode=3ds open the 3ds_url, then poll status / webhook.
Pass return_url so the customer can return after 3DS.
POST /v1/card/collection
Use operator: "vaultpay_card" or, when enabled, "orchestrate_card" (same body — PAN is forwarded once and never stored). Orchestrate 3DS uses the returned 3ds_url.
{
"operator": "vaultpay_card",
"amount": 49.99,
"currency": "USD",
"reference": "ORDER-10432",
"first_name": "Jane",
"last_name": "Doe",
"email": "jane@example.com",
"card_number": "4242424242424242",
"card_expiry_month": "01",
"card_expiry_year": "2028",
"card_cvv": "123",
"return_url": "https://your-site.com/checkout/return",
"callback_url": "https://your-site.com/webhooks/globpay"
}
// 201 — 2D completed
{ "auth_mode": "2d", "status": "completed", "integration": "direct", "3ds_url": null }
// 201 — 3DS Direct challenge
{ "auth_mode": "3ds", "status": "processing", "integration": "direct",
"3ds_url": "https://…/authentication/…" }
Direct API requires Globpay enablement (PCI). Hosted below is available by default when cards are enabled.
B. Hosted checkout — 3DS (SAQ A)
POST /v1/card/session → get pay_url → redirect the customer → they pay on the hosted page (3DS handled) → they return to your return_url?ref=&status= → confirm via webhook / status. Your server never sees card numbers.
POST /v1/card/session
{
"amount": 49.99,
"currency": "USD",
"reference": "ORDER-10432",
"return_url": "https://your-site.com/checkout/return",
"first_name": "Jane",
"last_name": "Doe",
"email": "jane@example.com"
}
// 201 Created
{
"success": true,
"request_ref": "PAYAB12CD34EF56",
"amount": 49.99,
"currency": "USD",
"status": "waiting",
"pay_url": "https://login.globpay.app/pay/card/9f8e7d…"
}
Redirect the customer to pay_url. They come back to return_url?ref=PAYAB12CD34EF56&status=success&provider=vaultpay. Treat the query string as a hint only — confirm the final result server-side via GET /v1/status/{request_ref} or the webhook.
Or share a card payment link
Create a paylink with payment_method: "card" and share the returned pay_url:
POST /v1/paylink
{
"title": "Invoice #4501",
"amount": 49.99,
"currency": "USD",
"payment_method": "card",
"is_reusable": true,
"redirect_url": "https://your-site.com/thanks"
}
Card payments complete asynchronously via Globpay webhook when 3DS or hosted; status responses carry channel: "vaultpay" and operator_code: "vaultpay_card".
Integration Examples
Full Integration Examples
PHP — Collect Payment
$apiKey = 'YOUR_API_KEY';
$apiSecret = 'YOUR_API_SECRET';
$baseUrl = 'https://api.globpay.app/api/v1';
// 1. Initiate collection
$ch = curl_init("$baseUrl/collection");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
'Accept: application/json',
"X-API-Key: $apiKey",
"X-API-Secret: $apiSecret",
],
CURLOPT_POSTFIELDS => json_encode([
'phone' => '255712345678',
'amount' => 10000,
'operator' => 'mpesa',
'reference' => 'ORDER-001',
]),
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$data = json_decode($response, true);
if ($httpCode === 201 && ($data['success'] ?? false)) {
echo "Payment initiated: " . $data['request_ref'];
// 2. Check status later
$ch = curl_init("$baseUrl/status/" . $data['request_ref']);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"X-API-Key: $apiKey",
"X-API-Secret: $apiSecret",
],
]);
$statusData = json_decode(curl_exec($ch), true);
curl_close($ch);
echo "Status: " . $statusData['status'];
} else {
echo "Error: " . ($data['message'] ?? 'Unknown error');
}
Python — Collect & Check Status
import requests
API_KEY = 'YOUR_API_KEY'
API_SECRET = 'YOUR_API_SECRET'
BASE_URL = 'https://api.globpay.app/api/v1'
headers = {
'X-API-Key': API_KEY,
'X-API-Secret': API_SECRET,
}
# 1. Initiate collection
response = requests.post(f'{BASE_URL}/collection', headers=headers, json={
'phone': '255712345678',
'amount': 10000,
'operator': 'mpesa',
'reference': 'ORDER-001',
})
if response.status_code == 201:
data = response.json()
print(f"Payment initiated: {data['request_ref']}")
# 2. Check status
status = requests.get(f"{BASE_URL}/status/{data['request_ref']}", headers=headers)
print(f"Status: {status.json()['status']}")
# 3. Check wallet balance
balance = requests.get(f'{BASE_URL}/balance', headers=headers)
print(f"Balance: {balance.json()}")
else:
print(f"Error: {response.json()['message']}")
JavaScript / Node.js — Full Flow
const API_KEY = 'YOUR_API_KEY';
const API_SECRET = 'YOUR_API_SECRET';
const BASE_URL = 'https://api.globpay.app/api/v1';
const headers = {
'Content-Type': 'application/json',
'X-API-Key': API_KEY,
'X-API-Secret': API_SECRET,
};
// 1. Initiate collection
const collectRes = await fetch(`${BASE_URL}/collection`, {
method: 'POST',
headers,
body: JSON.stringify({
phone: '255712345678',
amount: 10000,
operator: 'mpesa',
reference: 'ORDER-001',
}),
});
const collectData = await collectRes.json();
if (collectRes.status === 201 && collectData.success) {
console.log('Payment initiated:', collectData.request_ref);
// 2. Check status
const statusRes = await fetch(
`${BASE_URL}/status/${collectData.request_ref}`,
{ headers }
);
const statusData = await statusRes.json();
console.log('Status:', statusData.status);
// 3. List recent transactions
const txnRes = await fetch(
`${BASE_URL}/transactions?per_page=5`,
{ headers }
);
const txnData = await txnRes.json();
console.log('Transactions:', txnData.data.length);
} else {
console.error('Error:', collectData.message);
}
cURL — Quick Reference
# Collect payment
curl -X POST https://api.globpay.app/api/v1/collection \
-H "Content-Type: application/json" \
-H "X-API-Key: YOUR_API_KEY" \
-H "X-API-Secret: YOUR_API_SECRET" \
-d '{"phone":"255712345678","amount":10000,"operator":"mpesa","reference":"ORDER-001"}'
# Create invoice
curl -X POST https://api.globpay.app/api/v1/invoice \
-H "Content-Type: application/json" \
-H "X-API-Key: YOUR_API_KEY" \
-H "X-API-Secret: YOUR_API_SECRET" \
-d '{"amount":25000,"reference":"INV-001","description":"Monthly subscription"}'
# Virtual account invoice (KES / USD / EUR — VA is auto-assigned)
curl -X POST https://api.globpay.app/api/v1/invoice \
-H "Content-Type: application/json" \
-H "X-API-Key: YOUR_API_KEY" \
-H "X-API-Secret: YOUR_API_SECRET" \
-d '{"amount":1500,"reference":"INV-KES-001","currency":"KES","payment_method":"virtual_account"}'
# Create virtual account
curl -X POST https://api.globpay.app/api/v1/virtual-accounts \
-H "Content-Type: application/json" \
-H "X-API-Key: YOUR_API_KEY" \
-H "X-API-Secret: YOUR_API_SECRET" \
-d '{"currency":"USD","label":"Main USD"}'
# Virtual account paylink (VA auto-created)
curl -X POST https://api.globpay.app/api/v1/paylink \
-H "Content-Type: application/json" \
-H "X-API-Key: YOUR_API_KEY" \
-H "X-API-Secret: YOUR_API_SECRET" \
-d '{"title":"Pay Globpay","currency":"USD","payment_method":"virtual_account"}'
# Disburse funds
curl -X POST https://api.globpay.app/api/v1/disbursement \
-H "Content-Type: application/json" \
-H "X-API-Key: YOUR_API_KEY" \
-H "X-API-Secret: YOUR_API_SECRET" \
-d '{"phone":"255712345678","amount":5000,"operator":"mpesa","reference":"PAYOUT-001"}'
# Transfer collection → disbursement (requires Auto Transfer)
curl -X POST https://api.globpay.app/api/v1/transfer \
-H "Content-Type: application/json" \
-H "X-API-Key: YOUR_API_KEY" \
-H "X-API-Secret: YOUR_API_SECRET" \
-d '{"amount":1000,"operator":"mpesake","currency":"KES"}'
# Check status
curl https://api.globpay.app/api/v1/status/PAY-A1B2C3D4E5F6 \
-H "X-API-Key: YOUR_API_KEY" \
-H "X-API-Secret: YOUR_API_SECRET"
# Get balance
curl https://api.globpay.app/api/v1/balance \
-H "X-API-Key: YOUR_API_KEY" \
-H "X-API-Secret: YOUR_API_SECRET"
# List transactions (with filters)
curl "https://api.globpay.app/api/v1/transactions?status=completed&date_from=2026-01-01&per_page=10" \
-H "X-API-Key: YOUR_API_KEY" \
-H "X-API-Secret: YOUR_API_SECRET"
# Lookup transaction
curl https://api.globpay.app/api/v1/transaction/ORDER-001 \
-H "X-API-Key: YOUR_API_KEY" \
-H "X-API-Secret: YOUR_API_SECRET"
# Check webhook delivery
curl https://api.globpay.app/api/v1/webhooks/PAY-A1B2C3D4E5F6 \
-H "X-API-Key: YOUR_API_KEY" \
-H "X-API-Secret: YOUR_API_SECRET"
# List operators
curl https://api.globpay.app/api/v1/operators \
-H "X-API-Key: YOUR_API_KEY" \
-H "X-API-Secret: YOUR_API_SECRET"
Error Handling
HTTP Status Codes
| Code | Meaning | Action |
|---|---|---|
200
|
Success | Process the response normally |
201
|
Created (payment initiated) | Store request_ref and wait for
callback |
401
|
Unauthorized | Check your API key and secret |
403
|
Forbidden | IP not whitelisted or account inactive |
404
|
Not found | Check the request_ref or endpoint URL |
422
|
Validation error | Check errors field for details
|
429
|
Rate limit exceeded | Slow down requests, retry after delay |
500/502/503
|
Server error | Retry with exponential backoff |
Error Response Format
{
"message": "Insufficient wallet balance.",
"errors": {
"amount": ["The amount must be at least 100."]
}
}
Common Error Messages
| Message | Cause |
|---|---|
| Invalid API credentials | Wrong API key or secret |
| Operator not found or inactive | Invalid operator code or operator is temporarily unavailable |
| Insufficient wallet balance | Not enough funds in disbursement wallet |
| No account associated | API key not linked to an active account |
| IP address not in whitelist | Request from an IP not in your allowed list |
Need Help?
Contact us at support@globpay.app for integration support.
Full API reference available at globpay.app/api-docs