Build on Solana and EVM chains with one API.

Programmatic access to every Solauncher feature. Token creation and metadata cloning, liquidity management across Raydium, Meteora and PumpSwap, Pump.fun bundle launches, multi-wallet send and collect, asset locking, rent recovery, EVM deployment on Robinhood Chain, and volume bots. API users pay half the platform fee. Data endpoints carry no platform fee.

Base URL https://api.solauncher.org
50%
Fee reduction for all API users
109+
Available endpoints
300
Requests per minute per key
2
Chains supported (Solana + EVM)
Free
All data endpoints are Free
Solana
Token Operations
Create SPL tokens with on-chain metadata. Fetch existing token metadata by mint address. Manage mint, freeze, and update authorities. Burn supply, mint more, freeze accounts. SPL and Token-2022 supported.
9 endpoints
Raydium
Liquidity Management
Create and manage pools across Raydium CPMM, AMM V4, Meteora DLMM, and PumpSwap. Add or remove liquidity and burn LP tokens to lock permanently. Launch on LaunchLab or LetsBonk with pre-signed bundle wallets.
23 endpoints
Jupiter
Bundle Trading and Volume Bot
Build unsigned buy and sell transactions for multi-wallet Jito bundles. Run a server-side volume bot that generates organic-looking on-chain activity and refunds unused SOL.
10 endpoints
Token Locker
Lock SPL tokens and LP tokens on-chain. Set a vesting schedule, attach display metadata, and look up any lock by mint address.
5 endpoints
Robinhood
EVM / Robinhood Chain
Deploy ERC-20 tokens with tax, anti-bot, and anti-whale modules. Manage token settings on-chain. Add and remove liquidity via LiquidityHelper. Lock tokens via PinkLock02. Bundle buy and sell across multiple wallets. Run a volume bot or market maker. Increase holder count. Launch via Pons launchpad. Generate EVM wallets.
50 endpoints
Pons
Pons Bundle Launch
Launch tokens on the Pons Launchpad on Robinhood Chain. Bundle buy across multiple wallets in a coordinated transaction. Upload token logos, search for vanity contract addresses, and check wallet balances before executing.
5 endpoints
Wallets, Assets and Rent
Generate keypairs in bulk or find a vanity address. Fetch token holdings for any wallet. Close empty accounts and recover rent-exempt SOL.
5 endpoints
Pump.fun
Pump.fun Bundle Launch
Upload token metadata to IPFS and create a new Pump.fun token in a single call. Supply up to 12 bundle wallets that buy on the same block. All transactions built directly against the on-chain program with no external API dependency.
1 endpoint
Multi Sender and Collector
Send SOL or any SPL token to hundreds of recipients in one transaction. Sweep SOL and close token accounts from multiple source wallets into a single destination. Server signs collect transactions directly.
2 endpoints
Jump in
Common starting points for new integrations
Quick Start Guide
Authentication
Pricing and Fees
Error Reference
Create Token POST
Create CPMM Pool POST
Setup Volume Bot POST
Bundle Buy POST
Lock Tokens POST
Deploy EVM Token POST
EVM Bundle Buy POST
Open EVM Trading POST
Lock EVM Tokens POST
Find Closeable Accounts GET
Get Wallet Assets POST
Fetch Token Metadata GET
Pump.fun Bundle Launch POST
Multi Send SOL or Token POST
Multi Collect and Sweep POST

Introduction

REST APISolanaRobinhood Chain EVM50% Fee Discount

The Solauncher API provides programmatic access to every action available on the Solauncher platform. On Solana this covers SPL and Token-2022 token creation, metadata cloning, liquidity management across Raydium CPMM and AMM V4, Meteora, PumpSwap, Pump.fun bundle launches, LaunchLab and LetsBonk bundles, multi-wallet send and collect, token locking, rent recovery, and volume bots. On Robinhood Chain EVM this covers token creation and management, Uniswap V3 mainnet pools, PancakeSwap V3 testnet pools, Pons Launchpad, multisender, and volume bots.

Data endpoints are free. Any endpoint that only reads or returns data (wallet assets, claimable balances, token info, pool info, and similar) carries no platform fee. Only action endpoints that build or submit transactions charge the platform fee, which is reduced by 50% for API key holders.

Base URL

base url
https://api.solauncher.org

All v1 API endpoints are prefixed with /api/v1. Key management endpoints (/api/keys) use wallet-signature authentication and are not prefixed with /api/v1.

Transaction Model

Every "build" endpoint returns a base64-encoded, partially signed Solana transaction. Your application is responsible for:

  1. 1
    Decoding the base64 transaction string into bytes.
  2. 2
    Deserializing into a Transaction or VersionedTransaction object depending on the endpoint.
  3. 3
    Adding the user's wallet signature.
  4. 4
    Broadcasting to the Solana network via your RPC connection.
Private keys never leave the user's device. The API only builds unsigned (or partially signed) transactions. Signing always happens client-side.

Versioned vs Legacy Transactions

CPMM-based operations (Raydium CPMM, Meteora) return versioned (V0) transactions. Use VersionedTransaction.deserialize(Buffer.from(txBase64, 'base64')). All other Solana endpoints return legacy transactions. Use Transaction.from(Buffer.from(txBase64, 'base64')).

Quick Start

Create a Solana token end-to-end using three API calls.

  1. 1
    Get an API key from the Developer API page on Solauncher. Connect your wallet, sign the message, and click Create Key. The full key is shown once and must be saved immediately.
  2. 2
    Upload metadata using POST /api/v1/token/upload-metadata with your image and token details. First transfer 0.01 SOL to the platform fee wallet from your wallet, wait for confirmation, then include the transaction signature and your wallet address in the request. Receive back an IPFS URI.
  3. 3
    Build the transaction with POST /api/v1/token/build-create. Decode, sign, and broadcast to Solana.
javascript
import { Transaction } from '@solana/web3.js';

// Step 1 — pay 0.01 SOL service fee and wait for confirmation,
// then include the confirmed signature and your wallet address in the request body.
const RPC_URL = 'https://your-rpc-endpoint.com';

const form = new FormData();
form.append('feeTxSignature', confirmedFeeTxSignature);
form.append('payerWallet', walletPublicKey);
form.append('logo', imageFile);
form.append('name', 'My Token');
form.append('symbol', 'MTK');
form.append('description', 'A sample token');
form.append('decimals', '6');

const { uri } = await fetch(
  'https://api.solauncher.org/api/v1/token/upload-metadata?rpcUrl=' + encodeURIComponent(RPC_URL),
  { method: 'POST', headers: { 'X-API-Key': 'slk_yourkeyhere' }, body: form }
).then(r => r.json());

// Step 2 — build create transaction
const { transaction, mint } = await fetch('https://api.solauncher.org/api/v1/token/build-create', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json', 'X-API-Key': 'slk_yourkeyhere' },
  body: JSON.stringify({
    rpcUrl: RPC_URL,
    wallet: walletPublicKey,
    uri,
    name: 'My Token',
    symbol: 'MTK',
    supply: '1000000000000000',
    decimals: 6,
    network: 'mainnet-beta',
    revokeMintAuthority: true,
    revokeFreezeAuthority: true,
  }),
}).then(r => r.json());

// Step 3 — sign and submit
const tx = Transaction.from(Buffer.from(transaction, 'base64'));
await wallet.signTransaction(tx);
const sig = await connection.sendRawTransaction(tx.serialize());
console.log('Mint:', mint, 'Sig:', sig);

Authentication

API Key Authentication

Pass your API key in the X-API-Key header on every /api/v1/* request. API keys begin with the prefix slk_ followed by 64 hex characters. Only the SHA-256 hash of the key is stored on the server — the full key is shown once at creation time.

curl
curl -X POST https://api.solauncher.org/api/v1/token/build-create \
  -H "X-API-Key: slk_yourkeyhere" \
  -H "Content-Type: application/json" \
  -d '{...}'

Wallet Signature Authentication

The key management endpoints (/api/keys) use Ed25519 wallet ownership verification instead of an API key. Sign the fixed string Solauncher API Key Management with your Solana wallet and include the base58-encoded signature in the request.

javascript
import bs58 from 'bs58';
const message = 'Solauncher API Key Management';
const bytes = new TextEncoder().encode(message);
const sig = await wallet.signMessage(bytes);
const signature = bs58.encode(sig); // pass this as walletSignature or signature

GET endpoints pass auth via query params (wallet, signature, message). POST/PATCH/DELETE endpoints pass auth in the request body (wallet, walletSignature, signedMessage).

Rate Limits

The API enforces a limit of 300 requests per minute per API key. Exceeding this returns a 429 Too Many Requests response with the following body:

json
{
  "error": "Rate limit exceeded",
  "code": "RATE_LIMITED",
  "retry_after_seconds": 42
}

Each wallet can have a maximum of 10 active API keys. Revoking a key frees up a slot.

Errors

All error responses return JSON with an error string field. HTTP status codes follow standard conventions.

CodeMeaning
400Bad request — missing or invalid parameters
401Missing or invalid API key
404Resource not found
429Rate limit exceeded (300 req/min)
500Internal server error
503Authentication service unavailable — database unreachable
json error shape
{ "error": "Missing required field: wallet" }

Pricing

API users pay exactly half the standard platform fee. Fees are embedded as on-chain transfer instructions inside the returned transaction. No fee is charged if the transaction is not submitted. The Upload Metadata endpoint is an exception: it charges a flat 0.01 SOL fee that must be paid before the call, not embedded in a returned transaction.

ActionAPI Fee
Upload Metadata to IPFS0.01 SOL (flat, pre-paid per call)
Create Token0.03 SOL
Burn Tokens0.025 SOL
Revoke Authority0.015 SOL
Freeze Account0.005 SOL
Unfreeze Account0.005 SOL
Mint Additional Tokens0.015 SOL
Lock SPL Token0.05 SOL
Lock LP Token0.2 SOL
Raydium CPMM Pool Create0.07 SOL (API users: 0.035 SOL)
Raydium AMM V4 Pool Create0.07 SOL base (API users: 0.035 SOL) + 0.02 SOL per bundle wallet
Raydium Add Liquidity0.05 SOL (API users: 0.025 SOL)
Raydium Remove Liquidity0.05 SOL (API users: 0.025 SOL)
Raydium Burn LP Tokens0.05 SOL (API users: 0.025 SOL)
OpenBook Market Create0.07 SOL (platform fee, not discounted for API users)
Meteora Pool Create0.035 SOL base
Meteora Add Liquidity0.01 SOL
Meteora Remove Liquidity0.01 SOL
PumpSwap Pool Create0.035 SOL base
PumpSwap Add Liquidity0.01 SOL
PumpSwap Remove Liquidity0.01 SOL
Recover Rent4% of recovered SOL
Claim Dev Fees (Pump.fun / LaunchLab)2.5% of claimed SOL
Multi Send (SOL or SPL)0.00005 SOL per recipient
Multi Collect0.00005 SOL per source wallet
Pump.fun Bundle Launch0.01 SOL per bundle wallet
EVM Multisend0.00005 ETH per recipient
EVM Token DeployVariable by features (use /fee endpoint)

Pool creation endpoints that accept bundleWalletCount add 0.01 SOL per bundle wallet on top of the base fee at the API rate.

GET/api/keys

List Keys

Returns all API keys belonging to the authenticated wallet. Uses wallet-signature authentication, not an API key.

FieldTypeRequiredDescription
walletstringRequiredSolana wallet public key (base58)
signaturestringRequiredBase58-encoded Ed25519 signature
messagestringRequiredThe message that was signed. Use Solauncher API Key Management
curl
curl "https://api.solauncher.org/api/keys?wallet=YourWallet&signature=base58sig&message=Solauncher+API+Key+Management"
json response
{ "keys": [{ "id": 1, "key_prefix": "slk_a1b2c3", "name": "My Bot", "is_active": 1, "request_count": 142, "last_used_at": "2026-08-18T10:00:00Z", "created_at": "2026-08-01T00:00:00Z" }] }
POST/api/keys

Create Key

Creates a new API key for the wallet. The full key is returned once and never stored in plaintext. Maximum 10 active keys per wallet.

FieldTypeRequiredDescription
walletstringRequiredSolana wallet public key
walletSignaturestringRequiredBase58-encoded signature of the message
signedMessagestringRequiredThe message that was signed. Use Solauncher API Key Management
namestringOptionalLabel for the key, max 100 characters
Save immediately: The full API key is shown only once and cannot be retrieved again.
json response (201)
{ "key": "slk_a1b2c3d4...", "prefix": "slk_a1b2c3", "name": "My Bot", "warning": "Save this key now — it will not be shown again." }
PATCH/api/keys/:id

Rename Key

Updates the display name of an existing API key.

FieldTypeRequiredDescription
walletstringRequiredOwner wallet public key
walletSignaturestringRequiredBase58-encoded signature
signedMessagestringRequiredThe message that was signed. Use Solauncher API Key Management
namestringOptionalNew label, max 100 characters
json response
{ "ok": true }
DELETE/api/keys/:id

Revoke Key

Permanently deactivates an API key. The key can no longer authenticate any request. This action cannot be undone.

FieldTypeRequiredDescription
walletstringRequiredOwner wallet public key
walletSignaturestringRequiredBase58-encoded signature
signedMessagestringRequiredThe message that was signed. Use Solauncher API Key Management
json response
{ "ok": true }
GET/api/keys/:id/usage

Usage Stats

Returns usage statistics for a specific API key: total requests, daily breakdown for the last 30 days, and top endpoints by call count.

FieldTypeRequiredDescription
walletstringRequiredOwner wallet public key
signaturestringRequiredBase58-encoded signature
messagestringRequiredThe message that was signed. Use Solauncher API Key Management
json response
{
  "total_requests": 458,
  "last_used_at": "2026-08-18T10:22:00Z",
  "last_30_days": [{ "date": "2026-08-18", "requests": 12 }],
  "top_endpoints": [{ "endpoint": "/api/v1/token/build-create", "count": 80 }]
}

Create Token

Creates a new SPL token on Solana in two steps: upload the token image and metadata to IPFS, then build the on-chain creation transaction. Total fees: 0.01 SOL (upload) + 0.03 SOL (create).

POST/api/v1/token/upload-metadata

Uploads a token image and metadata JSON to IPFS via Pinata. Returns the metadata URI to pass into Step 2. Accepts multipart/form-data. A flat fee of 0.01 SOL must be paid before this call: transfer 0.01 SOL to the platform fee wallet, wait for confirmation, then include the transaction signature and your wallet address in the request.

Fee window: The fee transaction signature must be confirmed on-chain and submitted within 5 minutes of this call. Signatures older than 5 minutes are rejected before any upload is attempted.
FieldTypeRequiredDescription
rpcUrlstringRequiredYour Solana RPC endpoint URL. Pass as a query parameter: ?rpcUrl=https://your-rpc-url
feeTxSignaturestringRequiredBase58 signature of a confirmed on-chain transfer of 0.01 SOL from payerWallet to the platform fee wallet. Must be confirmed within 5 minutes of this call.
payerWalletstringRequiredBase58 public key of the wallet that sent the fee transaction
namestringRequiredToken name
symbolstringRequiredToken ticker symbol
logofileOptionalToken image file, max 5 MB
descriptionstringOptionalToken description
websitestringOptionalWebsite URL
twitterstringOptionalTwitter URL
telegramstringOptionalTelegram URL
discordstringOptionalDiscord URL
decimalsnumberOptionalToken decimals. Default: 9
curl
curl -X POST "https://api.solauncher.org/api/v1/token/upload-metadata?rpcUrl=https%3A%2F%2Fapi.mainnet-beta.solana.com" \
  -H "X-API-Key: slk_yourkeyhere" \
  -F "feeTxSignature=5XkD...confirmed_sig" \
  -F "payerWallet=YourWalletPublicKey" \
  -F "logo=@/path/to/image.png" \
  -F "name=My Token" \
  -F "symbol=MTK" \
  -F "description=A sample token" \
  -F "decimals=6"
json response
{
  "uri": "https://ipfs.io/ipfs/QmXyz...",
  "metadata": {
    "name": "My Token",
    "symbol": "MTK",
    "description": "A sample token",
    "image": "https://ipfs.io/ipfs/QmImg...",
    "external_url": "",
    "decimals": 6,
    "properties": { "category": "token", "files": [{ "uri": "https://ipfs.io/ipfs/QmImg...", "type": "image/png" }] },
    "extensions": {}
  }
}
POST/api/v1/token/build-create

Builds a legacy Solana transaction that creates a new SPL token with on-chain metadata. The transaction is partially signed by the mint keypair server-side. Your wallet signature is required before broadcasting. Fee: 0.03 SOL.

FieldTypeRequiredDescription
rpcUrlstringRequiredYour Solana RPC endpoint URL
walletstringRequiredPayer wallet public key (base58)
uristringRequiredIPFS metadata URI from Step 1
namestringRequiredToken name
symbolstringRequiredToken symbol
supplystringRequiredTotal supply in raw units already scaled by decimals. Example: 1 billion tokens at 6 decimals = "1000000000000000"
decimalsnumberRequiredToken decimal places (0 to 9)
networkstringRequired"mainnet-beta" or "devnet"
revokeFreezeAuthoritybooleanOptionalAppend freeze authority revocation instruction
revokeMintAuthoritybooleanOptionalAppend mint authority revocation instruction
revokeUpdateAuthoritybooleanOptionalSet metadata to immutable
vanitySecretKeystringOptionalBase64-encoded secret key from the vanity endpoint. A random keypair is generated if omitted.
curl
curl -X POST https://api.solauncher.org/api/v1/token/build-create \
  -H "X-API-Key: slk_yourkeyhere" \
  -H "Content-Type: application/json" \
  -d '{
  "wallet": "YourWalletPublicKey",
  "uri": "https://ipfs.io/ipfs/QmXyz...",
  "name": "My Token",
  "symbol": "MTK",
  "supply": "1000000000000000",
  "decimals": 6,
  "network": "mainnet-beta",
  "revokeMintAuthority": true,
  "revokeFreezeAuthority": true,
  "rpcUrl": "https://api.mainnet-beta.solana.com"
}'
json response
{
  "transaction": "AgAAAA...",
  "blockhash": "9WjABC...",
  "lastValidBlockHeight": 289540012,
  "mint": "NewMintAddress...",
  "ata": "AssocTokenAccount..."
}
This is a legacy transaction. Deserialize with Transaction.from(Buffer.from(transaction, 'base64')), sign with your wallet, then broadcast.
POST/api/v1/token/vanity

Vanity Mint Address

Generates a mint keypair whose public key starts with a given prefix or ends with a given suffix. At least one of the two fields is required. Longer patterns take significantly more server time to generate.

FieldTypeRequiredDescription
prefixstringOptionalDesired base58 address prefix
suffixstringOptionalDesired base58 address suffix
curl
curl -X POST https://api.solauncher.org/api/v1/token/vanity \
  -H "X-API-Key: slk_yourkeyhere" \
  -H "Content-Type: application/json" \
  -d '{"prefix":"COOL","rpcUrl":"https://api.mainnet-beta.solana.com"}'
json response
{ "publicKey": "COOLaBc1...", "secretKey": "5JcV...", "attempts": 142857 }

The secretKey in the response is base58-encoded. To use it as vanitySecretKey in the build-create request, decode it from base58 to raw bytes and re-encode as base64 first. Example using the bs58 library:

javascript
import bs58 from 'bs58'
const vanitySecretKey = Buffer.from(bs58.decode(secretKey)).toString('base64')
GET/api/v1/token/fetch-metadata

Fetch Token Metadata

Reads on-chain Metaplex metadata for any existing SPL token and returns the name, symbol, URI, and social links extracted from the metadata JSON. Used by the Clone Token feature to auto-fill token details. No fee is charged.

FieldTypeRequiredDescription
mintstringRequiredToken mint address (base58)
networkstringOptional"mainnet-beta" or "devnet". Default: "mainnet-beta"
curl
curl "https://api.solauncher.org/api/v1/token/fetch-metadata?mint=TokenMintAddress&network=mainnet-beta&rpcUrl=https://your-rpc-url" \
  -H "X-API-Key: slk_yourkeyhere"
json response
{
  "name":        "My Token",
  "symbol":      "MTK",
  "uri":         "https://ipfs.io/ipfs/QmXyz...",
  "description": "A sample token",
  "image":       "https://ipfs.io/ipfs/QmImg...",
  "twitter":     "https://x.com/mytoken",
  "telegram":    "https://t.me/mytoken",
  "website":     "https://mytoken.io",
  "discord":     ""
}
Social link fields (twitter, telegram, website, discord) are extracted from the token's off-chain metadata JSON. They are empty strings when not present in the JSON. The endpoint returns a partial result if the URI is unreachable.
POST/api/v1/manage/burn/build

Burn Tokens

Builds a transaction to permanently burn a specified amount of tokens. Automatically detects SPL vs Token-2022 program from the mint's on-chain owner. Fee: 0.025 SOL.

FieldTypeRequiredDescription
mintstringRequiredToken mint address
ownerstringRequiredWallet that owns the tokens
amountstringRequiredHuman-readable amount to burn (decimals allowed)
decimalsnumberOptionalToken decimals. Fetched from chain if omitted.
networkstringOptionalDefault: "mainnet-beta"
curl
curl -X POST https://api.solauncher.org/api/v1/manage/burn/build \
  -H "X-API-Key: slk_yourkeyhere" \
  -H "Content-Type: application/json" \
  -d '{"mint":"TokenMint","owner":"WalletAddress","amount":"1000000","network":"mainnet-beta","rpcUrl":"https://api.mainnet-beta.solana.com"}'
json response
{ "transaction": "AQAAAA...", "blockhash": "9WjABC...", "lastValidBlockHeight": 289540012 }
POST/api/v1/manage/revoke-authority/build

Revoke Authority

Builds a transaction to permanently revoke a token authority. Supports three authority types. For mint and freeze, the server verifies the caller is the actual on-chain authority before building. Fee: 0.015 SOL.

FieldTypeRequiredDescription
mintstringRequiredToken mint address
currentAuthoritystringRequiredWallet currently holding the authority
authorityTypestringRequired"mint", "freeze", or "update"
networkstringOptionalDefault: "mainnet-beta"
curl
curl -X POST https://api.solauncher.org/api/v1/manage/revoke-authority/build \
  -H "X-API-Key: slk_yourkeyhere" \
  -H "Content-Type: application/json" \
  -d '{"mint":"TokenMint","currentAuthority":"WalletAddr","authorityType":"mint","network":"mainnet-beta","rpcUrl":"https://api.mainnet-beta.solana.com"}'
json response
{ "transaction": "AQAAAA..." }
POST/api/v1/manage/freeze/build

Freeze Account

Builds a transaction to freeze a token account, preventing the holder from transferring tokens. Pass either the token account address or the wallet address — the ATA is derived automatically from the wallet. Fee: 0.005 SOL.

FieldTypeRequiredDescription
mintstringRequiredToken mint address
targetAccountstringRequiredToken account address or wallet address
freezeAuthoritystringRequiredWallet holding the freeze authority
networkstringOptionalDefault: "mainnet-beta"
curl
curl -X POST https://api.solauncher.org/api/v1/manage/freeze/build \
  -H "X-API-Key: slk_yourkeyhere" \
  -H "Content-Type: application/json" \
  -d '{"mint":"TokenMint","targetAccount":"WalletOrTokenAccount","freezeAuthority":"AuthWallet","network":"mainnet-beta","rpcUrl":"https://api.mainnet-beta.solana.com"}'
json response
{ "transaction": "AQAAAA...", "blockhash": "9WjABC...", "lastValidBlockHeight": 289540012 }
POST/api/v1/manage/unfreeze/build

Unfreeze Account

Builds a transaction to unfreeze a previously frozen token account. Accepts the same fields as the freeze endpoint. Fee: 0.005 SOL.

FieldTypeRequiredDescription
mintstringRequiredToken mint address
targetAccountstringRequiredToken account address or wallet address
freezeAuthoritystringRequiredWallet holding the freeze authority
networkstringOptionalDefault: "mainnet-beta"
curl
curl -X POST https://api.solauncher.org/api/v1/manage/unfreeze/build \
  -H "X-API-Key: slk_yourkeyhere" \
  -H "Content-Type: application/json" \
  -d '{"mint":"TokenMint","targetAccount":"WalletOrTokenAccount","freezeAuthority":"AuthWallet","network":"mainnet-beta","rpcUrl":"https://api.mainnet-beta.solana.com"}'
json response
{ "transaction": "AQAAAA...", "blockhash": "9WjABC...", "lastValidBlockHeight": 289540012 }
POST/api/v1/manage/mint/build

Mint Additional Tokens

Builds a transaction to mint additional tokens to a destination wallet. The destination ATA is created automatically if it does not yet exist. Fee: 0.015 SOL.

FieldTypeRequiredDescription
mintstringRequiredToken mint address
mintAuthoritystringRequiredWallet holding the mint authority
destinationstringRequiredDestination wallet address (ATA derived automatically)
amountstringRequiredHuman-readable amount to mint (decimals allowed)
decimalsnumberOptionalFetched from chain if omitted
networkstringOptionalDefault: "mainnet-beta"
curl
curl -X POST https://api.solauncher.org/api/v1/manage/mint/build \
  -H "X-API-Key: slk_yourkeyhere" \
  -H "Content-Type: application/json" \
  -d '{"mint":"TokenMint","mintAuthority":"AuthWallet","destination":"DestWallet","amount":"1000000","network":"mainnet-beta","rpcUrl":"https://api.mainnet-beta.solana.com"}'
json response
{ "transaction": "AQAAAA..." }
POST/api/v1/raydium/openbook/create

Create OpenBook Market

Creates an OpenBook V3 order book market required before launching a Raydium AMM V4 pool. Returns two unsigned transactions that must be signed and submitted in order: tx1 first (confirmed), then tx2. Platform fee: 0.07 SOL (charged at the platform level, not subject to the API user discount).

FieldTypeRequiredDescription
payerstringRequiredPayer wallet public key. Signs both transactions
baseMintstringRequiredToken mint address (the asset being traded)
quoteMintstringRequiredQuote currency mint, typically SOL or USDC
minOrderSizenumberRequiredMinimum order size in base token units (e.g. 1)
priceTicknumberRequiredMinimum price increment (e.g. 0.000001)
rentFeenumberOptionalTarget rent SOL budget, controls order book account sizes. Default: 0.29
networkstringOptionalDefault: "mainnet-beta"
curl
curl -X POST https://api.solauncher.org/api/v1/raydium/openbook/create \
  -H "X-API-Key: slk_yourkeyhere" \
  -H "Content-Type: application/json" \
  -d '{"payer":"YourWallet","baseMint":"TokenMint","quoteMint":"So11111111111111111111111111111111111111112","minOrderSize":1,"priceTick":0.000001,"network":"mainnet-beta","rpcUrl":"https://api.mainnet-beta.solana.com"}'
json response
{
  "marketId": "MarketPublicKey...",
  "tx1": "AQAAAA...",
  "tx2": "AQAAAB...",
  "blockhash": "9WjABC...",
  "lastValidBlockHeight": 289540012
}
Submit tx1 and wait for confirmation before submitting tx2. Both use the same blockhash. Both are legacy transactions — use Transaction.from(Buffer.from(tx, 'base64')).
POST/api/v1/raydium/liquidity/create

Create CPMM Pool

Creates a Raydium CPMM (Constant Product Market Maker) pool and adds initial liquidity in one operation. Returns a versioned (V0) transaction. Platform fee: 0.07 SOL (API users: 0.035 SOL).

FieldTypeRequiredDescription
ownerstringRequiredPayer wallet public key
baseMintstringRequiredToken mint address
quoteMintstringRequiredQuote mint, typically SOL or USDC
baseAmountstringRequiredToken amount as a decimal string (e.g. "1000000"). Scaled internally using on-chain decimals
quoteAmountstringRequiredQuote amount as a decimal string (e.g. "5.5" for 5.5 SOL)
feeTierstringOptionalPool fee tier as a percent string, e.g. "0.25". Default: "0.25"
startTimestring|numberOptionalISO date string or Unix timestamp to open trading. Default: 0 (immediate)
networkstringOptionalDefault: "mainnet-beta"
curl
curl -X POST https://yourapp.com/api/v1/raydium/liquidity/create \
  -H "Content-Type: application/json" \
  -H "x-api-key: YOUR_API_KEY" \
  -d '{
    "rpcUrl": "https://api.mainnet-beta.solana.com",
    "owner": "YourWalletPublicKey",
    "baseMint": "TokenMintAddress",
    "quoteMint": "So11111111111111111111111111111111111111112",
    "baseAmount": "1000000",
    "quoteAmount": "5.5"
  }'
json response
{ "transaction": "AgAAAA...", "poolId": "CpmmPool...", "blockhash": "9WjABC...", "lastValidBlockHeight": 289540012, "message": "CPMM pool transaction built — sign and send to create pool" }
This is a versioned (V0) transaction. Use VersionedTransaction.deserialize(Buffer.from(transaction, 'base64')) to sign and broadcast.
POST/api/v1/raydium/liquidity/create-amm

Create AMM V4 Pool

Creates a Raydium AMM V4 pool using the Initialize2 instruction. Requires an existing OpenBook market ID (use the Create OpenBook Market endpoint first). Returns a legacy transaction. Platform fee: 0.07 SOL (API users: 0.035 SOL).

FieldTypeRequiredDescription
ownerstringRequiredPayer wallet public key
marketIdstringRequiredOpenBook market ID from the Create OpenBook Market endpoint
baseMintstringRequiredToken mint address
quoteMintstringRequiredQuote mint address (typically SOL)
baseAmountstringRequiredToken amount as a decimal string
quoteAmountstringRequiredQuote amount as a decimal string
startTimestring|numberOptionalISO date string or Unix timestamp to open trading. Default: 0 (immediate)
bundleWalletCountnumberOptionalNumber of bundle wallets buying at creation. Adds 0.02 SOL per wallet to the platform fee. Default: 0
networkstringOptionalDefault: "mainnet-beta"
curl
curl -X POST https://yourapp.com/api/v1/raydium/liquidity/create-amm \
  -H "Content-Type: application/json" \
  -H "x-api-key: YOUR_API_KEY" \
  -d '{
    "rpcUrl": "https://api.mainnet-beta.solana.com",
    "owner": "YourWalletPublicKey",
    "marketId": "OpenBookMarketId",
    "baseMint": "TokenMintAddress",
    "quoteMint": "So11111111111111111111111111111111111111112",
    "baseAmount": "1000000",
    "quoteAmount": "5.5"
  }'
json response
{ "transaction": "AQAAAA...", "poolId": "AmmPool...", "blockhash": "9WjABC...", "lastValidBlockHeight": 289540012 }
This is a legacy transaction. Deserialize with Transaction.from(Buffer.from(transaction, 'base64')), sign with your wallet, then broadcast.
POST/api/v1/raydium/preview-liquidity

Preview Liquidity

Returns the estimated token output for a given SOL input amount based on the current pool reserves. Works for both CPMM and AMM V4 pools. No transaction is built and no fee is charged.

FieldTypeRequiredDescription
poolIdstringRequiredRaydium pool ID (CPMM or AMM V4)
amountstringRequiredSOL input amount as a decimal string (e.g. "1.5" for 1.5 SOL)
poolTypestringOptional"cpmm" or "ammv4". Default: "cpmm"
networkstringOptionalDefault: "mainnet-beta"
curl
curl -X POST https://yourapp.com/api/v1/raydium/preview-liquidity \
  -H "Content-Type: application/json" \
  -H "x-api-key: YOUR_API_KEY" \
  -d '{
    "rpcUrl": "https://api.mainnet-beta.solana.com",
    "poolId": "CpmmPoolId",
    "amount": "1.5"
  }'
json response
{ "success": true, "tokenAmount": "12345.678900", "tokenMint": "TokenMint...", "tokenDecimals": 6, "poolType": "cpmm" }
On error, returns { "success": false, "error": "..." }. tokenAmount is the human-readable token output (not raw units).
POST/api/v1/raydium/add-liquidity

Add Liquidity

Builds a transaction to add liquidity to an existing Raydium CPMM or AMM V4 pool. Pass poolType to specify which pool type to use. Platform fee: 0.05 SOL (API users: 0.025 SOL).

FieldTypeRequiredDescription
ownerstringRequiredLiquidity provider wallet public key
poolIdstringRequiredRaydium pool ID
baseAmountstringRequiredSOL amount to add as a decimal string (e.g. "1.5"). The paired token amount is computed from the pool ratio
poolTypestringOptional"cpmm" or "ammv4". Default: "cpmm"
slippagenumberOptionalSlippage tolerance in percent. Default: 1
networkstringOptionalDefault: "mainnet-beta"
curl
curl -X POST https://yourapp.com/api/v1/raydium/add-liquidity \
  -H "Content-Type: application/json" \
  -H "x-api-key: YOUR_API_KEY" \
  -d '{
    "rpcUrl": "https://api.mainnet-beta.solana.com",
    "owner": "YourWalletPublicKey",
    "poolId": "CpmmPoolId",
    "baseAmount": "1.5"
  }'
json response
{ "transaction": "AgAAAA...", "blockhash": "9WjABC...", "lastValidBlockHeight": 289540012, "message": "CPMM add liquidity transaction built — sign and send" }
CPMM returns a versioned (V0) transaction. AMM V4 returns a legacy transaction. Use VersionedTransaction.deserialize() for CPMM and Transaction.from() for AMM V4.
POST/api/v1/raydium/liquidity/remove

Remove Liquidity

Builds a transaction to remove liquidity from a Raydium pool by redeeming LP tokens. Provide lpAmount for an exact amount or removePercent to remove a fraction of your balance. Platform fee: 0.05 SOL (API users: 0.025 SOL).

FieldTypeRequiredDescription
ownerstringRequiredLP token holder wallet public key
poolIdstringRequiredRaydium pool ID
lpAmountstringOptionalExact LP token amount to redeem in raw units. If omitted, removePercent is used
removePercentnumberOptionalPercentage of your LP balance to remove (1 to 100). Default: 100
poolTypestringOptional"cpmm" or "ammv4". Default: "cpmm"
slippagenumberOptionalSlippage tolerance in percent. Default: 1
networkstringOptionalDefault: "mainnet-beta"
curl
curl -X POST https://yourapp.com/api/v1/raydium/liquidity/remove \
  -H "Content-Type: application/json" \
  -H "x-api-key: YOUR_API_KEY" \
  -d '{
    "rpcUrl": "https://api.mainnet-beta.solana.com",
    "owner": "YourWalletPublicKey",
    "poolId": "CpmmPoolId"
  }'
json response
{ "transaction": "AgAAAA...", "blockhash": "9WjABC...", "lastValidBlockHeight": 289540012, "message": "CPMM remove liquidity transaction built — sign and send" }
CPMM returns a versioned (V0) transaction. AMM V4 returns a legacy transaction. Use VersionedTransaction.deserialize() for CPMM and Transaction.from() for AMM V4.
POST/api/v1/raydium/burn-lp

Burn LP Tokens

Builds a transaction to permanently burn LP tokens from a token account. Burning locks liquidity forever and is irreversible. Works with both Raydium and Meteora LP tokens. Platform fee: 0.05 SOL (API users: 0.025 SOL).

FieldTypeRequiredDescription
payerstringRequiredWallet public key that owns the LP token account and pays fees
mintstringRequiredLP token mint address (not the pool ID)
sourcestringRequiredSource token account address that holds the LP tokens to burn
amountstringRequiredAmount to burn as a decimal string, scaled by lpdecimals (e.g. "1000.5")
lpdecimalsnumberRequiredDecimal places of the LP token mint
priorityFeenumberOptionalPriority fee in SOL. Default: 0.001
networkstringOptionalDefault: "mainnet-beta"
curl
curl -X POST https://yourapp.com/api/v1/raydium/burn-lp \
  -H "Content-Type: application/json" \
  -H "x-api-key: YOUR_API_KEY" \
  -d '{
    "rpcUrl": "https://api.mainnet-beta.solana.com",
    "payer": "YourWalletPublicKey",
    "mint": "LpTokenMintAddress",
    "source": "LpTokenAccountAddress",
    "amount": "1000.5",
    "lpdecimals": 6
  }'
json response
{ "txBase64": "AQAAAA...", "blockhash": "9WjABC...", "lastValidBlockHeight": 289540012 }
This is a legacy transaction. Deserialize with Transaction.from(Buffer.from(txBase64, 'base64')), sign with your wallet, then broadcast.
This is an irreversible operation. The server validates that the source account holds the correct mint and is owned by payer before building the transaction.
GET/api/v1/raydium/cpmm-pool-by-token

Find CPMM Pool

Looks up Raydium CPMM pools by token mint address. Searches on-chain program accounts directly. Returns the first matching pool ID along with both mint addresses and a count of all matching pools. No fee is charged.

FieldTypeRequiredDescription
tokenMintstringRequiredToken mint address to search for
networkstringOptionalDefault: "mainnet-beta"
curl
curl "https://yourapp.com/api/v1/raydium/cpmm-pool-by-token?rpcUrl=https%3A%2F%2Fapi.mainnet-beta.solana.com&tokenMint=TokenMintAddr&network=mainnet-beta" \
  -H "x-api-key: YOUR_API_KEY"
json response
{ "success": true, "poolId": "CpmmPool...", "token0Mint": "TokenMint...", "token1Mint": "So111...112", "poolCount": 1 }
On failure, returns { "success": false, "error": "..." }. If poolCount is greater than 1, multiple pools exist for this token; the first found is returned.
GET/api/v1/raydium/ammv4-pool-by-token

Find AMM V4 Pool

Looks up Raydium AMM V4 pools by token mint address. Searches on-chain program accounts for SOL-paired pools only. Returns the pool ID, both mints, the LP mint address, and a count of all matching pools. No fee is charged.

FieldTypeRequiredDescription
tokenMintstringRequiredToken mint address to search for
networkstringOptionalDefault: "mainnet-beta"
curl
curl "https://yourapp.com/api/v1/raydium/ammv4-pool-by-token?rpcUrl=https%3A%2F%2Fapi.mainnet-beta.solana.com&tokenMint=TokenMintAddr&network=mainnet-beta" \
  -H "x-api-key: YOUR_API_KEY"
json response
{ "success": true, "poolId": "AmmPool...", "lpMint": "LpMint...", "coinMint": "TokenMint...", "pcMint": "So111...112", "poolCount": 1 }
On failure, returns { "success": false, "error": "..." }. coinMint is the base token; pcMint is the quote token (SOL). Only SOL-paired pools are returned. If poolCount is greater than 1, multiple pools exist; the first found is returned.
POST/api/v1/raydium/launchlab-bundle

LaunchLab Bundle

Uploads token metadata to IPFS, creates a new Raydium LaunchLab token, and builds pre-signed buy transactions for bundle wallets. The create transaction is returned unsigned for the deployer to sign and submit. Bundle wallet transactions are pre-signed and ready to broadcast. Platform fee: 0.02 SOL per bundle wallet (charged inside the create transaction).

FieldTypeRequiredDescription
namestringRequiredToken name
symbolstringRequiredToken symbol
imageBase64stringRequiredBase64-encoded image data (data URI or raw base64)
deployerPublicKeystringRequiredDeployer wallet public key (base58)
descriptionstringOptionalToken description
twitterstringOptionalTwitter URL
telegramstringOptionalTelegram URL
websitestringOptionalWebsite URL
discordstringOptionalDiscord URL
initialBuySolnumberOptionalDeployer initial buy in SOL. Default: 0 (no buy)
bundleWalletsobject[]OptionalArray of {"secretKey": "base58key", "solAmount": 0.1}. Each secretKey must be base58-encoded.
slippagenumberOptionalSlippage tolerance in percent. Default: 10
priorityFeenumberOptionalPriority fee in SOL per transaction. Default: 0.001
vanityMintSecretKeystringOptionalBase64-encoded secret key for a vanity mint address. A random keypair is generated if omitted.
networkstringOptionalDefault: "mainnet-beta"
curl
curl -X POST https://yourapp.com/api/v1/raydium/launchlab-bundle \
  -H "Content-Type: application/json" \
  -H "x-api-key: YOUR_API_KEY" \
  -d '{
    "rpcUrl": "https://api.mainnet-beta.solana.com",
    "deployerPublicKey": "DeployerWalletPublicKey",
    "name": "My Token",
    "symbol": "MTK",
    "imageBase64": "data:image/png;base64,iVBORw0KGgo...",
    "bundleWallets": [
      { "secretKey": "base58SecretKey", "solAmount": 0.1 }
    ]
  }'
json response
{
  "mintPublicKey":             "NewMintAddress...",
  "metadataUri":              "https://ipfs.io/ipfs/QmXyz...",
  "createTx":                 "AQAAAA...",
  "createBlockhash":          "9WjABC...",
  "createLastValidBlockHeight": 289540012,
  "bundleTxs": [
    { "wallets": ["Wallet1..."], "signedTx": "AQAAAB...", "blockhash": "9WjABC...", "lastValidBlockHeight": 289540012 }
  ]
}
createTx is a partially-signed legacy transaction (already signed by the mint keypair). Deserialize with Transaction.from(Buffer.from(createTx, 'base64')), add your deployer signature, then broadcast. Each bundleTxs[].signedTx is fully signed and can be broadcast directly.
Bundle wallet private keys are used only to sign buy transactions on the server and are never stored. Submit createTx first and wait for confirmation before submitting bundleTxs.
POST/api/v1/raydium/letsbonk-bundle

LetsBonk Bundle

Identical to the LaunchLab Bundle endpoint but routes the token launch through the LetsBonk platform on Raydium LaunchLab. Accepts the same request body and returns the same response shape. Platform fee: 0.02 SOL per bundle wallet (charged inside the create transaction).

All fields are identical to the LaunchLab Bundle endpoint.

curl
curl -X POST https://yourapp.com/api/v1/raydium/letsbonk-bundle \
  -H "Content-Type: application/json" \
  -H "x-api-key: YOUR_API_KEY" \
  -d '{
    "rpcUrl": "https://api.mainnet-beta.solana.com",
    "deployerPublicKey": "DeployerWalletPublicKey",
    "name": "My Token",
    "symbol": "MTK",
    "imageBase64": "data:image/png;base64,iVBORw0KGgo...",
    "bundleWallets": [
      { "secretKey": "base58SecretKey", "solAmount": 0.1 }
    ]
  }'
json response
{
  "mintPublicKey":             "NewMintAddress...",
  "metadataUri":              "https://ipfs.io/ipfs/QmXyz...",
  "createTx":                 "AQAAAA...",
  "createBlockhash":          "9WjABC...",
  "createLastValidBlockHeight": 289540012,
  "bundleTxs": [
    { "wallets": ["Wallet1..."], "signedTx": "AQAAAB...", "blockhash": "9WjABC...", "lastValidBlockHeight": 289540012 }
  ]
}
createTx is a partially-signed legacy transaction (already signed by the mint keypair). Deserialize with Transaction.from(Buffer.from(createTx, 'base64')), add your deployer signature, then broadcast. Each bundleTxs[].signedTx is fully signed and can be broadcast directly.
Bundle wallet private keys are used only to sign buy transactions on the server and are never stored. Submit createTx first and wait for confirmation before submitting bundleTxs.
POST/api/v1/meteora/create-pool

Create Pool

Creates a Meteora CP-AMM (Dynamic AMM or Stable) pool and adds initial liquidity. DLMM is not supported. Platform fee: 0.07 SOL base (API users: 0.035 SOL) plus 0.02 SOL per bundle wallet.

FieldTypeRequiredDescription
ownerstringRequiredPayer wallet public key
tokenAMintstringRequiredToken A mint address
tokenBMintstringRequiredToken B mint address (typically SOL or USDC)
tokenAAmountstringRequiredToken A amount as a human-readable decimal (e.g. "1000.5"). The server scales by decimals
tokenBAmountstringRequiredToken B amount as a human-readable decimal
feeRatestringOptionalFee percentage as a decimal string (e.g. "0.25" for 0.25%). Default: "0.25"
poolTypestringOptional"stable" for a Stable pool. Any other value creates a Dynamic AMM pool. "dlmm" returns a 400 error
bundleWalletCountnumberOptionalNumber of bundle wallets. Adds 0.02 SOL per wallet to the fee. Default: 0
networkstringOptionalDefault: "mainnet-beta"
curl
curl -X POST https://yourapp.com/api/v1/meteora/create-pool \
  -H "Content-Type: application/json" \
  -H "x-api-key: YOUR_API_KEY" \
  -d '{
    "rpcUrl": "https://api.mainnet-beta.solana.com",
    "owner": "YourWalletPublicKey",
    "tokenAMint": "TokenMintAddress",
    "tokenBMint": "So11111111111111111111111111111111111111112",
    "tokenAAmount": "1000.5",
    "tokenBAmount": "5.5"
  }'
json response
{
  "txBase64": "AQAAAA...",
  "pool": "MetPool...",
  "position": "PosPubkey...",
  "positionNft": "NftPubkey...",
  "tokenAMint": "TokenMint...",
  "warnings": [],
  "blockhash": "9WjABC...",
  "lastValidBlockHeight": 289540012
}
The transaction is pre-signed by the position NFT keypair. Deserialize with Transaction.from(Buffer.from(txBase64, 'base64')), sign with the owner, and broadcast.
POST/api/v1/meteora/pool-info

Pool Info

Returns the current state of a Meteora CP-AMM pool including token mints, decimals, fee mode, and current price. Only Dynamic AMM and Stable pools are supported. No fee is charged.

FieldTypeRequiredDescription
poolAddressstringRequiredMeteora CP-AMM pool address
networkstringOptionalDefault: "mainnet-beta"
curl
curl -X POST https://yourapp.com/api/v1/meteora/pool-info \
  -H "Content-Type: application/json" \
  -H "x-api-key: YOUR_API_KEY" \
  -d '{
    "rpcUrl": "https://api.mainnet-beta.solana.com",
    "poolAddress": "MeteoraPoolAddress"
  }'
json response
{
  "tokenAMint": "TokenMint...",
  "tokenBMint": "So11111...",
  "tokenADecimals": 6,
  "tokenBDecimals": 9,
  "collectFeeMode": 0,
  "currentPrice": 0.001
}
collectFeeMode: 0 = BothToken (Dynamic AMM), 2 = Compounding (Stable). DLMM pool addresses return a 400 error.
POST/api/v1/meteora/preview-liquidity

Preview Liquidity

Returns a quote for adding liquidity to a Meteora CP-AMM pool: the required token B amount paired with the given token A amount, plus the current price. No transaction is built and no fee is charged.

FieldTypeRequiredDescription
poolAddressstringRequiredMeteora CP-AMM pool address
tokenAAmountstringRequiredToken A amount as a human-readable decimal (e.g. "100.5")
networkstringOptionalDefault: "mainnet-beta"
curl
curl -X POST https://yourapp.com/api/v1/meteora/preview-liquidity \
  -H "Content-Type: application/json" \
  -H "x-api-key: YOUR_API_KEY" \
  -d '{
    "rpcUrl": "https://api.mainnet-beta.solana.com",
    "poolAddress": "MeteoraPoolAddress",
    "tokenAAmount": "100.5"
  }'
json response
{
  "success": true,
  "tokenBAmount": "0.100000000",
  "tokenAMint": "TokenMint...",
  "tokenBMint": "So11111...",
  "currentPrice": 0.001
}
POST/api/v1/meteora/add-liquidity

Add Liquidity

Builds a transaction to add liquidity to an existing Meteora CP-AMM pool. Creates a new position if the wallet has none. Platform fee: 0.02 SOL (API users: 0.01 SOL).

FieldTypeRequiredDescription
ownerstringRequiredLiquidity provider wallet
poolAddressstringRequiredMeteora CP-AMM pool address
tokenAAmountstringRequiredToken A amount as a human-readable decimal (e.g. "100.5")
tokenBAmountstringRequiredToken B amount as a human-readable decimal
slippagenumberOptionalSlippage tolerance in percent. Default: 1
networkstringOptionalDefault: "mainnet-beta"
curl
curl -X POST https://yourapp.com/api/v1/meteora/add-liquidity \
  -H "Content-Type: application/json" \
  -H "x-api-key: YOUR_API_KEY" \
  -d '{
    "rpcUrl": "https://api.mainnet-beta.solana.com",
    "owner": "YourWalletPublicKey",
    "poolAddress": "MeteoraPoolAddress",
    "tokenAAmount": "100.5",
    "tokenBAmount": "0.5"
  }'
json response
{
  "txBase64": "AQAAAA...",
  "position": "PosPubkey...",
  "positionNft": "NftPubkey...",
  "tokenAMint": "TokenMint...",
  "tokenBMint": "So11111...",
  "warnings": [],
  "blockhash": "9WjABC...",
  "lastValidBlockHeight": 289540012
}
positionNft is only present when a new position is created. Deserialize with Transaction.from(Buffer.from(txBase64, 'base64')) and sign with the owner.
POST/api/v1/meteora/remove-liquidity

Remove Liquidity

Builds a transaction to withdraw liquidity from a Meteora CP-AMM pool position. Platform fee: 0.02 SOL (API users: 0.01 SOL).

FieldTypeRequiredDescription
ownerstringRequiredPosition owner wallet
poolAddressstringRequiredMeteora CP-AMM pool address
removePercentnumberOptionalPercentage of position to remove (1 to 100). Default: 100 (full removal)
networkstringOptionalDefault: "mainnet-beta"
curl
curl -X POST https://yourapp.com/api/v1/meteora/remove-liquidity \
  -H "Content-Type: application/json" \
  -H "x-api-key: YOUR_API_KEY" \
  -d '{
    "rpcUrl": "https://api.mainnet-beta.solana.com",
    "owner": "YourWalletPublicKey",
    "poolAddress": "MeteoraPoolAddress"
  }'
json response
{
  "txBase64": "AQAAAA...",
  "position": "PosPubkey...",
  "warnings": [],
  "blockhash": "9WjABC...",
  "lastValidBlockHeight": 289540012
}
This is a legacy transaction. Deserialize with Transaction.from(Buffer.from(txBase64, 'base64')), sign with the owner, and broadcast.
GET/api/v1/meteora/pool-by-token

Find Pool

Looks up Meteora CP-AMM pools by token mint address, searching both the tokenA and tokenB positions. Returns the first matching pool. No fee is charged.

FieldTypeRequiredDescription
tokenMintstringRequiredToken mint address to search for
networkstringOptionalDefault: "mainnet-beta"
curl
curl "https://yourapp.com/api/v1/meteora/pool-by-token?rpcUrl=https%3A%2F%2Fapi.mainnet-beta.solana.com&tokenMint=TokenMintAddr" \
  -H "x-api-key: YOUR_API_KEY"
json response
{
  "success": true,
  "poolAddress": "MetPool...",
  "tokenAMint": "TokenMint...",
  "tokenBMint": "So11111...",
  "poolCount": 1
}
On failure, returns { "success": false, "error": "..." }. If poolCount is greater than 1, multiple pools exist for this token; the first found is returned.
POST/api/v1/pumpswap/pool-info

Pool Info

Returns current state of a PumpSwap AMM pool: reserves, LP mint, and base token decimals. When a wallet address is provided, the LP token balance for that wallet is also returned. No fee is charged.

FieldTypeRequiredDescription
poolAddressstringRequiredPumpSwap pool address
walletAddressstringOptionalWallet to include LP token balance in response
networkstringOptionalDefault: "mainnet-beta"
curl
curl -X POST https://yourapp.com/api/v1/pumpswap/pool-info \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "rpcUrl": "https://api.mainnet-beta.solana.com",
  "poolAddress": "PsPoolAddr..."
}'
json response
{
  "success": true,
  "lpMint": "LpMint...",
  "baseMint": "TokenMint...",
  "quoteMint": "So11111...",
  "baseReserve": "5000000000000",
  "quoteReserve": "1000000000",
  "baseDecimals": 6,
  "lpBalance": "12345678",
  "lpBalanceRaw": "12345678000"
}
lpBalance and lpBalanceRaw are only present when walletAddress is provided.
POST/api/v1/pumpswap/create-pool

Create Pool

Creates a PumpSwap AMM pool and adds initial liquidity. Platform fee: 0.07 SOL (API users: 0.035 SOL).

FieldTypeRequiredDescription
walletAddressstringRequiredPayer wallet public key
baseMintstringRequiredToken mint address
baseAmountstringRequiredInitial token amount in raw units
quoteAmountstringRequiredInitial SOL amount in lamports
poolIndexnumberOptionalPool index for disambiguation. Default: 0
bundleWalletCountnumberOptionalNumber of bundle wallets to include
networkstringOptionalDefault: "mainnet-beta"
curl
curl -X POST https://yourapp.com/api/v1/pumpswap/create-pool \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "rpcUrl": "https://api.mainnet-beta.solana.com",
  "walletAddress": "YourWallet...",
  "baseMint": "TokenMint...",
  "baseAmount": "1000000000",
  "quoteAmount": "1000000000"
}'
json response
{
  "success": true,
  "tx": "AQAAAA...",
  "poolAddress": "PsPool...",
  "baseMint": "TokenMint...",
  "blockhash": "9WjABC...",
  "lastValidBlockHeight": 289540012
}
This is a V0 (versioned) transaction. Deserialize with VersionedTransaction.deserialize(Buffer.from(tx, 'base64')), sign with the payer wallet, and broadcast.
POST/api/v1/pumpswap/preview-liquidity

Preview Liquidity

Returns a computed counterpart amount and current price for adding liquidity to a PumpSwap pool. No transaction is built and no fee is charged.

FieldTypeRequiredDescription
poolAddressstringRequiredPumpSwap pool address
amountstringRequiredAmount to add in raw units
isBaseAmountbooleanOptionalIf true, amount is in base token units. If false, it is in quote (SOL) lamports. Default: false
networkstringOptionalDefault: "mainnet-beta"
curl
curl -X POST https://yourapp.com/api/v1/pumpswap/preview-liquidity \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "rpcUrl": "https://api.mainnet-beta.solana.com",
  "poolAddress": "PsPoolAddr...",
  "amount": "1000000000",
  "isBaseAmount": false
}'
json response
{
  "success": true,
  "computedAmount": "200000000",
  "isBaseAmount": false,
  "baseMint": "TokenMint...",
  "baseDecimals": 6,
  "currentPrice": 0.0002
}
POST/api/v1/pumpswap/add-liquidity

Add Liquidity

Builds a transaction to add liquidity to an existing PumpSwap pool. Platform fee: 0.02 SOL (API users: 0.01 SOL).

FieldTypeRequiredDescription
walletAddressstringRequiredLiquidity provider wallet
poolAddressstringRequiredPumpSwap pool address
amountstringRequiredAmount to deposit in raw units
isBaseAmountbooleanOptionalIf true, amount is in base token units. If false, it is in quote (SOL) lamports. Default: true
slippagenumberOptionalSlippage tolerance in percent. Default: 1
networkstringOptionalDefault: "mainnet-beta"
curl
curl -X POST https://yourapp.com/api/v1/pumpswap/add-liquidity \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "rpcUrl": "https://api.mainnet-beta.solana.com",
  "walletAddress": "YourWallet...",
  "poolAddress": "PsPoolAddr...",
  "amount": "1000000000",
  "isBaseAmount": true
}'
json response
{
  "success": true,
  "tx": "AQAAAA...",
  "blockhash": "9WjABC...",
  "lastValidBlockHeight": 289540012
}
This is a V0 (versioned) transaction. Deserialize with VersionedTransaction.deserialize(Buffer.from(tx, 'base64')), sign with the wallet, and broadcast.
POST/api/v1/pumpswap/remove-liquidity

Remove Liquidity

Builds a transaction to remove liquidity from a PumpSwap pool by redeeming LP tokens. Platform fee: 0.02 SOL (API users: 0.01 SOL).

FieldTypeRequiredDescription
walletAddressstringRequiredLP token holder wallet
poolAddressstringRequiredPumpSwap pool address
lpAmountstringOptionalExact LP token amount to redeem in raw units. Provide this or removePercent
removePercentnumberOptionalPercentage of LP position to remove (1 to 100). Provide this or lpAmount
slippagenumberOptionalSlippage tolerance in percent. Default: 1
networkstringOptionalDefault: "mainnet-beta"
curl
curl -X POST https://yourapp.com/api/v1/pumpswap/remove-liquidity \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "rpcUrl": "https://api.mainnet-beta.solana.com",
  "walletAddress": "YourWallet...",
  "poolAddress": "PsPoolAddr...",
  "removePercent": 100
}'
json response
{
  "success": true,
  "tx": "AQAAAA...",
  "blockhash": "9WjABC...",
  "lastValidBlockHeight": 289540012
}
This is a V0 (versioned) transaction. Deserialize with VersionedTransaction.deserialize(Buffer.from(tx, 'base64')), sign with the wallet, and broadcast.
GET/api/v1/pumpswap/pool-by-token

Find Pool

Looks up a PumpSwap pool by token mint address. When a wallet address is provided, a secondary lookup checks for a user-created pool at index 0 for that wallet before falling back to a full program scan. No fee is charged.

FieldTypeRequiredDescription
tokenMintstringRequiredToken mint address to search for
networkstringOptionalDefault: "mainnet-beta"
walletAddressstringOptionalWallet address used to check for a user-created pool at index 0 before doing a full program scan
curl
curl "https://yourapp.com/api/v1/pumpswap/pool-by-token?rpcUrl=https%3A%2F%2Fapi.mainnet-beta.solana.com&tokenMint=TokenMintAddr" \
  -H "x-api-key: YOUR_API_KEY"
json response
{
  "success": true,
  "poolAddress": "PsPool...",
  "baseMint": "TokenMint...",
  "quoteMint": "So11111..."
}
On failure, returns { "success": false, "error": "..." }. To get reserves and price for a found pool, call the Pool Info endpoint with the returned poolAddress.
POST/api/v1/locker/create

Lock Tokens

Creates a time-locked vesting schedule on-chain using the Bonfida token-vesting program. Supports locking both SPL tokens and Raydium/Meteora LP tokens. Tokens are fully locked until the unlock date. Platform fee: 0.1 SOL for SPL tokens, 0.4 SOL for LP tokens (API users: 0.05 SOL / 0.2 SOL).

FieldTypeRequiredDescription
walletAddressstringRequiredToken owner wallet public key
mintAddressstringRequiredMint address of the token or LP token to lock
amountstringRequiredHuman-readable amount to lock (scaled by decimals server-side)
decimalsnumberOptionalToken decimals. Default: 0
unlockDatenumberRequiredUnix timestamp (seconds) when tokens become unlockable
destinationAddressstringOptionalBeneficiary wallet that receives unlocked tokens. Defaults to walletAddress
isLpTokenbooleanOptionalSet to true for LP token locks (higher fee applies). Default: false
networkstringOptionalDefault: "mainnet-beta"
curl
curl -X POST https://yourapp.com/api/v1/locker/create \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "rpcUrl": "https://api.mainnet-beta.solana.com",
  "walletAddress": "YourWallet...",
  "mintAddress": "TokenMint...",
  "amount": "1000000",
  "decimals": 6,
  "unlockDate": 1800000000,
  "isLpToken": false
}'
json response
{
  "success": true,
  "tx": "AQAAAA...",
  "blockhash": "9WjABC...",
  "lastValidBlockHeight": 289540012,
  "contractId": "4xK3m...",
  "vestingAccount": "VestingAcct..."
}
Save both contractId and vestingAccount. Either can be passed to Get Lock Info or Unlock Tokens. This is a V0 (versioned) transaction — deserialize with VersionedTransaction.deserialize(Buffer.from(tx, 'base64')), sign with the owner wallet, and broadcast to complete the lock.
POST/api/v1/locker/unlock

Unlock Tokens

Builds a transaction to withdraw locked tokens after the unlock date has passed. The server verifies on-chain that the lock exists and the schedule is readable before building the transaction. No fee is charged at unlock time.

FieldTypeRequiredDescription
walletAddressstringRequiredWallet that will sign and submit the unlock transaction
contractIdstringRequiredLock ID returned in the contractId field when the lock was created
networkstringOptionalDefault: "mainnet-beta"
curl
curl -X POST https://yourapp.com/api/v1/locker/unlock \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "rpcUrl": "https://api.mainnet-beta.solana.com",
  "walletAddress": "YourWallet...",
  "contractId": "4xK3m..."
}'
json response
{ "success": true, "tx": "AQAAAA...", "blockhash": "9WjABC...", "lastValidBlockHeight": 289540012 }
This is a V0 (versioned) transaction. Deserialize with VersionedTransaction.deserialize(Buffer.from(tx, 'base64')), sign with the wallet, and broadcast. The server verifies the lock exists on-chain before building the transaction.
GET/api/v1/locker/lock/:vestingAccount

Get Lock Info

Returns the on-chain state of a specific vesting account: mint, amount, beneficiary, unlock timestamp, and whether the lock is still active. No fee is charged.

FieldTypeRequiredDescription
vestingAccountstringRequiredVesting account public key (in URL path)
FieldTypeRequiredDescription
networkstringOptionalDefault: "mainnet-beta"
curl
curl "https://yourapp.com/api/v1/locker/lock/VestingAcct...?rpcUrl=https%3A%2F%2Fapi.mainnet-beta.solana.com&network=mainnet-beta" \
  -H "x-api-key: YOUR_API_KEY"
json response
{
  "success": true,
  "vestingAccount": "VestingAcct...",
  "mintAddress": "TokenMint...",
  "destinationAddress": "WalletAddr...",
  "decimals": 6,
  "lockedBalance": "1000000000000",
  "schedules": [{ "releaseTime": "1800000000", "amount": "1000000000000" }]
}
You can pass either the vesting account address or the contractId as the path parameter. If metadata was saved via Save Lock Metadata, the response also includes twitter, telegram, discord, website, and creatorWallet fields.
POST/api/v1/locker/save-meta

Save Lock Metadata

Saves optional social and creator metadata for a lock to the Solauncher database. This metadata is returned alongside lock info queries. No fee is charged.

FieldTypeRequiredDescription
vestingAccountstringRequiredVesting account address returned when the lock was created
mintAddressstringRequiredToken mint address for the lock
destinationAddressstringRequiredBeneficiary wallet address for the lock
creatorWalletstringOptionalWallet that created the lock
unlockDatenumberOptionalUnix timestamp of the unlock date
decimalsnumberOptionalToken decimals
isLpTokenbooleanOptionalWhether this lock holds an LP token
twitterstringOptionalTwitter/X URL (must be http/https)
telegramstringOptionalTelegram URL
discordstringOptionalDiscord URL
websitestringOptionalWebsite URL
curl
curl -X POST https://yourapp.com/api/v1/locker/save-meta \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "rpcUrl": "https://api.mainnet-beta.solana.com",
  "vestingAccount": "VestingAcct...",
  "mintAddress": "TokenMint...",
  "destinationAddress": "WalletAddr...",
  "twitter": "https://x.com/yourproject",
  "website": "https://yourproject.com"
}'
json response
{ "success": true }
Social link fields (twitter, telegram, discord, website) must be valid http or https URLs. Invalid or non-http/https values are silently dropped.
GET/api/v1/locker/by-mint

Locks by Mint

Returns all vesting locks that exist for a given token mint address. Useful for displaying the lock history on a token info page. No fee is charged.

FieldTypeRequiredDescription
mintstringRequiredToken mint address
networkstringOptionalDefault: "mainnet-beta"
curl
curl "https://yourapp.com/api/v1/locker/by-mint?rpcUrl=https%3A%2F%2Fapi.mainnet-beta.solana.com&mint=TokenMintAddr" \
  -H "x-api-key: YOUR_API_KEY"
json response
{
  "success": true,
  "decimals": 6,
  "locks": [{
    "vestingAccount": "VestingAcct...",
    "destinationAddress": "WalletAddr...",
    "mintAddress": "TokenMint...",
    "schedules": [{ "releaseTime": "1800000000", "amount": "500000000000" }]
  }]
}
GET/api/v1/rent/closeable/:wallet

Find Closeable Accounts

Returns a list of empty token accounts owned by the wallet that can be closed to recover their rent-exempt SOL deposit. Each entry includes the account address, the token mint, and the recoverable SOL amount. No fee is charged for this lookup.

FieldTypeRequiredDescription
walletstringRequiredWallet public key (in URL path)
FieldTypeRequiredDescription
networkstringOptionalDefault: "mainnet-beta"
curl
curl "https://yourapp.com/api/v1/rent/closeable/YourWallet?rpcUrl=https%3A%2F%2Fapi.mainnet-beta.solana.com&network=mainnet-beta" \
  -H "x-api-key: YOUR_API_KEY"
json response
{
  "accounts": [
    { "pubkey": "Acct1...", "mint": "Mint1...", "lamports": 2039280, "state": "initialized", "programId": "TokenkegQ..." },
    { "pubkey": "Acct2...", "mint": "Mint2...", "lamports": 2039280, "state": "initialized", "programId": "TokenkegQ..." }
  ],
  "totalRecoverable": 4078560,
  "count": 2,
  "batchCount": 1
}
POST/api/v1/rent/close/build

Close Accounts

Builds one or more transactions to close selected empty token accounts and return their rent-exempt SOL to the wallet. Accounts are batched at 19 per transaction. Platform fee: 8% of totalLamports deducted from the first batch transaction (API users: 4%).

FieldTypeRequiredDescription
ownerstringRequiredWallet that owns the accounts and will sign the transactions
accountsToClosestring[] or object[]RequiredArray of token account addresses to close. Each entry is a string address or {"pubkey":"...","programId":"..."} for Token-2022 accounts
destinationstringOptionalAddress that receives the recovered SOL. Defaults to owner
totalLamportsnumberOptionalTotal lamports expected to be recovered. Used to compute the 8% platform fee for the first batch
networkstringOptionalDefault: "mainnet-beta"
curl
curl -X POST https://yourapp.com/api/v1/rent/close/build \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "rpcUrl": "https://api.mainnet-beta.solana.com",
  "owner": "YourWallet...",
  "accountsToClose": ["Acct1...", "Acct2..."],
  "totalLamports": 4078560
}'
json response
{
  "transactions": ["AQAAAA...", "AQBBBB..."],
  "batchCount": 2,
  "totalAccounts": 25,
  "blockhash": "9WjABC...",
  "lastValidBlockHeight": 289540012
}
These are legacy transactions. Deserialize each with Transaction.from(Buffer.from(tx, 'base64')), sign with the owner wallet, and submit in order. The fee is deducted inside the first transaction only. Pass the pubkey values from the Find Closeable Accounts response as accountsToClose. For Token-2022 accounts, pass objects: { "pubkey": "...", "programId": "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb" }.
GET/api/v1/claim-fees/balances/:wallet

Get Claimable Balances

Returns the claimable creator fee balance for a given wallet across Pump.fun and Raydium LaunchLab / LetsBonk. No fee is charged for this read-only call. The rpcUrl query parameter is required.

FieldTypeRequiredDescription
walletstringRequiredSolana wallet public key (base58) of the token creator
FieldTypeRequiredDescription
rpcUrlstringRequiredYour Solana RPC endpoint URL
curl
curl "https://yourapp.com/api/v1/claim-fees/balances/YourWalletAddress?rpcUrl=https%3A%2F%2Fapi.mainnet-beta.solana.com" \
  -H "x-api-key: YOUR_API_KEY"
json response
{
  "pumpfun": {
    "creatorVault":      "7xKX...",
    "claimableLamports": 12345678,
    "claimableSol":     0.012345678
  },
  "launchlab": {
    "wsolAta":           "4rPQ...",
    "claimableLamports": 56789012,
    "claimableSol":     0.056789012
  },
  "totalClaimableSol": 0.06913469
}
Pump.fun claimable lamports are the creator vault balance minus the 890880 lamport rent-exempt reserve held in the PDA. LaunchLab claimable lamports are the raw token amount of the wSOL ATA (each unit equals one lamport of SOL).
POST/api/v1/claim-fees/build

Build Claim Transaction

Builds an unsigned Solana transaction that claims creator fees from one or both supported platforms and transfers a 2.5% platform fee (half of the standard 5%) to the Solauncher treasury. Sign and submit the returned base64 transaction with your wallet.

FieldTypeRequiredDescription
walletstringRequiredSolana wallet public key of the creator claiming fees
rpcUrlstringRequiredYour Solana RPC endpoint URL
platformsstring[]RequiredPlatforms to claim from. Valid values: "pumpfun", "launchlab"
pumpfunLamportsnumberOptionalExpected claimable lamports from Pump.fun. Required when pumpfun is in platforms.
launchlabLamportsnumberOptionalExpected claimable lamports from LaunchLab / LetsBonk. Required when launchlab is in platforms.
curl
curl -X POST https://yourapp.com/api/v1/claim-fees/build \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "rpcUrl": "https://api.mainnet-beta.solana.com",
  "wallet": "YourWalletAddress...",
  "platforms": ["pumpfun", "launchlab"],
  "pumpfunLamports": 12345678,
  "launchlabLamports": 56789012
}'
json response
{
  "transaction":          "base64EncodedTransaction...",
  "blockhash":            "9WjABC...",
  "lastValidBlockHeight": 289540012,
  "feeLamports":         3456,
  "platforms":           ["pumpfun", "launchlab"]
}
This is a legacy transaction. Deserialize with Transaction.from(Buffer.from(transaction, 'base64')), sign with the creator wallet, and broadcast. The platform fee is embedded as a transfer instruction and is only charged if the transaction confirms. Use the balances endpoint first to get the lamport values for pumpfunLamports and launchlabLamports.
POST/api/v1/assets/get-asset

Get Wallet Assets

Returns all SPL and Token-2022 fungible token holdings for a wallet, including mint address, raw and human-readable balance, decimals, token program, name, symbol, and logo URI. No fee is charged.

FieldTypeRequiredDescription
wallet_addressstringRequiredSolana wallet public key
networkstringOptionalDefault: "mainnet-beta"
curl
curl -X POST https://yourapp.com/api/v1/assets/get-asset \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "rpcUrl": "https://api.mainnet-beta.solana.com",
  "wallet_address": "YourWallet..."
}'
json response
{
  "success": true,
  "data": {
    "tokens": [
      {
        "mintAddress": "TokenMint...",
        "rawAmount": "1000000000",
        "tokenProgram": "TokenkegQ...",
        "decimals": 6,
        "balance": "1000.000000",
        "name": "My Token",
        "symbol": "MTK",
        "img_uri": "https://..."
      }
    ]
  }
}
POST/api/v1/wallets/generate

Generate Wallets

Generates one or more fresh Solana keypairs server-side and returns the public and secret keys. Useful for seeding bot wallets in bulk. Maximum 500 wallets per request. No fee is charged, but treat the response as highly sensitive.

FieldTypeRequiredDescription
countnumberRequiredNumber of keypairs to generate (1 to 500)
curl
curl -X POST https://yourapp.com/api/v1/wallets/generate \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "rpcUrl": "https://api.mainnet-beta.solana.com",
  "count": 5
}'
json response
{
  "wallets": [
    { "publicKey": "Pub1abc...", "secretKey": "5K8LsND6g..." },
    { "publicKey": "Pub2xyz...", "secretKey": "3mFpXQr7t..." }
  ]
}
Secret keys are returned in plaintext. Use HTTPS and store them securely. Do not log or expose secret keys.
POST/api/v1/wallets/vanity

Vanity Wallet Address

Generates a Solana keypair whose public key starts with a given prefix or ends with a given suffix. At least one of the two fields is required. The combined length of prefix and suffix must be 6 characters or fewer. Longer patterns take significantly more compute time. No fee is charged.

FieldTypeRequiredDescription
prefixstringOptionalDesired base58 address prefix. Combined length of prefix and suffix must not exceed 6 characters.
suffixstringOptionalDesired base58 address suffix. Combined length of prefix and suffix must not exceed 6 characters.
curl
curl -X POST https://yourapp.com/api/v1/wallets/vanity \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "rpcUrl": "https://api.mainnet-beta.solana.com",
  "prefix": "COOL"
}'
json response
{ "publicKey": "COOL4xyz...", "secretKey": "5K8LsND6g...", "attempts": 218340 }
POST/api/v1/dex/bundle-buy/build

Bundle Buy Build

Builds unsigned buy transactions for one or more wallets. Private keys never leave the caller's machine. The server fetches Jupiter quotes, constructs VersionedTransactions, embeds a Jito tip and platform fee in the first transaction, then returns base64-encoded unsigned transactions for the caller to sign locally and submit.

FieldTypeRequiredDescription
rpcUrlstringRequiredYour Solana RPC endpoint URL
tokenMintstringRequiredToken mint address to buy
walletsarrayRequiredArray of { publicKey, buyAmountSol } objects
slippagenumberOptionalSlippage tolerance in percent. Default: 10
jitoTipSolnumberOptionalJito tip in SOL. Default: 0.001
receivingAddressstringOptionalOptional destination wallet for received tokens (defaults to each buying wallet)
curl
curl -X POST https://yourapp.com/api/v1/dex/bundle-buy/build \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "rpcUrl": "https://api.mainnet-beta.solana.com",
  "tokenMint": "TokenMint111111111111111111111111111111111",
  "wallets": [
    { "publicKey": "Wallet1Pk...", "buyAmountSol": 0.5 },
    { "publicKey": "Wallet2Pk...", "buyAmountSol": 0.3 }
  ],
  "slippage": 10,
  "jitoTipSol": 0.001
}'
json response
{
  "transactions": [
    {
      "wallet": "Wallet1Pk...",
      "unsignedTransaction": "base64encodedtx...",
      "quote": { "inAmount": "500000000", "outAmount": "12300000", "priceImpactPct": 0.12 },
      "blockhash": "Blockhash...",
      "lastValidBlockHeight": 290000000,
      "jitoTipIncluded": true,
      "platformFeeIncluded": true
    }
  ],
  "summary": { "total": 2, "built": 2, "failed": 0 },
  "nextStep": "Sign each transaction with its wallet and submit to POST /api/v1/dex/bundle/submit"
}
POST/api/v1/dex/bundle-sell/build

Bundle Sell Build

Builds unsigned sell transactions for one or more wallets. The server fetches each wallet's on-chain token balance, calculates the sell amount from either an explicit amount or a percentage, builds Jupiter swap instructions, and returns base64-encoded unsigned transactions. The Jito tip and platform fee are bundled into the first (largest-balance) transaction only.

FieldTypeRequiredDescription
rpcUrlstringRequiredYour Solana RPC endpoint URL
tokenMintstringRequiredToken mint address to sell
walletsarrayRequiredArray of { publicKey, sellAmountTokens? } objects. If sellAmountTokens is omitted, sellPercent applies.
tokenDecimalsnumberOptionalToken decimals used to convert sellAmountTokens. Default: 6
sellPercentnumberOptionalPercent of balance to sell when no explicit amount is given. Default: 100
slippagenumberOptionalSlippage tolerance in percent. Default: 10
jitoTipSolnumberOptionalJito tip in SOL. Default: 0.001
receivingAddressstringOptionalOptional destination wallet for received SOL
curl
curl -X POST https://yourapp.com/api/v1/dex/bundle-sell/build \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "rpcUrl": "https://api.mainnet-beta.solana.com",
  "tokenMint": "TokenMint111111111111111111111111111111111",
  "wallets": [
    { "publicKey": "Wallet1Pk..." },
    { "publicKey": "Wallet2Pk...", "sellAmountTokens": 500 }
  ],
  "sellPercent": 100,
  "slippage": 10
}'
json response
{
  "transactions": [
    {
      "wallet": "Wallet1Pk...",
      "unsignedTransaction": "base64encodedtx...",
      "quote": { "inAmount": "12000000", "outAmount": "482000000", "priceImpactPct": 0.08 },
      "blockhash": "Blockhash...",
      "lastValidBlockHeight": 290000001,
      "tokenBalance": "12000000",
      "sellAmount": "12000000",
      "jitoTipIncluded": true,
      "platformFeeIncluded": true
    }
  ],
  "summary": { "total": 2, "built": 2, "failed": 0 },
  "nextStep": "Sign each transaction with its wallet and submit to POST /api/v1/dex/bundle/submit"
}
POST/api/v1/dex/bundle/submit

Bundle Submit

Accepts signed base64-encoded transactions and broadcasts them as Jito bundles. Transactions are grouped in batches of 5 (the Jito bundle limit). Each group is sent as a single atomic bundle and the server waits for confirmation of the first transaction in each group before responding.

FieldTypeRequiredDescription
rpcUrlstringRequiredYour Solana RPC endpoint URL
transactionsarrayRequiredArray of signed base64-encoded VersionedTransaction strings
curl
curl -X POST https://yourapp.com/api/v1/dex/bundle/submit \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "rpcUrl": "https://api.mainnet-beta.solana.com",
  "transactions": ["signedBase64Tx1...", "signedBase64Tx2..."]
}'
json response
{
  "bundles": [
    {
      "bundleIndex": 0,
      "bundleId": "abc123...",
      "status": "confirmed",
      "count": 2,
      "signatures": ["sig1...", "sig2..."]
    }
  ],
  "summary": { "total": 1, "confirmed": 1, "sent": 0, "failed": 0 }
}
POST/api/v1/dex/volume-bot/estimate

Estimate Bot Cost

Returns a cost breakdown for a given bot configuration without creating any wallets or on-chain state. Use this to display a cost preview before asking the user to fund the bot. No fee is charged.

FieldTypeRequiredDescription
rpcUrlstringRequiredYour Solana RPC endpoint URL
bot_typestringOptional"volume", "booster", or "advanced". Default: "volume"
maker_countnumberOptionalNumber of maker wallets (1 to 1000). Default: 100
v_maker_amountnumberOptionalTotal SOL to trade for volume bot
b_put_amountnumberOptionalTotal SOL to put in for booster bot
adv_buy_min_solnumberOptionalMin buy amount per maker for advanced bot. Default: 0.01
adv_buy_max_solnumberOptionalMax buy amount per maker for advanced bot. Default: 0.05
priority_feenumberOptionalPriority fee per transaction in SOL. Default: 0
pool_typestringOptional"pumpfun", "pumpswap", or omit for standard pools
token_disposalstringOptionalFor advanced bot: "auto-sell" or "return-to-wallet"
curl
curl -X POST https://yourapp.com/api/v1/dex/volume-bot/estimate \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "rpcUrl": "https://api.mainnet-beta.solana.com",
  "bot_type": "volume",
  "maker_count": 100,
  "v_maker_amount": 5
}'
json response
{
  "bot_type": "volume",
  "maker_count": 100,
  "service_fee_sol": 0.025,
  "gas_buffer": "0.413 SOL",
  "gas_and_swap_fees": "0.018 SOL",
  "refunded_sol": "5.390 SOL",
  "generated_volume": "10.000 SOL"
}
POST/api/v1/dex/volume-bot/setup

Setup Volume Bot

Generates maker wallets and a pool keypair server-side, stores them encrypted, and returns an unsigned legacy Transaction for the caller to sign and broadcast. The transaction transfers the service fee to the platform and seeds the pool keypair with trading capital. After broadcasting, call POST /api/v1/dex/volume-bot/start with the confirmed signature. The pending setup expires automatically after 30 minutes if not started.

FieldTypeRequiredDescription
rpcUrlstringRequiredYour Solana RPC endpoint URL
token_mint_addressstringRequiredToken mint address to trade
payerstringRequiredPublic key of the wallet that will sign and fund the setup transaction
bot_typestringOptional"volume", "booster", or "advanced". Default: "volume"
bot_speedstringOptional"SLOW", "NORMAL", or "FAST". Default: "SLOW"
maker_countnumberOptionalNumber of maker wallets (1 to 1000). Default: 100
v_maker_amountnumberOptionalTotal SOL for volume bot trading capital
b_put_amountnumberOptionalTotal SOL for booster bot
adv_buy_min_solnumberOptionalMin buy per maker for advanced bot
adv_buy_max_solnumberOptionalMax buy per maker for advanced bot
adv_delay_min_msnumberOptionalMin delay between advanced bot trades in ms. Default: 5000
adv_delay_max_msnumberOptionalMax delay between advanced bot trades in ms. Default: 15000
slippage_bpsnumberOptionalSlippage in basis points. Default: 1000
priority_feenumberOptionalPriority fee per transaction in SOL. Default: 0
pool_addressstringOptionalOptional pool address to use direct swaps instead of Jupiter routing
pool_typestringOptional"pumpfun", "pumpswap", "raydium", etc. Auto-detected if pool_address is provided and this is omitted.
token_disposalstringOptionalFor advanced bot: "auto-sell" or "return-to-wallet". Default: "auto-sell"
networkstringOptional"mainnet-beta" or "devnet". Default: "mainnet-beta"
curl
curl -X POST https://yourapp.com/api/v1/dex/volume-bot/setup \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "rpcUrl": "https://api.mainnet-beta.solana.com",
  "token_mint_address": "TokenMint111...",
  "payer": "YourWalletPublicKey...",
  "bot_type": "volume",
  "maker_count": 100,
  "v_maker_amount": 5,
  "bot_speed": "NORMAL"
}'
json response
{
  "unsignedTransaction": "base64encodedlegacytx...",
  "transactionDetails": { "feePayer": "YourWalletPublicKey...", "recentBlockhash": "Blockhash...", "lastValidBlockHeight": 290000000 },
  "poolPubkey": "PoolKeypairPublicKey...",
  "estimatedSwapFee": 0.0025,
  "costs": { "serviceFee": 0.025, "poolFunding": 5.413, "total": 5.438 },
  "makerCount": 100,
  "nextStep": "Sign the transaction with the payer wallet, broadcast it, then call POST /api/v1/dex/volume-bot/start with the confirmed signature"
}
POST/api/v1/dex/volume-bot/start

Start Volume Bot

Verifies the on-chain funding transaction from the setup step, then starts the bot in the background. The endpoint returns immediately with a job ID. Bot progress is streamed in real time via WebSocket at wss://yourapp.com/ws/bot-logs. When the bot completes, all unused SOL is automatically returned to the payer wallet.

FieldTypeRequiredDescription
rpcUrlstringRequiredYour Solana RPC endpoint URL
wallet_addressstringRequiredThe payer public key used in the setup step
signaturestringRequiredConfirmed on-chain signature of the setup funding transaction
networkstringOptional"mainnet-beta" or "devnet". Must match the value used in setup. Default: "mainnet-beta"
curl
curl -X POST https://yourapp.com/api/v1/dex/volume-bot/start \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "rpcUrl": "https://api.mainnet-beta.solana.com",
  "wallet_address": "YourWalletPublicKey...",
  "signature": "confirmedFundingTxSignature..."
}'
json response
{
  "jobId": "job_abc123",
  "status": "started",
  "makerCount": 100
}
GET/api/v1/dex/volume-bot/:jobId

Bot Status

Returns the current status and trade statistics for a running or completed bot job. Poll this endpoint or use the WebSocket stream for live updates. Jobs remain in memory until the server restarts.

FieldTypeRequiredDescription
jobIdstringRequiredJob ID returned by POST /api/v1/dex/volume-bot/start
curl
curl "https://yourapp.com/api/v1/dex/volume-bot/job_abc123?rpcUrl=https%3A%2F%2Fapi.mainnet-beta.solana.com" \
  -H "x-api-key: YOUR_API_KEY"
json response
{
  "jobId": "job_abc123",
  "type": "maker",
  "status": "running",
  "tradesExecuted": 42,
  "errors": 0,
  "startedAt": 1750000000000,
  "completedAt": null,
  "lastError": null
}
POST/api/v1/dex/volume-bot/:jobId/stop

Stop Bot

Signals a running bot to stop. The bot will finish its current trade cycle and then sweep all maker wallets, returning any remaining SOL to the payer. Returns immediately with a status of "stopped"; the actual sweep completes asynchronously.

FieldTypeRequiredDescription
jobIdstringRequiredJob ID returned by POST /api/v1/dex/volume-bot/start
curl
curl -X POST https://yourapp.com/api/v1/dex/volume-bot/job_abc123/stop \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"rpcUrl": "https://api.mainnet-beta.solana.com"}'
json response
{ "jobId": "job_abc123", "status": "stopped" }
DELETE/api/v1/dex/volume-bot/pending

Clear Pending Setup

Deletes a pending bot setup that has not been started. Use this to discard a setup and free the slot before calling setup again with different parameters. If the setup already transferred SOL to the pool keypair, use the Recover SOL endpoint instead to return that balance to the payer wallet.

FieldTypeRequiredDescription
rpcUrlstringRequiredYour Solana RPC endpoint URL
payerstringRequiredThe payer public key used in the setup step
networkstringOptionalMust match the network used in setup. Default: "mainnet-beta"
curl
curl -X DELETE https://yourapp.com/api/v1/dex/volume-bot/pending \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "rpcUrl": "https://api.mainnet-beta.solana.com",
  "payer": "YourWalletPublicKey..."
}'
json response
{ "ok": true }
This call is idempotent: if no pending setup exists for the given payer and network combination, the server returns {"ok":true} without error.
POST/api/v1/dex/volume-bot/recover

Recover SOL

Recovers stranded SOL from the pool keypair when the bot was set up but never started. The server signs and broadcasts a recovery transaction using the stored pool keypair, returning any remaining balance to the payer wallet. The pending job is deleted after a successful recovery. Only works within the 30-minute pending-job window.

FieldTypeRequiredDescription
rpcUrlstringRequiredYour Solana RPC endpoint URL
wallet_addressstringRequiredThe payer public key used in the setup step
networkstringOptionalMust match the network used in setup. Default: "mainnet-beta"
curl
curl -X POST https://yourapp.com/api/v1/dex/volume-bot/recover \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "rpcUrl": "https://api.mainnet-beta.solana.com",
  "wallet_address": "YourWalletPublicKey..."
}'
json response
{
  "ok": true,
  "recovered_sol": 5.438,
  "signature": "recoveryTxSignature..."
}
GET/api/v1/evm/config

Chain Config

Returns the full EVM chain configuration including chain ID, RPC endpoint, DEX addresses, deployed contract addresses, and fee schedule. When network is omitted, both networks are returned under mainnet and testnet keys. No fee is charged.

FieldTypeRequiredDescription
networkstringOptional"mainnet" or "testnet". If omitted, both networks are returned
rpcUrlstringRequiredYour EVM RPC URL
curl
curl "https://yourapp.com/api/v1/evm/config?network=mainnet&rpcUrl=YOUR_EVM_RPC_URL" \
  -H "x-api-key: YOUR_API_KEY"
json response
{
  "chainId": 4663,
  "rpc": "https://rpc.mainnet.chain.robinhood.com",
  "explorer": "https://robinhoodchain.blockscout.com",
  "explorerApi": "https://robinhoodchain.blockscout.com/api",
  "faucet": null,
  "tokens": {
    "WETH": "0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73",
    "USDG": "0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168"
  },
  "uniswapV2": {
    "factory": "0x8bceaa40b9acdfaedf85adf4ff01f5ad6517937f",
    "router02": "0x89e5db8b5aa49aa85ac63f691524311aeb649eba"
  },
  "uniswapV3": {
    "factory": "0x1f7d7550b1b028f7571e69a784071f0205fd2efa",
    "swapRouter02": "0xcaf681a66d020601342297493863e78c959e5cb2",
    "universalRouter": "0x8876789976decbfcbbbe364623c63652db8c0904",
    "nonfungiblePositionManager": "0x73991a25c818bf1f1128deaab1492d45638de0d3",
    "quoterV2": "0x33e885ed0ec9bf04ecfb19341582aadcb4c8a9e7",
    "permit2": "0x000000000022D473030F116dDEE9F6B43aC78BA3",
    "multicall": "0x282a3c4d320cc7f0d5eaf56b8029e4b88338f0a3",
    "tickLens": "0x7dfd4f31be6814d2906bde155c3e1b146eac1468"
  },
  "pancakeswapV2": {
    "factory": "0x02a84c1b3BBD7401a5f7fa98a384EBC70bB5749E",
    "router02": "0x8cFe327CEc66d1C090Dd72bd0FF11d690C33a2Eb"
  },
  "pancakeswapV3": null,
  "contracts": {
    "tokenFactory": "0x311A1cB7EE788a6f2720844e1Aa8EAdD64830EeA",
    "multisender": "0x8b3aA19aF88fBeaef1BF499e7EFA770C59089b2e",
    "treasury": "0x2665e484ff0BE967d8950CC148D499a108880E49",
    "pinkLock": "0x8F675BD0BD5eed560B2Cf170F85a277CF3fAAE79",
    "liquidityHelper": "0xd0a66A54fC29cacDcf1fC17232Dcb44c62e50814",
    "ponsLaunchFactory": "0xA5aAb3F0c6EeadF30Ef1D3Eb997108E976351feB",
    "ponsLaunchLocker": "0x736D76699C26D0d966744cAe304C000d471f7F35"
  },
  "fees": {
    "base": "10000000000000000",
    "taxEnabled": "6000000000000000",
    "antiBotEnabled": "6000000000000000",
    "antiWhaleEnabled": "6000000000000000"
  },
  "multisender": {
    "feePerRecipientWei": "100000000000000",
    "maxRecipientsPerBatch": 100
  }
}
On testnet (chain 46630), uniswapV2 and uniswapV3 are null and pancakeswapV3 is populated. Omitting network returns both configs under { "mainnet": {...}, "testnet": {...} }.
GET/api/v1/evm/fee

Get EVM Fee

Returns the platform fee in wei and ETH for a given EVM operation type. No fee is charged for this query.

FieldTypeRequiredDescription
typestringRequired"factory" for token deploy or "multisend" for multisend
networkstringRequired"mainnet" or "testnet"
rpcUrlstringRequiredYour EVM RPC URL
taxstringOptional"true" if tax module is enabled. Adds 0.006 ETH to factory fee. Only used for type=factory
antiBotstringOptional"true" if anti-bot is enabled. Adds 0.006 ETH to factory fee. Only used for type=factory
antiWhalestringOptional"true" if anti-whale is enabled. Adds 0.006 ETH to factory fee. Only used for type=factory
recipientsnumberOptionalNumber of recipients. Required for type=multisend to compute the per-recipient fee
curl
curl "https://yourapp.com/api/v1/evm/fee?type=factory&network=mainnet&rpcUrl=YOUR_EVM_RPC_URL" \
  -H "x-api-key: YOUR_API_KEY"
json response (factory, no options)
{ "type": "factory", "network": "mainnet", "wei": "10000000000000000", "eth": "0.01" }
json response (multisend, 10 recipients)
{ "type": "multisend", "network": "mainnet", "recipients": 10, "wei": "500000000000000", "eth": "0.0005" }
POST/api/v1/evm/deploy-token

Deploy EVM Token

Returns ABI-encoded calldata for deploying an ERC-20 token via the Solauncher factory contract. The transaction is not submitted. Sign and broadcast it yourself. Use the fee endpoint to preview the cost before calling deploy.

FieldTypeRequiredDescription
networkstringRequired"mainnet" or "testnet"
namestringRequiredToken full name
symbolstringRequiredToken ticker symbol
decimalsnumberRequiredToken decimals (e.g. 18)
totalSupplystringRequiredTotal token supply as a display amount. The contract multiplies this by 10^decimals internally. Example: 1 billion tokens = "1000000000"
taxRecipientstringRequiredAddress that receives collected tax
taxEnabledbooleanOptionalEnable buy/sell tax module. Default: false
antiBotEnabledbooleanOptionalEnable anti-bot limiter at launch. Default: false
antiWhaleEnabledbooleanOptionalEnable max wallet and max transaction limits. Default: false
blacklistEnabledbooleanOptionalEnable address blacklist. Default: false
mintEnabledbooleanOptionalAllow owner to mint new tokens. Default: false
pauseEnabledbooleanOptionalAllow owner to pause transfers. Default: false
buyTaxBpsnumberOptionalBuy tax in basis points (e.g. 200 = 2%)
sellTaxBpsnumberOptionalSell tax in basis points
maxWalletBpsnumberOptionalMax wallet size in basis points of total supply
maxTxBpsnumberOptionalMax transaction size in basis points of total supply
antiBotMaxTxBpsnumberOptionalAnti-bot phase max transaction size in basis points
curl
curl -X POST https://yourapp.com/api/v1/evm/deploy-token \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "rpcUrl": "YOUR_EVM_RPC_URL",
  "network": "mainnet",
  "name": "My Token",
  "symbol": "MTK",
  "decimals": 18,
  "totalSupply": "1000000000",
  "taxRecipient": "0xYourAddress",
  "taxEnabled": true,
  "buyTaxBps": 200,
  "sellTaxBps": 300
}'
json response
{
  "to": "0x311A1cB7EE788a6f2720844e1Aa8EAdD64830EeA",
  "data": "0xABIEncoded...",
  "value": "16000000000000000",
  "fee": { "wei": "16000000000000000", "eth": "0.016" },
  "network": "mainnet"
}
Send this as an EVM transaction from the owner's wallet. The value field is the platform fee in wei, included in the transaction value. The fee is 0.01 ETH base plus 0.006 ETH each for taxEnabled, antiBotEnabled, and antiWhaleEnabled. The token is deployed when the transaction is confirmed on-chain.
POST/api/v1/evm/multisend

EVM Multisend

Returns ABI-encoded calldata for sending native ETH or ERC-20 tokens to multiple recipients via the Solauncher multisend contract. The transaction is not submitted. Sign and broadcast it yourself.

FieldTypeRequiredDescription
networkstringRequired"mainnet" or "testnet"
typestringRequiredSend mode: "ethEqual" (equal ETH), "ethVarying" (varying ETH), "tokenEqual" (equal ERC-20), "tokenVarying" (varying ERC-20)
recipientsstring[]RequiredArray of recipient EVM addresses
amountsstring[]OptionalArray of amounts in wei or raw token units, one per recipient. Required for "ethVarying" and "tokenVarying" types
amountEachstringOptionalAmount per recipient in wei or raw token units. Required for "ethEqual" and "tokenEqual" types
tokenstringOptionalERC-20 token contract address. Required for token types
curl
curl -X POST https://yourapp.com/api/v1/evm/multisend \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "rpcUrl": "YOUR_EVM_RPC_URL",
  "network": "mainnet",
  "type": "ethEqual",
  "recipients": ["0xAddr1", "0xAddr2"],
  "amountEach": "1000000000000000"
}'
json response
{
  "to": "0x8b3aA19aF88fBeaef1BF499e7EFA770C59089b2e",
  "data": "0xABIEncoded...",
  "value": "10500000000000000",
  "fee": { "wei": "500000000000000", "eth": "0.0005" },
  "total": { "wei": "10500000000000000", "eth": "0.0105" },
  "network": "mainnet",
  "type": "ethEqual",
  "recipientCount": 10
}
value is the raw wei amount to include in the transaction (ETH being distributed plus the platform fee). total is the same amount formatted as { wei, eth }. For token types, value is only the platform fee since tokens are pulled via transferFrom. Approve the multisend contract to spend tokens before broadcasting for ERC-20 sends.
POST/api/v1/evm/verify-token

Verify EVM Token

Submits the deployed token contract source code to the chain's block explorer for verification. Verification makes the contract ABI and source publicly readable on the explorer. The request may take up to 30 seconds as it waits for the explorer API to respond. No fee is charged.

FieldTypeRequiredDescription
tokenAddressstringRequiredDeployed token contract address (0x...)
networkstringRequired"mainnet" or "testnet"
curl
curl -X POST https://yourapp.com/api/v1/evm/verify-token \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "rpcUrl": "YOUR_EVM_RPC_URL",
  "network": "mainnet",
  "tokenAddress": "0xYourTokenAddress"
}'
json response
{
  "ok": true,
  "network": "mainnet",
  "tokenAddress": "0xYourTokenAddress",
  "blockscout": { "message": "OK" }
}
Verification is asynchronous on the explorer side. A successful response means the request was accepted by Blockscout. The blockscout field contains the raw JSON the explorer API returned. Check the explorer after a few seconds to confirm the contract is publicly verified.
POST/api/v1/evm/manage/open-trading

Open Trading

Returns calldata that calls openTrading() on the deployed RHTokenTemplate contract, enabling public transfers. The caller signs and broadcasts the transaction. Platform fee: 0.001 ETH (contract-enforced, included in value).

FieldTypeRequiredDescription
networkstringRequired"mainnet" or "testnet"
tokenAddressstringRequiredDeployed token contract address (0x...)
curl
curl -X POST https://yourapp.com/api/v1/evm/manage/open-trading \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "rpcUrl": "YOUR_EVM_RPC_URL",
  "network": "mainnet",
  "tokenAddress": "0xYourTokenAddress"
}'
json response
{ "to": "0xTokenAddress", "data": "0x...", "value": "1000000000000000", "fee": { "wei": "1000000000000000", "eth": "0.001" } }
POST/api/v1/evm/manage/set-tax

Set Tax

Returns calldata that calls setTaxConfig() on the token contract, updating buy tax, sell tax, and the tax recipient address. Platform fee: 0.001 ETH.

FieldTypeRequiredDescription
networkstringRequired"mainnet" or "testnet"
tokenAddressstringRequiredToken contract address (0x...)
buyTaxBpsnumberRequiredBuy tax in basis points (0 to 2500)
sellTaxBpsnumberRequiredSell tax in basis points (0 to 2500)
taxRecipientstringRequiredAddress that receives tax proceeds
curl
curl -X POST https://yourapp.com/api/v1/evm/manage/set-tax \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "rpcUrl": "YOUR_EVM_RPC_URL",
  "network": "mainnet",
  "tokenAddress": "0xYourTokenAddress",
  "buyTaxBps": 200,
  "sellTaxBps": 300,
  "taxRecipient": "0xYourAddress"
}'
json response
{ "to": "0xTokenAddress", "data": "0x...", "value": "1000000000000000", "fee": { "wei": "1000000000000000", "eth": "0.001" } }
POST/api/v1/evm/manage/set-limits

Set Limits

Returns calldata that calls setLimits() on the token contract, setting max wallet and max transaction sizes as a percentage of total supply in basis points. Platform fee: 0.001 ETH.

FieldTypeRequiredDescription
networkstringRequired"mainnet" or "testnet"
tokenAddressstringRequiredToken contract address (0x...)
maxWalletBpsnumberRequiredMax wallet size in basis points (0 to 10000)
maxTxBpsnumberRequiredMax transaction size in basis points (0 to 10000)
curl
curl -X POST https://yourapp.com/api/v1/evm/manage/set-limits \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "rpcUrl": "YOUR_EVM_RPC_URL",
  "network": "mainnet",
  "tokenAddress": "0xYourTokenAddress",
  "maxWalletBps": 200,
  "maxTxBps": 100
}'
json response
{ "to": "0xTokenAddress", "data": "0x...", "value": "1000000000000000", "fee": { "wei": "1000000000000000", "eth": "0.001" } }
POST/api/v1/evm/manage/remove-limits

Remove Limits

Returns calldata that calls removeLimits() on the token contract, disabling max wallet and max transaction restrictions. Platform fee: 0.001 ETH.

FieldTypeRequiredDescription
networkstringRequired"mainnet" or "testnet"
tokenAddressstringRequiredToken contract address (0x...)
curl
curl -X POST https://yourapp.com/api/v1/evm/manage/remove-limits \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "rpcUrl": "YOUR_EVM_RPC_URL",
  "network": "mainnet",
  "tokenAddress": "0xYourTokenAddress"
}'
json response
{ "to": "0xTokenAddress", "data": "0x...", "value": "1000000000000000", "fee": { "wei": "1000000000000000", "eth": "0.001" } }
POST/api/v1/evm/manage/set-blacklist

Set Blacklist

Returns calldata that calls setBlacklist() on the token contract, adding or removing an address from the transfer blacklist. Platform fee: 0.001 ETH.

FieldTypeRequiredDescription
networkstringRequired"mainnet" or "testnet"
tokenAddressstringRequiredToken contract address (0x...)
accountstringRequiredAddress to blacklist or unblacklist
statusbooleanRequiredtrue to blacklist, false to remove
curl
curl -X POST https://yourapp.com/api/v1/evm/manage/set-blacklist \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "rpcUrl": "YOUR_EVM_RPC_URL",
  "network": "mainnet",
  "tokenAddress": "0xYourTokenAddress",
  "account": "0xAddressToBlacklist",
  "status": true
}'
json response
{ "to": "0xTokenAddress", "data": "0x...", "value": "1000000000000000", "fee": { "wei": "1000000000000000", "eth": "0.001" } }
POST/api/v1/evm/manage/set-dex-pair

Set Dex Pair

Returns calldata that calls setDexPair() on the token contract, registering or deregistering a liquidity pool address as a known DEX pair so that buys and sells from it are taxed correctly. Platform fee: 0.001 ETH.

FieldTypeRequiredDescription
networkstringRequired"mainnet" or "testnet"
tokenAddressstringRequiredToken contract address (0x...)
pairstringRequiredLiquidity pool address to register
statusbooleanRequiredtrue to add as DEX pair, false to remove
curl
curl -X POST https://yourapp.com/api/v1/evm/manage/set-dex-pair \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "rpcUrl": "YOUR_EVM_RPC_URL",
  "network": "mainnet",
  "tokenAddress": "0xYourTokenAddress",
  "pair": "0xPoolAddress",
  "status": true
}'
json response
{ "to": "0xTokenAddress", "data": "0x...", "value": "1000000000000000", "fee": { "wei": "1000000000000000", "eth": "0.001" } }
POST/api/v1/evm/manage/set-exemptions

Set Exemptions

Returns calldata that calls setExemptions() on the token contract, granting or revoking fee and limit exemptions for a specific address. Platform fee: 0.001 ETH.

FieldTypeRequiredDescription
networkstringRequired"mainnet" or "testnet"
tokenAddressstringRequiredToken contract address (0x...)
accountstringRequiredAddress to update exemption status for
feeExemptbooleanRequiredWhether to exempt this address from tax
limitExemptbooleanRequiredWhether to exempt this address from transfer limits
curl
curl -X POST https://yourapp.com/api/v1/evm/manage/set-exemptions \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "rpcUrl": "YOUR_EVM_RPC_URL",
  "network": "mainnet",
  "tokenAddress": "0xYourTokenAddress",
  "account": "0xAddress",
  "feeExempt": true,
  "limitExempt": false
}'
json response
{ "to": "0xTokenAddress", "data": "0x...", "value": "1000000000000000", "fee": { "wei": "1000000000000000", "eth": "0.001" } }
POST/api/v1/evm/manage/set-paused

Set Paused

Returns calldata that calls setPaused() on the token contract, pausing or unpausing all token transfers. Platform fee: 0.001 ETH.

FieldTypeRequiredDescription
networkstringRequired"mainnet" or "testnet"
tokenAddressstringRequiredToken contract address (0x...)
pausedbooleanRequiredtrue to pause transfers, false to unpause
curl
curl -X POST https://yourapp.com/api/v1/evm/manage/set-paused \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "rpcUrl": "YOUR_EVM_RPC_URL",
  "network": "mainnet",
  "tokenAddress": "0xYourTokenAddress",
  "paused": true
}'
json response
{ "to": "0xTokenAddress", "data": "0x...", "value": "1000000000000000", "fee": { "wei": "1000000000000000", "eth": "0.001" } }
POST/api/v1/evm/manage/mint

Mint

Returns calldata that calls mint() on the token contract, minting new tokens to a recipient address. Only available when the mint authority has not been revoked. Platform fee: 0.001 ETH.

FieldTypeRequiredDescription
networkstringRequired"mainnet" or "testnet"
tokenAddressstringRequiredToken contract address (0x...)
tostringRequiredRecipient address for the minted tokens
amountstringRequiredAmount to mint in raw token units (integer string)
curl
curl -X POST https://yourapp.com/api/v1/evm/manage/mint \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "rpcUrl": "YOUR_EVM_RPC_URL",
  "network": "mainnet",
  "tokenAddress": "0xYourTokenAddress",
  "to": "0xRecipientAddress",
  "amount": "1000000000000000000000"
}'
json response
{ "to": "0xTokenAddress", "data": "0x...", "value": "1000000000000000", "fee": { "wei": "1000000000000000", "eth": "0.001" } }
POST/api/v1/evm/manage/burn

Burn

Returns calldata that calls burn() on the token contract, burning tokens from the caller's own balance. Platform fee: 0.001 ETH.

FieldTypeRequiredDescription
networkstringRequired"mainnet" or "testnet"
tokenAddressstringRequiredToken contract address (0x...)
amountstringRequiredAmount to burn in raw token units (integer string)
curl
curl -X POST https://yourapp.com/api/v1/evm/manage/burn \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "rpcUrl": "YOUR_EVM_RPC_URL",
  "network": "mainnet",
  "tokenAddress": "0xYourTokenAddress",
  "amount": "1000000000000000000000"
}'
json response
{ "to": "0xTokenAddress", "data": "0x...", "value": "1000000000000000", "fee": { "wei": "1000000000000000", "eth": "0.001" } }
POST/api/v1/evm/manage/renounce-ownership

Renounce Ownership

Returns calldata that calls renounceOwnership() on the token contract, permanently removing the owner. This action is irreversible. Platform fee: 0.001 ETH.

FieldTypeRequiredDescription
networkstringRequired"mainnet" or "testnet"
tokenAddressstringRequiredToken contract address (0x...)
curl
curl -X POST https://yourapp.com/api/v1/evm/manage/renounce-ownership \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "rpcUrl": "YOUR_EVM_RPC_URL",
  "network": "mainnet",
  "tokenAddress": "0xYourTokenAddress"
}'
json response
{ "to": "0xTokenAddress", "data": "0x...", "value": "1000000000000000", "fee": { "wei": "1000000000000000", "eth": "0.001" } }
POST/api/v1/evm/manage/transfer-ownership

Transfer Ownership

Returns calldata that calls transferOwnership() on the token contract, transferring the owner role to a new address. Platform fee: 0.001 ETH.

FieldTypeRequiredDescription
networkstringRequired"mainnet" or "testnet"
tokenAddressstringRequiredToken contract address (0x...)
newOwnerstringRequiredAddress of the new owner
curl
curl -X POST https://yourapp.com/api/v1/evm/manage/transfer-ownership \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "rpcUrl": "YOUR_EVM_RPC_URL",
  "network": "mainnet",
  "tokenAddress": "0xYourTokenAddress",
  "newOwner": "0xNewOwnerAddress"
}'
json response
{ "to": "0xTokenAddress", "data": "0x...", "value": "1000000000000000", "fee": { "wei": "1000000000000000", "eth": "0.001" } }
POST/api/v1/evm/liquidity/add-with-eth

Add Liquidity with ETH

Returns calldata for LiquidityHelper.addWithETH(), adding a token and ETH pair to a Uniswap-compatible pool. The caller must approve the token to the LiquidityHelper contract before broadcasting. Platform fee: 0.001 ETH (added to the ETH amount in value).

FieldTypeRequiredDescription
networkstringRequired"mainnet" or "testnet"
routerstringRequiredDEX router address
tokenstringRequiredToken address to pair with ETH
amountTokenDesiredstringRequiredToken amount to add (raw units, positive integer string)
amountTokenMinstringOptionalMinimum token amount accepted (default: "0")
amountETHMinstringOptionalMinimum ETH amount accepted in wei (default: "0")
ethAmountstringRequiredETH to add as liquidity in wei (positive integer string)
tostringRequiredAddress that receives the LP tokens
deadlinestringOptionalUnix timestamp deadline (default: 30 minutes from now)
curl
curl -X POST https://yourapp.com/api/v1/evm/liquidity/add-with-eth \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "rpcUrl": "YOUR_EVM_RPC_URL",
  "network": "mainnet",
  "router": "0xRouterAddress",
  "token": "0xYourTokenAddress",
  "amountTokenDesired": "1000000000000000000000",
  "ethAmount": "500000000000000000",
  "to": "0xYourWalletAddress"
}'
json response
{ "to": "0xLiquidityHelper", "data": "0x...", "value": "501000000000000000", "fee": { "wei": "1000000000000000", "eth": "0.001" }, "network": "mainnet" }
The value field is 0.001 ETH fee + ethAmount. Send this exact value when broadcasting the transaction.
POST/api/v1/evm/liquidity/add-with-tokens

Add Liquidity with Tokens

Returns calldata for LiquidityHelper.addWithTokens(), adding two ERC-20 tokens as a pair to a Uniswap-compatible pool. The caller must approve both tokens to the LiquidityHelper before broadcasting. Platform fee: 0.001 ETH.

FieldTypeRequiredDescription
networkstringRequired"mainnet" or "testnet"
routerstringRequiredDEX router address
tokenAstringRequiredFirst token address
tokenBstringRequiredSecond token address
amountADesiredstringRequiredDesired amount of tokenA (raw units)
amountBDesiredstringRequiredDesired amount of tokenB (raw units)
amountAMinstringOptionalMinimum tokenA accepted (default: "0")
amountBMinstringOptionalMinimum tokenB accepted (default: "0")
tostringRequiredAddress that receives the LP tokens
deadlinestringOptionalUnix timestamp deadline (default: 30 minutes from now)
curl
curl -X POST https://yourapp.com/api/v1/evm/liquidity/add-with-tokens \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "rpcUrl": "YOUR_EVM_RPC_URL",
  "network": "mainnet",
  "router": "0xRouterAddress",
  "tokenA": "0xTokenAAddress",
  "tokenB": "0xTokenBAddress",
  "amountADesired": "1000000000000000000000",
  "amountBDesired": "500000000000000000000",
  "to": "0xYourWalletAddress"
}'
json response
{ "to": "0xLiquidityHelper", "data": "0x...", "value": "1000000000000000", "fee": { "wei": "1000000000000000", "eth": "0.001" }, "network": "mainnet" }
POST/api/v1/evm/liquidity/remove-with-eth

Remove Liquidity with ETH

Returns calldata for LiquidityHelper.removeWithETH(), removing liquidity from a token/ETH pair pool and receiving ETH and tokens back. The caller must approve the LP token to the LiquidityHelper before broadcasting. Platform fee: 0.001 ETH.

FieldTypeRequiredDescription
networkstringRequired"mainnet" or "testnet"
routerstringRequiredDEX router address
tokenstringRequiredToken address in the pool
lpTokenstringRequiredLP token address to burn
liquiditystringRequiredLP token amount to remove (raw units)
amountTokenMinstringOptionalMinimum token amount to receive (default: "0")
amountETHMinstringOptionalMinimum ETH amount to receive in wei (default: "0")
tostringRequiredAddress to receive withdrawn assets
deadlinestringOptionalUnix timestamp deadline (default: 30 minutes from now)
curl
curl -X POST https://yourapp.com/api/v1/evm/liquidity/remove-with-eth \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "rpcUrl": "YOUR_EVM_RPC_URL",
  "network": "mainnet",
  "router": "0xRouterAddress",
  "token": "0xYourTokenAddress",
  "lpToken": "0xLpTokenAddress",
  "liquidity": "100000000000000000",
  "to": "0xYourWalletAddress"
}'
json response
{ "to": "0xLiquidityHelper", "data": "0x...", "value": "1000000000000000", "fee": { "wei": "1000000000000000", "eth": "0.001" }, "network": "mainnet" }
POST/api/v1/evm/liquidity/remove-with-tokens

Remove Liquidity with Tokens

Returns calldata for LiquidityHelper.removeWithTokens(), removing liquidity from a token/token pair pool. The caller must approve the LP token to the LiquidityHelper before broadcasting. Platform fee: 0.001 ETH.

FieldTypeRequiredDescription
networkstringRequired"mainnet" or "testnet"
routerstringRequiredDEX router address
tokenAstringRequiredFirst token address in the pool
tokenBstringRequiredSecond token address in the pool
lpTokenstringRequiredLP token address to burn
liquiditystringRequiredLP token amount to remove (raw units)
amountAMinstringOptionalMinimum tokenA to receive (default: "0")
amountBMinstringOptionalMinimum tokenB to receive (default: "0")
tostringRequiredAddress to receive withdrawn assets
deadlinestringOptionalUnix timestamp deadline (default: 30 minutes from now)
curl
curl -X POST https://yourapp.com/api/v1/evm/liquidity/remove-with-tokens \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "rpcUrl": "YOUR_EVM_RPC_URL",
  "network": "mainnet",
  "router": "0xRouterAddress",
  "tokenA": "0xTokenAAddress",
  "tokenB": "0xTokenBAddress",
  "lpToken": "0xLpTokenAddress",
  "liquidity": "100000000000000000",
  "to": "0xYourWalletAddress"
}'
json response
{ "to": "0xLiquidityHelper", "data": "0x...", "value": "1000000000000000", "fee": { "wei": "1000000000000000", "eth": "0.001" }, "network": "mainnet" }
POST/api/v1/evm/locker/lock

Lock Tokens

Returns calldata for PinkLock02.lock(), locking ERC-20 or LP tokens until a future unlock date. The caller must approve the token amount to the PinkLock02 contract before broadcasting. Lock fee: 0.01 ETH (contract-enforced).

FieldTypeRequiredDescription
networkstringRequired"mainnet" or "testnet"
ownerstringRequiredAddress that owns and can unlock the lock
tokenstringRequiredToken address to lock
isLpTokenbooleanRequiredtrue if locking an LP token
amountstringRequiredAmount to lock in raw token units (positive integer string)
unlockDatenumberRequiredFuture unix timestamp when tokens can be unlocked
descriptionstringOptionalLabel shown on the lock explorer (default: "")
curl
curl -X POST https://yourapp.com/api/v1/evm/locker/lock \
  -H "Content-Type: application/json" \
  -H "x-api-key: YOUR_API_KEY" \
  -d '{
    "rpcUrl": "YOUR_EVM_RPC_URL",
    "network": "mainnet",
    "owner": "0x...",
    "token": "0x...",
    "isLpToken": false,
    "amount": "1000000000000000000",
    "unlockDate": 1800000000,
    "description": "Team tokens"
  }'
json response
{ "to": "0xPinkLock", "data": "0x...", "value": "10000000000000000", "fee": { "wei": "10000000000000000", "eth": "0.01" }, "network": "mainnet" }
POST/api/v1/evm/locker/vesting-lock

Vesting Lock

Returns calldata for PinkLock02.vestingLock(), locking tokens with a TGE unlock and recurring cycle releases. Approve the token to PinkLock02 before broadcasting. Lock fee: 0.01 ETH.

FieldTypeRequiredDescription
networkstringRequired"mainnet" or "testnet"
ownerstringRequiredAddress that owns the lock
tokenstringRequiredToken address to lock
isLpTokenbooleanRequiredtrue if locking an LP token
amountstringRequiredTotal amount to lock (raw units)
tgeDatenumberRequiredUnix timestamp for the TGE unlock
tgeBpsnumberRequiredPercentage of tokens released at TGE in basis points (0 to 10000)
cyclenumberRequiredCycle duration in seconds
cycleBpsnumberRequiredPercentage released per cycle in basis points (0 to 10000)
descriptionstringOptionalLabel shown on the lock explorer (default: "")
curl
curl -X POST https://yourapp.com/api/v1/evm/locker/vesting-lock \
  -H "Content-Type: application/json" \
  -H "x-api-key: YOUR_API_KEY" \
  -d '{
    "rpcUrl": "YOUR_EVM_RPC_URL",
    "network": "mainnet",
    "owner": "0x...",
    "token": "0x...",
    "isLpToken": false,
    "amount": "1000000000000000000",
    "tgeDate": 1750000000,
    "tgeBps": 2000,
    "cycle": 2592000,
    "cycleBps": 1000,
    "description": "Team vesting"
  }'
json response
{ "to": "0xPinkLock", "data": "0x...", "value": "10000000000000000", "fee": { "wei": "10000000000000000", "eth": "0.01" }, "network": "mainnet" }
POST/api/v1/evm/locker/unlock

Unlock

Returns calldata for PinkLock02.unlock(), withdrawing unlocked tokens after the lock period or vesting cycle. No ETH fee is required. Only the lock owner can call this on-chain.

FieldTypeRequiredDescription
networkstringRequired"mainnet" or "testnet"
lockIdstringRequiredLock ID to unlock (non-negative integer string)
curl
curl -X POST https://yourapp.com/api/v1/evm/locker/unlock \
  -H "Content-Type: application/json" \
  -H "x-api-key: YOUR_API_KEY" \
  -d '{
    "rpcUrl": "YOUR_EVM_RPC_URL",
    "network": "mainnet",
    "lockId": "1"
  }'
json response
{ "to": "0xPinkLock", "data": "0x...", "value": "0", "network": "mainnet" }
GET/api/v1/evm/locker/lock/:lockId

Get Lock by ID

Reads a single lock record from PinkLock02 by its numeric ID.

FieldTypeRequiredDescription
networkstringRequired"mainnet" or "testnet"
FieldTypeDescription
lockIdnumberNumeric lock ID
curl
curl "https://yourapp.com/api/v1/evm/locker/lock/1?network=mainnet&rpcUrl=YOUR_EVM_RPC_URL" \
  -H "x-api-key: YOUR_API_KEY"
json response
{ "network": "mainnet", "lock": { "id": "1", "token": "0x...", "owner": "0x...", "amount": "1000000000000000000", "lockDate": "1720000000", "tgeDate": "0", "tgeBps": "0", "cycle": "0", "cycleBps": "0", "unlockedAmount": "0", "description": "Team" } }
GET/api/v1/evm/locker/by-token

Locks by Token

Reads all lock records for a given token address from PinkLock02. If end is not provided the total lock count is fetched first.

FieldTypeRequiredDescription
networkstringRequired"mainnet" or "testnet"
tokenstringRequiredToken address to query locks for
startstringOptionalStart index (default: "0")
endstringOptionalEnd index (default: total lock count for the token)
curl
curl "https://yourapp.com/api/v1/evm/locker/by-token?network=mainnet&token=0x...&rpcUrl=YOUR_EVM_RPC_URL" \
  -H "x-api-key: YOUR_API_KEY"
json response
{
  "network": "mainnet",
  "token": "0x...",
  "locks": [
    {
      "id": "1",
      "token": "0x...",
      "owner": "0x...",
      "amount": "1000000000000000000",
      "lockDate": "1720000000",
      "tgeDate": "0",
      "tgeBps": "0",
      "cycle": "0",
      "cycleBps": "0",
      "unlockedAmount": "0",
      "description": "Liquidity"
    }
  ]
}
GET/api/v1/evm/locker/by-user

Locks by User

Reads all locks (normal tokens and LP tokens) owned by a given address from PinkLock02. Both normalLocksForUser and lpLocksForUser are fetched in parallel.

FieldTypeRequiredDescription
networkstringRequired"mainnet" or "testnet"
userstringRequiredOwner address to query locks for
curl
curl "https://yourapp.com/api/v1/evm/locker/by-user?network=mainnet&user=0x...&rpcUrl=YOUR_EVM_RPC_URL" \
  -H "x-api-key: YOUR_API_KEY"
json response
{ "network": "mainnet", "user": "0x...", "normalLocks": [], "lpLocks": [] }
POST/api/v1/evm/bundle/buy

Bundle Buy

Executes buy transactions across multiple wallets against a Uniswap-compatible pool. The response is a Server-Sent Events stream. Fee: 0.001 ETH per wallet, charged after each successful swap.

FieldTypeRequiredDescription
tokenAddressstringRequiredToken to buy (EVM address)
walletsobject[]RequiredArray of { privateKey, ethAmount } objects. ethAmount is a human-readable ETH decimal string (e.g. "0.01")
networkstringOptional"mainnet" or "testnet". Default: "mainnet"
jobIdstringOptionalClient-assigned job ID used with the Stop endpoint to abort remaining wallets
receivingAddressstringOptionalAddress that receives purchased tokens. Defaults to each buyer wallet
dexstringOptional"uniswap_v2" (default), "uniswap_v3", or "pancakeswap_v2"
feeTiernumberOptionalUniswap V3 fee tier (e.g. 3000). Only used when dex="uniswap_v3"
callerWalletstringOptionalEVM address. Accepted and validated but currently has no effect
curl
curl -X POST https://yourapp.com/api/v1/evm/bundle/buy \
  -H "Content-Type: application/json" \
  -H "Accept: text/event-stream" \
  -H "x-api-key: YOUR_API_KEY" \
  --no-buffer \
  -d '{
    "rpcUrl": "YOUR_EVM_RPC_URL",
    "tokenAddress": "0x...",
    "wallets": [
      { "privateKey": "0x...", "ethAmount": "0.01" },
      { "privateKey": "0x...", "ethAmount": "0.01" }
    ],
    "network": "mainnet",
    "dex": "uniswap_v2",
    "jobId": "my-job-1"
  }'
SSE stream
data: { "type": "started", "total": 3 }
data: { "type": "wallet", "index": 0, "wallet": "0x...", "status": "pending" }
data: { "type": "wallet", "index": 0, "wallet": "0x...", "status": "success", "txHash": "0x...", "ethAmount": "0.01" }
data: { "type": "wallet", "index": 1, "wallet": "0x...", "status": "failed", "error": "Insufficient ETH: have 0.0001, need 0.0015 (buy + fee + gas)" }
data: { "type": "done", "summary": { "total": 3, "success": 2, "failed": 1 } }
Set Accept: text/event-stream. Each wallet emits two events: pending before the swap and success or failed after. If a jobId was supplied and Stop Bundle was called mid-run, remaining wallets emit status: "aborted". Private keys are never stored on the server.
POST/api/v1/evm/bundle/sell

Bundle Sell

Executes sell transactions across multiple wallets. The response is a Server-Sent Events stream. Fee: 0.001 ETH per wallet, charged after each successful swap.

FieldTypeRequiredDescription
tokenAddressstringRequiredToken to sell (EVM address)
walletsobject[]RequiredArray of { privateKey, tokenAmountRaw } objects. tokenAmountRaw is a raw bigint string (e.g. "1000000000000000000"). Pass "0" or omit to sell the full token balance
tokenDecimalsnumberOptionalToken decimals for human-readable output in the SSE events. Default: 18
networkstringOptional"mainnet" or "testnet". Default: "mainnet"
jobIdstringOptionalClient-assigned job ID used with the Stop endpoint to abort remaining wallets
receivingAddressstringOptionalAddress that receives the ETH proceeds. Defaults to each seller wallet
dexstringOptional"uniswap_v2" (default), "uniswap_v3", or "pancakeswap_v2"
feeTiernumberOptionalUniswap V3 fee tier. Only used when dex="uniswap_v3"
callerWalletstringOptionalEVM address. Accepted and validated but currently has no effect
curl
curl -X POST https://yourapp.com/api/v1/evm/bundle/sell \
  -H "Content-Type: application/json" \
  -H "Accept: text/event-stream" \
  -H "x-api-key: YOUR_API_KEY" \
  --no-buffer \
  -d '{
    "rpcUrl": "YOUR_EVM_RPC_URL",
    "tokenAddress": "0x...",
    "wallets": [
      { "privateKey": "0x...", "tokenAmountRaw": "0" },
      { "privateKey": "0x...", "tokenAmountRaw": "500000000000000000" }
    ],
    "network": "mainnet",
    "dex": "uniswap_v2",
    "jobId": "my-job-1"
  }'
SSE stream
data: { "type": "started", "total": 3 }
data: { "type": "wallet", "index": 0, "wallet": "0x...", "status": "pending" }
data: { "type": "wallet", "index": 0, "wallet": "0x...", "status": "success", "txHash": "0x...", "tokenAmount": "1.000000" }
data: { "type": "wallet", "index": 1, "wallet": "0x...", "status": "failed", "error": "No token balance" }
data: { "type": "done", "summary": { "total": 3, "success": 2, "failed": 1 } }
Set Accept: text/event-stream. Each wallet emits two events: pending before the swap and success or failed after. If a jobId was supplied and Stop Bundle was called mid-run, remaining wallets emit status: "aborted". Private keys are never stored on the server.
POST/api/v1/evm/bundle/:jobId/stop

Stop Bundle

Signals a running bundle buy or sell job to stop processing remaining wallets.

FieldTypeDescription
jobIdstringJob ID supplied when starting the bundle stream
FieldTypeRequiredDescription
curl
curl -X POST https://yourapp.com/api/v1/evm/bundle/my-job-1/stop \
  -H "Content-Type: application/json" \
  -H "x-api-key: YOUR_API_KEY" \
  -d '{ "rpcUrl": "YOUR_EVM_RPC_URL" }'
json response
{ "ok": true }
POST/api/v1/evm/market-making/start

Start Market Making

Starts a background market-making job that executes buy and sell trades across a pool according to the selected bot type. Returns a job ID immediately. Use the Volume Bot Status, Stop, and Recover endpoints to manage the job. Fee: 0.0001 ETH per trade.

FieldTypeRequiredDescription
networkstringRequired"mainnet" or "testnet"
tokenAddressstringRequiredToken to market-make
callerWalletstringRequiredEVM address of the account initiating the job. Used to prevent duplicate jobs
walletPrivateKeysstring[]RequiredArray of private keys (hex strings, with or without 0x prefix) for the trading wallets
botTypestringRequiredTrading mode: "Traffic" (balanced buys and sells), "Pull Up" (buy-heavy), or "Drop" (sell-heavy)
minEthstringRequiredMinimum ETH per trade as a decimal string (e.g. "0.001")
maxEthstringRequiredMaximum ETH per trade as a decimal string. Must be greater than or equal to minEth
intervalMsnumberRequiredMinimum delay between trades in milliseconds (minimum 1000)
maxIntervalMsnumberOptionalMaximum delay between trades in milliseconds for random jitter
durationMinutesnumberOptionalRun the job for this many minutes then stop automatically. Omit to run indefinitely
maxTotalEthstringOptionalStop after this total ETH has been spent across all trades
spreadPercentnumberOptionalPrice spread percentage used in Pull Up / Drop mode
dexstringOptional"uniswap_v2" (default), "uniswap_v3", or "pancakeswap_v2"
feeTiernumberOptionalUniswap V3 fee tier. Only used when dex="uniswap_v3"
poolAddressstringOptionalAccepted but currently has no effect
curl
curl -X POST https://yourapp.com/api/v1/evm/market-making/start \
  -H "Content-Type: application/json" \
  -H "x-api-key: YOUR_API_KEY" \
  -d '{
    "rpcUrl": "YOUR_EVM_RPC_URL",
    "network": "mainnet",
    "tokenAddress": "0x...",
    "callerWallet": "0x...",
    "walletPrivateKeys": ["0x..."],
    "botType": "Traffic",
    "minEth": "0.001",
    "maxEth": "0.005",
    "intervalMs": 30000
  }'
json response
{ "jobId": "evm-mm-1721234567890-a1b2c3d4" }
The job runs in the background. Use the returned jobId with the Volume Bot Status and Stop endpoints to poll progress and terminate early. Only one market-making or volume bot job per callerWallet can run at a time. On testnet, dex is always overridden to PancakeSwap V2.
POST/api/v1/evm/bot/find-pools

Find Pools

Discovers liquidity pools for a given token address across the configured DEXes on Robinhood Chain.

FieldTypeRequiredDescription
networkstringRequired"mainnet" or "testnet"
tokenAddressstringRequiredToken to search pools for
curl
curl -X POST https://yourapp.com/api/v1/evm/bot/find-pools \
  -H "Content-Type: application/json" \
  -H "x-api-key: YOUR_API_KEY" \
  -d '{
    "rpcUrl": "YOUR_EVM_RPC_URL",
    "network": "mainnet",
    "tokenAddress": "0x..."
  }'
json response
{
  "pools": [
    { "address": "0x...", "version": "v2", "tvl": null, "dex": "uniswap_v2" },
    { "address": "0x...", "version": "v3", "feeTier": 3000, "tvl": null, "dex": "uniswap_v3" }
  ],
  "network": "mainnet",
  "tokenAddress": "0x..."
}
On mainnet, Uniswap V2, PancakeSwap V2, and all Uniswap V3 fee tiers are searched. On testnet, only PancakeSwap V2 is searched. V2 pools omit feeTier; V3 pools include it.
POST/api/v1/evm/bot/check-tradability

Check Tradability

Verifies a token is tradable on a DEX by simulating a small buy (0.001 ETH) using a live on-chain quote. Returns whether the trade would succeed and the estimated output amount. No fee is charged.

FieldTypeRequiredDescription
networkstringRequired"mainnet" or "testnet"
tokenAddressstringRequiredToken to check
dexstringOptional"uniswap_v2" (default), "uniswap_v3", or "pancakeswap_v2"
curl
curl -X POST https://yourapp.com/api/v1/evm/bot/check-tradability \
  -H "Content-Type: application/json" \
  -H "x-api-key: YOUR_API_KEY" \
  -d '{
    "rpcUrl": "YOUR_EVM_RPC_URL",
    "network": "mainnet",
    "tokenAddress": "0x...",
    "dex": "uniswap_v2"
  }'
json response (tradable, V2)
{ "isTradable": true, "estimatedOut": "5000000000000000000", "network": "mainnet", "tokenAddress": "0x...", "dex": "uniswap_v2" }
json response (tradable, V3)
{ "isTradable": true, "estimatedOut": "5000000000000000000", "feeTier": 3000, "network": "mainnet", "tokenAddress": "0x...", "dex": "uniswap_v3" }
json response (not tradable)
{ "isTradable": false, "reason": "No V2 pair found for this token", "network": "mainnet", "tokenAddress": "0x...", "dex": "uniswap_v2" }
POST/api/v1/evm/bot/calc-maker

Calc Makers

Returns gas reserve estimates and volume projections for the three bot modes (Volume, Booster, Advanced) given the requested number of wallets and budget. No fee is charged for this query.

FieldTypeRequiredDescription
networkstringRequired"mainnet" or "testnet"
botTypestringRequired"volume", "booster", or "advanced"
makerCountnumberRequiredNumber of maker wallets (1 to 1000)
ethBudgetstringOptionalTotal ETH budget as a decimal string. Required for Volume and Booster mode projections
advBuyMinEthstringOptionalMinimum ETH per buy for Advanced mode
advBuyMaxEthstringOptionalMaximum ETH per buy for Advanced mode
tokenDisposalstringOptional"auto-sell" (default) or "return-to-wallet" for Advanced mode
feeTiernumberOptionalPool fee tier in bps (e.g. 3000 for 0.3%). Used for LP loss estimates. Default: 3000
gasPriceMultipliernumberOptionalGas price multiplier: 1, 1.5, or 2. Default: 1
dexstringOptional"uniswap_v2" (default) or "uniswap_v3"
curl
curl -X POST https://yourapp.com/api/v1/evm/bot/calc-maker \
  -H "Content-Type: application/json" \
  -H "x-api-key: YOUR_API_KEY" \
  -d '{
    "rpcUrl": "YOUR_EVM_RPC_URL",
    "network": "mainnet",
    "botType": "volume",
    "makerCount": 10,
    "ethBudget": "1",
    "dex": "uniswap_v2"
  }'
json response
{
  "v_gas_swap_fees": "0.01 ETH", "v_gas_buffer": "0.01 ETH", "v_refunded_eth": "0.98 ETH", "v_generate_vol": "2 ETH",
  "b_gas_swap_fees": "0.02 ETH", "b_gas_buffer": "0.02 ETH", "b_refunded_eth": "0.72 ETH", "b_generate_vol": "7 ETH",
  "adv_gas_swap_fees": "0.01 ETH", "adv_gas_buffer": "0.01 ETH", "adv_refunded_eth": "0.94 ETH", "adv_generate_vol": "1 ETH",
  "network": "mainnet", "gasPrice": "1000000000"
}
All ETH values are human-readable strings with an " ETH" suffix (e.g. "0.01 ETH"). gasPrice is the effective gas price in wei as a decimal string. Projections for all three modes are returned in one call so the UI can compare them.
POST/api/v1/evm/bot/transfer-maker

Transfer to Makers

Prepares a volume bot run by generating ephemeral maker wallets and computing the total ETH required. Returns an escrow address and total value in wei. Send that exact ETH amount to the escrow address, then call start-maker with the funding transaction hash.

FieldTypeRequiredDescription
networkstringRequired"mainnet" or "testnet"
walletAddressstringRequiredYour EVM wallet address. Used to associate the pending job and prevent duplicate runs
tokenAddressstringRequiredToken to volume-trade
botTypestringRequired"volume", "booster", or "advanced"
makerCountnumberRequiredNumber of maker wallets (1 to 1000)
ethBudgetstringOptionalTotal ETH budget as a decimal string. Required for Volume and Booster mode
advBuyMinEthstringOptionalMinimum ETH per buy. Required for Advanced mode
advBuyMaxEthstringOptionalMaximum ETH per buy. Required for Advanced mode
tokenDisposalstringOptional"auto-sell" (default) or "return-to-wallet". Advanced mode only
botSpeedstringOptionalTrade pacing: "NORMAL" (default), "FAST", or "SLOW"
gasPriceMultipliernumberOptional1, 1.5, or 2. Default: 1
slippageBpsnumberOptionalSlippage in basis points. Default: 100 (1%)
dexstringOptional"uniswap_v2" (default) or "uniswap_v3"
feeTiernumberOptionalUniswap V3 fee tier. Only used when dex="uniswap_v3"
advDelayMinMsnumberOptionalMin delay between Advanced mode cycles in ms. Default: 1000
advDelayMaxMsnumberOptionalMax delay between Advanced mode cycles in ms. Default: 5000
poolAddressstringOptionalSpecific pool address to use for trading. If omitted, the bot selects a pool automatically
curl
curl -X POST https://yourapp.com/api/v1/evm/bot/transfer-maker \
  -H "Content-Type: application/json" \
  -H "x-api-key: YOUR_API_KEY" \
  -d '{
    "rpcUrl": "YOUR_EVM_RPC_URL",
    "network": "mainnet",
    "walletAddress": "0x...",
    "tokenAddress": "0x...",
    "botType": "volume",
    "makerCount": 10,
    "ethBudget": "1"
  }'
json response
{ "escrowAddress": "0x...", "valueWei": "100000000000000000" }
Send exactly valueWei ETH (or within 1% tolerance) to escrowAddress. Then call start-maker with your transaction hash. Pending jobs expire if start-maker is not called within 30 minutes.
POST/api/v1/evm/bot/start-maker

Start Bot

Verifies the funding transaction on-chain and launches the background volume bot job. Returns a job ID immediately. Call transfer-maker first to get the escrow address and value, fund it, then call this endpoint with the transaction hash.

FieldTypeRequiredDescription
networkstringRequired"mainnet" or "testnet"
walletAddressstringRequiredYour EVM wallet address. Must match the address used in transfer-maker
txHashstringRequiredHash of the ETH transfer transaction sent to the escrow address
curl
curl -X POST https://yourapp.com/api/v1/evm/bot/start-maker \
  -H "Content-Type: application/json" \
  -H "x-api-key: YOUR_API_KEY" \
  -d '{
    "rpcUrl": "YOUR_EVM_RPC_URL",
    "network": "mainnet",
    "walletAddress": "0x...",
    "txHash": "0x..."
  }'
json response
{ "jobId": "evm-1721234567890-a1b2c3d4" }
Use the returned jobId with the Status and Stop endpoints to monitor and control the running bot.
GET/api/v1/evm/bot/:jobId/status

Bot Status

Returns the current status and trade count for a running volume bot job.

FieldTypeRequiredDescription
FieldTypeDescription
jobIdstringJob ID from the start-maker stream
curl
curl "https://yourapp.com/api/v1/evm/bot/JOB_ID/status?network=mainnet&rpcUrl=YOUR_EVM_RPC_URL" \
  -H "x-api-key: YOUR_API_KEY"
json response
{ "status": "running", "tradesExecuted": 12, "logs": [] }
status is one of "running", "stopped", "error", or "idle" (if the job ID is unknown). logs is an array of recent trade log entries.
POST/api/v1/evm/bot/:jobId/stop

Stop Bot

Signals a running volume bot job to stop after the current trade completes.

FieldTypeRequiredDescription
FieldTypeDescription
jobIdstringJob ID to stop
curl
curl -X POST https://yourapp.com/api/v1/evm/bot/JOB_ID/stop \
  -H "Content-Type: application/json" \
  -H "x-api-key: YOUR_API_KEY" \
  -d '{ "rpcUrl": "YOUR_EVM_RPC_URL" }'
json response
{ "ok": true }
Returns { "ok": true } even if the job is not currently running. The bot will finish its current trade cycle before stopping.
POST/api/v1/evm/bot/recover-eth

Recover ETH

Sweeps all ETH from the maker and escrow wallets belonging to a wallet address back to that wallet. Works for both pending jobs (funded but not started) and completed or stopped active jobs.

FieldTypeRequiredDescription
networkstringRequired"mainnet" or "testnet"
walletAddressstringRequiredYour EVM wallet address. All maker wallets belonging to this address are swept back to it
curl
curl -X POST https://yourapp.com/api/v1/evm/bot/recover-eth \
  -H "Content-Type: application/json" \
  -H "x-api-key: YOUR_API_KEY" \
  -d '{
    "rpcUrl": "YOUR_EVM_RPC_URL",
    "network": "mainnet",
    "walletAddress": "0x..."
  }'
json response
{ "ok": true, "recoveredWei": "5000000000000000" }
json response (no wallets found)
{ "ok": true, "recoveredWei": "0", "message": "No maker wallets found to sweep." }
Wallets belonging to currently running bot jobs are skipped automatically. Stop the bot first if you want to recover all ETH including active maker wallets. recoveredWei is a decimal string of the total ETH swept in wei. An optional message field is included when no wallets were found to sweep.
POST/api/v1/evm/holders/airdrop/start

Airdrop Start

Airdrops tokens from a source wallet to multiple freshly generated addresses to increase the holder count. Returns a Server-Sent Events stream. The first event includes the generated wallet list with private keys so the client can save a CSV before any transaction is sent.

FieldTypeRequiredDescription
networkstringRequired"mainnet" or "testnet"
tokenAddressstringRequiredToken to airdrop
sourceWalletPrivateKeystringRequiredPrivate key of the wallet that holds the tokens and pays fees
jobIdstringOptionalClient-supplied job ID for stop and pause control
numberOfWalletsnumberOptionalNumber of new holder addresses to generate. Default 4, max 5000
tokensPerWalletstringOptionalFixed token amount per address as a decimal string. If omitted, a random amount between minTokensPerWallet and maxTokensPerWallet is used
minTokensPerWalletstringOptionalMinimum token amount when randomizing. Default 100
maxTokensPerWalletstringOptionalMaximum token amount when randomizing. Default 1000
curl
curl -X POST https://yourapp.com/api/v1/evm/holders/airdrop/start \
  -H "Content-Type: application/json" \
  -H "Accept: text/event-stream" \
  -H "x-api-key: YOUR_API_KEY" \
  --no-buffer \
  -d '{
    "rpcUrl": "YOUR_EVM_RPC_URL",
    "network": "mainnet",
    "tokenAddress": "0x...",
    "sourceWalletPrivateKey": "0x...",
    "numberOfWallets": 10,
    "minTokensPerWallet": "100",
    "maxTokensPerWallet": "500"
  }'
SSE stream
data: { "type": "started", "jobId": "abc123", "count": 10, "wallets": [{ "address": "0x...", "privateKey": "0x..." }] }

data: { "type": "wallet", "index": 0, "wallet": "0x...", "status": "holding", "transferSig": "0x...", "tokenAmount": "500.0" }
data: { "type": "wallet", "index": 1, "wallet": "0x...", "status": "failed", "error": "..." }

data: { "type": "done", "summary": { "total": 10, "active": 9, "failed": 1 } }
The started event is emitted immediately with all generated wallet private keys so the client can save them before any transaction is sent. A service fee of 0.0001 ETH per wallet is then collected before transfers begin.
POST/api/v1/evm/holders/start

Holders Start

Generates new wallets, funds each with ETH from the funding wallet, and swaps into the token so each address becomes a unique on-chain holder. Returns a Server-Sent Events stream. The first event includes the generated wallet list with private keys.

FieldTypeRequiredDescription
networkstringRequired"mainnet" or "testnet"
tokenAddressstringRequiredToken to buy
fundingWalletPrivateKeystringRequiredPrivate key of the wallet that funds each holder and pays fees
jobIdstringOptionalClient-supplied job ID for stop or pause control
numberOfWalletsnumberOptionalNumber of holder wallets to generate. Default 4, max 5000
ethPerWalletstringOptionalFixed ETH amount per wallet as a decimal string (e.g. "0.05"). If omitted, a random amount between minEthPerWallet and maxEthPerWallet is used
minEthPerWalletstringOptionalMinimum ETH when randomizing. Default 0.01
maxEthPerWalletstringOptionalMaximum ETH when randomizing. Default 0.1
slippageBpsnumberOptionalSlippage tolerance in basis points. Default 1000 (10%)
dexstringOptional"uniswap_v2", "pancakeswap_v2", or "uniswap_v3". Mainnet only; testnet always uses PancakeSwap V2. Default "uniswap_v2"
feeTiernumberOptionalUniswap V3 fee tier (e.g. 3000, 500, 10000). Default 3000. Ignored for V2 DEXes
curl
curl -X POST https://yourapp.com/api/v1/evm/holders/start \
  -H "Content-Type: application/json" \
  -H "Accept: text/event-stream" \
  -H "x-api-key: YOUR_API_KEY" \
  --no-buffer \
  -d '{
    "rpcUrl": "YOUR_EVM_RPC_URL",
    "network": "mainnet",
    "tokenAddress": "0x...",
    "fundingWalletPrivateKey": "0x...",
    "numberOfWallets": 10,
    "minEthPerWallet": "0.01",
    "maxEthPerWallet": "0.05",
    "dex": "uniswap_v2"
  }'
SSE stream
data: { "type": "started", "jobId": "abc123", "count": 10, "wallets": [{ "address": "0x...", "privateKey": "0x..." }] }

data: { "type": "wallet", "index": 0, "wallet": "0x...", "status": "holding", "buySig": "0x...", "ethAmount": "0.05" }
data: { "type": "wallet", "index": 1, "wallet": "0x...", "status": "failed", "error": "..." }

data: { "type": "done", "summary": { "total": 10, "active": 9, "failed": 1 } }
The started event is emitted immediately with all generated wallet private keys so the client can save them before any ETH moves. A service fee of 0.0001 ETH per wallet is then collected before swaps begin. On testnet, dex is always overridden to PancakeSwap V2 regardless of the value supplied.
POST/api/v1/evm/holders/:jobId/stop

Stop Holders Job

Stops a running holders job after the current wallet completes.

FieldTypeRequiredDescription
FieldTypeDescription
jobIdstringJob ID to stop
curl
curl -X POST https://yourapp.com/api/v1/evm/holders/JOB_ID/stop \
  -H "Content-Type: application/json" \
  -H "x-api-key: YOUR_API_KEY" \
  -d '{ "rpcUrl": "YOUR_EVM_RPC_URL" }'
json response
{ "ok": true }
Returns { "ok": true } even if the job ID is not found or the job is not currently running.
POST/api/v1/evm/holders/:jobId/pause

Pause Holders Job

Pauses a running holders job. The job resumes from where it left off when resumed.

FieldTypeRequiredDescription
FieldTypeDescription
jobIdstringJob ID to pause
curl
curl -X POST https://yourapp.com/api/v1/evm/holders/JOB_ID/pause \
  -H "Content-Type: application/json" \
  -H "x-api-key: YOUR_API_KEY" \
  -d '{ "rpcUrl": "YOUR_EVM_RPC_URL" }'
json response
{ "ok": true }
POST/api/v1/evm/holders/:jobId/resume

Resume Holders Job

Resumes a paused holders job.

FieldTypeRequiredDescription
FieldTypeDescription
jobIdstringJob ID to resume
curl
curl -X POST https://yourapp.com/api/v1/evm/holders/JOB_ID/resume \
  -H "Content-Type: application/json" \
  -H "x-api-key: YOUR_API_KEY" \
  -d '{ "rpcUrl": "YOUR_EVM_RPC_URL" }'
json response
{ "ok": true }
POST/api/v1/evm/pons/balances

Check Balances

Returns the ETH balance for a list of addresses on the Robinhood Chain. Balances are returned in wei as decimal strings. Proxied through the backend to avoid CORS issues when calling the RPC from the browser.

FieldTypeRequiredDescription
rpcUrlstringRequiredRobinhood Chain RPC endpoint URL
addressesarrayRequiredArray of EVM addresses to check
networkstringOptional"mainnet" or "testnet". Defaults to "mainnet"
curl
curl -X POST https://yourapp.com/api/v1/evm/pons/balances \
  -H "Content-Type: application/json" \
  -H "x-api-key: YOUR_API_KEY" \
  -d '{
    "rpcUrl": "YOUR_EVM_RPC_URL",
    "addresses": ["0xAbc...", "0xDef..."],
    "network": "mainnet"
  }'
json response
{
  "balances": {
    "0xAbc...": "1000000000000000000",
    "0xDef...": "500000000000000000"
  }
}
Invalid addresses in the array are silently skipped. Addresses that fail the RPC call return "0".

Create Pons Token

Launches a token on the Pons Launchpad on Robinhood Chain. Two endpoints support the creation flow: optionally upload a logo to IPFS before deploying, then optionally execute the bundle buy so that multiple wallets acquire the token immediately at launch. The bundle wallets step is optional. Skipping it still deploys the token but no coordinated wallets buy in.

Step 1 (optional): Upload a logo image to IPFS to get the URL used in token metadata.
Step 2: Deploy the token via the Pons Launchpad on-chain, passing the logo URL and token metadata.
Step 3 (optional): Call bundle buy right after deployment to have up to 25 additional wallets buy the token via Uniswap V3. Each wallet spends its own ETH amount. Fee is 0.002 ETH per wallet, charged to the first wallet before any swaps execute.
POST/api/v1/evm/pons/upload-logo

Uploads a base64-encoded image to IPFS via Pinata. Returns the public IPFS URL to use as the logo field when deploying the token. Maximum image size is 5 MB.

FieldTypeRequiredDescription
rpcUrlstringRequiredRobinhood Chain RPC endpoint URL
imageBase64stringRequiredImage as a base64 data URL, e.g. "data:image/png;base64,iVBORw0..."
filenamestringOptionalFilename hint for the IPFS pin. Defaults to "logo.png"
curl
curl -X POST https://yourapp.com/api/v1/evm/pons/upload-logo \
  -H "Content-Type: application/json" \
  -H "x-api-key: YOUR_API_KEY" \
  -d '{
    "rpcUrl": "YOUR_EVM_RPC_URL",
    "imageBase64": "data:image/png;base64,iVBORw0...",
    "filename": "logo.png"
  }'
json response
{ "url": "https://ipfs.io/ipfs/QmXoypizjW3WknFiJnKLwHCnL72vedxjQkDDP1mXWo6uco" }
POST/api/v1/evm/pons/bundle-buy

After the token is deployed, call this endpoint to have up to 25 wallets buy the token via Uniswap V3 in sequence. Each wallet sends its own ETH amount in a separate swap. The first wallet in the array pays the platform fee (0.002 ETH multiplied by the total number of wallets) before any swaps start. The response is a Server-Sent Events stream reporting the fee transaction and each wallet's swap result.

FieldTypeRequiredDescription
rpcUrlstringRequiredRobinhood Chain RPC endpoint URL
tokenAddressstringRequiredDeployed Pons token contract address
poolFeenumberRequiredUniswap V3 pool fee tier from the Pons launch config. Must be 100, 500, 3000, or 10000
walletsarrayRequiredArray of { privateKey: string, ethAmount: string } objects. Max 25 wallets. The first wallet also pays the fee
networkstringOptional"mainnet" or "testnet". Defaults to "mainnet"
slippagenumberOptionalMaximum slippage percentage. Defaults to 10. Clamped between 0.1 and 50
callerWalletstringOptionalAccepted but currently has no effect
curl
curl -X POST https://yourapp.com/api/v1/evm/pons/bundle-buy \
  -H "Content-Type: application/json" \
  -H "Accept: text/event-stream" \
  -H "x-api-key: YOUR_API_KEY" \
  --no-buffer \
  -d '{
    "rpcUrl": "YOUR_EVM_RPC_URL",
    "tokenAddress": "0x...",
    "poolFee": 10000,
    "wallets": [
      { "privateKey": "0x...", "ethAmount": "0.1" },
      { "privateKey": "0x...", "ethAmount": "0.05" },
      { "privateKey": "0x...", "ethAmount": "0.05" }
    ],
    "network": "mainnet",
    "slippage": 10
  }'
SSE stream
// Stream begins immediately; confirms total wallet count
data: { "type": "started", "total": 3 }

// Fee paid by wallet[0] before any swaps (0.002 ETH x 3 wallets)
data: { "type": "fee", "txHash": "0x...", "fee": "0.006" }

// Per-wallet swap result (success)
data: { "type": "wallet", "index": 0, "wallet": "0x...", "status": "success", "txHash": "0x...", "ethAmount": "0.1", "tokenAmount": "12345.6" }

// Per-wallet swap result (failed)
data: { "type": "wallet", "index": 1, "wallet": "0x...", "status": "failed", "error": "Transaction reverted on-chain" }

// All wallets processed
data: { "type": "done", "summary": { "total": 3, "success": 2, "failed": 1 } }
Set Accept: text/event-stream. All messages arrive as data: lines; distinguish them by the type field. If the fee transaction from wallet[0] reverts, no swaps execute and the stream ends with a type: "error" event. Private keys are never stored on the server.
GET/api/v1/evm/pons/config

Pons Config

Returns the Pons Launchpad contract addresses for both mainnet and testnet. No network filter is applied; both environments are always returned in a single response.

FieldTypeRequiredDescription
rpcUrlstringRequiredRobinhood Chain RPC endpoint URL
curl
curl "https://yourapp.com/api/v1/evm/pons/config?rpcUrl=YOUR_EVM_RPC_URL" \
  -H "x-api-key: YOUR_API_KEY"
json response
{
  "mainnet": {
    "factory": "0x...",
    "locker":  "0x..."
  },
  "testnet": {
    "factory": "0x...",
    "locker":  "0x..."
  }
}
POST/api/v1/evm/wallets/generate

Generate EVM Wallets

Generates one or more EVM wallet keypairs (address and private key). Useful for creating maker or bundle wallets before a bot run. Keys are generated in-memory and never stored on the server.

FieldTypeRequiredDescription
countnumberRequiredNumber of wallets to generate (1 to 100)
curl
curl -X POST https://yourapp.com/api/v1/evm/wallets/generate \
  -H "Content-Type: application/json" \
  -H "x-api-key: YOUR_API_KEY" \
  -d '{
    "rpcUrl": "YOUR_EVM_RPC_URL",
    "count": 5
  }'
json response
{ "wallets": [ { "address": "0x...", "privateKey": "0x..." } ] }
Store private keys securely. They cannot be recovered once the response is discarded.
POST/api/v1/pump/bundle

Pump.fun Bundle Launch

Uploads token metadata to IPFS, creates a new Pump.fun token, and builds pre-signed buy transactions for up to 12 bundle wallets. Everything is built directly against the Pump.fun on-chain program with no external API dependency. Platform fee: 0.01 SOL per bundle wallet.

FieldTypeRequiredDescription
namestringRequiredToken name
symbolstringRequiredToken symbol
imageBase64stringRequiredBase64-encoded image (data URI data:image/png;base64,... or raw base64)
deployerPublicKeystringRequiredDeployer wallet public key (base58). This wallet signs the create transaction.
descriptionstringOptionalToken description
twitterstringOptionalTwitter URL
telegramstringOptionalTelegram URL
websitestringOptionalWebsite URL
discordstringOptionalDiscord URL
deployerBuySolnumberOptionalDeployer initial buy amount in SOL. Default: 0 (skip). When provided, a separate unsigned deployer buy transaction is returned.
bundleWalletsobject[]OptionalArray of {"secretKey": "base58key", "solAmount": 0.1}. Up to 12 wallets. Each wallet receives one pre-signed VersionedTransaction.
mayhemModebooleanOptionalEnable Token-2022 path with Mayhem reserved fee recipient. Default: false
cashbackbooleanOptionalEnable creator reward cashback to traders. Default: false
vanityMintSecretKeystringOptionalBase58-encoded secret key for a vanity mint address. A random keypair is generated if omitted.
curl
curl -X POST https://yourapp.com/api/v1/pump/bundle \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "rpcUrl": "https://api.mainnet-beta.solana.com",
  "name": "My Token",
  "symbol": "MTK",
  "imageBase64": "data:image/png;base64,iVBORw...",
  "deployerPublicKey": "YourDeployerWallet",
  "deployerBuySol": 0.5,
  "bundleWallets": [
    { "secretKey": "base58secretkey1", "solAmount": 0.2 },
    { "secretKey": "base58secretkey2", "solAmount": 0.15 }
  ]
}'
json response
{
  "mintPublicKey":              "NewMintAddress...",
  "metadataUri":               "https://ipfs.io/ipfs/QmXyz...",
  "createTx":                  "AQAAAA...",
  "createBlockhash":           "9WjABC...",
  "createLastValidBlockHeight": 289540012,
  "deployerBuyTx":             "AQAAAB...",
  "deployerBuyBlockhash":      "9WjDEF...",
  "deployerBuyLastValidBlockHeight": 289540100,
  "bundleTxs": [
    {
      "walletAddress":        "BundleWallet1...",
      "signedTx":             "AgAAAA...",
      "blockhash":            "9WjXYZ...",
      "lastValidBlockHeight": 289540015
    }
  ]
}
createTx is partially signed by the mint keypair. Add the deployer wallet signature before submitting. deployerBuyTx, deployerBuyBlockhash, and deployerBuyLastValidBlockHeight are omitted when deployerBuySol is 0 or not supplied. Each element of bundleTxs is an object with walletAddress, signedTx (pre-signed VersionedTransaction base64), blockhash, and lastValidBlockHeight. Submit the create transaction and wait for confirmation before submitting deployer buy or bundle transactions.
Bundle wallet private keys are used only to sign buy transactions during this request and are never stored on the server.
POST/api/v1/multisender/send

Multi Send

Builds an unsigned transaction that sends SOL or an SPL token from one wallet to multiple recipients in a single transaction. Your wallet signs and broadcasts the transaction. Platform fee: 0.00005 SOL per recipient.

FieldTypeRequiredDescription
feePayerstringRequiredWallet sending funds and paying transaction fees (base58)
recipientsobject[]RequiredSOL send: [{"address":"Wallet...", "lamports": 1000000}] or [{"address":"Wallet...", "amountSol": 0.001}]. Token send: [{"address":"Wallet...", "amount": "1000000"}] in base units.
tokenMintstringOptionalSPL token mint address. Omit to send native SOL. When provided, recipient ATAs are created automatically if they do not exist.
curl
curl -X POST https://yourapp.com/api/v1/multisender/send \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "rpcUrl": "https://api.mainnet-beta.solana.com",
  "feePayer": "YourWalletPublicKey",
  "recipients": [
    { "address": "Wallet1...", "amountSol": 0.1 },
    { "address": "Wallet2...", "amountSol": 0.05 }
  ]
}'
json response
{
  "transaction":          "AQAAAA...",
  "blockhash":            "9WjABC...",
  "lastValidBlockHeight": 289540012,
  "platformFee":          5000
}
This is a legacy transaction. Use Transaction.from(Buffer.from(transaction, 'base64')), sign with your wallet, then broadcast.
POST/api/v1/multisender/collect

Multi Collect

Sweeps SOL and SPL tokens from multiple source wallets into a single target address. Optionally closes SPL token accounts and reclaims their rent. The server signs each source wallet transaction with the provided secret keys and returns pre-signed transactions ready to broadcast. Platform fee: 0.00005 SOL per source wallet.

FieldTypeRequiredDescription
targetAddressstringRequiredDestination wallet that receives all collected funds (base58)
sourcesobject[]RequiredArray of source wallet objects (see below)
sources[].secretKeystringRequiredBase58-encoded secret key of the source wallet
sources[].collectSolbooleanOptionalSweep SOL balance to target. Default: true
sources[].closeTokenAccountsstring[]OptionalArray of token mint addresses whose ATAs to close and sweep to target. Rent from closed accounts is factored into the SOL sweep.
curl
curl -X POST https://yourapp.com/api/v1/multisender/collect \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "rpcUrl": "https://api.mainnet-beta.solana.com",
  "targetAddress": "TargetWalletPublicKey",
  "sources": [
    {
      "secretKey": "base58secretkey1",
      "collectSol": true,
      "closeTokenAccounts": ["TokenMint1...", "TokenMint2..."]
    },
    {
      "secretKey": "base58secretkey2",
      "collectSol": true
    }
  ]
}'
json response
{
  "transactions": [
    {
      "sourceAddress":        "Source1Wallet...",
      "transaction":          "AQAAAA...",
      "blockhash":            "9WjABC...",
      "lastValidBlockHeight": 289540012
    }
  ]
}
Source wallet secret keys are used only to sign transactions during this request. They are never stored on the server. Submit each transaction promptly as blockhashes expire after approximately 150 blocks.

API Sitemap

All available endpoints grouped by category.

Getting Started

PageDescription
IntroductionOverview of the API, transaction model, and versioned vs legacy transactions
Quick StartCreate a token end-to-end in three API calls
AuthenticationAPI key authentication and wallet-signature authentication
Rate Limits300 requests per minute per key
ErrorsHTTP status codes and error response format
PricingAll fees at the API rate (50% discount)
API SitemapThis page

Key Management

MethodEndpointDescription
GET/api/keysList all API keys for the authenticated wallet
POST/api/keysCreate a new API key
PATCH/api/keys/:idRename an existing API key
DELETE/api/keys/:idPermanently revoke an API key
GET/api/keys/:id/usageUsage statistics for a specific key

Token

MethodEndpointDescription
POST/api/v1/token/upload-metadataUpload token image and metadata JSON to IPFS
POST/api/v1/token/vanityGenerate a vanity mint address with prefix or suffix
POST/api/v1/token/build-createBuild a create-token transaction
GET/api/v1/token/fetch-metadataFetch on-chain Metaplex metadata for any token by mint address

Manage Token

MethodEndpointDescription
POST/api/v1/manage/burn/buildBurn a specified amount of tokens
POST/api/v1/manage/revoke-authority/buildRevoke mint, freeze, or update authority
POST/api/v1/manage/freeze/buildFreeze a token account
POST/api/v1/manage/unfreeze/buildUnfreeze a previously frozen token account
POST/api/v1/manage/mint/buildMint additional tokens to a destination wallet

Raydium

MethodEndpointDescription
POST/api/v1/raydium/openbook/createCreate an OpenBook V3 market (required for AMM V4)
POST/api/v1/raydium/liquidity/createCreate a CPMM pool with initial liquidity
POST/api/v1/raydium/liquidity/create-ammCreate an AMM V4 pool
POST/api/v1/raydium/preview-liquidityPreview add-liquidity amounts before committing
POST/api/v1/raydium/add-liquidityAdd liquidity to a CPMM or AMM V4 pool
POST/api/v1/raydium/liquidity/removeRemove liquidity from a pool
POST/api/v1/raydium/burn-lpPermanently burn LP tokens
GET/api/v1/raydium/cpmm-pool-by-tokenFind a CPMM pool by token mint address
GET/api/v1/raydium/ammv4-pool-by-tokenFind an AMM V4 pool by token mint address
POST/api/v1/raydium/launchlab-bundleLaunch on Raydium LaunchLab with bundle wallets
POST/api/v1/raydium/letsbonk-bundleLaunch on LetsBonk via Raydium LaunchLab with bundle wallets
POST/api/v1/raydium/volume-bot/startStart a Raydium volume bot alternating buy and sell trades
GET/api/v1/raydium/volume-bot/:jobIdGet current status of a running Raydium volume bot job
POST/api/v1/raydium/volume-bot/:jobId/stopStop a running Raydium volume bot job

Meteora

MethodEndpointDescription
POST/api/v1/meteora/create-poolCreate a Meteora DLMM or CPMM pool
POST/api/v1/meteora/pool-infoGet pool configuration and current reserves
POST/api/v1/meteora/preview-liquidityPreview liquidity addition amounts
POST/api/v1/meteora/add-liquidityAdd liquidity to a Meteora pool
POST/api/v1/meteora/remove-liquidityRemove liquidity from a Meteora pool
GET/api/v1/meteora/pool-by-tokenFind a Meteora pool by token mint address

PumpSwap

MethodEndpointDescription
POST/api/v1/pumpswap/pool-infoGet PumpSwap pool details and reserves
POST/api/v1/pumpswap/create-poolCreate a PumpSwap pool with initial liquidity
POST/api/v1/pumpswap/preview-liquidityPreview liquidity amounts before committing
POST/api/v1/pumpswap/add-liquidityAdd liquidity to a PumpSwap pool
POST/api/v1/pumpswap/remove-liquidityRemove liquidity from a PumpSwap pool
GET/api/v1/pumpswap/pool-by-tokenFind a PumpSwap pool by token mint address
POST/api/v1/pumpswap/pools-by-lpFind PumpSwap pools by LP token mint address

Token Locker

MethodEndpointDescription
POST/api/v1/locker/createLock SPL or LP tokens with a vesting schedule
POST/api/v1/locker/unlockUnlock tokens after the vesting period
GET/api/v1/locker/lock/:vestingAccountGet lock info for a vesting account
POST/api/v1/locker/save-metaAttach display metadata to a lock
GET/api/v1/locker/by-mintFind all locks by token mint address

Recover Rent

MethodEndpointDescription
GET/api/v1/rent/closeable/:walletFind empty token accounts that can be closed
POST/api/v1/rent/close/buildBuild a transaction to close accounts and recover rent

Assets and Wallets

MethodEndpointDescription
POST/api/v1/assets/get-assetGet token holdings and SOL balance for a wallet
POST/api/v1/wallets/generateGenerate keypairs in bulk
POST/api/v1/wallets/vanityFind a vanity wallet address with a prefix or suffix

Bundle Trading

MethodEndpointDescription
POST/api/v1/dex/bundle-buy/buildBuild unsigned buy transactions for multiple wallets
POST/api/v1/dex/bundle-sell/buildBuild unsigned sell transactions for multiple wallets
POST/api/v1/dex/bundle/submitSubmit a bundle to Jito block engine

Volume Bot

MethodEndpointDescription
POST/api/v1/dex/volume-bot/estimateEstimate cost for a volume bot run
POST/api/v1/dex/volume-bot/setupCreate and fund volume bot wallets
POST/api/v1/dex/volume-bot/startStart the volume bot job
GET/api/v1/dex/volume-bot/:jobIdGet current status of a running bot
POST/api/v1/dex/volume-bot/:jobId/stopStop a running volume bot
DELETE/api/v1/dex/volume-bot/pendingDelete a pending setup that was never started
POST/api/v1/dex/volume-bot/recoverRecover unused SOL from bot wallets

Pump.fun

MethodEndpointDescription
POST/api/v1/pump/bundleCreate a Pump.fun token and pre-sign bundle wallet buy transactions

Multi Sender

MethodEndpointDescription
POST/api/v1/multisender/sendBuild a multi-recipient SOL or SPL token send transaction
POST/api/v1/multisender/collectSweep SOL and close token accounts from multiple wallets into one destination

Claim Dev Fees

MethodEndpointDescription
GET/api/v1/claim-fees/balances/:walletGet claimable creator fee balances for Pump.fun and LaunchLab
POST/api/v1/claim-fees/buildBuild an unsigned transaction to claim creator fees and pay the platform fee

EVM / Robinhood Chain

MethodEndpointDescription
GET/api/v1/evm/configGet chain configuration and contract addresses
GET/api/v1/evm/feeEstimate deployment fee for chosen token features
POST/api/v1/evm/deploy-tokenDeploy an ERC-20 token with optional tax, anti-bot, and anti-whale modules
POST/api/v1/evm/multisendSend ETH or ERC-20 tokens to multiple recipients
POST/api/v1/evm/verify-tokenSubmit contract source for verification on the block explorer

EVM Manage Token

MethodEndpointDescription
POST/api/v1/evm/manage/open-tradingEnable public transfers on the token contract
POST/api/v1/evm/manage/set-taxUpdate buy tax, sell tax, and tax recipient
POST/api/v1/evm/manage/set-limitsSet max wallet and max transaction size limits
POST/api/v1/evm/manage/remove-limitsDisable max wallet and max transaction restrictions
POST/api/v1/evm/manage/set-blacklistAdd or remove an address from the transfer blacklist
POST/api/v1/evm/manage/set-dex-pairRegister or deregister a DEX pair address
POST/api/v1/evm/manage/set-exemptionsGrant or revoke fee and limit exemptions for an address
POST/api/v1/evm/manage/set-pausedPause or unpause all token transfers
POST/api/v1/evm/manage/mintMint new tokens to a recipient address
POST/api/v1/evm/manage/burnBurn tokens from the caller's own balance
POST/api/v1/evm/manage/renounce-ownershipPermanently remove the owner (irreversible)
POST/api/v1/evm/manage/transfer-ownershipTransfer the owner role to a new address

EVM Liquidity

MethodEndpointDescription
POST/api/v1/evm/liquidity/add-with-ethCalldata for adding token and ETH liquidity to a pool
POST/api/v1/evm/liquidity/add-with-tokensCalldata for adding two ERC-20 tokens as liquidity
POST/api/v1/evm/liquidity/remove-with-ethCalldata for removing token and ETH liquidity
POST/api/v1/evm/liquidity/remove-with-tokensCalldata for removing two-token liquidity

EVM Token Locker

MethodEndpointDescription
POST/api/v1/evm/locker/lockCalldata for locking tokens until a future date via PinkLock02
POST/api/v1/evm/locker/vesting-lockCalldata for a vesting lock with TGE and cycle releases
POST/api/v1/evm/locker/unlockCalldata for unlocking tokens after the lock period
GET/api/v1/evm/locker/lock/:lockIdRead a single lock record from the chain
GET/api/v1/evm/locker/by-tokenRead all locks for a given token address
GET/api/v1/evm/locker/by-userRead all locks (normal and LP) owned by a given address

EVM Bundle

MethodEndpointDescription
POST/api/v1/evm/bundle/buyExecute coordinated buy transactions across multiple wallets (SSE)
POST/api/v1/evm/bundle/sellExecute coordinated sell transactions across multiple wallets (SSE)
POST/api/v1/evm/bundle/:jobId/stopStop a running bundle job

EVM Market Making

MethodEndpointDescription
POST/api/v1/evm/market-making/startStart a market-making job alternating buy and sell trades (SSE)

EVM Volume Bot

MethodEndpointDescription
POST/api/v1/evm/bot/find-poolsDiscover liquidity pools for a token
POST/api/v1/evm/bot/check-tradabilityVerify a token can be bought and sold
POST/api/v1/evm/bot/calc-makerCalculate maker wallet count and ETH needed for target volume
POST/api/v1/evm/bot/transfer-makerFund maker wallets from a funder wallet
POST/api/v1/evm/bot/start-makerStart the volume bot job (SSE)
GET/api/v1/evm/bot/:jobId/statusGet current status of a running volume bot job
POST/api/v1/evm/bot/:jobId/stopStop a running volume bot job
POST/api/v1/evm/bot/recover-ethSweep residual ETH from maker wallets to a collector address

EVM Increase Holders

MethodEndpointDescription
POST/api/v1/evm/holders/airdrop/startAirdrop tokens to generated addresses to increase holder count (SSE)
POST/api/v1/evm/holders/startStart a holder-increase buy job (SSE)
POST/api/v1/evm/holders/:jobId/stopStop a running holders job
POST/api/v1/evm/holders/:jobId/pausePause a running holders job
POST/api/v1/evm/holders/:jobId/resumeResume a paused holders job

EVM Pons Bundle

MethodEndpointDescription
POST/api/v1/evm/pons/balancesGet ETH and token balances for a list of wallets
POST/api/v1/evm/pons/bundle-buyExecute a coordinated bundle buy on Pons Launchpad (SSE)
POST/api/v1/evm/pons/upload-logoUpload a token logo to Pons IPFS
POST/api/v1/evm/pons/vanity-searchFind a token address with a desired prefix
GET/api/v1/evm/pons/configGet Pons Launchpad contract addresses and configuration

EVM Wallets

MethodEndpointDescription
POST/api/v1/evm/wallets/generateGenerate EVM wallet keypairs in bulk (1 to 100)