Skip to content

Pesapal API 3.0

Take payments across East Africa, with every behaviour verified against the sandbox API.

Every claim on this site was verified by making the request and recording the response. The captures are published alongside the documentation, so any statement here can be checked against what the API actually returned.

Notification URLs are never checked

Registering one validates its shape and nothing else. A mistyped URL reports itself as active and then silently never delivers a payment notification.

HTTP 200 means nothing

Wrong credentials, an unsupported currency and a declined order all return 200. There are eight distinct response shapes to handle.

A pending payment is an error

Querying an unpaid order returns payment_details_not_found. The same code is used for orders that genuinely do not exist.

Reusing an order id is dangerous

Resubmitting a merchant reference silently returns the original order and discards your new payload, including a changed amount.