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

# Prepare a purps.lol launch

> Step 1 of a purps.lol launch. Send the launch's terms and get back the exact message your wallet must sign, with the timestamp that is part of it. Nothing is stored or spent. Sign the message with the creator wallet (ed25519 over the UTF-8 bytes, the way `signMessage` does) and send the same terms plus `ts` and `signature` to submit within five minutes.



## OpenAPI

````yaml https://purps.lol/api/v1/openapi.json post /launches/prepare
openapi: 3.1.0
info:
  title: PURPS API
  version: 1.0.0
  description: >-
    Everything purps.lol can do, as JSON. Read the coin list, a coin's full page
    and the launchpad; launch coins on purps.lol, pump.fun and Robinhood Chain;
    wire an existing pump.fun coin's fees into a strategy. No key, no signup. A
    write is authorised by your own wallet's signature and every transaction is
    signed in your wallet, never by us. Every response is `{ ok: true, data }`
    or `{ ok: false, error }`. Cross-origin requests are allowed from any site.
servers:
  - url: https://purps.lol/api/v1
security: []
tags:
  - name: Coins
    description: Read what the site shows.
  - name: Launch on purps.lol
    description: Launch a coin on purps.lol. Prepare, sign, submit, send, poll.
  - name: Launch on pump.fun
    description: Launch straight on pump.fun with fees wired to a strategy.
  - name: Launch on Robinhood Chain
    description: Launch through Pons on Robinhood Chain.
  - name: Redirect a pump.fun coin
    description: Point an existing pump.fun coin's creator fees at a strategy.
  - name: Manage a coin
    description: Attach a strategy to a coin launched without one. Creator-signed.
  - name: Transactions
    description: Send a signed Solana transaction through our relay and watch it land.
paths:
  /launches/prepare:
    post:
      tags:
        - Launch on purps.lol
      summary: Prepare a purps.lol launch
      description: >-
        Step 1 of a purps.lol launch. Send the launch's terms and get back the
        exact message your wallet must sign, with the timestamp that is part of
        it. Nothing is stored or spent. Sign the message with the creator wallet
        (ed25519 over the UTF-8 bytes, the way `signMessage` does) and send the
        same terms plus `ts` and `signature` to submit within five minutes.
      operationId: prepareLaunch
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/LaunchTerms'
      responses:
        '200':
          description: What to sign.
          content:
            application/json:
              schema:
                type: object
                properties:
                  ok:
                    type: boolean
                    enum:
                      - true
                  data:
                    $ref: '#/components/schemas/Prepared'
        '400':
          description: Every failure carries the same envelope.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          description: Every failure carries the same envelope.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
components:
  schemas:
    LaunchTerms:
      type: object
      properties:
        name:
          type: string
          description: 1 to 32 characters.
          required: true
        symbol:
          type: string
          description: 1 to 10 characters.
          required: true
        quoteMint:
          type: string
          description: The pair, from /pairs `meteora`.
          required: true
        feePreset:
          type: string
          description: >-
            Where creator fees go: `airdrop` to holders, `split` half to holders
            half to you, `creator` all to you (no strategy possible later),
            `strategy` into a strategy you send now.
          enum:
            - airdrop
            - split
            - creator
            - strategy
          required: true
        devBuySol:
          type: number
          description: >-
            Your own first buy, in SOL. Converted to the pair on the way in when
            the pair is not SOL. Default 0.
        creatorFeeBps:
          type: integer
          description: >-
            Your fee tier, basis points of curve volume, on top of the
            platform's 1%. Default 100 (1%), maximum 1000.
        strategy:
          $ref: '#/components/schemas/Strategy'
          type: object
          description: >-
            Required when `feePreset` is `strategy`. Must be sent identically to
            submit.
        creatorWallet:
          type: string
          description: The Solana wallet that signs and pays.
          required: true
    Prepared:
      type: object
      properties:
        ts:
          type: integer
          description: Unix seconds. Send it back unchanged with the signature.
        message:
          type: string
          description: >-
            The exact text to sign. Sign the UTF-8 bytes as they are: no prefix,
            no hashing on Solana; `personal_sign` on Robinhood Chain.
        expiresInSeconds:
          type: integer
          description: How long the signature stays valid. 300.
        hash:
          type: string
          description: The terms' hash, as embedded in the message. For your records.
    Error:
      type: object
      properties:
        ok:
          type: boolean
          description: Always false on a failure.
        error:
          type: string
          description: >-
            A short reason in plain words: `coin not found`, `too many
            requests`, `invalid wallet signature`.
    Strategy:
      type: object
      description: >-
        How a coin uses its fees. Basis points sum to 10000 across the three
        splits.
      properties:
        splitBuybackBps:
          type: integer
          description: Share of each fee that buys the coin back.
          required: true
        splitMarginBps:
          type: integer
          description: Share sent to the perp exchange as margin.
          required: true
        splitReserveBps:
          type: integer
          description: Share kept as a reserve that backs the positions.
          required: true
        perpLegs:
          type: array
          description: >-
            The positions to hold: `{ market, direction, leverage, weightBps,
            reserveMode }`. `market` from /markets, `leverage` a whole number
            within its cap, weights summing to 10000, `reserveMode` `defensive`
            or `none` (use the preset's `legReserveMode`). Empty means no perps,
            in which case margin and reserve must be 0.
          items:
            type: object
          required: true
        rewardMode:
          type: string
          description: >-
            What profits do: `burn` (default), `holders` pays the coin itself,
            `backed` pays `payoutMint`. Paying coins need `holderPayoutsEnabled`
            in /launch-options.
          enum:
            - burn
            - holders
            - backed
        payoutMint:
          type: string
          description: >-
            `backed` only: the asset holders are paid in, from /launch-options
            `payoutAssets` or any Solana mint with a real market.
          nullable: true
        payoutMint2:
          type: string
          description: >-
            Optional second payout asset for any paying coin; each buyback
            splits in half between the two.
          nullable: true
        strategy:
          type: object
          description: >-
            The trading rules: `{ preset, tpTriggerPct, tpSlicePct, rungCount,
            rungMode }`. Take a preset's `config.strategy` from /launch-options,
            or set your own.
          nullable: true

````