curl --request POST \
--url https://api.sandbox.brickken.com/prepare-transactions \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"method": "claimTokens",
"chainId": "aa36a7",
"investorAddress": "0x1111111111111111111111111111111111111111",
"investorEmail": "investor@example.com",
"tokenSymbol": "EXMPL"
}
'import requests
url = "https://api.sandbox.brickken.com/prepare-transactions"
payload = {
"method": "claimTokens",
"chainId": "aa36a7",
"investorAddress": "0x1111111111111111111111111111111111111111",
"investorEmail": "investor@example.com",
"tokenSymbol": "EXMPL"
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
method: 'claimTokens',
chainId: 'aa36a7',
investorAddress: '0x1111111111111111111111111111111111111111',
investorEmail: 'investor@example.com',
tokenSymbol: 'EXMPL'
})
};
fetch('https://api.sandbox.brickken.com/prepare-transactions', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.sandbox.brickken.com/prepare-transactions",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'method' => 'claimTokens',
'chainId' => 'aa36a7',
'investorAddress' => '0x1111111111111111111111111111111111111111',
'investorEmail' => 'investor@example.com',
'tokenSymbol' => 'EXMPL'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.sandbox.brickken.com/prepare-transactions"
payload := strings.NewReader("{\n \"method\": \"claimTokens\",\n \"chainId\": \"aa36a7\",\n \"investorAddress\": \"0x1111111111111111111111111111111111111111\",\n \"investorEmail\": \"investor@example.com\",\n \"tokenSymbol\": \"EXMPL\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.sandbox.brickken.com/prepare-transactions")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"method\": \"claimTokens\",\n \"chainId\": \"aa36a7\",\n \"investorAddress\": \"0x1111111111111111111111111111111111111111\",\n \"investorEmail\": \"investor@example.com\",\n \"tokenSymbol\": \"EXMPL\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sandbox.brickken.com/prepare-transactions")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"method\": \"claimTokens\",\n \"chainId\": \"aa36a7\",\n \"investorAddress\": \"0x1111111111111111111111111111111111111111\",\n \"investorEmail\": \"investor@example.com\",\n \"tokenSymbol\": \"EXMPL\"\n}"
response = http.request(request)
puts response.read_body{
"transactions": [
{
"from": "0x1234567890abcdef1234567890abcdef12345678",
"to": "0xabcdef1234567890abcdef1234567890abcdef12",
"value": "0x00",
"nonce": 3792,
"chainId": 11155111,
"data": "0xd362e8a70000000000000000000000000000000000000000000000000000000000000040...",
"type": 2,
"maxPriorityFeePerGas": "1150000",
"maxFeePerGas": "1156037",
"gasLimit": "0xccef"
}
],
"txId": "0x46adea7bdf49c576a760102e0d6bc9ecd650b3998588cd3d7f576a7973426aad",
"info": {
"tokenizerEmail": "tokenizer@example.com",
"tokenSymbol": "EXMPL",
"investorEmail": "investor@example.com"
}
}claimTokens
Collect tokens from a successful offering, or a refund from a rolled-back one.
curl --request POST \
--url https://api.sandbox.brickken.com/prepare-transactions \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"method": "claimTokens",
"chainId": "aa36a7",
"investorAddress": "0x1111111111111111111111111111111111111111",
"investorEmail": "investor@example.com",
"tokenSymbol": "EXMPL"
}
'import requests
url = "https://api.sandbox.brickken.com/prepare-transactions"
payload = {
"method": "claimTokens",
"chainId": "aa36a7",
"investorAddress": "0x1111111111111111111111111111111111111111",
"investorEmail": "investor@example.com",
"tokenSymbol": "EXMPL"
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
method: 'claimTokens',
chainId: 'aa36a7',
investorAddress: '0x1111111111111111111111111111111111111111',
investorEmail: 'investor@example.com',
tokenSymbol: 'EXMPL'
})
};
fetch('https://api.sandbox.brickken.com/prepare-transactions', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.sandbox.brickken.com/prepare-transactions",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'method' => 'claimTokens',
'chainId' => 'aa36a7',
'investorAddress' => '0x1111111111111111111111111111111111111111',
'investorEmail' => 'investor@example.com',
'tokenSymbol' => 'EXMPL'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.sandbox.brickken.com/prepare-transactions"
payload := strings.NewReader("{\n \"method\": \"claimTokens\",\n \"chainId\": \"aa36a7\",\n \"investorAddress\": \"0x1111111111111111111111111111111111111111\",\n \"investorEmail\": \"investor@example.com\",\n \"tokenSymbol\": \"EXMPL\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.sandbox.brickken.com/prepare-transactions")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"method\": \"claimTokens\",\n \"chainId\": \"aa36a7\",\n \"investorAddress\": \"0x1111111111111111111111111111111111111111\",\n \"investorEmail\": \"investor@example.com\",\n \"tokenSymbol\": \"EXMPL\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sandbox.brickken.com/prepare-transactions")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"method\": \"claimTokens\",\n \"chainId\": \"aa36a7\",\n \"investorAddress\": \"0x1111111111111111111111111111111111111111\",\n \"investorEmail\": \"investor@example.com\",\n \"tokenSymbol\": \"EXMPL\"\n}"
response = http.request(request)
puts response.read_body{
"transactions": [
{
"from": "0x1234567890abcdef1234567890abcdef12345678",
"to": "0xabcdef1234567890abcdef1234567890abcdef12",
"value": "0x00",
"nonce": 3792,
"chainId": 11155111,
"data": "0xd362e8a70000000000000000000000000000000000000000000000000000000000000040...",
"type": 2,
"maxPriorityFeePerGas": "1150000",
"maxFeePerGas": "1156037",
"gasLimit": "0xccef"
}
],
"txId": "0x46adea7bdf49c576a760102e0d6bc9ecd650b3998588cd3d7f576a7973426aad",
"info": {
"tokenizerEmail": "tokenizer@example.com",
"tokenSymbol": "EXMPL",
"investorEmail": "investor@example.com"
}
}POST /prepare-transactions with method=claimTokens.
The prepared transaction is signed and sent by the investor.
The offering must be finalized first
claimTokens reverts with 0x04c7a3b1 IssuanceNotInRollback(uint256) while the issuance has not
been finalized. The argument is the issuance index, not an address.Run closeOffer first — and closeOffer itself only
works once the offering’s endDate has passed.What you get back
The same call does one of two things, decided at finalization:- Successful offering — the purchased tokens are released to the investor.
- Rolled-back offering — the payment token is refunded instead, because the soft cap was not reached.
Testing a successful claim end to end
Because there is no minimum offering duration, a short offering is the reliable way to exercise the full lifecycle:Create a short offering with a reachable soft cap
minRaiseUSD low enough that your test investment alone can meet it, and set endDate a few
minutes out. Remember the Z suffix on both dates.Whitelist, approve and invest
Wait for the end date
Close the offer
closeOffer and wait for it to confirm.Claim
claimTokens now releases the tokens.Notes
- The investor must have participated in the offering.
- Each investor can only claim once.
Next step
Preparing does not touch the chain. The response gives youtxId and an array of unsigned transactions — you still have to sign and submit them.
Sign every returned transaction
signerAddress, or investorAddress for newInvest and claimTokens. It must be whitelisted by Brickken, and it needs native gas on the target chain.Submit the signed payloads
POST them to /send-transactions as { txId, signedTransactions } and Brickken broadcasts for you.If you would rather broadcast yourself, prepare with executionMode: "client-broadcast" and confirm afterwards with { txId, txHash } instead.Poll until it confirms
GET /get-transaction-status with the txId. A pending status means it is broadcast but not yet mined — do not resubmit.Authorizations
Body
Required. Operation to prepare. Must be claimTokens for this endpoint.
claimTokens "claimTokens"
Required. Blockchain network identifier. Hex format is recommended, for example Sepolia aa36a7.
"aa36a7"
Required. Investor wallet address that claims the tokens.
^0x[a-fA-F0-9]{40}$"0x1111111111111111111111111111111111111111"
Required. Email of the investor. The investor must already exist in Brickken.
"investor@example.com"
Required. Symbol of the token to claim. Its offering must have completed successfully.
"EXMPL"
Optional and ignored for this method. The prepared transaction is always signed and sent by investorAddress.
"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"
Response
Successful response
Array of unsigned transaction objects ready for signing
Show child attributes
Show child attributes
Unique identifier for this transaction batch (required for /send-transactions). This is NOT a blockchain transaction hash.
"0x46adea7bdf49c576a760102e0d6bc9ecd650b3998588cd3d7f576a7973426aad"
Metadata about the operation
Show child attributes
Show child attributes