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
| Field | Type | Required | Description |
|---|---|---|---|
genesisAccount | string | Yes | The genesis account public key (from Create Launch response) |
network | string | No | 'solana-mainnet' (default) or 'solana-devnet' |
launch | object | Yes | The 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..."
}
}
| Field | Type | Description |
|---|---|---|
success | boolean | true on success |
existing | boolean? | true if launch was already registered (idempotent) |
launch.id | string | Unique launch ID |
launch.link | string | Public launch page URL |
token.id | string | Unique token ID |
token.mintAddress | string | Token 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
| Code | Description |
|---|---|
400 | Invalid input, on-chain state mismatch, or genesis account not found |
500 | Internal 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)
Recommended: Use the SDK
Instead of calling this endpoint directly, use createAndRegisterLaunch which handles the entire flow — creating transactions, signing, sending, and registering — in one call:
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.
