Payout notification
your notification URLBuild with AI 1 package
A build package is every page for one task, with the API operations they use. Copy the prompt into a coding assistant, or hand it the package itself: slim links to each page, full inlines all of them in one document.
- Send a payoutEverything needed to pay money out to a customer's bank account or voucher with the Payouts API, including how to exercise the failure paths before going live.
Sent to the notification URLWebhook A URL of yours that Ozow calls when something happens, rather than you polling to find out. The call carries no credential of yours and arrives at a public URL, so authenticate it before acting on it: a hash field on the Payments API, a Svix signature on One API. once a payoutPayout Money sent from a merchant to a bank account. Unlike a refund, a payout is not tied to a payment anyone made you, so you can pay anyone with a bank account. Payouts draw on your float rather than on your incoming payments, and they are not self-service: they need approval from Ozow and testing in staging first. reaches a final status.
The URL comes from the NotifyUrl field on the payout request, or from the site configuration in the merchant admin site. Without one, no notification is sent.
Verify the hashCheck field before acting on the contents. A notification is an unauthenticated POST to a URL that anyone can call.
The same payout can be notified more than once. Ozow works to avoid duplicates and cannot guarantee their absence, so your handler must be idempotentIdempotency A request is idempotent when sending it twice has the same effect as sending it once. It matters most where a retry after a timeout could otherwise take a payment twice.IETF draft: a repeated notification for a payout you have already processed must not credit or debit anyone a second time.
Authentication
Ozow sends no credential with this call, so this check is the only thing standing between a real delivery and a stranger’s. Verify the hashCheck field before acting on the contents: your notification URL is public, and anyone can post to it.
Payload
application/json
payoutIdstring uuidOzow's unique reference for the payoutPayout Money sent from a merchant to a bank account. Unlike a refund, a payout is not tied to a payment anyone made you, so you can pay anyone with a bank account. Payouts draw on your float rather than on your incoming payments, and they are not self-service: they need approval from Ozow and testing in staging first..
siteCodestring requiredA unique code for the site currently in use. A site codeSite code The unique code for a site registered under a merchant. A site is a place to transact: a website, or a branch of a store. A merchant can have several, and each transaction names the one it belongs to, so sending the wrong code files the payment against the wrong place. is generated when adding a site in the Ozow merchant admin section. [Please contact support for SiteCode - support@ozow.com]
max length50merchantReferencestring requiredThe merchant's reference for the transaction.
max length20customerMerchantReferencestring requiredThe reference that will be prepopulated in the "their reference" field in the customers online banking site. This will be the payoutPayout Money sent from a merchant to a bank account. Unlike a refund, a payout is not tied to a payment anyone made you, so you can pay anyone with a bank account. Payouts draw on your float rather than on your incoming payments, and they are not self-service: they need approval from Ozow and testing in staging first. reference that appears on the merchant’s bank statement and can be used for recon purposes.
max length20pattern^[A-Za-z0-9 -]+PayoutPayout Money sent from a merchant to a bank account. Unlike a refund, a payout is not tied to a payment anyone made you, so you can pay anyone with a bank account. Payouts draw on your float rather than on your incoming payments, and they are not self-service: they need approval from Ozow and testing in staging first. status.
Fields of
PayoutStatusstatusinteger int32 requiredThe payoutPayout Money sent from a merchant to a bank account. Unlike a refund, a payout is not tied to a payment anyone made you, so you can pay anyone with a bank account. Payouts draw on your float rather than on your incoming payments, and they are not self-service: they need approval from Ozow and testing in staging first. status.
1: Payout Received. The payout has been received.
2: Verification. The payout is being verified.
3: Payout Submitted For Processing. The payout is being processed.
4: Payout Processing Error. There was an error with the payout.
5: Payout Completed. The payout has been completed.
6: Payout Pending Investigation. The payout is being investigated.
7: Payout Pending Cancellation. Cancellation has been requested and is not yet settled.
90: Payout Returned. The payout could not be paid into the recipient account.
99: Payout Cancelled. The payout was cancelled.
values12345679099min0subStatusinteger requiredThe payoutPayout Money sent from a merchant to a bank account. Unlike a refund, a payout is not tied to a payment anyone made you, so you can pay anyone with a bank account. Payouts draw on your float rather than on your incoming payments, and they are not self-service: they need approval from Ozow and testing in staging first. sub status. Possible values are:
100: Payout_Unclassified – No sub status.
101: Payout_ValidationFailed – Request validation failed and error description will be in the ErrorMessage field.
201: Verification_Pending – Awaiting webook verification.
202: Verification_Failed – The verification webhookWebhook A URL of yours that Ozow calls when something happens, rather than you polling to find out. The call carries no credential of yours and arrives at a public URL, so authenticate it before acting on it: a hash field on the Payments API, a Svix signature on One API. returned a failed.
203: Verification_Success – Successful payout verification via webhook.
204: Verification_Error – Unable to reach the verification webhook.
205: Verification_AccountNumberDecryptionFailed – Decryption of the account number failed using the key received via webhook.
301: SubmittedForProcessing_PayoutAddedToBatch – The payout has been added to the payout batch.
302: SubmittedForProcessing_PayoutSubmittedToBank – The payout batch has been processed and submitted to the bank.
303: SubmittedForProcessing_PayoutSubmittedToPpi – Payout submitted for processing.
401: PayoutProcessingError_PayoutRejected – The payout has been rejected by the bank.
402: PayoutProcessingError_PayoutCancelled – The payout has been cancelled.
403: PayoutProcessingError_Insufficient_Balance – Insufficient balance.
404: PayoutProcessingError_PayoutInternalError.
405: PayoutProcessingError_InvalidAccountNumber – The payout has an invalid account number.
601: PayoutPendingInvestigation_AmountMismatch – The payout failed due to mismatch in amounts.
9001: PayoutReturned_Unpaid – Rejected by destination bank.
9901: Cancellation_AddedToBatch – Cancellation request added to batch for processing.
9902: Cancellation_SubmittedToBank – Cancellation request has been submitted to the bank.
9903: Cancellation_RejectedByBank – Cancellation request has been rejected by the bank.
9904 - Cancellation_AccountNumberValidationFailed – CDV account number validation failed.
min0errorMessagestringError message generated when validating the request.
max length250
hashCheckstring requiredSHA512SHA-512 A hashing algorithm. Ozow uses it to sign the values in a request or a notification so you can tell that they arrived unaltered and came from us. Hashing is one-way: the hash cannot be turned back into what produced it.Wikipedia hash used to ensure that certain fields in the message have not been altered after the hash was generated. Check the generate hash section in the documentation for more details on how to generate the hash.
Verify the hash
Ozow sends no credential with this call, so hashCheck is the only thing that tells you the notification came from Ozow. Recompute it and compare before you act on anything else in the body.
- Concatenate the fields in the table below, in that order. A field with no value contributes an empty string rather than being skipped.
- Append your API key.
- For a voucher payout, append the voucher pin after your API key.
- Convert the whole string, your API key included, to lowercase.
- Take the SHA512 of it and write the digest as hexadecimal.
- Compare that against
hashCheck, ignoring case.
| Position | Field |
|---|---|
| 1 | payoutId |
| 2 | siteCode |
| 3 | merchantReference |
| 4 | customerMerchantReference |
| 5 | payoutStatus.status |
| 6 | payoutStatus.subStatus |
| 7 | Your API key |
| 8 | voucherPin, for a voucher payout only |
Hash calculator builds this string field by field, so you can compare it against the one your code produces.
Your response
No body.