Payouts are live only. Payouts are sent from your Pocket, and Pocket has no test mode — no test keys and no sandbox. Every payout sends real money to a real bank account, so use small amounts to an account you control while you integrate.
Process Flow
Authenticate
Get Bearer Token
Generate Signature
HMAC-SHA256
Initiate Payout
Single or Bulk
Confirm Payout
OTP, Authenticator or PIN
Step 1 — Authenticate
POSTRequest Sample
cURL
Response Sample
Step 2 — Generate X-Seerbit-Signature
Before initiating a payout, generate anX-Seerbit-Signature using the exact raw request body and your SeerBit Private Key. Pass the resulting hash as a header on every payout request.
Note: The signature is unique to each request. Always regenerate it using the exact body of each new request before sending.
Signature Formula
Variables Reference
Step 3 — Initiate Payout
POSTX-Seerbit-Signature headers.
Required Headers
Single Payout
Request Sample
cURL
Response Sample
channel tells you which code to ask the user for when you confirm the payout: EMAIL, TOTP, PIN, REQUIRED_TOTP or REQUIRED_PIN. An email is sent only on EMAIL. See How payout authorization works.
Sending the same reference again while the payout is still PENDING_OTP returns the existing payoutId without creating a second payout or sending a new code.
Request Fields
Bulk Payout
Bulk payouts allow multiple transfer instructions to be processed in a single request. Each transfer is validated and executed under a singlebatchReference.
Request Sample
cURL
Response Sample
batchReference again while the batch is still PENDING_OTP returns the existing payoutId.
Request Fields
Each transfers object contains:
Step 4 — Confirm Payout
POSTchannel field tells you which code to ask the user for — see How payout authorization works:
- Email OTP (
channel: "EMAIL", the default) — sent to the pocket owner’s email and primary signatories when you initiate the payout. It is valid for 5 minutes. - Authenticator code — the 6-digit code from the user’s authenticator app (
channel: "TOTP"or"REQUIRED_TOTP"). No email is sent. - Transaction PIN — the user’s PIN (
channel: "PIN"or"REQUIRED_PIN"). No email is sent. - Recovery code — accepted in place of an authenticator code or PIN.
Required Headers
Request Sample
cURL
Response Sample
QUEUED means the payout has been authorized and handed off for processing; it moves to PROCESSING next.
Request Fields
Bank List
GETRequest Sample
cURL
Account Name Enquiry
POSTRequest Sample
cURL
Request Fields
Note: The field names here are all lowercase (SeerBit also runs a name enquiry on every payout. If you sendbankcode,accountnumber), unlike the camelCasebankCodeandaccountNumberin payout requests.
accountName in the payout request, it must match the enquiry result — so looking the name up first and passing it through avoids a mismatch.
Error Scenarios
The following error responses may occur during payout initiation or confirmation flows.1. Missing Signature Header
Occurs when theX-Seerbit-Signature header is absent from the request.
2. Invalid Signature
Occurs when the provided signature fails HMAC validation.3. Missing Public Key Header
Occurs when thePublic-Key header is not included in the request.
4. Invalid Code
The code is wrong, or the wrong factor for the challenge (for example, a PIN on aTOTP challenge). The payout stays PENDING_OTP — ask the user to re-enter the code and confirm the same payoutId again.
5. Too Many Failed Attempts
Five consecutive wrong codes lock authorization for 15 minutes. A correct code resets the count.6. Expired Email OTP
An email OTP is valid for 5 minutes. After that the payout can’t be confirmed — initiate a new payout.7. Insufficient Balance at Confirmation
If the pocket balance is too low when you confirm, the payout fails permanently. It can’t be confirmed again; fund the pocket and initiate a new payout with a newreference.
8. Authenticator or PIN Required but Not Set Up
On aREQUIRED_TOTP or REQUIRED_PIN pocket, initiating a payout fails with SM_06 until the user has set up that factor.
9. Account Name Mismatch
TheaccountName you sent doesn’t match the bank name enquiry. A single payout fails at initiation; in a bulk payout, only the mismatched transfer fails, when it is processed.