Skip to main content
Every step below is the same three moves: prepare an unsigned transaction, sign it with your whitelisted wallet, send it. The examples target Sepolia (aa36a7) on sandbox, so nothing here moves real value.

Before you start

1

Get an API key

Request one. Every call below needs x-api-key.
2

Get your signer registered

Brickken registers the wallet you pass as signerAddress in the factory. Include that address in your API key request. If you did not, or you want to use a different wallet, send it to tech@brickken.com — there is nothing for you to do on-chain, and no separate whitelist call to make.
3

Fund that wallet with native gas

You broadcast the transactions, so the signer pays the gas — Sepolia ETH here.
The wallet that performs the first newTokenization becomes the tokenizer for that token. Only the tokenizer can mint it, whitelist its investors, or distribute its dividends. Transfers and burns can come from any wallet. Your API key is also scoped to the symbols it tokenized — anything else returns Unauthorized token symbol.

The sign-and-send loop

You will repeat this after every prepare, so it is worth writing once. Prepare returns { txId, transactions }:
Signing, with ethers:
Then poll until it confirms:
pending means broadcast but not yet mined. Do not resubmit — you would pay gas twice.
Treat every successful transaction as a dependency boundary. Before preparing newSto, mintToken, or whitelist, poll the preceding newTokenization until it succeeds. A send response only means the transaction was broadcast; a reverted receipt does not create the token record used by later methods.
Already run your own broadcasting? Add "executionMode": "client-broadcast" to any prepare below, submit the signed transaction to the chain yourself, then confirm with { txId, txHash } instead of { txId, signedTransactions }. Brickken reconciles your hash so the transaction still appears in get-transaction-status and in the dApp. See Send Transactions.

1. Create the tokenized asset

The field is name, not tokenName. tokenType accepts EQUITY, DEBT, BILL_FACTORING, ICO, STABLECOIN, REVENUE_SHARE, RWA_TOKEN, or PROFIT_SHARING, and defaults to EQUITY. supplyCap defaults to 0, which means uncapped — set it deliberately. Sign and send, then confirm the token exists. The endpoint lists all symbols available to your API key; use the exact confirmed symbol in every later request.
Every field, with the request and response schema, is on the newTokenization reference.

2. Whitelist your investors

Testing in Sandbox? Pass needKyc: false and skip identity verification entirely. The KYC flow is a Sumsub verification with document upload, not something you need to prove your integration works, and every test investor you create without it is one less manual step in your loop.Rehearse the real KYC flow once before you go live, since needKyc: false is rejected in production with needKyc=false is only available in the sandbox environment.
A security token only moves between whitelisted wallets. Whitelist before you mint or accept investment.
whitelistStatus: false removes an investor. Verify with GET /get-whitelist-status.

3. Mint tokens

needWhitelist: true whitelists the recipient as part of the same mint, which collapses step 2 into step 3 when you are onboarding a new investor.
investorEmail must identify an investor distinct from the asset’s tokenizerEmail. Do not use the issuer/tokenizer email as the mint recipient: it can conflict with the issuer account in the investor records. The recipient may use the same wallet address as the tokenizer for sandbox testing; only the email identities must differ. needWhitelist controls the whitelist sub-step and does not change this identity rule.

4. Launch the offering

Every one of those fields is required. acceptedCoin is a payment token symbol — USDT, USDC, or BKN — and minRaiseUSD is the offering’s soft cap. There is no tokenPrice field: the price is derived as maxRaiseUSD / tokenAmount. tokenAmount, not totalTokensOffered, is the supply on offer, and the payment token field is acceptedCoin, not paymentTokenSymbol — those three wrong names are the most common cause of a rejected newSto.
Send both dates as explicit UTC, with the Z suffix shown above, or as a unix timestamp. A timestamp with no offset is read as UTC by the server, so a local-time value schedules the offering at a different moment than you intended, and every investment in that gap reverts with IssuanceNotStarted.
startDate is checked against the block timestamp when the STO transaction is mined, not when you prepare it. Set it at least 10 minutes after the time you expect to call send-transactions, then sign and broadcast promptly. A date that has elapsed while signing, sending, or waiting for inclusion causes the transaction to revert even when prepare and send succeeded.
Once it is live, list your offerings and keep the uuid:

5. Take an investment

Note there is no signerAddress in the required set — the investor signs this one, not the tokenizer.
newInvest prepares the investment transaction only. Before calling it, the investor must already have a whitelisted wallet, the payment token in that wallet, and an allowance towards this offering’s escrowAddress — prepared separately with approve and confirmed on-chain. Allowances are per spender, so an allowance granted for another offering does not count.
The whitelist and the allowance are enforced by the contract, not by an API precondition check, so a missing one comes back as a revert rather than a readable message. See Troubleshooting.
Track progress with GET /get-investments-by-sto-id and GET /get-sto-balance.

6. Close the offering

An offering can only be closed once its endDate has passed — there is no early close and no override. Closing finalizes the issuance, which is what unlocks claiming.
If the raise reached minRaiseUSD, the offering is successful and investors receive tokens. If it did not, the issuance enters rollback and investors are refunded instead.

7. Let investors claim their tokens

Only after the offering has been finalized. The investor signs this one.
The same call refunds the payment token instead of releasing tokens when the offering rolled back.

8. Distribute dividends

Only the tokenizer can do this. Read the result with GET /get-dividend-distribution.

When something fails

Each write method has its own credit balance, so exhausting mintCredits does not block newSto. See Authentication for plans, scoping, and the full error reference. For decoding raw revert data and the full symptom-to-cause list, see Troubleshooting.

Doing this without writing HTTP

MCP server

The same lifecycle as agent tools — create_tokenization, create_sto, mint_tokens — driven by an AI agent with just your API key.

Postman collection

Every request above, ready to run.