Exact total before sending
The quote shows amount, fee and total, so your customer knows what the recipient gets.
Connect your remittance, payments or fintech app to MonCash with a simple REST API: quote, send and track every transfer until the money reaches the recipient’s wallet.
MonCash is the most widely used mobile wallet in Haiti: millions of people receive and keep money on their phone with it. The LevaPay MonCash API lets your platform send gourdes (HTG) to any MonCash wallet using only the recipient’s Haitian phone number.
Instead of building and maintaining a separate connection to each network, your system talks to a single REST API. You quote the transfer, see the exact total that will be debited from your prepaid balance, confirm it and check its status. LevaPay delivers the money to the wallet.
It is built for companies that send money to Haiti: remittance apps operating from the Dominican Republic, the United States or elsewhere, digital wallets, P2P payment platforms and businesses that pay Haitian contractors or suppliers.
MonCash is a trademark of Digicel Haiti and NatCash is a trademark of Natcom. LevaPay is an independent service. The LevaPay API is for sending money (payouts) to MonCash wallets. It is not Digicel’s merchant API for accepting payments in an online store.
Sign up for free and generate an API user and a test PRIVATE_KEY in the dashboard. The sandbox never moves real money.
FreeCall POST /transfers/quote with network "moncash", the phone number and the amount in HTG. You get the fee, the total and a quote_id valid for about 120 seconds.
POST /transfers/quoteSend the quote_id to POST /transfers with a unique idempotency_key. If your system retries, you are never charged twice.
POST /transfersMonCash may return pending while the deposit is confirmed. Call GET /transfers/{id} until the status is completed or failed.
GET /transfers/{id}Quote, send and check the status with the MonCash API in TEST mode. To move real money, replace /test/v1 with /prod/v1 and use your PROD keys.
# 1) Quote
curl -X POST https://api.levapay.dev/test/v1/transfers/quote \
-H "Content-Type: application/json" \
-H "X-Api-User: your_api_user" \
-H "X-Api-Key: your_PRIVATE_KEY" \
-d '{"network":"moncash","wallet":"50937123456","amount_htg":5000}'
# 2) Send
curl -X POST https://api.levapay.dev/test/v1/transfers \
-H "Content-Type: application/json" \
-H "X-Api-User: your_api_user" \
-H "X-Api-Key: your_PRIVATE_KEY" \
-d '{"quote_id":"qt_...","idempotency_key":"order-10025"}'
# 3) Check the status (pending → completed)
curl https://api.levapay.dev/test/v1/transfers/tr_... \
-H "X-Api-User: your_api_user" \
-H "X-Api-Key: your_PRIVATE_KEY"
<?php
const BASE = 'https://api.levapay.dev/test/v1';
function levapay(string $method, string $path, ?array $body = null): array {
$ch = curl_init(BASE . $path);
$opts = [
CURLOPT_CUSTOMREQUEST => $method,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
'X-Api-User: your_api_user',
'X-Api-Key: your_PRIVATE_KEY',
],
];
if ($body !== null) {
$opts[CURLOPT_POSTFIELDS] = json_encode($body);
}
curl_setopt_array($ch, $opts);
return json_decode((string) curl_exec($ch), true);
}
$quote = levapay('POST', '/transfers/quote', [
'network' => 'moncash', 'wallet' => '50937123456', 'amount_htg' => 5000,
])['data'];
$transfer = levapay('POST', '/transfers', [
'quote_id' => $quote['quote_id'],
'idempotency_key' => 'order-10025',
])['data'];
// MonCash may return pending: poll until the final status
for ($i = 0; $i < 12 && $transfer['status'] === 'pending'; $i++) {
sleep(5);
$transfer = levapay('GET', '/transfers/' . $transfer['id'])['data'];
}
echo $transfer['status'];
const base = 'https://api.levapay.dev/test/v1';
const headers = {
'Content-Type': 'application/json',
'X-Api-User': 'your_api_user',
'X-Api-Key': process.env.LEVAPAY_KEY,
};
const api = (method, path, body) =>
fetch(base + path, { method, headers, body: body && JSON.stringify(body) })
.then((r) => r.json());
const { data: quote } = await api('POST', '/transfers/quote', {
network: 'moncash', wallet: '50937123456', amount_htg: 5000,
});
let { data: transfer } = await api('POST', '/transfers', {
quote_id: quote.quote_id,
idempotency_key: 'order-10025',
});
// MonCash may return pending: poll until the final status
for (let i = 0; i < 12 && transfer.status === 'pending'; i++) {
await new Promise((r) => setTimeout(r, 5000));
({ data: transfer } = await api('GET', `/transfers/${transfer.id}`));
}
console.log(transfer.status);
Use the Haitian phone number linked to MonCash: 8 digits, with or without the 509 prefix (for example 37123456 or 50937123456). Amounts are in gourdes, whole numbers, starting at 1 HTG.
A MonCash transfer may stay pending for a moment while the deposit is confirmed. Your integration should check the status and show the final result to your customer. If the transfer fails, the amount goes back to your balance.
Looking up the account holder name before sending is available for NatCash, not for MonCash. Ask the sender to confirm the number in your app before calling the API.
In the sandbox, MonCash transfers stay pending and the amount is reserved from your TEST balance, so you can test how your system handles a transfer that has not finished yet.
The note field (up to 64 characters) sets the text the recipient sees on the deposit, such as your app name or an order number.
The quote shows amount, fee and total, so your customer knows what the recipient gets.
The required idempotency_key makes a retry return the same transfer instead of creating a new one.
Your prepaid balance is charged only when the transfer is accepted.
The same code works for both networks: only the network value changes.
TEST keys to build and test without moving real money.
Balance, transfer history, funding and API keys in one place.
You pay 3.5% of each transfer, with no setup fee, no monthly fee and no funding fees. Fund your prepaid HTG balance by Banreservas bank transfer, USDT or Binance Pay. For example, for the recipient to get 5,000 HTG on MonCash:
No. LevaPay is an independent service that lets businesses send money to MonCash wallets through its own API. MonCash is a trademark of Digicel Haiti.
No. The LevaPay API sends money to MonCash wallets (payouts). Accepting payments from customers in an online store is a merchant checkout product, which is different.
It is usually credited quickly, although it may stay pending for a moment. Call GET /transfers/{id} until the status is completed.
If the transfer is not accepted, your balance is not debited. If it fails after being accepted, the status changes to failed and the amount is returned to your balance.
Request production access from the dashboard and complete the verification: representative details, an ID document and a selfie. TEST mode is available right after sign-up.
Any language that can make HTTPS requests: PHP, Node.js, Python, Java, Go or C#. The docs include examples in cURL, PHP and Node.js.
Yes. With the same integration you send to NatCash by setting network to "natcash", and you can also look up the account holder before sending.
Create a free account, test the MonCash API in TEST mode and go live when you are ready.