Create Token | Meteora API
Launch tokens on Meteora Launchpad in a single request. It works just like Create Token on Pump.fun, except every token is launched on a config β it sets the fees, quote mint, supply, and bonding curve.
Endpointβ
POST https://api.pumpapi.io
Parametersβ
| Parameter | Required | Description |
|---|---|---|
pool | Yes | "meteora-launchpad" |
launchpadConfig | Yes | Config address. Take it from any Meteora Launchpad event in the Data Stream or create your own. The config also sets the quote token, so no quoteMint is needed |
name | Yes | Token name |
symbol | Yes | Token ticker symbol |
amount | No | Dev buy on launch, in the config's quote token (usually SOL) |
Everything else β imageURL, description, website, telegram, x, uri, mintRef, Jito Bundles, Actions and local transactions β works the same as on Pump.fun.
No quoteMint β you always create with the config's quote token.
Basic Exampleβ
- Python
- JavaScript
- Rust
- Go
import requests
url = "https://api.pumpapi.io"
data = {
"privateKey": "base58_private_key", # or use "apiKey": "your_api_key" instead β generate one at pumpapi.io/trade-api (π spoiler)
"action": "create",
"pool": "meteora-launchpad",
"launchpadConfig": "CnjeHETJWUCa54c8fnFyu3Kgquba7F7qmuBvu6rwhrrr",
"name": "PumpApi",
"symbol": "PAPI",
"imageURL": "https://pumpapi.io/img/pumpapi_logo.webp",
"amount": 0.1, # dev buy
}
response = requests.post(url, json=data)
print(response.json())
import axios from 'axios';
const data = {
privateKey: "base58_private_key", // or use "apiKey": "your_api_key" instead β generate one at pumpapi.io/trade-api (π spoiler)
action: "create",
pool: "meteora-launchpad",
launchpadConfig: "CnjeHETJWUCa54c8fnFyu3Kgquba7F7qmuBvu6rwhrrr",
name: "PumpApi",
symbol: "PAPI",
imageURL: "https://pumpapi.io/img/pumpapi_logo.webp",
amount: 0.1, // dev buy
};
axios.post("https://api.pumpapi.io", data)
.then(response => console.log(response.data))
.catch(error => console.error(error));
use reqwest::Client;
use serde_json::json;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = Client::new();
let res = client
.post("https://api.pumpapi.io")
.json(&json!({
"privateKey": "base58_private_key", // or use "apiKey": "your_api_key" instead β generate one at pumpapi.io/trade-api (π spoiler)
"action": "create",
"pool": "meteora-launchpad",
"launchpadConfig": "CnjeHETJWUCa54c8fnFyu3Kgquba7F7qmuBvu6rwhrrr",
"name": "PumpApi",
"symbol": "PAPI",
"imageURL": "https://pumpapi.io/img/pumpapi_logo.webp",
"amount": 0.1, // dev buy
}))
.send()
.await?
.text()
.await?;
println!("{}", res);
Ok(())
}
package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
)
func main() {
data := map[string]interface{}{
"privateKey": "base58_private_key", // or use "apiKey": "your_api_key" instead β generate one at pumpapi.io/trade-api (π spoiler)
"action": "create",
"pool": "meteora-launchpad",
"launchpadConfig": "CnjeHETJWUCa54c8fnFyu3Kgquba7F7qmuBvu6rwhrrr",
"name": "PumpApi",
"symbol": "PAPI",
"imageURL": "https://pumpapi.io/img/pumpapi_logo.webp",
"amount": 0.1, // dev buy
}
jsonData, _ := json.Marshal(data)
resp, err := http.Post("https://api.pumpapi.io", "application/json", bytes.NewBuffer(jsonData))
if err != nil {
panic(err)
}
defer resp.Body.Close()
var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result)
fmt.Println(result)
}
The address of the new token comes back in createdMints.
Create Your Own Configβ
Want your own curve, supply or fees? Create a config and launch tokens on it. All fields are optional β this alone creates a config with a Pump.fun-like curve on SOL:
{
"privateKey": "base58_private_key", // or use "apiKey": "your_api_key" instead
"action": "createConfig",
}
Send it the same way as the Basic Example. The address of the new config comes back in createdLaunchpadConfigs.
| Parameter | Default | Description |
|---|---|---|
quoteMint | SOL | Quote token of the curve. For USDC use EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v. With any quote other than SOL, initialMarketCap and migrationMarketCap are required |
supply | 1000000000 | Total supply of every token on this config |
initialMarketCap | 28 SOL | Market cap at launch, in the quote token |
migrationMarketCap | 410 SOL | Market cap at which the curve ends and the token migrates to a Meteora DAMM v2 pool. With the defaults the curve raises ~85 SOL |
poolFeeRate | 0.01 (1%) | Trading fee on the curve |
creatorFeeShare | "50%" | Part of the trading fee paid to the token creator instead of you |
poolFeeRateAfterMigration | 0.0025 (0.25%) | Trading fee in the pool after migration, from 0.1% to 10% |
migrationFee | "0%" | Part of the raised quote that goes to you at migration instead of into the pool, up to 50% |
creatorMigrationFeeShare | "0%" | Part of migrationFee paid to the token creator |
poolCreationFee | 0 | Fee in SOL paid by anyone who launches a token on your config |
creatorLockedLiquidityAfterMigration | "0%" | Pool liquidity locked for the creator: earns fees, can't be withdrawn |
creatorUnlockedLiquidityAfterMigration | "0%" | Pool liquidity the creator can withdraw |
platformUnlockedLiquidityAfterMigration | "0%" | Pool liquidity you can withdraw |
platformFeeAddress | your wallet | Wallet that receives your share |
pool | Yes | "meteora-launchpad" |
Liquidity you don't hand out stays locked for you: it earns pool fees but can't be withdrawn.
A config can't be changed after it's created.
Config and Token in One Transactionβ
Set launchpadConfigRef on createConfig and use it on create instead of launchpadConfig β just like mintRef. Works in Jito Bundles too.
{
"actions": [
{
"privateKey": "base58_private_key",
"action": "createConfig",
"quoteMint": "So11111111111111111111111111111111111111112",
"launchpadConfigRef": "0", // temporary reference for the new config
"supply": 1000,
"pool": "meteora-launchpad"
},
{
"privateKey": "base58_private_key",
"action": "create",
"pool": "meteora-launchpad",
"launchpadConfigRef": "0", // reuse it instead of launchpadConfig
"name": "PumpApi",
"symbol": "PAPI",
"imageURL": "https://pumpapi.io/img/pumpapi_logo.webp",
"amount": 0.1
}
]
}
Example Responseβ
For createConfig:
{
"signature": "33C8iFBVSuCtioGkoykyuZmBM5qKZe5HNZKXAm7mBbTFnQ7SaktZKwpZMNfZZxAZLeEwnSj43xPRhQXVEGEBBYTz",
"err": "",
"timestamp": 1790154524625,
"createdLaunchpadConfigs": ["CnjeHETJWUCa54c8fnFyu3Kgquba7F7qmuBvu6rwhrrr"]
}
Need help? Join our Telegram group.