Integration APIs

POSTRegister Launch

Last updated February 19, 2026

Register a Genesis launch after the on-chain transactions from Create Launch have been confirmed. The endpoint validates the on-chain state, creates the launch listing, and returns a launch page URL.

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.

Endpoint

POST /v1/launches/register

Request Body

FieldTypeRequiredDescription
genesisAccountstringYesThe genesis account public key (from Create Launch response)
networkstringNo'solana-mainnet' (default) or 'solana-devnet'
launchobjectYesThe same launch configuration used in Create Launch

The launch object must match what was sent to the Create Launch endpoint so the API can verify the on-chain state matches the expected configuration. The top-level network field determines which Solana cluster to verify against; the network inside launch should match.

Example Request

curl -X POST https://api.metaplex.com/v1/launches/register \
-H "Content-Type: application/json" \
-d '{
"genesisAccount": "GenesisAccountPDA...",
"network": "solana-devnet",
"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,
"existing": false,
"launch": {
"id": "uuid-launch-id",
"link": "https://www.metaplex.com/token/MintPublicKey..."
},
"token": {
"id": "uuid-token-id",
"mintAddress": "MintPublicKey..."
}
}
FieldTypeDescription
successbooleantrue on success
existingboolean?true if launch was already registered (idempotent)
launch.idstringUnique launch ID
launch.linkstringPublic launch page URL
token.idstringUnique token ID
token.mintAddressstringToken mint public key

If the launch has already been registered, the endpoint returns the existing record with existing: true rather than creating a duplicate.

Mainnet launches will appear on metaplex.com after registration. The returned launch.link points to the public launch page.

Error Response

{
"success": false,
"error": "Genesis account not found on-chain",
"details": [...]
}

Error Codes

CodeDescription
400Invalid input, on-chain state mismatch, or genesis account not found
500Internal server error

Validation

The register endpoint performs extensive on-chain validation:

  • Fetches the Genesis V2 account and verifies it exists
  • Validates all bucket accounts match the expected allocations
  • Verifies token metadata (name, symbol, image) matches the input
  • Checks mint properties (supply, decimals, authorities)

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.