> ## Documentation Index
> Fetch the complete documentation index at: https://v1-docs.zcombinator.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Create Token Launch

> POST /launch - Create an unsigned transaction for SPL token launch

## Overview

Creates an unsigned transaction for launching a new SPL token on Solana with custom metadata, optional vanity address ending, no fees, automatic inflation and claimability.

<CodeGroup>
  ```bash curl theme={null}
  curl -X POST https://api.zcombinator.io/launch \
    -H "Content-Type: application/json" \
    -d '{
      "name": "My Token",
      "symbol": "MTK",
      "description": "A demonstration token",
      "image": "https://example.com/token-image.png",
      "website": "https://example.com",
      "twitter": "https://twitter.com/mytoken",
      "caEnding": "MTK",
      "payerPublicKey": "9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWM",
      "quoteToken": "SOL"
    }'
  ```

  ```javascript fetch theme={null}
  const response = await fetch('https://api.zcombinator.io/launch', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      name: "My Token",
      symbol: "MTK",
      description: "A demonstration token",
      image: "https://example.com/token-image.png",
      website: "https://example.com",
      twitter: "https://twitter.com/mytoken",
      caEnding: "MTK",
      payerPublicKey: "9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWM",
      quoteToken: "SOL" // or "ZC" for native launchpad token
    })
  });

  const result = await response.json();
  ```

  ```python requests theme={null}
  import requests

  data = {
      "name": "My Token",
      "symbol": "MTK",
      "description": "A demonstration token",
      "image": "https://example.com/token-image.png",
      "website": "https://example.com",
      "twitter": "https://twitter.com/mytoken",
      "caEnding": "MTK",
      "payerPublicKey": "9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWM",
      "quoteToken": "SOL"  # or "ZC" for native launchpad token
  }

  response = requests.post(
      'https://api.zcombinator.io/launch',
      json=data,
      headers={'Content-Type': 'application/json'}
  )

  result = response.json()
  ```
</CodeGroup>

## Request Parameters

<ParamField body="name" type="string" required>
  The display name of the token (e.g., "Solana Token")
</ParamField>

<ParamField body="symbol" type="string" required>
  The token symbol/ticker (e.g., "SOL", "USDC")
</ParamField>

<ParamField body="payerPublicKey" type="string" required>
  Base58 encoded public key of the account that will pay transaction fees and own the token
</ParamField>

<ParamField body="description" type="string">
  Optional description of the token for metadata
</ParamField>

<ParamField body="image" type="string">
  URL to the token's image/logo for metadata
</ParamField>

<ParamField body="website" type="string">
  Website URL associated with the token
</ParamField>

<ParamField body="twitter" type="string">
  Twitter URL or handle for the token project
</ParamField>

<ParamField body="caEnding" type="string">
  Optional vanity ending for the token address (max 3 characters, no 0, O, I, l)
</ParamField>

<ParamField body="quoteToken" type="string">
  Quote token for the bonding curve pool. Options: "SOL" (default) or "ZC" (native launchpad token). If not specified, defaults to "SOL"
</ParamField>

## Response

<ResponseField name="success" type="boolean">
  Indicates if the operation was successful
</ResponseField>

<ResponseField name="transaction" type="string">
  Base58 encoded unsigned transaction that needs to be signed by the payer
</ResponseField>

<ResponseField name="baseMint" type="string">
  The public key of the token mint address
</ResponseField>

<ResponseField name="metadataUrl" type="string">
  IPFS URL where the token metadata is stored
</ResponseField>

<ResponseField name="message" type="string">
  Instructions for the next step in the process
</ResponseField>

### Success Response

```json theme={null}
{
  "success": true,
  "transaction": "4MzR7dxJNJRVP1Q6k7Y3j8X...", // Base58 encoded transaction
  "baseMint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
  "metadataUrl": "https://gateway.pinata.cloud/ipfs/QmX7Y3j8...",
  "message": "Sign this transaction and submit to /confirm-launch"
}
```

## Error Responses

<AccordionGroup>
  <Accordion title="400 - Missing Required Fields">
    ```json theme={null}
    {
      "error": "Missing required fields: name, symbol, and payerPublicKey are required"
    }
    ```
  </Accordion>

  <Accordion title="400 - Invalid CA Ending">
    ```json theme={null}
    {
      "error": "CA ending must be 3 characters or less"
    }
    ```

    Or:

    ```json theme={null}
    {
      "error": "CA ending contains invalid Base58 characters (0, O, I, l)"
    }
    ```
  </Accordion>

  <Accordion title="500 - Server Error">
    ```json theme={null}
    {
      "error": "Failed to create launch transaction"
    }
    ```
  </Accordion>
</AccordionGroup>

## Rate Limiting

This endpoint is subject to rate limiting:

* **8 requests per IP** per 2-minute window
* Returns HTTP 429 when limit exceeded

## Next Steps

After receiving the unsigned transaction:

1. **Deserialize** the transaction using `@solana/web3.js`
2. **Sign** the transaction with your wallet
3. **Submit** the signed transaction to [`/confirm-launch`](/api-reference/launch/confirm)

<Warning>
  The `baseMint` and internal keypair are stored temporarily. You must call `/confirm-launch` within a reasonable time frame or the launch will need to be restarted.
</Warning>

## Security Notes

* The API generates the token keypair internally and does not expose the private key
* Users only sign for transaction fees and account creation
* Protocol maintains mint authority for the claims system
* All metadata is uploaded to IPFS for permanent storage
