curl --request POST \
--url https://eu.solana.bloombot.app/api/v1/deploy \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"wallet_address": "7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU",
"metadata": {
"name": "My Token",
"symbol": "MTK",
"description": "A community token launched via Bloom.",
"image_url": "https://example.com/token-logo.png",
"twitter": "https://x.com/mytoken",
"website": "https://mytoken.xyz"
},
"configs": [
{
"dex": "pump_fun",
"data": {
"is_mayhem_mode": false,
"is_cashback_enabled": false
}
}
],
"creator_buy_sol_amount": 100000000,
"buys": [
{
"wallet_address": "9mZWxyz1234567890abcdef",
"sol_amount": 50000000,
"priority_fee_sol": 0.001
}
],
"bundle_mode": "packed",
"jito_tip": 5000000,
"slippage_bps": 500
}
'{
"success": true,
"data": {
"mint_addresses": [
"<string>"
],
"landed_txs": [
{
"kind": "<string>",
"dex": "<string>",
"mint": "<string>",
"signature": "<string>",
"landed": true,
"reverted": true
}
]
}
}{
"success": false,
"error": {
"code": "<string>",
"message": "<string>",
"details": "<string>"
}
}{
"success": false,
"error": {
"code": "<string>",
"message": "<string>",
"details": "<string>"
}
}{
"success": false,
"error": {
"code": "<string>",
"message": "<string>",
"details": "<string>"
}
}{
"success": false,
"error": {
"code": "<string>",
"message": "<string>",
"details": "<string>"
}
}Deploy a token
Launch a token on a supported launchpad, on Solana or an EVM chain.
curl --request POST \
--url https://eu.solana.bloombot.app/api/v1/deploy \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"wallet_address": "7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU",
"metadata": {
"name": "My Token",
"symbol": "MTK",
"description": "A community token launched via Bloom.",
"image_url": "https://example.com/token-logo.png",
"twitter": "https://x.com/mytoken",
"website": "https://mytoken.xyz"
},
"configs": [
{
"dex": "pump_fun",
"data": {
"is_mayhem_mode": false,
"is_cashback_enabled": false
}
}
],
"creator_buy_sol_amount": 100000000,
"buys": [
{
"wallet_address": "9mZWxyz1234567890abcdef",
"sol_amount": 50000000,
"priority_fee_sol": 0.001
}
],
"bundle_mode": "packed",
"jito_tip": 5000000,
"slippage_bps": 500
}
'{
"success": true,
"data": {
"mint_addresses": [
"<string>"
],
"landed_txs": [
{
"kind": "<string>",
"dex": "<string>",
"mint": "<string>",
"signature": "<string>",
"landed": true,
"reverted": true
}
]
}
}{
"success": false,
"error": {
"code": "<string>",
"message": "<string>",
"details": "<string>"
}
}{
"success": false,
"error": {
"code": "<string>",
"message": "<string>",
"details": "<string>"
}
}{
"success": false,
"error": {
"code": "<string>",
"message": "<string>",
"details": "<string>"
}
}{
"success": false,
"error": {
"code": "<string>",
"message": "<string>",
"details": "<string>"
}
}Choosing a host
Pick the host from the chain you are launching on, and use that host’s key — keys are not interchangeable.| Solana | EVM | |
|---|---|---|
| Host | https://eu.solana.bloombot.apphttps://us.solana.bloombot.app | https://evm.bloombot.app |
| Key prefix | blm_sol_live_… | blm_evm_live_… |
| Chains | Solana | rbh, bsc, arc, ink |
chain field | not used | optional, defaults to rbh |
| Creator wallet | base58 address | 0x + 40 hex |
ink deploys but does not swap; eth and base swap but do not
deploy. Don’t reuse a swap’s chain value without checking it here first.chain defaults to rbh, an EVM deploy that omits it launches on
Robinhood. Set it explicitly for every other chain.
Amounts
This is the most common source of broken deploy requests.| Solana | EVM | |
|---|---|---|
| Creator buy | creator_buy_sol_amount, integer lamports | creator_buy_wei, integer string in wei |
| Bundled buy | buys[].sol_amount, integer lamports | buys[].amount_wei, integer string in wei |
| Priority fee | creator_priority_fee_sol / buys[].priority_fee_sol, decimal SOL | — |
| Bundle tip | jito_tip, integer lamports | — |
// Solana — a 0.1 SOL creator buy
{ "creator_buy_sol_amount": 100000000 }
// EVM — a 0.01 ETH creator buy
{ "creator_buy_wei": "10000000000000000" }
INVALID_REQUEST naming the field and
the expected type. Solana amounts are the opposite: plain integers, except the
priority fees, which are decimal SOL.Fields the EVM host rejects
These are Solana-only. The EVM host rejects them withINVALID_REQUEST
(<field> is not supported on EVM) rather than ignoring them, so strip them
when porting a body across:
creator_buy_sol_amountjito_tipmint_private_keycreator_priority_fee_solbuys[].sol_amountandbuys[].priority_fee_sol
bundle_mode: "sniper" is Solana-only too, but fails with
INVALID_BUNDLE_MODE instead.
Launchpads by chain
configs takes at least one entry, and at most one per dex — a repeat fails
with DUPLICATE_DEX. On EVM, dex is matched case-insensitively and must be
allowed on the chain you selected; anything else fails with
INVALID_DEX_CONFIG, and the message lists the ones that are.
| Host | chain | Allowed dex values |
|---|---|---|
| Solana | — | pump_fun, bags, bonk |
| EVM | rbh (default) | flap, bags, ponsv2, launchproof |
| EVM | bsc | flap, fourmeme |
| EVM | arc | warp, sharc, tolly, radardex, o1, arguspad, foci |
| EVM | ink | tsunami, inkypump |
bags exists on both hosts with different data shapes. Solana takes
fee_claimers, a list of objects each carrying its own bps. EVM takes two
parallel arrays, claimers and percent. Neither shape works on the other
host.trench is not available on the public API and is rejected with
INVALID_REQUEST.
Launchpad data rules
Each entry in configs is dex plus a data object holding that launchpad’s
own settings. data must be an object; on EVM, omitting it is treated as an
empty object.
Throughout these tables:
- wei — an integer string, up to 78 digits.
- addr —
0xfollowed by 40 hex characters. - hash32 —
0xfollowed by 64 hex characters. - bps — basis points, where 10000 = 100%.
- Fields are optional unless marked required.
400 INVALID_DEX_CONFIG with a message naming the index
of the offending entry.
EVM
flap — Robinhood, BNB Chain
flap — Robinhood, BNB Chain
| Field | Rule |
|---|---|
buy_tax_bps | required, 1–10000 |
sell_tax_bps | required, 1–10000 |
quote_token | addr |
mkt_bps, deflation_bps, dividend_bps, lp_bps | 0–10000 |
anti_farmer_s | integer ≥ 0 |
minimum_share_balance | wei |
bags — Robinhood
bags — Robinhood
| Field | Rule |
|---|---|
creation_fee_wei | wei |
claimers | array of addr |
percent | array of numbers, at most 2 decimal places |
claimers and percent must be the
same length, and percent must total exactly 100 (10000 bps). Send both
or neither. An invalid split fails with BAGS_FEE_CLAIMER_BPS_INVALID.ponsv2 — Robinhood
ponsv2 — Robinhood
| Field | Rule |
|---|---|
pair_token | addr |
creator_tax_bps | 0–1000 |
launchproof — Robinhood
launchproof — Robinhood
data is passed through as sent. The API applies no rules of its own, so
any error surfaces at launch time rather than on validation.fourmeme — BNB Chain
fourmeme — BNB Chain
| Field | Rule |
|---|---|
pre_sale_wei | wei — defaults to creator_buy_wei |
quote_token | addr |
label | one of Meme, AI, Defi, Games, Infra, De-Sci, Social, Depin, Charity, Others |
token_tax | object, see below |
token_tax is optional, but sending it brings its own rules:| Field | Rule |
|---|---|
fee_rate | required, 1–10 |
fee_rate_sell | 1–10 |
min_sharing | required, ≥ 0 |
burn_rate, divide_rate, liquidity_rate | required, 0–100 |
recipient_rate, giggle_charity_rate, binance_charity_rate | 0–100 |
recipient_address | required when recipient_rate > 0 |
burn_rate, divide_rate, liquidity_rate,
recipient_rate, giggle_charity_rate and binance_charity_rate — must
total exactly 100.warp — Arc
warp — Arc
| Field | Rule |
|---|---|
min_tokens_out | wei |
destination | 0 (WarpDex V2) or 1 (Uniswap V4) |
tax | object, see below |
tax is optional, but sending it brings its own rules:| Field | Rule |
|---|---|
buy_tax_bps, sell_tax_bps | 0–10000 |
creator_bps, burn_bps, dividend_bps, liquidity_bps | required, 0–10000, totalling exactly 10000 |
min_dividend_balance | wei |
anti_farmer_days | 0–3650 |
tax_recipient | addr |
arguspad uses, and all four
must be present even when one is zero.sharc — Arc
sharc — Arc
| Field | Rule |
|---|---|
creation_fee, usdc_in, min_tokens_out | wei |
deadline_secs | 1–86400 |
tolly — Arc
tolly — Arc
| Field | Rule |
|---|---|
dev_buy_usdc | wei |
radardex — Arc
radardex — Arc
| Field | Rule |
|---|---|
variant | v2 or reflection |
initial_buy | wei |
foci — Arc
foci — Arc
| Field | Rule |
|---|---|
creator_tax_bps | 0–1000 |
creator_fee_recipient | addr |
dev_buy_usdc, min_tokens_out | wei |
o1 — Arc
o1 — Arc
| Field | Rule |
|---|---|
config_version | required, integer ≥ 0 |
quote | addr |
token_bytecode_hash, salt | hash32 |
native_launch_fee, min_amount_out | wei |
deadline_secs | 1–300 |
arguspad — Arc
arguspad — Arc
| Field | Rule |
|---|---|
start_fdv, bond_fdv | required, wei — bond_fdv must be greater than start_fdv |
token_salt, hook_salt | required, hash32 |
total_supply, dev_buy_amount | wei |
portal, quote_asset | addr |
buy_tax_bps, sell_tax_bps | 0–1000 |
creator_bps, burn_bps, dividend_bps, liquidity_bps | required, totalling exactly 10000 |
data, not nested.tsunami — Ink
tsunami — Ink
| Field | Rule |
|---|---|
target_raise | wei, at most 10 ETH |
min_amount_out, launch_fee_wei | wei |
fee_share | array of objects, each with destination (addr, required) and share_bps (1–10000, required) |
inkypump — Ink
inkypump — Ink
| Field | Rule |
|---|---|
target_raise | wei, 1–5 ETH when set |
creator_fee_split_bps | 0–10000 |
gain_bps | 0–200000 |
start_time | integer ≥ 0 |
INVALID_DEX_CONFIG.arc with real
value, test creator_buy_wei, buys[].amount_wei and the *_usdc config
fields with a small amount and check what actually lands.Solana
pump_fun
pump_fun
| Field | Rule |
|---|---|
is_mayhem_mode | required, boolean |
is_cashback_enabled | required, boolean |
quote_mint | "sol" or "usdc" |
fee_share_recipients | array of objects with address, user_id, platform (pump, x, or github) and share_bps |
is_charity_mode, donate_gg_config_id, charity_donation_bps | charity settings |
tokenized_agent, tokenized_agent_buyback_bps, tokenized_agent_authority | tokenized-agent settings |
bags
bags
| Field | Rule |
|---|---|
fee_claimers | required, array of objects with either wallet_address or provider + username, plus an integer bps |
fee_config_type | optional |
bps across all claimers must total 10000, or the deploy fails with
BAGS_FEE_CLAIMER_BPS_INVALID. Bags launches also require
metadata.description (BAGS_DESCRIPTION_REQUIRED).bonk
bonk
| Field | Rule |
|---|---|
mode | required, balanced or bonkers |
quote_token | optional |
Bundled buys
buys names wallets that buy the token in the same bundle as the launch. Every
one must belong to your account.
Every entry needs an amount, in that host’s field — sol_amount on Solana,
amount_wei on EVM. A buy carrying neither is rejected.
buys requires bundle_mode. Sending buys without one fails with
INVALID_BUNDLE_MODE. Each amount_wei must also be greater than zero.bundle_mode | Solana | EVM |
|---|---|---|
packed | ✓ | ✓ |
non_packed | ✓ — caps the number of buyer wallets | ✓ — caps the number of buyer wallets |
sniper | ✓ | rejected |
non_packed has a maximum number of buyer wallets; exceeding it fails with
NON_PACKED_TOO_MANY_BUYS. Switch to packed or send fewer buys.
Distributions
distributions sends part of the launched supply to wallets you name, straight
after the deploy.
creator_buy_sol_amount (Solana) or a non-zero
creator_buy_wei (EVM) fails with DISTRIBUTIONS_REQUIRE_CREATOR_BUY.DISTRIBUTION_PERCENTAGE_EXCEEDS_CAP. On the EVM
host each entry must set exactly one of amount or percentage, and the
recipient may not be the creator wallet — that fails with
INVALID_DISTRIBUTION_WALLET.
Reading the response
Both hosts return the same envelope:{
"success": true,
"data": {
"mint_addresses": ["<token address>"],
"landed_txs": [
{
"kind": "deploy",
"dex": "flap",
"mint": "<token address>",
"signature": "<tx hash>",
"landed": true,
"reverted": false
}
]
}
}
landed and reverted are EVM-only; Solana entries carry only kind,
dex, mint and signature.
landed, not by the presence of a hash. A hash
only means a node accepted the transaction. landed: true is the only field
that means it is on chain, and reverted: true means it was mined and
failed — treat that as a failure even though the request returned 200.Retrying a failed deploy
A500 with code INTERNAL means the deploy could not be completed. It is
safe to retry.
Every other deploy error is a validation failure: the host stops at the first
problem it finds, so fix the error in front of you and resend. See
Deploy errors for the full code list and
which host returns each one.
Examples
- Solana
- EVM
curl -X POST "https://eu.solana.bloombot.app/api/v1/deploy" \
-H "Authorization: Bearer blm_sol_live_YOUR_KEY_HERE" \
-H "Content-Type: application/json" \
-d '{
"wallet_address": "<YOUR_WALLET>",
"metadata": {
"name": "My Token",
"symbol": "MTK",
"description": "A community token launched via Bloom.",
"image_url": "https://example.com/token-logo.png"
},
"configs": [
{ "dex": "pump_fun", "data": { "is_mayhem_mode": false, "is_cashback_enabled": false } }
],
"creator_buy_sol_amount": 100000000,
"buys": [
{ "wallet_address": "<YOUR_SECOND_WALLET>", "sol_amount": 50000000, "priority_fee_sol": 0.0001 }
],
"bundle_mode": "packed",
"jito_tip": 1000000,
"slippage_bps": 1000
}'
curl -X POST "https://evm.bloombot.app/api/v1/deploy" \
-H "Authorization: Bearer blm_evm_live_YOUR_KEY_HERE" \
-H "Content-Type: application/json" \
-d '{
"chain": "rbh",
"wallet_address": "0x<YOUR_WALLET>",
"metadata": {
"name": "My Token",
"symbol": "MTK",
"description": "A community token launched via Bloom.",
"image_url": "https://example.com/token-logo.png"
},
"configs": [
{ "dex": "flap", "data": { "buy_tax_bps": 100, "sell_tax_bps": 100 } }
],
"creator_buy_wei": "10000000000000000",
"bundle_mode": "packed",
"buys": [
{ "wallet_address": "0x<YOUR_SECOND_WALLET>", "amount_wei": "5000000000000000" }
],
"distributions": [
{ "wallet_address": "0x<YOUR_THIRD_WALLET>", "percentage": 2500 }
],
"slippage_bps": 1000
}'
chain and configs change between EVM chains:
// BNB Chain — four.meme. pre_sale_wei defaults to creator_buy_wei.
{ "chain": "bsc", "configs": [{ "dex": "fourmeme", "data": { "label": "Meme" } }] }
// Arc — Warp. destination 0 = WarpDex V2, 1 = Uniswap V4.
{ "chain": "arc", "configs": [{ "dex": "warp", "data": { "destination": 0 } }] }
// Ink — inkypump. target_raise must be 1-5 ETH.
{ "chain": "ink", "configs": [{ "dex": "inkypump", "data": { "target_raise": "2000000000000000000" } }] }
Authorizations
Your Bloom API key, e.g. Authorization: Bearer blm_sol_live_…. Create one in Bloom Manager → Manage API Keys.
Body
Creator wallet — a base58 address on Solana, 0x followed by 40 hex characters on EVM. Must belong to your account.
Token metadata. name, symbol and image_url are required on both hosts. description is required on Solana, and enforced again there for Bags launches (BAGS_DESCRIPTION_REQUIRED); the EVM host does not validate it. It is listed as required below because this schema covers both hosts — always send one.
Show child attributes
Show child attributes
One entry per launchpad, at least one and at most one per dex — a repeated dex fails with DUPLICATE_DEX. Use the Solana shape on the Solana host and the EVM shape on the EVM host.
1Solana host. A DEX configuration; the JSON shape is
{ "dex": <pump_fun|bags|bonk>, "data": <variant config> }. trench is
not available on the public API and is rejected with INVALID_REQUEST.
- Option 1
- Option 2
- Option 3
- Option 4
Show child attributes
Show child attributes
EVM host only. The chain to launch on, matched case-insensitively. Defaults to rbh (Robinhood), so a deploy on any other chain must set it explicitly. An unrecognised value fails with INVALID_REQUEST, and the error lists the supported chains. Not used on the Solana host, where the host is the chain.
The chains that serve deploys are not the same as the ones that serve swaps — ink deploys but does not swap, and eth and base swap but do not deploy. See Chains and quote assets.
rbh, bsc, arc, ink Solana only. The creator's own buy, in lamports. On the EVM host use creator_buy_wei; sending this field there fails with INVALID_REQUEST.
EVM host only. The creator's own buy, as an integer string in wei. Omitted or "0" means no creator buy. A non-zero value is required whenever you send distributions.
Bundled buyer wallets, each of which must belong to your account. On the EVM host, buys requires bundle_mode — sending buys without one fails with INVALID_BUNDLE_MODE.
Show child attributes
Show child attributes
How bundled buys are submitted. sniper is Solana only — the EVM host accepts packed and non_packed and rejects anything else with INVALID_BUNDLE_MODE. non_packed caps the number of buyer wallets (NON_PACKED_TOO_MANY_BUYS); packed does not.
packed, non_packed, sniper Solana only. Bundle tip, in lamports. Rejected by the EVM host with INVALID_REQUEST.
Slippage tolerance in basis points. On the EVM host, 0-10000.
Post-deploy transfers of the launched token to wallets you name. Requires a creator buy on both hosts — creator_buy_sol_amount on Solana, a non-zero creator_buy_wei on EVM. Without one the deploy fails with DISTRIBUTIONS_REQUIRE_CREATOR_BUY.
Show child attributes
Show child attributes
Solana only. A custom or vanity mint keypair. Rejected by the EVM host with INVALID_REQUEST.
Solana only. The creator transaction's priority fee, in SOL as a decimal (not lamports). Rejected by the EVM host with INVALID_REQUEST.

