> ## 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.

# Build a purps.lol launch

> One call, no message to sign. Send the launch's terms, the coin's image and socials. We upload the metadata, build the launch transaction (and a SOL-to-pair swap in front of it when the pair is not SOL and there is a dev buy), simulate it, and record the launch as pending. You get back unsigned transactions and the throwaway mint key. The launch transaction can only land with the creator wallet's signature, and that is the proof: sign each transaction with the creator wallet, and the one at `createIndex` with the mint key as well, then send them in order through /transactions/send. The launch goes live on its own once the pool exists on chain; poll /launches/{mint}. A wallet the launchpad does not admit is refused with a 403 before anything is uploaded; a wallet that cannot afford the launch (about 0.03 SOL plus the dev buy) with a 400. `imageUrl` fetches are budgeted (20 an hour per address, 200 an hour site-wide); a 429 naming image fetches means send `image` as a data URL instead.



## OpenAPI

````yaml /openapi.json post /launches
openapi: 3.1.0
info:
  title: PURPS API
  version: 2.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 Pons; wire an
    existing pump.fun coin's fees into a strategy; steer a coin you own. No key,
    no signup. A launch is one call that returns unsigned transactions: the
    launch transaction can only land with your wallet's signature, and that is
    the proof. The few writes that need a message signature (Pons launches,
    wiring a strategy onto a coin, creator authority) come as a prepare/submit
    pair. 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. Every answer from the API itself carries
    `RateLimit-Limit` and `RateLimit-Policy`; uncached ones (writes, prepare and
    submit, refusals) carry `RateLimit-Remaining` and `RateLimit-Reset` as well.
    The 503 while the API is paused and the 410 on old v1 write addresses carry
    neither.
servers:
  - url: https://purps.lol/api/v2
security: []
tags:
  - name: Coins
    description: Read what the site shows.
  - name: Launch on purps.lol
    description: Launch a coin on purps.lol. Build, sign, send, poll.
  - name: Launch on pump.fun
    description: Launch straight on pump.fun with fees wired to a strategy.
  - name: Launch on Pons
    description: Launch through Pons, the launchpad 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: Creator authority
    description: >-
      Steer a purps.lol coin you own: act on a position, change its strategy,
      ask for authority, or hand the coin on. Every move is signed by the
      owner's wallet and published on the coin's Changes tab.
  - name: Transactions
    description: Send a signed Solana transaction through our relay and watch it land.
paths:
  /launches:
    post:
      tags:
        - Launch on purps.lol
      summary: Build a purps.lol launch
      description: >-
        One call, no message to sign. Send the launch's terms, the coin's image
        and socials. We upload the metadata, build the launch transaction (and a
        SOL-to-pair swap in front of it when the pair is not SOL and there is a
        dev buy), simulate it, and record the launch as pending. You get back
        unsigned transactions and the throwaway mint key. The launch transaction
        can only land with the creator wallet's signature, and that is the
        proof: sign each transaction with the creator wallet, and the one at
        `createIndex` with the mint key as well, then send them in order through
        /transactions/send. The launch goes live on its own once the pool exists
        on chain; poll /launches/{mint}. A wallet the launchpad does not admit
        is refused with a 403 before anything is uploaded; a wallet that cannot
        afford the launch (about 0.03 SOL plus the dev buy) with a 400.
        `imageUrl` fetches are budgeted (20 an hour per address, 200 an hour
        site-wide); a 429 naming image fetches means send `image` as a data URL
        instead.
      operationId: buildLaunch
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/LaunchBuild'
      responses:
        '200':
          description: The transactions to sign.
          content:
            application/json:
              schema:
                type: object
                properties:
                  ok:
                    type: boolean
                    enum:
                      - true
                  data:
                    $ref: '#/components/schemas/SolanaBuild'
        '400':
          description: Every failure carries the same envelope.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: Every failure carries the same envelope.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '409':
          description: Every failure carries the same envelope.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '413':
          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'
        '503':
          description: Every failure carries the same envelope.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
components:
  schemas:
    LaunchBuild:
      type: object
      description: >-
        A purps.lol launch, in one call. No `ts` or `signature`: the launch
        transaction you sign is the proof.
      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 `purps`.
          required: true
        feePreset:
          type: string
          description: >-
            Where creator fees go: `airdrop` to holders in the pair token,
            `split` half to holders half to you, `creator` all to your wallet,
            `strategy` into a strategy you send now. Send `feeSplit` for any
            other share.
          enum:
            - airdrop
            - split
            - creator
            - strategy
          required: true
        feeSplit:
          $ref: '#/components/schemas/FeeSplit'
          type: object
          description: >-
            Optional three-way share of the creator fee, basis points summing to
            10000. `strategy` is required when `strategyBps` is above zero.
        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%); 50 (0.5%) to 980 (9.8%).
        strategy:
          $ref: '#/components/schemas/Strategy'
          type: object
          description: >-
            Required when `feePreset` is `strategy` or `feeSplit.strategyBps` is
            above zero. Checked before anything is uploaded; registered by us
            the moment the launch goes live.
        creatorWallet:
          type: string
          description: The Solana wallet that signs the transactions and pays.
          required: true
        image:
          type: string
          description: >-
            The coin's logo as a data URL (`data:image/png;base64,…`). PNG,
            JPEG, WebP or GIF, 512KB max. Send this or `imageUrl`.
        imageUrl:
          type: string
          description: >-
            A public https link to the logo instead of `image`. Fetched by us
            under the same size and type rules.
        description:
          type: string
          description: >-
            Up to 500 characters. The coin's website in its metadata is always
            its purps.lol page; add your own links as `twitter` and `telegram`.
        twitter:
          type: string
          description: https:// link.
        telegram:
          type: string
          description: https:// link.
    SolanaBuild:
      type: object
      properties:
        mint:
          type: string
          description: The new coin's mint address.
        transactions:
          type: array
          description: Base64 transactions to sign and send in order.
          items:
            type: string
        createIndex:
          type: integer
          description: >-
            Which of `transactions` is the create. Sign that one with the mint
            key as well.
        mintSecret:
          type: string
          description: >-
            The mint keypair's secret, base58. Powerless after the launch; use
            it once to countersign the create.
          nullable: true
        imageUrl:
          type: string
          description: Where the logo was stored, when this build uploaded one.
          nullable: true
        url:
          type: string
          description: The coin's future page.
    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`.
    FeeSplit:
      type: object
      properties:
        strategyBps:
          type: integer
          description: Share swapped to SOL and fed into the coin's strategy.
          required: true
        airdropBps:
          type: integer
          description: Share paid to holders in the pair token from the airdrop pot.
          required: true
        creatorBps:
          type: integer
          description: Share sent straight to the creator wallet, in the pair token.
          required: true
    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`); optional
            `takeProfitPct` and `stopLossPct` (percent, shown in the signed
            words when set) and `reserveTranches`. 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. On Solana, a mint from
            /launch-options `payoutAssets` or any Solana mint with a real
            market. On Robinhood Chain, a `0x` token address that passes the
            depth check: one of the launchpad's `payoutAssets`, or any token
            /pons/assets/{address} reports as payable. ETH itself cannot be a
            payout asset there.
          nullable: true
        payoutMintsExtra:
          type: array
          items:
            type: string
          description: >-
            Further payout assets for any paying coin, up to four beyond the
            first; every buyback splits evenly across all of them and holders
            receive each. Same rules per asset as `payoutMint`.
          nullable: true
        payoutMint2:
          type: string
          description: Older form of `payoutMintsExtra` with one asset; still accepted.
          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
        ownerControls:
          type: boolean
          description: >-
            Creator authority from launch: the creator can steer the coin from
            its page or through /coins/{mint}/authority, every move signed and
            shown to holders. Off unless set; honoured only while the platform
            has creator authority open (see `openToPublic` on
            /coins/{mint}/authority). It is part of the signed words when set.

````