Sandbox and production are separate deployments with separate databases. An API key issued for one does not work on the other.
Sandbox is a separate world
Sandbox and production have separate databases, separate API keys, and separate contract deployments. An asset created in Sandbox does not exist in production, and vice versa. That extends to the web surfaces, which is the single most common source of confusion:
The KYC widget resolves which asset it is verifying for from the host it is served from. On a
generic host that lookup returns nothing and the widget spins forever. Start the KYC flow from the
asset’s own storefront.
Networks
Pass
chainId as decimal or hex. Client tooling normalizes common values.
Sandbox assets in this guide use Ethereum Sepolia (11155111 / aa36a7). Every wallet that signs
a transaction needs Sepolia ETH for gas, from any public Sepolia faucet.
Payment tokens
Sandbox uses its own payment-token registry. A token you obtained from an unrelated public faucet will not match the contract the escrow actually pulls from, which is why generic “Sepolia USDT” never works.Resolve the token from the API
Always let the API tell you which contract an asset takes as payment, rather than hardcoding one. Different assets can be configured with different payment tokens.paymentTokenAddress in the response is the authoritative value for that asset. The newInvest
prepare response also carries paymentTokenAddress and paymentTokenSymbol for the specific
offering.
Registered Sepolia payment tokens
USDT is the default payment token on Sepolia when a request does not specify one, so it is the
path of least resistance for testing.
To fund a test wallet, send the wallet address and the amount you need to
tech@brickken.com.
These are the payment tokens of the Dapp API. The Agentic API settles x402 payments on a separate
rail with its own assets, including Circle’s own testnet USDC, so an address you see quoted for an
x402 payment is not interchangeable with the ones above.
Skip KYC while you build
Do not run the KYC flow for your test investors. Sandbox KYC is a real Sumsub verification with a document upload, and it proves nothing about your integration. Create investors withneedKyc: false and the compliance gate is satisfied from the start — no documents, no waiting, and
a fresh test investor whenever you need one.
needKyc is accepted on create-kyc-link, on each
userToWhitelist entry of the whitelist method, and
on each userToMint entry of mintToken.
- API
- CLI
complianceStatus should read NOT_REQUIRED, and walletAddress should be the address you
passed. An investor with a null walletAddress cannot invest.
Rehearse the real flow once, before production
needKyc: false is a Sandbox affordance. In production the request is rejected with
needKyc=false is only available in the sandbox environment, so every real investor goes through
Sumsub.
That makes one rehearsal worthwhile before you go live — enough to see the verification screens your
investors will meet and to confirm your polling of complianceStatus behaves. A sample document
image is enough to reach a green applicant in the Sandbox tenant; no genuine liveness check is
required.
KYC and whitelisting are independent. KYC is an off-chain, per-investor compliance record keyed
by email. Whitelisting is an on-chain, per-token permission keyed by wallet address. Whitelisting
a wallet does not approve KYC, and passing KYC does not whitelist a wallet — an offering needs
both.
Identities are shared across the environment
A Brickken account is one identity for the whole Sandbox environment, not one per asset:- Login is global.
- KYC is global — one record per email, reused by every asset that investor touches.
- Whitelisting is per asset — each token tracks its own relationship with an investor.
Investor not found.
Troubleshooting
Decode a failed call, from validation errors to raw revert data.
Tokenize an asset and run an STO
The full lifecycle, end to end.