Launches

POSTCreate Launch

Last updated September 26, 2026

Build the on-chain transactions for a new Genesis token launch. Returns unsigned transactions that must be signed and sent before calling Register Launch.

Use the SDK instead

Most integrators should use createAndRegisterLaunch from the SDK, which handles creating transactions, signing, sending, and registering the launch in a single call. This endpoint is only needed if you require direct HTTP access without the SDK.

We recommend using the Create API to build launches programmatically, as metaplex.com does not yet support the full feature set of the Genesis program. Mainnet launches created through the API will appear on metaplex.com once registered.

Endpoint

POST /v1/launches/create

Request Body

FieldTypeRequiredDescription
walletstringYesCreator's wallet public key
launchobjectYesFull launch configuration (see below)
agentobjectNoLaunch on behalf of a registered agent (see Agent Launches)

The request body also accepts includeBackendSigner, derivedSignerPublicKey, nonce, and buildAllTxs. These drive the signing flow used by metaplex.com itself; leave them unset when calling the API directly.

Launch Configuration

The launch object describes the full token and launch setup:

FieldTypeRequiredDescription
namestringYesToken name, 1–32 characters
symbolstringYesToken symbol, 1–10 characters
imagestringYesToken image URL (Irys gateway)
descriptionstringNoToken description, max 250 characters
decimalsnumberNoToken decimals, 1–9 (defaults to 6). A new launchpool token must use 6, and an existing token must match its on-chain mint
supplynumberNoTotal token supply (defaults to 1,000,000,000)
networkstringNo'solana-mainnet' (default) or 'solana-devnet'
quoteMintstringNoQuote token mint address (defaults to wrapped SOL)
typestringYesLaunch type (see Launch Types)
finalizebooleanNoWhether to finalize the launch (defaults to true)
allocationsarrayYesArray of allocation configurations
externalLinksobjectNoWebsite, Twitter, Telegram links
publicKeystringYesCreator's wallet public key (must match the top-level wallet field)
useExistingTokenbooleanNoLaunch an existing SPL token instead of minting a new one (see Existing Tokens)
mintAddressstringNoMint of the existing token. Required when useExistingToken is true
isMutablebooleanNoWhether the token metadata stays mutable (defaults to true)

For a new token, the allocation supplies must add up to exactly supply. A new token with a supply other than the 1,000,000,000 default returns 403 unless custom supply is enabled for your account.

Launch Types

typeDescription
launchpoolProportional distribution pool. Allocations: a launchpoolV2, plus any unlockedV2 and claimScheduleV2 allocations
presaleFixed-price presale. Allocations, in order: a presaleV2, an unlockedV2, then any claimScheduleV2 allocations
bondingCurveBonding curve launch. Allocations: a bondingCurveV2. Fixed at 1,000,000,000 supply, 6 decimals, and a SOL quote

The schema also defines auction and custom. auction is a placeholder that is not implemented yet, and custom is rejected by the public API with 400.

Allocation Types

Each allocation in the allocations array has a type field, a name, a supply, and a configuration object keyed by the same type name:

  • launchpoolV2 — Proportional distribution pool
  • presaleV2 — Fixed-price presale
  • bondingCurveV2 — Bonding curve sale
  • unlockedV2 — Unlocked tokens to a recipient
  • claimScheduleV2 — Tokens released to a recipient on a vesting schedule, with an optional cliff

Raydium liquidity is configured as a fund flow on the sale allocation, not as its own allocation: a RaydiumLP flow creates a Raydium CPMM pool, and a RaydiumClmmLP flow creates a Raydium CLMM (concentrated liquidity) position. CLMM launches return 403 unless they are enabled for your account.

Streamflow allocations are retired

The earlier lockedV2 (Streamflow) allocation type is no longer accepted. Use claimScheduleV2 for locked and vesting allocations.

Existing Tokens

Set useExistingToken: true and pass the token's mintAddress to launch a token you already minted. decimals must match the on-chain mint. Unlike a new token, the allocations may fund only part of the supply: their total must be greater than 0 and no more than supply, and the rest stays in the creator's wallet. Existing-token launches return 403 unless they are enabled for your account, and are not available for the bondingCurve type.

Agent Launches

Pass agent to create the launch with a registered agent as its creator:

FieldTypeRequiredDescription
agent.mintstringYesThe agent's Core asset address. It must be owned by wallet
agent.setTokenbooleanYesWhether to set the launched token as the agent's token

The agent's asset signer wallet becomes the launch creator. Pass the same agent.mint to Register Launch.

The SDK's buildCreateLaunchPayload function handles converting the simplified CreateLaunchInput into this full payload format. See the API Client docs.

Example Request — Launch Pool Type

curl -X POST https://api.metaplex.com/v1/launches/create \
-H "Content-Type: application/json" \
-d '{
"wallet": "YourWalletPublicKey...",
"launch": {
"name": "My Token",
"symbol": "MTK",
"image": "https://gateway.irys.xyz/...",
"decimals": 6,
"supply": 1000000000,
"network": "solana-devnet",
"quoteMint": "So11111111111111111111111111111111111111112",
"type": "launchpool",
"finalize": true,
"publicKey": "YourWalletPublicKey...",
"allocations": [...]
}
}'

Success Response

{
"success": true,
"transactions": [
"base64-encoded-transaction-1...",
"base64-encoded-transaction-2..."
],
"blockhash": {
"blockhash": "...",
"lastValidBlockHeight": 123456789
},
"mintAddress": "MintPublicKey...",
"genesisAccount": "GenesisAccountPDA..."
}
FieldTypeDescription
successbooleantrue on success
transactionsstring[]Base64-encoded serialized transactions
blockhashobjectBlockhash for transaction confirmation
mintAddressstringThe token mint public key
genesisAccountstringThe genesis account PDA public key

Error Response

{
"success": false,
"error": "Validation failed",
"details": [...]
}
FieldTypeDescription
successbooleanfalse on error
errorstringError message
detailsarray?Validation error details (when applicable)

Error Codes

CodeDescription
400Invalid input or validation failure
500Internal server error

Instead of calling this endpoint directly, use createAndRegisterLaunch which handles the entire flow — creating transactions, signing, sending, and registering — in one call:

createAndRegisterLaunch.ts
1import {
2 createAndRegisterLaunch,
3 CreateLaunchInput,
4 genesis,
5} from '@metaplex-foundation/genesis'
6import { createUmi } from '@metaplex-foundation/umi-bundle-defaults'
7import { keypairIdentity } from '@metaplex-foundation/umi'
8
9const umi = createUmi('https://api.mainnet-beta.solana.com')
10 .use(genesis())
11
12// Use keypairIdentity to set a wallet when running server-side:
13// umi.use(keypairIdentity(myKeypair))
14
15const input: CreateLaunchInput = {
16 wallet: umi.identity.publicKey,
17 token: {
18 name: 'My Token',
19 symbol: 'MTK',
20 image: 'https://gateway.irys.xyz/...',
21 },
22 launchType: 'launchpool',
23 launch: {
24 launchpool: {
25 tokenAllocation: 500_000_000,
26 depositStartTime: new Date(Date.now() + 48 * 60 * 60 * 1000),
27 raiseGoal: 250,
28 raydiumLiquidityBps: 5000,
29 fundsRecipient: umi.identity.publicKey,
30 },
31 },
32}
33
34const result = await createAndRegisterLaunch(umi, {}, input)
35console.log(`Launch live at: ${result.launch.link}`)

See API Client for the full SDK documentation including all three integration modes.