PayloqaDocs

API

Payments

Collect mobile money from your customers. Create a session, optionally verify the payer with OTP, initiate the charge, then poll status or listen for webhooks.

Typical web flow: create a payment session → (optional) OTP request + verify → initiate → poll GET …/status until terminal or receive a webhook.

All amounts are integer pesewas. Send Idempotency-Key on create.

Optional — request collection OTP

POST/v1/otp/request

Auth: Authorization: Bearer sk_test_ or sk_live_

Payloqa sends the SMS. Use otp_request_id when creating the payment session.

Request body

{
  "msisdn": "233244123456",
  "purpose": "collection",
  "collection": {
    "amount_minor": 1000
  }
}

201

{
  "otp_request_id": "otpr_01EXAMPLE",
  "expires_at": "2026-08-30T12:10:00.000Z"
}
curl 'https://api.payloqa.com/v1/otp/request' \
  -X POST \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer sk_test_...' \
  -H 'Idempotency-Key: otp-req-001' \
  -d '{
  "msisdn": "233244123456",
  "purpose": "collection",
  "collection": {
    "amount_minor": 1000
  }
}'

Optional — verify OTP

POST/v1/otp/verify

Auth: Authorization: Bearer sk_test_ or sk_live_

Request body

{
  "otp_request_id": "otpr_01EXAMPLE",
  "code": "123456"
}

Response

{
  "verified": true
}
curl 'https://api.payloqa.com/v1/otp/verify' \
  -X POST \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer sk_test_...' \
  -d '{
  "otp_request_id": "otpr_01EXAMPLE",
  "code": "123456"
}'

Create payment session

POST/v1/payments/sessions

Auth: Authorization: Bearer sk_test_ or sk_live_

Request body

{
  "msisdn": "233244123456",
  "amount_minor": 1000,
  "network": "mtn",
  "otp_request_id": "otpr_01EXAMPLE"
}

201

{
  "id": "pay_01EXAMPLE",
  "platform_id": "plt_01EXAMPLE",
  "merchant_id": "mch_01EXAMPLE",
  "channel": "web",
  "network": "mtn",
  "goods_minor": 1000,
  "amount_minor": 1000,
  "expected_fee_minor": 25,
  "expected_net_minor": 975,
  "status": "created",
  "client_trans_id": "your-order-123",
  "otp_request_id": "otpr_01EXAMPLE",
  "payer_msisdn": "233244123456",
  "created_at": "2026-08-30T12:00:00.000Z"
}
curl 'https://api.payloqa.com/v1/payments/sessions' \
  -X POST \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer sk_test_...' \
  -H 'Idempotency-Key: pay-create-001' \
  -d '{
  "msisdn": "233244123456",
  "amount_minor": 1000,
  "network": "mtn",
  "otp_request_id": "otpr_01EXAMPLE"
}'

Initiate charge

POST/v1/payments/sessions/pay_01EXAMPLE/initiate

Auth: Authorization: Bearer sk_test_ or sk_live_

Request body

{}

Response

{
  "id": "pay_01EXAMPLE",
  "status": "initiated",
  "initiated_at": "2026-08-30T12:00:05.000Z"
}
curl 'https://api.payloqa.com/v1/payments/sessions/pay_01EXAMPLE/initiate' \
  -X POST \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer sk_test_...' \
  -d '{}'

Poll status

GET/v1/payments/sessions/pay_01EXAMPLE/status

Auth: Authorization: Bearer sk_test_ or sk_live_

Response

{
  "id": "pay_01EXAMPLE",
  "status": "paid",
  "terminal": true,
  "paid_at": "2026-08-30T12:00:30.000Z",
  "retry_after_seconds": null
}
curl 'https://api.payloqa.com/v1/payments/sessions/pay_01EXAMPLE/status' \
  -H 'Authorization: Bearer sk_test_...'