POST /token/create
Create a token + liquidity pool in one call. Returns 202 and
runs the actual on-chain work in the background; poll
/token/creation-status/:botId for progress.
Handles mint, metadata upload, pool creation, optional sniper buys and
volume-boost seeding in one orchestrated job. CPMM = Raydium CPMM,
PUMPFUN = Pump.fun bonding curve.
Use case
User wants to launch a token with bundled initial buys across several
sniper wallets — submit once, poll status until COMPLETED, then drive
trading / MM endpoints off the returned botId.
Body
Common fields:
| Field | Type | Required | Description |
|---|---|---|---|
ePoolType | CPMM | PUMPFUN | yes | Pool type. |
sTokenName | string | yes | 3–32 chars, alphanumeric + spaces. |
sTokenSymbol | string | yes | 3–6 alphanumeric chars. |
sTokenImageBase64 | string | yes | Base64 image, up to 2 MB, PNG/JPEG/GIF/WEBP. |
sTokenDescription | string | yes | 10–500 chars from [A-Za-z0-9 .,!?()'-:;"$]. |
sTwitterLink | string | no | Full URL. |
sWebsiteLink | string | no | Full URL. |
sTelegramLink | string | no | Full URL. |
sCreatorWallet | string | yes | User-owned, non-imported wallet. |
aSnipers | array | no | Up to 50 entries. |
aSnipers[].sWalletAddress | string | yes | User-owned wallet (imported OK). Cannot equal sCreatorWallet. |
aSnipers[].nSnipeSolAmount | number | yes | SOL spent by this sniper. |
nTokenAllocationPercentage | number (0–100) | no | % of each sniper's tokens moved to a volume-boost wallet. 0 or omitted ⇒ volume boost skipped. |
CPMM-only:
| Field | Type | Required | Description |
|---|---|---|---|
nPoolSolAmount | number | yes | Initial SOL liquidity. |
nPoolSplAmount | number | yes | Initial token liquidity. |
For PUMPFUN, nPoolSolAmount / nPoolSplAmount are ignored —
initial liquidity comes only from snipers on the bonding curve.
SOL balance precheck
Every wallet's balance is checked in one shot before we accept the
job. Any shortage fails with 400:
{
"message": "insufficient SOL balance on one or more wallets",
"wallets": [
{ "type": "creator", "address": "…", "requiredSol": 1.8, "currentSol": 0.3 },
{ "type": "sniper#2", "address": "…", "requiredSol": 0.11, "currentSol": 0 }
]
}
Response 202
{
"botId": "66a9ff…",
"status": "PENDING",
"ePoolType": "PUMPFUN",
"sTokenAddress": null,
"sTokenName": null,
"sTokenSymbol": null,
"sPoolId": null,
"sPoolSignature": null,
"nPoolTokenAmount": null,
"nPoolSolAmount": null,
"iTokenBot": null,
"aSnipes": [],
"sErrorMessage": null,
"dCreatedAt": "2026-04-20T10:00:00.000Z",
"dUpdatedAt": "2026-04-20T10:00:00.000Z"
}
Use botId to poll /token/creation-status/:botId.
Errors
| Status | Meaning |
|---|---|
400 | Validation error, insufficient balance, or creator wallet is imported. |
Example — PumpFun
curl -X POST "$BASE_URL/token/create" \
-H "Authorization: Bearer $ACCESS" \
-H "x-user-id: $USER_ID" \
-H "Content-Type: application/json" \
-d @- <<'JSON'
{
"ePoolType": "PUMPFUN",
"sTokenName": "MyToken",
"sTokenSymbol": "MTK",
"sTokenImageBase64": "<base64>",
"sTokenDescription": "Short description.",
"sCreatorWallet": "<creator>",
"aSnipers": [
{ "sWalletAddress": "<wallet1>", "nSnipeSolAmount": 0.1 }
],
"nTokenAllocationPercentage": 10
}
JSON
Example — CPMM
curl -X POST "$BASE_URL/token/create" \
-H "Authorization: Bearer $ACCESS" \
-H "x-user-id: $USER_ID" \
-H "Content-Type: application/json" \
-d @- <<'JSON'
{
"ePoolType": "CPMM",
"sTokenName": "MyToken",
"sTokenSymbol": "MTK",
"sTokenImageBase64": "<base64>",
"sTokenDescription": "Short description.",
"sCreatorWallet": "<creator>",
"nPoolSolAmount": 1.5,
"nPoolSplAmount": 1000000,
"aSnipers": [
{ "sWalletAddress": "<wallet1>", "nSnipeSolAmount": 0.1 }
],
"nTokenAllocationPercentage": 10
}
JSON