Integration APIs

POSTCreate Launch

Last updated February 19, 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)

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 (defaults to 6)
supplynumberNoTotal token supply (defaults to 1,000,000,000)
networkstringNo'solana-mainnet' (default) or 'solana-devnet'
quoteMintstringNoQuote token mint address (defaults to wrapped SOL)
typestringYes'project'
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)

Allocation Types

Each allocation in the allocations array has a type field:

  • launchpoolV2 — Proportional distribution pool
  • raydiumV2 — Raydium LP allocation
  • unlockedV2 — Unlocked tokens to a recipient
  • lockedV2 — Locked tokens via Streamflow
  • presaleV2 — Fixed-price presale

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

Example Request

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": "project",
"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: 'project',
23 launch: {
24 launchpool: {
25 tokenAllocation: 500_000_000,
26 depositStartTime: new Date(Date.now() + 48 * 60 * 60 * 1000),
27 raiseGoal: 200,
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.