Skip to main content
POST
Adds an IP address to the list allowed to REQUEST withdrawals. It does not affect signing in — the IP whitelist gates egress only.
Adding your first IP turns egress into an allowlist. While your IP list is empty nothing is restricted. From the moment it holds one entry, POST /withdrawals, POST /mass-payouts and POST /admin/withdrawals accept requests only from a listed address; anything else is refused with 403 IP_NOT_WHITELISTED. Add the address you actually call from before you rely on it, and add every one you use — an office and a CI runner are two entries, not one.The check runs before the MFA factor is verified, so a blocked attempt does not consume your emailed code: whitelist the address and retry with the same one, for the rest of its 15 minutes.
You can always add an IP from an unlisted address. The whitelist-management endpoints are deliberately not IP-gated — otherwise a changed ISP address would lock you out permanently, with no way to add the one you are calling from. The trade-off is explicit: the IP list is defence in depth and an alarm, not an unbypassable boundary. Someone holding both your session and a working second factor could add their own address — but not quietly. Every IP added, and every blocked attempt, emails the account owner with their anti-phishing code and is written to the audit log.
Cookie-authenticated writes also need an Origin header. Any non-GET request that carries the liddie_access session cookie is checked against the allowed dashboard origins; a bare cURL that sends only the cookie is rejected with 403 {"ok":false,"error":{"code":"CSRF_ORIGIN_MISMATCH","message":"Forbidden"}} before the handler runs. The snippet below is shown for shape — from a browser the dashboard sends the origin for you; from a script, prefer an API key where the endpoint accepts one.

Authorization

Dashboard-only (JWT session). Roles: merchant_admin / merchant_member / super_admin, with team permission whitelist:manage. The body must additionally carry a fresh MFA factor (passkey / TOTP / emailed code); request an email code via Send whitelist email code. Rate limit: 10/min. Calling with an API key fails with 401 {"error":"Invalid or expired token"} — the key is not a JWT.

Parameters

string
required
The IP address to whitelist, e.g. 203.0.113.10. 3–64 characters.
string
A human-readable name for the entry, e.g. "Office". Max 64 characters.
string
The single-use emailed code.
string
A 6-digit code from your authenticator app — an alternative to emailCode. Backup codes are not accepted here: the field is validated against ^[0-9]{6}$ and backup codes are 16 hexadecimal characters. They work only at login (POST /2fa/validate). If you have lost your authenticator, request an emailed code instead.
object
WebAuthn assertion, used together with challengeKey.
string
Accompanies passkeyResponse.
Request a fresh single-use code via Send whitelist email code right before this call, then include it in the body as the email-code verification factor — alternatively, an OTP or passkey assertion satisfies the MFA requirement.

Response

201 Created. The body echoes only the new entry’s id — nothing else about the entry is returned.
201 Created
boolean
true on success.
string
The whitelist entry id. Pass it to Remove whitelist entry to undo this.

Errors

Every WHITELIST_ADD_FAILED fires AFTER the MFA factor is verified, so an emailed code is already spent when you see one. Request a fresh code before retrying.

See also