disbursed sandbox payout.
Everything runs against the sandbox environment: provider calls hit mock
implementations, no money moves, and nothing here requires review or approval
from Cleff.
You need an email address, a terminal with curl, and nothing else.
1
Create your account
Sign up at app.usecleff.com/signup. The
two-step wizard creates your user account and your Business (labelled
Organization in the dashboard). Verify the email you receive, then sign in.Sandbox access is granted immediately on email verification. Production stays
locked until your business completes verification; see Go live
when you get there.
2
Complete your business profile
In the dashboard, fill in your company profile under Settings → Company
and submit it. A complete profile provisions your sandbox wallet with
$1,000,000 of test money; until then, payout creation is refused with
SANDBOX_WALLET_UNFUNDED. (The same profile later becomes your verification
dossier for going live, so nothing here is throwaway work.)3
Mint a sandbox API key
In the dashboard, open Settings → API keys and create a key. The plaintext
key is shown exactly once: Cleff stores only a verifier and cannot show it
again. Export it for the rest of this walkthrough:The
ck_sandbox_ prefix is load-bearing: this key only ever sees sandbox data.
Authentication covers the key format and rotation.4
Confirm your sandbox balance
Payouts draw from your Cleff Account. The test money from your submitted
profile lands moments after the submit returns, so confirm it is there:Poll until
available_balance_minor is above zero. Amounts are in minor
units everywhere in the API. If you ever want a different balance, the
sandbox top-up sets it directly;
that endpoint is rejected outside sandbox.5
Create a Beneficiary
A Beneficiary is a person or business you pay. Passing Capture
acknowledged: true
attests that your Business has independently verified their identity, which
moves them straight to compliant, the state payout creation requires. (See
Beneficiaries & compliance for what that attestation
means and for the invite flow where beneficiaries submit their own details.)beneficiary.id from the response:6
Register their bank account
Payouts name an explicit destination account. Because the Beneficiary is
already Capture Identifiers are masked to
compliant, the account comes back verified immediately; a routing
code that passes Cleff’s format checks makes it validated. Both together set
payout_usable: true, the one flag that matters.bank_account.id:last4 in every read; the full account number is
never serialized back.7
Create the payout
pending_approval; nothing moves until a Decision
approves it. The idempotency_key makes this call safe to retry: replaying it
within 24 hours returns the original payout with HTTP 200 instead of creating a
second one.8
Approve it
Every payout passes an approval gate before dispatch. Approve yours (the
Approval enqueues the disbursement; the dispatch itself runs asynchronously.
decision_id is a caller-supplied ULID that makes the decision idempotent):9
Watch it disburse
Poll the payout and watch That is the whole loop: fund → register → create → approve → disburse. In
production the only differences are real providers, real money, and a funded
account you cannot top up by API.
state advance from approved to disbursed as
the sandbox provider confirms the disbursement:Where to go next
Listen instead of polling
Register a webhook endpoint and receive signed payout lifecycle events.
Invite beneficiaries to self-onboard
Send secure collection links so beneficiaries submit their own bank details.
Understand the lifecycle
Every payout state, the headroom check, and what happens on failure or return.
Go live
The path from sandbox to production: verification, pricing, and a production key.