Start in the sandbox. Everything below works with a jw_test_ key and no commercial agreement.
Every request carries a bearer token. Keys are environment-scoped: a jw_test_ key will be rejected by api.whitmoresecurities.com and vice versa.
curl https://api.whitmoresecurities.com/v1/accounts \ -H "Authorization: Bearer $JW_API_KEY"
Payouts are asynchronous. Create one, then either poll the payout or — better — subscribe to payout.settled and payout.returned. Always send an Idempotency-Key; retries within 24 hours return the original payout rather than creating a second payment.
| Status | Meaning |
|---|---|
| pending_approval | Above the dual-authorisation threshold; awaiting a second approver. |
| submitted | Handed to the scheme. No longer cancellable. |
| settled | Funds confirmed at the beneficiary bank. |
| returned | Rejected downstream; funds credited back with a reason code. |
A sweep rule moves everything above target_floor from a source account into a destination on a cron schedule, converting at booked FX if the currencies differ. Sweeps run after the last scheme cut-off for the source currency, so an intraday balance never triggers one unexpectedly.
Lock a quote, then reference the quote id on the transfer or payout within 60 seconds. If the quote expires you get fx_quote_expired and nothing moves. Spread is always broken out wirerately on the ledger entry.
We sign every delivery with HMAC-SHA256 over timestamp . "." . body and send it in X-Signature. Reject anything older than five minutes. We retry with exponential backoff for 24 hours.