globpay.app
Please wait...

Change Your Password

Your password was reset by an administrator. Please set a new password to continue.

Partner application pending

Your partner registration is waiting for admin approval. You will see assigned merchants and commissions once approved.

Application under review

Your KYC has been submitted and is being reviewed. You'll get full access to Collections, Wallets, Settlements, Reports, and API Keys once approved.

Complete your KYC documents

Still needed: . You can upload these anytime from Account Info.

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.

,

· updated

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 Amount

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

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.

  1. From
  2. To
  3. Amount
  4. Review

No collection wallets with available balance.

Destination is the matching disbursement wallet.

From

To

Available

From
To
Amount

Transfer submitted.

Transfer requests

Loading…

No transfer requests yet.

Reference Operator Amount Status Date
Opening balance

Closing balance

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.

Collection wallet balance
Pending collections
Reserved funds
Available to settle
Minimum settlement

No available balance to settle

Settlements debit collected funds only. Choose another collection wallet, or view collection wallets.

Destination

Account on file

Wrong network can permanently lose funds. Select the network explicitly — we never infer it from the address.

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

Select network manually. Wrong network = permanent loss.

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.

Operator
Settlement Amount
Service Charge
Payout Method
Description
Wallet Balance

Settlement Receipt

Your settlement request has been submitted

Settlement History

No settlements found.
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.

Loading partner dashboard...

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

Create Invoice

Payment instructions are generated based on the selected country and payment method.

Invoice

Customer

Amount

Due

Description

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 Email Role Expires Actions

Members

Loading team…

Name Email 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.

Invite team member

GlobPay emails a secure link. The invited person creates their own password and turns on 2FA. You cannot set a password for them.

Permissions

Account Information

Profile, verification, and payout destinations for settlements

Verification

Approved

Bank Accounts

For bank settlements

Crypto Wallets

For USDT settlements

Complete business verification

Submit your KYC details to unlock full account features.

Business name
Business type
Account

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

Loading accounts...

New bank account

Required for Kenya bank accounts.

Crypto Wallets

Destinations for USDT settlement payouts

Loading wallets...

From KYC

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.

Open full KYC form to upload documents →
Admin Notes:

Company details

Legal name, type, and registration

Services and markets

What you need and where you will operate

Tick every country you want to operate in. You can select more than one.

Technical details

Optional IP allowlist for API access

Stablecoin settlement

Settlements are paid in USDT or USDC. Complete wallet details in the Crypto Wallet step. Transfers to an incorrect network or address may not be recoverable.

ID Verification

Business owner or authorized representative

Document upload

Upload your ID here, or use the full KYC form for the rest of the pack.

Accepted: JPG, PNG or PDF · Max 5MB

Accepted: JPG, PNG or PDF · Max 5MB

Crypto wallet settlement

Wallet details for USDT or USDC payouts

Ensure the wallet address and network are correct. Transfers to an incorrect network or address may not be recoverable.

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.

Available disbursement

Limits

Delivery

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.

phone,amount,reference,description
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

Calculating charges for all recipients...
Total Send Amount
Total Service Fees ( items)
Total Debit from Wallet
No charges apply to this batch.

Batch Results

# Phone Amount Status Reference Error

Add Recipient Manually

Create Bulk Batch

Maker → Checker → Approver workflow before funds are sent.

Columns: phone, amount, operator, reference, description

Bulk Payout Batches

Loading...
No bulk batches yet.
Reference Name Items Amount Status Actions

Status

Items

Total

Source

Phone Amount Operator Status

Pending Payouts

0

Total Amount

0.00 TZS

Selected

0

payout(s) selected

Payouts Awaiting Approval

No pending payouts to approve.

Reference Phone Amount Operator Description Created By Date Actions

Recent Disbursements

No disbursements yet.
Reference Receipt Batch Phone Amount Operator Status Date Receipt

Showing to of

Globpay.ai

Payout Receipt

Disbursement Transaction

Reference Number

Recipient Phone
Operator
Send Amount
Service Fee
Total Debited
Reference
Description
Date

Kenya Virtual Accounts — NCBA

One collection account per currency. KES, USD, and EUR settle through NCBA Kenya.

Accounts

Loading virtual accounts…

No virtual accounts yet. Create KES, USD, or EUR above.

VA number Currency Bank Created Last payment Received Status Actions

Create virtual account

This creates one NCBA Kenya collection account for . You can only create one account per currency.

USD and EUR deposits use SWIFT to NCBA (CBAFKENXX). KES can also be paid via M-Pesa PayBill using the VA number as BillRef.

Payment instructions

Bank

SWIFT

PayBill

Account / reference

Crypto requires the stablecoin entitlement. Ask an admin to enable it for this account.

Crypto

Stablecoin balances, deposits, withdrawals and conversion

Crypto withdrawals are not enabled for this environment.

USDT

This asset/network has not been enabled by your custody provider.

USDC

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.

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.

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

Virtual cards are a premium feature. Contact your account manager to enable can_virtual_card on your account.

Load Card

Operator Status

Are payment services currently working? Sandbox integration tests live under Developer Testing.

Refreshed

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.

No real money

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

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

Live keys are created on the production dashboard.

Limits this key to read endpoints. Other permissions are cleared.

Security notice

The API secret is shown once and stored as a hash. Copy it before you close this panel — it cannot be retrieved later. Rotate the key if it is lost.

This secret is stored as a hash and will not be shown again.

Payments & Webhooks

Every collection and payout with payment status and webhook delivery status.

Loading payments...
No payments found.
Date Ref Type Phone Amount Operator Payment status Webhook Actions
Showing - of

Payment & webhook detail

Ref:
External:
Payment status:
Webhook:
Amount:
Phone:
Operator:
Receipt:
Error:

Webhook delivery attempts

Loading…
No webhook delivery attempts yet.

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.

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.

Preview to lock a time-limited quote before converting.

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

Name
Email
Role
Last Login
Last Login IP

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
Sandbox API: Use 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

  1. Sign up at login.globpay.app and complete KYC for admin approval
  2. Go to Settings → API Keys and generate your API key & secret
  3. Set your callback URL in Account Info → Callback URL
  4. Optionally whitelist your server IPs in Settings → IP Whitelist
  5. Call https://api.globpay.app/api/v1 with the X-API-Key and X-API-Secret headers

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.

POST/v1/collection

Request 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.

POST/v1/invoice

Request 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.

POST/v1/virtual-accounts

Example 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.

POST/v1/disbursement

Request 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.

Enablement: Globpay must turn on Auto Transfer for your account (Admin → Merchant review → Settings). Without it, 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).

POST/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"
  }
}
GET/v1/transfers optional ?status=approved

Query Endpoints

Transaction Status

Check the current status of a specific payment request by its reference.

GET/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.

GET/v1/balance

Example 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.

GET/v1/transactions

Query 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.

GET/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.

GET/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.

GET/v1/operators

Example 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 200 within 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):

ModeEndpointWhen 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

Flow: Customer enters card on your site → 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)

Flow: 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