One API, two channels
SMS through Africa’s Talking and email over SMTP behind a single key, a single wallet and a single set of logs. Same auth, same response shape, same webhook contract.
Built for developers shipping in Malawi. One key, two channels, a prepaid MWK wallet and delivery webhooks you can trust. Integrate in minutes.
Why InfiSend
The parts that usually take a sprint to build around a provider — retries, refunds, idempotency, delivery state — are the parts we already did.
SMS through Africa’s Talking and email over SMTP behind a single key, a single wallet and a single set of logs. Same auth, same response shape, same webhook contract.
Every account gets a sandbox key the moment it is created — no KYC, no top-up. Sandbox mirrors live: the same status transitions, the same webhook payloads, realistic delays and failures.
Top up in MWK, get charged per message. Credit is reserved when a send is accepted and finalised when the provider confirms — a failed send is refunded automatically, as its own ledger line.
Signed callbacks on every status change, retried five times with backoff. A delivery that never lands is marked failed and shown to you in the dashboard rather than disappearing quietly.
Store a Handlebars template once and send it with variables. Upload a CSV and each recipient becomes its own message row, its own job and its own retry — one bad row does not sink the batch.
Every message, its cost, its provider reference and its full status history — filterable by channel, status and date, and traceable end to end by correlation ID.
Developers
Authenticate with a bearer key, POST a recipient and a body. The API answers 202 Accepted with a message ID as soon as the credit is reserved — it never blocks your request on the provider. Switch the tab to see the same call for the other channel: one path segment changes, and nothing else does.
const response = await fetch('https://infisend-api.infi-tech.cloud/v1/sms/send', {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.INFISEND_API_KEY}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
to: '+265999000000',
message: 'Your verification code is 4829',
idempotencyKey: 'signup-4f2a-otp'
})
});
const { messageId, status } = await response.json();{
"messageId": "msg_01HZX9K3QWERTY",
"status": "QUEUED",
"channel": "SMS",
"to": "+265999000000",
"environment": "SANDBOX",
"estimatedCost": "15.00",
"duplicate": false,
"createdAt": "2026-08-13T09:41:22.104Z"
}Getting started
Email and a password. Your account and its wallet exist immediately.
Available straight away, with the scopes you choose. Build the whole integration against it.
Submit KYC and fund the wallet. Approval plus a minimum balance is what unlocks a live key.
Nothing else changes. The same call that ran in sandbox now sends for real.
Pricing
Pay only for what you send, top up whenever you like. No complex tiers, no subscriptions, no credit that expires.
The exact rate for a send depends on the destination network and is shown before you confirm — and on every line of your wallet history afterwards.
No. Sandbox keys are issued as soon as you sign up and cost nothing to use. KYC approval and a funded wallet are only required for a live key, so the verification wait never blocks integration work.
The reserved credit is returned to your wallet as an explicit refund line, the message ends in FAILED with the provider’s reason attached, and your webhook is called with that final status. You are never charged for a message the provider did not accept.
By channel, destination country and network, resolved from the current pricing table at the moment the send is accepted. A route with no published price is rejected with a clear error rather than being guessed at, so you can never be surprised by a rate.
Neither. You top the wallet up when you want to and are charged per message. There are no tiers, no monthly fee and no expiry on credit you have already bought.
Pass an idempotencyKey on the send. A repeat of the same key returns the original message instead of queuing a second one, which makes retries after a timeout safe.
Create an account, generate a key and send your first message before you have decided whether to pay us anything.
Create your account