Use the REST API when your backend is not running Node.js or when you want direct control over HTTP requests.Documentation Index
Fetch the complete documentation index at: https://docs.moflay.com/llms.txt
Use this file to discover all available pages before exploring further.
Prerequisites
- A Moflay account and organization
- A sandbox API key with
express.payandtransactions.read curlor another HTTP client
Sandbox test values
For the default sandbox path, you do not need to set up Daraja credentials before your first payment. Moflay uses default sandbox test credentials unless you add your own sandbox credentials. Use these values for the first test:| Value | Use |
|---|---|
254712345678 | Default sandbox test phone number |
amount: 1000 | KES 10.00 in minor currency units |
mof_test_... | Sandbox API key |
pending; check the final status by polling during development or by using webhooks in production.
Send your first payment
Start an express payment
Call The API returns
POST /v1/express with either phoneNumber or customerId. For the
first test, use phoneNumber.202 Accepted after Moflay sends the payment request to
M-Pesa.pending to a final state such as completed, failed, or canceled. See Transaction statuses for the full status reference.
Request rules
| Field | Requirement |
|---|---|
phoneNumber or customerId | One is required |
amount | Integer in minor currency units, greater than 0, up to 250000 |
description | Required, up to 13 characters |
accountReference | Optional, up to 12 alphanumeric characters |
Idempotency-Key | Optional, recommended for payment creation retries |
If you use
customerId, do not send extra customer fields such as
customerName or customerDescription in the same request.Production status handling
PollingGET /v1/payments/{id} is useful during development. In production, configure Moflay webhooks so your backend receives signed payment events such as payment.completed, payment.failed, and payment.canceled.
Verify the result
Your HTTP integration is working when:POST /v1/expressreturns202- The response includes a
paymentId GET /v1/payments/{id}returns the same payment in the sandbox environment
Troubleshooting
- Payment creation returns
invalid_access: Add theexpress.paypermission to the key or create a new sandbox key with that permission. - Status polling returns
invalid_access: Add thetransactions.readpermission to the key or create a new sandbox key with that permission. - The payment does not appear in the dashboard: Confirm you are viewing the sandbox environment.