Skip to main content
Every payout must be authorized with a second factor before SeerBit processes it — this is the code you send when you confirm a payout. By default that code is a one-time password sent by email. Pocket owners can replace email with a code from an authenticator app or a static transaction PIN, which removes email delivery delays from every payout.
Live only. Like the rest of Pocket, two-factor authentication has no test mode. Enrolment, PINs and recovery codes all apply to your live account.
All endpoints on this page use the bearer token from Pocket authentication and your public key, and always act on the account that token belongs to:

How payout authorization works

When you initiate a payout, the response tells you which code to ask the user for in channel:
Show the prompt that matches channel, then send what the user enters as code when you confirm the payout. Factors are isolated. On a TOTP challenge, only an authenticator code or a recovery code is accepted; on a PIN challenge, only the PIN or a recovery code. Sending a PIN to a TOTP challenge fails, and the failure counts towards the lockout. The channel follows the pocket’s security settings and the owner’s setup: an enrolled authenticator takes precedence, then a transaction PIN, then email. SeerBit can also configure a pocket to require a factor — the REQUIRED_TOTP and REQUIRED_PIN channels. These never fall back to email: if the user hasn’t set up the required factor, initiating a payout fails with MFA required. Please enroll in <factor> first. Your authenticator enrolment, PIN and recovery codes belong to your login, not to a single pocket — they work across every pocket you can access.

Set up an authenticator app

Any standard authenticator app works — Google Authenticator, Microsoft Authenticator or 1Password, for example.
1

Start enrolment

POST
cURL
Response
Show the QR code for the user to scan, or let them type secretBase32 into their app. qrBase64 is raw PNG data without a data-URI prefix, so add one to display it:
Complete the next step before expiresAt. Treat the secret like a password — anyone who has it can generate valid codes — and don’t log or store it.
2

Confirm enrolment

POST
Send the 6-digit code the app is currently showing. The authenticator isn’t active until this call succeeds.
cURL
Response
3

Save the recovery codes

The confirmation response contains 10 recovery codes. Show them to the user once and ask them to store them somewhere safe — they are the only way to authorize a payout if the authenticator device is lost.
From now on, payouts return channel: "TOTP".

Check authenticator status

GET
Response

Disable the authenticator

POST
Send a current authenticator code or a recovery code. If the user has a transaction PIN, it stays active and payouts switch to channel: "PIN"; otherwise they fall back to email.
cURL
Response
Disabling deletes the authenticator secret. Enrolling again creates a new one, and the old entry in the app stops working.

Set up a transaction PIN

A transaction PIN is a static secret of 4 to 12 alphanumeric characters that the user chooses. It is valid for 30 days, after which it must be rotated. POST

Set the first PIN

Setting a PIN requires a code that proves who the user is, and a user with no PIN yet has nothing to prove it with. So the first PIN is set through a temporary authenticator enrolment:
1

Enrol an authenticator

Start and confirm enrolment, and save the recovery codes.
2

Set the PIN with an authenticator code

cURL
Response
3

Disable the authenticator (PIN-only users)

While the authenticator is enabled it takes precedence, so payouts keep asking for an authenticator code. To use the PIN instead, disable the authenticator. The PIN stays active, and every payout from then on asks for it.

Rotate the PIN

Rotate before the 30 days are up. Send the current PIN as code — no authenticator code is needed:
cURL
Once a PIN is older than 30 days, it is rejected until it is rotated.

Check PIN status

GET
Response
pinActive is true only when a PIN exists and is less than 30 days old. Check it before a payout run so you can prompt for rotation instead of failing mid-batch.

Recovery codes

Recovery codes stand in for an authenticator code or PIN when the user can’t produce one — for example, after losing their phone. There are 10, each is 8 characters, and each works once. They are accepted on both TOTP and PIN challenges.

Generate new recovery codes

POST
Requires a current authenticator code — a recovery code is not accepted here. Each call replaces all existing recovery codes, and the new ones are returned only in this response.
cURL

Lockout and clock drift

  • Five wrong codes lock the account for 15 minutes. Five consecutive incorrect codes lock the user’s authentication, and every confirmation attempt during the lockout fails with Account locked due to too many failed attempts. Try again later. A correct code resets the count to zero. A wrong code doesn’t cancel the payout — it stays PENDING_OTP, so the user can try again. Don’t retry codes automatically — stop and ask the user.
  • Authenticator codes depend on the device clock. Codes change every 30 seconds, and SeerBit allows one step of drift either way. If a user’s codes are repeatedly rejected, have them turn on automatic date and time on their phone.

Errors

Confirmation failures come back with the payout’s status and a message — check both, not just the HTTP status code.