# Create a launch

> Builds the launch transactions for the wallet to sign. Nothing is on chain yet. Needs a key made with launching switched on. See the guide.


`POST https://payday.direct/api/v1/launches`

Builds the launch transactions for the wallet to sign. Nothing is on chain yet. Needs a key made with launching switched on. See [the guide](/developers/guides/launch-solana).

## Body

- `mode` ("account" | "cash_payback"): account: fees to fees_to. cash_payback: fees to the coin's holders by time held (GET /payback for the rules); any pairing pump.fun offers.
- `wallet` (string, required): Solana address that signs and pays for the launch
- `name` (string, required): The coin's name
- `symbol` (string, required): ticker, case kept
- `description` (string)
- `image` (string, required): PNG, JPEG, GIF or WebP as base64 or a data URL
- `banner` (string): optional, same formats
- `dev_buy_sol` (number, required): SOL the wallet spends on the first buy
- `fees_to` (string): X handle that gets the fees; or a $cashtag, venmo:username, or zelle:<email or US phone> (a Zelle destination is permanent and never shown in public)
- `hold_in_vault` (boolean): X handles only: hold the fees for the account to claim instead of paying them through Peer
- `quote_mint` (string): optional: pair with a stock or another asset pump.fun supports instead of SOL
- `reward_basket` (object[]): Deprecated: send `basket` instead. Still accepted in v1. cash_payback only, where baskets are open: 1 to 15 assets from GET /rewards/assets, no repeats. Plain mints for an even split, or { mint, weight_bps } for every asset with weights adding up to 10000, each at least 100. The split stays the same; basket_type says what the holders' part does with the basket. Dividends follow the Cash Payback round clock and are shared by the hold ladder. Locked at launch. Only on a SOL pair (leave out quote_mint). Each asset is checked first (a transfer fee of at most 5%, no transfer hook, not frozen, a swap route from the pairing); a refused basket answers 400 with error.rejected, one reason per asset. An asset with its own transfer fee keeps it: holders get what is sent minus that fee, shown as transfer_fee_bps. Leave it out and holders are paid in the pairing.
- `basket` (object): cash_payback only, where baskets are open; the newer form of reward_basket and basket_type (send one form, not both). Locked at launch. The site launcher runs the same validator. Refusals answer 400 with a stable error.code: basket_size, basket_weights, basket_type, basket_asset_not_allowed (error.mint and error.rejected, one reason per asset), basket_payback_not_allowed (error.mint).
- `basket.type` ("payout" | "fund"): payout: the whole holders' part buys the legs by weight and all of it is sent every round. fund: the legs are bought and kept; holders are paid only value above cost.
- `basket.legs` (object[], required)
- `basket.payback` (string | null): fund only, optional: one asset from the full list (GET /rewards/assets?for=payout). pair_pct of the holders' part (GET /payback baskets.payback.pair_pct, saved on the coin at launch) buys it and is paid every round; the rest buys the fund. Refused on a payout basket.
- `basket_type` ("payout" | "fund"): Deprecated: send `basket` instead. Still accepted in v1. with reward_basket, locked at launch. payout: the whole holders' part buys the basket by weight and all of it is sent each dividend; nothing is held. fund: the whole holders' part buys the basket and the coin keeps it (never sold); holders are paid only each asset's value above what it cost, so if the assets do not rise the fund pays nothing. A fund basket takes only stocks, pre-stocks, the majors (SOL, WBTC, ETH, HYPE, XMR) and the big memes (PUMP, Fartcoin, Bonk, $WIF, TRUMP, PENGU); no USDC.
- `pay_with_sol` (boolean): with quote_mint: the wallet pays in SOL and a swap transaction is added
- `links` (object): Where to see the coin
- `links.x` (string)
- `links.telegram` (string)
- `links.website` (string)

```json
{
  "wallet": "LaunchWa11et1111111111111111111111111111111",
  "name": "Example Coin",
  "symbol": "Example",
  "description": "What the coin is about.",
  "image": "BASE64_PNG_JPEG_GIF_OR_WEBP",
  "dev_buy_sol": 0.5,
  "fees_to": "examplehandle"
}
```

## Responses

- 201: Transactions to sign
- 400: Error
- 401: Missing or invalid key
- 403: Error
- 429: Over the limit. Retry-After says when to try again.

```json
{
  "data": {
    "id": "L_9f2c1e",
    "status": "awaiting_signature",
    "mint": "NewCoinMint11111111111111111111111111111pump",
    "wallet": "LaunchWa11et1111111111111111111111111111111",
    "fees_to": {
      "rail": "xmoney",
      "handle": "examplehandle"
    },
    "transactions": [
      {
        "name": "launch",
        "transaction": "AQAB...BASE64"
      },
      {
        "name": "buy",
        "transaction": "AQAB...BASE64"
      },
      {
        "name": "split_1",
        "transaction": "AQAB...BASE64"
      }
    ],
    "sign_within_seconds": 60,
    "expires_in_seconds": 600
  }
}
```

## Example

```bash
curl -X POST "https://payday.direct/api/v1/launches" \
  -H "Authorization: Bearer pd_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"wallet":"LaunchWa11et1111111111111111111111111111111","name":"Example Coin","symbol":"Example","description":"What the coin is about.","image":"BASE64_PNG_JPEG_GIF_OR_WEBP","dev_buy_sol":0.5,"fees_to":"examplehandle"}'
```