{"openapi":"3.0.3","info":{"title":"PairsFun API","version":"1.0.0","description":"Launch multipairs from your own site. You build the request, the creator signs in their wallet, we never hold a key. Fees are the same as on pairsfun.xyz; a partner earns by being a recipient of part of the creator share, which the creator sees and signs before the launch. Rate limits per key: prepareRpm 30, launchesPerDay 200, openLaunches 25, userPreparesPer5Min 2, userLaunchesPerDay 10, quoteRpm 300, tradeRpm 120, submitRpm 60, readRpm 600, rpcRpm 600, rpcSendRpm 60. To get a key, DM @pairsfun_xyz."},"servers":[{"url":"https://pairsfun.xyz/v1"}],"tags":[{"name":"Account"},{"name":"Catalog"},{"name":"Launch"},{"name":"Trade"},{"name":"Earnings"}],"paths":{"/openapi.json":{"get":{"operationId":"getOpenApi","tags":["Account"],"summary":"This document","security":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/config":{"get":{"operationId":"getConfig","tags":["Account"],"summary":"Network-wide settings: is launching open, limits on a launch, tax models","security":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Config"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/me":{"get":{"operationId":"getMe","tags":["Account"],"summary":"Who this key belongs to: partner, share, limits","security":[{"secretKey":[]},{"publishableKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Me"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/usage":{"get":{"operationId":"getUsage","tags":["Account"],"summary":"Requests and launches per key for a UTC day","security":[{"secretKey":[]}],"parameters":[{"name":"day","in":"query","required":false,"description":"UTC day, YYYY-MM-DD. Default: today.","schema":{"type":"string","example":"2026-10-21"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Usage"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/pairs":{"get":{"operationId":"listPairs","tags":["Catalog"],"summary":"Assets a token can be paired with","security":[{"secretKey":[]},{"publishableKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/pairs/{mint}":{"get":{"operationId":"getPair","tags":["Catalog"],"summary":"One asset: price, decimals, issuer powers, whether it fits a pool","security":[{"secretKey":[]},{"publishableKey":[]}],"parameters":[{"name":"mint","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/launches":{"get":{"operationId":"listLaunches","tags":["Catalog"],"summary":"Live multipair tokens, newest first","description":"Each item carries `via` when it was launched through a partner and the partner is verified on-chain. `partner=me` lists only the launches made with your keys; the secret key also gets each item's `launchId` and `endUserRef` (the publishable key never does: the id works as an access key to a launch in progress).","security":[{"secretKey":[]},{"publishableKey":[]}],"parameters":[{"name":"partner","in":"query","required":false,"description":"`me` lists only launches made with your keys (adds `attribution`).","schema":{"type":"string","enum":["me"]}},{"name":"limit","in":"query","required":false,"description":"1 to 100, default 50.","schema":{"type":"integer","minimum":1,"maximum":100}},{"name":"cursor","in":"query","required":false,"description":"`nextCursor` from the previous page.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LaunchList"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"createLaunch","tags":["Launch"],"summary":"Step 1. Prepare a launch","description":"Checks the request, picks the token mint and builds the first-phase transactions (swaps if the creator buy is paid in SOL, and the address table). Nothing is signed or sent by us: the creator signs everything in their wallet. Send an `Idempotency-Key` header so a retry returns the same launch instead of creating a second one (for 30 minutes, whatever state the launch is in). Preparing costs the creator nothing, so a publishable key is limited per end-user address too (`userPreparesPer5Min`, `userLaunchesPerDay`); the daily limit counts launches whose address table was paid for.","security":[{"secretKey":[]},{"publishableKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LaunchRequest"}}}},"responses":{"201":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LaunchCreated"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"8 to 64 characters. The same key with the same body returns the same launch for 30 minutes; the same key with another body is `idempotency_conflict`.","schema":{"type":"string"}}]}},"/tokens/{mint}":{"get":{"operationId":"getToken","tags":["Catalog"],"summary":"One token: basket, pools, stats, on-chain proofs","security":[{"secretKey":[]},{"publishableKey":[]}],"parameters":[{"name":"mint","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/launches/{id}":{"get":{"operationId":"getLaunch","tags":["Launch"],"summary":"State of a launch made with your keys","security":[{"secretKey":[]},{"publishableKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LaunchStatus"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/launches/{id}/bundle":{"post":{"operationId":"getBundle","tags":["Launch"],"summary":"Step 3. Get the launch bundle (after the address table is confirmed)","description":"Answers 409 `table_not_ready` (with `Retry-After: 1`) until the address table is final on-chain: retry once a second, up to about 40 seconds. If the launch bundle was sent but never landed (bundles are sometimes dropped), call this again for a fresh bundle and have the creator sign it again. Answers 409 `already_live` once the launch is live.","security":[{"secretKey":[]},{"publishableKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Bundle"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/launches/{id}/submit":{"post":{"operationId":"submitLaunch","tags":["Launch"],"summary":"Step 4. Send the signed bundle, then the signed bookkeeping transactions","security":[{"secretKey":[]},{"publishableKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LaunchSubmit"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmitResult"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/launches/{id}/finalize":{"post":{"operationId":"finalizeLaunch","tags":["Launch"],"summary":"Rebuild the bookkeeping transactions with a fresh blockhash if sending them failed","security":[{"secretKey":[]},{"publishableKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LaunchFinalize"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Finalize"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/rpc":{"post":{"operationId":"rpc","tags":["Launch"],"summary":"JSON-RPC proxy for the steps that go straight to the network (first phase, status checks)","description":"A fixed list of read methods plus sendTransaction. The body is a standard JSON-RPC request; the answer is the node's JSON-RPC answer byte for byte (not wrapped, numbers above 2^53 intact). `sendTransaction` and `simulateTransaction` also count against `rpcSendRpm`.","security":[{"secretKey":[]},{"publishableKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/tokens/{mint}/quote":{"post":{"operationId":"quote","tags":["Trade"],"summary":"Quote a buy or a sell","security":[{"secretKey":[]},{"publishableKey":[]}],"parameters":[{"name":"mint","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TradeRequest"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/tokens/{mint}/trade":{"post":{"operationId":"trade","tags":["Trade"],"summary":"Build the unsigned transactions for a buy or a sell","security":[{"secretKey":[]},{"publishableKey":[]}],"parameters":[{"name":"mint","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TradeRequest"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/submit":{"post":{"operationId":"submit","tags":["Trade"],"summary":"Send signed trade transactions, one by one","security":[{"secretKey":[]},{"publishableKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Submit"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmitResult"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/earnings":{"get":{"operationId":"getEarnings","tags":["Earnings"],"summary":"What your payout wallet can claim","security":[{"secretKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/claim":{"post":{"operationId":"claim","tags":["Earnings"],"summary":"Unsigned transactions that withdraw your payout wallet share; you sign them","security":[{"secretKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClaimRequest"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"securitySchemes":{"publishableKey":{"type":"http","scheme":"bearer","description":"pfp_… for the browser. Works only from the origins registered for your account."},"secretKey":{"type":"http","scheme":"bearer","description":"pfs_… for your server. Never put it in front-end code: requests that carry an Origin header are refused."}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["unauthorized","key_revoked","partner_suspended","forbidden_origin","forbidden","rate_limited","quota_exceeded","busy","validation_failed","brand_copy","moderation_blocked","launches_closed","not_found","method_not_allowed","payload_too_large","session_expired","table_not_ready","swaps_pending","idempotency_conflict","already_live","policy_mismatch","submit_failed","upstream_unavailable","internal_error","bad_amount","too_small","insufficient_liquidity","no_route","price_impact","too_many_legs","too_complex","slippage","stale_quote","insufficient_balance","no_sol","expired","not_live","would_fail"]},"message":{"type":"string","description":"For people. Wording can change, `code` does not."},"status":{"type":"integer","description":"The HTTP status, repeated."},"requestId":{"type":"string","description":"Quote it when you ask us about a request."},"retryAfterSec":{"type":"integer","description":"Only on rate_limited, quota_exceeded, busy, table_not_ready, swaps_pending."},"details":{"type":"object","additionalProperties":true,"description":"Machine-readable extras: `field` for validation_failed, `problems`, `unfinished`, `failedIndex`, `signatures` for submit_failed."}},"required":["code","message","status","requestId"]}},"required":["error"]},"Config":{"type":"object","properties":{"apiVersion":{"type":"string","example":"v1"},"programId":{"type":"string","nullable":true},"launchesOpen":{"type":"boolean"},"launchesClosed":{"type":"string","nullable":true,"description":"Why launching is closed, when it is."},"atomic":{"type":"boolean","description":"Whether launches go out as one all-or-nothing bundle."},"maxAssets":{"type":"integer","description":"Most assets in one basket."},"taxModes":{"type":"array","items":{"type":"string"}},"taxRatesBps":{"type":"array","items":{"type":"integer"}},"image":{"type":"object","properties":{"maxBytes":{"type":"integer"},"types":{"type":"array","items":{"type":"string"}}}},"text":{"type":"object","properties":{"descriptionMax":{"type":"integer"},"nameMaxBytes":{"type":"integer"},"symbolMaxBytes":{"type":"integer"}}},"partnerShare":{"type":"object","properties":{"appliesTo":{"type":"array","items":{"type":"string"}},"note":{"type":"string"}}},"fees":{"type":"object","properties":{"note":{"type":"string"},"poolFeeBps":{"type":"integer","description":"The pool fee, in bps of volume"},"raydiumCutBps":{"type":"integer","description":"Part of the pool fee that the pool program keeps, in bps of it"},"creatorShareBps":{"type":"integer","nullable":true,"description":"Of what reaches the position, on Standard and Creator-tax tokens, in bps (live from the Config; null when it could not be read). Reward and Custom tokens: 0."},"pairsfunShareBps":{"type":"integer","nullable":true,"description":"The rest, PairsFun's share, in bps"},"burnShareBps":{"type":"integer","nullable":true,"description":"Part of PairsFun's share set aside for a future platform-token burn, in bps. 0: all of it goes to the PairsFun treasury."},"platformToken":{"type":"string","nullable":true,"enum":["none","named"],"description":"`none`: no platform token exists, so nothing is burned"},"pairsfunShareUse":{"type":"string","description":"What happens to PairsFun's share right now, in words"},"live":{"type":"string","description":"Where the live values come from"}},"description":"Live from the Config on-chain (cached for a minute)"}}},"Me":{"type":"object","properties":{"partner":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"},"url":{"type":"string"},"payoutWallet":{"type":"string"},"shareBps":{"type":"integer"},"maxShareBps":{"type":"integer"},"allowedTaxModes":{"type":"array","items":{"type":"string"}},"allowedOrigins":{"type":"array","items":{"type":"string"}}}},"key":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["publishable","secret"]},"prefix":{"type":"string"}}},"limits":{"$ref":"#/components/schemas/Limits"},"usage":{"type":"object","additionalProperties":true}}},"Limits":{"type":"object","properties":{"prepareRpm":{"type":"integer","description":"Launch preparations per minute"},"launchesPerDay":{"type":"integer","description":"Launches per UTC day. A launch counts once the creator has paid for the address table (step 3, `/bundle`), not at preparation."},"openLaunches":{"type":"integer","description":"Unfinished launches at once: a launch whose address table is paid for holds its place for the 30 minutes of the session, one that is not for 5 minutes."},"userPreparesPer5Min":{"type":"integer","description":"Publishable keys only: preparations from one end-user address (IPv6 by /64) per 5 minutes"},"userLaunchesPerDay":{"type":"integer","description":"Publishable keys only: preparations from one end-user address per day"},"quoteRpm":{"type":"integer"},"tradeRpm":{"type":"integer"},"submitRpm":{"type":"integer"},"readRpm":{"type":"integer"},"rpcRpm":{"type":"integer"},"rpcSendRpm":{"type":"integer","description":"`sendTransaction` and `simulateTransaction` through `/rpc`, per minute"}}},"Usage":{"type":"object","properties":{"day":{"type":"string"},"keys":{"type":"array","items":{"type":"object","additionalProperties":true}},"totals":{"type":"object","additionalProperties":true},"launches":{"type":"object","additionalProperties":true}}},"Basket":{"type":"object","properties":{"mint":{"type":"string","description":"Mint address of the asset"},"weightBps":{"type":"integer","description":"Weight in basis points; all weights must add up to 10000"}},"required":["mint","weightBps"]},"LaunchRequest":{"type":"object","properties":{"creator":{"type":"string","description":"The wallet that signs the launch and owns the creator share"},"name":{"type":"string","description":"Up to 32 bytes (Cyrillic and emoji take 2 to 4 bytes each). Longer is `validation_failed`.","maxLength":32},"symbol":{"type":"string","description":"Up to 10 bytes. Longer is `validation_failed`.","maxLength":10},"description":{"type":"string","description":"Up to 500 characters. Longer is `validation_failed` (it is never cut silently).","maxLength":500},"image":{"type":"string","description":"A PNG, JPEG, GIF or WEBP, up to 512 KB, as a data URL or base64"},"twitter":{"type":"string"},"telegram":{"type":"string"},"website":{"type":"string"},"basket":{"type":"array","minItems":1,"maxItems":4,"items":{"$ref":"#/components/schemas/Basket"}},"devBuy":{"type":"object","properties":{"usd":{"type":"number","minimum":0},"pay":{"type":"string","description":"Required when `usd` is above 0. `sol`: the first phase swaps SOL for the basket assets; `assets`: the creator already holds them","enum":["sol","assets"]}},"required":["usd"],"description":"The creator buys in every pool first, in the same transaction that opens the pool. `{ \"usd\": 0 }` means no buy."},"tax":{"type":"object","properties":{"mode":{"type":"string","enum":["standard","creator","reward","custom"]},"bps":{"type":"integer","description":"100, 200 or 300"},"holderShareBps":{"type":"integer"},"sunsetBurnBps":{"type":"integer"}}},"hooks":{"type":"object","additionalProperties":true,"description":"Custom hooks, only for the custom model"},"feeRecipients":{"type":"array","maxItems":4,"description":"Who else gets part of the creator share, in bps of that share. There are 4 slots. When your partner share is above 0 it takes one of them, so 3 are left (the fee model with no creator share, or a creator who is your payout wallet, leaves all 4). The creator keeps the rest.","items":{"type":"object","properties":{"wallet":{"type":"string"},"platform":{"type":"string"},"target":{"type":"string"},"shareBps":{"type":"integer"}},"required":["shareBps"]}},"partnerShareBps":{"type":"integer","description":"Your share of the creator share, in bps. Default and ceiling are set on your key (default 1000, ceiling 3000 unless we agreed otherwise)."},"endUserRef":{"type":"string","description":"Your own id for the person launching, up to 64 characters. Returned only to your secret key.","maxLength":64}},"required":["creator","name","symbol","basket"],"additionalProperties":false},"FeePolicyEntry":{"type":"object","properties":{"wallet":{"type":"string"},"shareBps":{"type":"integer"},"kind":{"type":"string","enum":["wallet","social"]},"label":{"type":"string","nullable":true},"role":{"type":"string","enum":["creator","partner","co-recipient"]}}},"LaunchCreated":{"type":"object","properties":{"launch":{"type":"object","properties":{"id":{"type":"string","description":"Use it in every next call"},"mint":{"type":"string","description":"The token mint address"},"state":{"type":"string","example":"prepared"},"expiresAt":{"type":"string","format":"date-time"},"lookupTable":{"type":"string"}}},"phase1":{"type":"object","properties":{"transactions":{"type":"array","description":"Address table transactions: unsigned. Put a fresh recent blockhash on each right before the creator signs.","items":{"type":"string","description":"A base64 serialized transaction"}},"swapTransactions":{"type":"array","description":"Only when the creator buy is paid in SOL: swaps that go first, in the same wallet window","items":{"type":"object","additionalProperties":true}},"lookupTable":{"type":"string"}}},"review":{"type":"object","properties":{"tax":{"type":"object","additionalProperties":true},"hooks":{"type":"object","additionalProperties":true},"plan":{"type":"object","additionalProperties":true},"feePolicy":{"type":"array","items":{"$ref":"#/components/schemas/FeePolicyEntry"},"description":"Show it to the creator before they sign: this is the split of the creator share, and it cannot change after the first fee collection"},"policyDigest":{"type":"string","description":"sha256 over the split; the same value comes back on GET /launches/{id}"},"partner":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"},"wallet":{"type":"string"},"shareBps":{"type":"integer"},"earns":{"type":"boolean"},"reason":{"type":"string"}}},"devBuy":{"type":"object","additionalProperties":true},"bundleSteps":{"type":"array","items":{"type":"string"}},"sendMode":{"type":"string","enum":["bundle","sequential"]},"warnings":{"type":"array","items":{"type":"string"}},"fake":{"type":"object","properties":{"reason":{"type":"string"}},"description":"Only when the name copies PairsFun and the server is set to label instead of refusing"}}}}},"LaunchStatus":{"type":"object","properties":{"launch":{"type":"object","properties":{"id":{"type":"string"},"mint":{"type":"string"},"state":{"type":"string","enum":["prepared","bundle_issued","bundle_submitted","live","expired","failed"]},"attribution":{"type":"string","description":"Whether the split on-chain matches what we promised your wallet","enum":["pending","verified","mismatch","unpaid"]},"creator":{"type":"string"},"endUserRef":{"type":"string"},"policyDigest":{"type":"string"},"feePolicy":{"type":"array","items":{"$ref":"#/components/schemas/FeePolicyEntry"}},"createdAt":{"type":"string","format":"date-time"},"expiresAt":{"type":"string","format":"date-time"}}}}},"LaunchList":{"type":"object","properties":{"launches":{"type":"array","items":{"type":"object","additionalProperties":true}},"nextCursor":{"type":"string","nullable":true}}},"Bundle":{"type":"object","properties":{"launchId":{"type":"string","description":"The launch id, as in the path"},"tokenMint":{"type":"string"},"steps":{"type":"array","items":{"type":"string"}},"transactions":{"type":"array","description":"The launch bundle: sign all of them, send with stage `bundle`","items":{"type":"string","description":"A base64 serialized transaction"}},"followUpTransactions":{"type":"array","description":"Bookkeeping: sign with the bundle, send with stage `followup` after the bundle lands","items":{"type":"string","description":"A base64 serialized transaction"}},"atomic":{"type":"boolean"},"devBuy":{"type":"boolean"},"devBuyPerLegRaw":{"type":"array","items":{"type":"string"}},"warnings":{"type":"array","items":{"type":"string"}},"policyDigest":{"type":"string"}}},"LaunchSubmit":{"type":"object","properties":{"stage":{"type":"string","enum":["bundle","followup"]},"transactions":{"type":"array","description":"Signed transactions","items":{"type":"string","description":"A base64 serialized transaction"}}},"required":["stage","transactions"],"additionalProperties":false},"LaunchFinalize":{"type":"object","properties":{"from":{"type":"integer","description":"How many bookkeeping transactions already landed"}},"additionalProperties":false},"Finalize":{"type":"object","properties":{"launchId":{"type":"string","description":"The launch id, as in the path"},"transactions":{"type":"array","description":"Unsigned, fresh blockhash","items":{"type":"string","description":"A base64 serialized transaction"}},"from":{"type":"integer"},"total":{"type":"integer"}}},"Submit":{"type":"object","properties":{"transactions":{"type":"array","description":"Signed transactions, in order","items":{"type":"string","description":"A base64 serialized transaction"}}},"required":["transactions"],"additionalProperties":false},"SubmitResult":{"type":"object","properties":{"launchId":{"type":"string","description":"Only on the launch steps (`/launches/{id}/submit`)"},"stage":{"type":"string","description":"Only on the launch steps: the stage that was sent","enum":["bundle","followup"]},"mode":{"type":"string","enum":["bundle","sequential"]},"atomic":{"type":"boolean"},"bundleId":{"type":"string"},"signatures":{"type":"array","items":{"type":"string"}}}},"TradeRequest":{"type":"object","properties":{"side":{"type":"string","enum":["buy","sell"]},"amountRaw":{"type":"string","description":"One amount in raw units: a sell spends the token, a buy spends `inputMint`"},"amountsRaw":{"type":"array","items":{"type":"string"},"description":"A buy with the basket assets the wallet already holds: one amount per leg"},"inputMint":{"type":"string","description":"What a buy pays with; default USDC"},"slippageBps":{"type":"integer"},"buyer":{"type":"string","description":"trade only: the wallet that signs"},"owner":{"type":"string","description":"quote only: the wallet"},"resume":{"type":"array","items":{"type":"object","properties":{"quoteMint":{"type":"string"},"amountRaw":{"type":"string"}}},"description":"trade only: finish a half-landed trade with the `unfinished` list from a failed submit"}},"additionalProperties":false},"ClaimRequest":{"type":"object","properties":{"tokenMint":{"type":"string","description":"Only this token"}},"additionalProperties":false}}}}