justi.fun
§05 · API

Launch API

Build a launch with the site's rules, sign it, send it privately, track it.

The flow

  1. Build. POST /v1/launches with the creator wallet and the coin fields. The server runs the same checks as the site, picks the config for the fee option, adds the dev buy and the Jito tip, simulates, and returns a base64 v0 transaction plus signers.
  2. Sign. The creator wallet signs (and your mint key, if you sent a custom mint). Signers can sign in any order.
  3. Submit. POST /v1/launches/{id}/submit within about 60 seconds. It is sent through Jito, privately, and answers live or submitted within waitMs (default 20 s).
  4. Track. Poll GET /v1/launches/{id}, or listen for launch.created on a webhook or the launches channel.
SDK: all four steps
const r = await justi.launch({ signer: wallet, name: "Swordope", ticker: "SWORD", image, mode: "split", creatorBps: 50 });
// r.status: "live" | "submitted" | "failed" | "expired"; r.mint, r.signature, r.url

Fields and rules

FieldRule
walletCreator wallet. Pays, signs, becomes the pool creator and earns the creator fee.
name2 to 32 characters.
ticker2 to 10 letters or numbers. A leading $ is dropped.
imagehttps URL (fetched by the server: public hosts, 5 MB, 8 s) or a data URL up to 500 KB. Large images are re-encoded to WebP.
bannerOptional 3:1 banner shown on the site. Not on chain.
mode, creatorBpscreator: 0 to 250 in steps of 25. holders: 0. split: 25 to 200 (plus 0.5% to holders).
devBuyLamportsOptional. Capped at 15% of supply; the cap per option is in GET /v1/pad (maxDevBuyLamports, about 4.665523 SOL on the lowest fee option).
xUrl, telegramUrl, websiteOptional links, stored in the metadata.
mintOptional custom mint public key. See below.

Refusals have clear codes: copy_exists (409, with details.existing), launch_limit (429, 10 per wallet a day), image_fetch_failed, mint_taken, insufficient_funds. See Errors.

Custom (vanity) mints

Without mint, the server uses a key ending in JUST from its pool and signs that slot before returning. To use your own vanity mint, grind the keypair yourself, send only its public key as mint, and sign the returned transaction with it. The API has no field for a secret key and never needs one.

ts
const mintKp = Keypair.fromSecretKey(myGroundKey); // stays on your machine
const r = await justi.launch({ signer: wallet, mintSigner: mintKp, name: "Bunnett", ticker: "BUNNETT", image, mode: "holders" });
Note
signers[] in the build response lists every slot: payer and mint, with signed: true when the server already signed it.

Reference

#Build a launch exactly like the site does

POST/v1/launches
Key optionalRate class launchBody 3mbbuildLaunch

Same validation as the site: copy rule, 15% dev-buy cap, tier configs, sniper window, 10 launches per wallet a day. Returns an unsigned (by the wallet) v0 create transaction. signers lists every required signature: the payer (wallet) always; the mint is already signed for pool keys, or must be signed by your client with your custom mint keypair. Then POST /v1/launches/{id}/submit with the fully signed transaction within about a minute.

Body

FieldTypeAbout
walletrequiredaddressCreator wallet: pays, signs, is the pool creator.
namerequiredstringmax 32 chars
tickerrequiredstring2 to 10 letters or numbers; a leading $ is dropped. max 11 chars
descriptionstringmax 280 chars, default ""
imagerequiredstringhttps URL (fetched by the server: public hosts only, 5 MB max, 8 s) or a data:image/...;base64 URL up to 500 KB. max 700000 chars
bannerstring | nullOptional 3:1 banner, https URL or data URL (1 MB). Site only, not on chain. max 1400000 chars
xUrlstring | nullmax 200 chars
telegramUrlstring | nullmax 200 chars
websitestring | nullmax 200 chars
moderequired"creator" | "holders" | "split"Who earns the fee: the creator, holders, or both.
creatorBpsintegerCreator fee in bps (creator: 0-250 step 25; split: 25-200 step 25; holders: 0). default 0
devBuyLamportsu64 stringDev buy in the create transaction. Capped at 15% of supply. default "0"
mintaddressCustom (vanity) mint public key. The integrator's client holds the keypair and signs the returned transaction with it. Never send the secret key. Without it the server uses a ...JUST key from its pool (already signed in).
hiddenbooleanAdmin only (X-Admin-Token header): the coin never appears on the board, live feeds, token list or stats. Its page and APIs by mint still work.
testConfigbooleanAdmin only (X-Admin-Token header): launch on the server's test config (holders tier, low graduation threshold). Always hidden.
Response LaunchBuilt
FieldTypeAbout
launchIdrequiredstringUUID.
mintrequiredaddress
customMintrequiredboolean
vanityrequiredbooleanA ...JUST key from the pool.
signersrequiredobject[]
pubkeyrequiredaddress
rolerequired"payer" | "mint" | "other"
signedrequiredboolean
curvePoolrequiredaddress
configrequiredaddress
tierrequiredstring
feesrequiredobject
tierrequiredstring
moderequired"creator" | "holders" | "split"Who earns the fee: the creator, holders, or both.
totalPctrequirednumber
platformPctrequirednumber
creatorPctrequirednumber
holdersPctrequirednumber
protocolPctrequirednumber
creatorOnchainPercentrequirednumber
poolFeeNumeratorrequiredu64 stringUnsigned integer as a decimal string (may exceed 2^53).
devBuyLamportsrequiredu64 stringUnsigned integer as a decimal string (may exceed 2^53).
devBuyTokensrequiredu64 stringUnsigned integer as a decimal string (may exceed 2^53).
devBuyPctOfSupplyrequirednumber
bytesrequiredinteger
computeUnitsrequiredinteger | null
tipLamportsrequiredu64 stringUnsigned integer as a decimal string (may exceed 2^53).
lastValidBlockHeightrequiredinteger
metadataUrirequiredstring
imagerequiredstring
transactionrequiredstring
hiddenbooleanPresent when the launch was built hidden (admin).
testConfigbooleanPresent when built on the test config (admin).
Errors400 bad_request, insufficient_funds, chain_rejected, image_fetch_failed, invalid_params, invalid_json401 unauthorized403 forbidden409 copy_exists, mint_taken413 payload_too_large429 launch_limit, rate_limited500 internal503 unavailable
curl -X POST "https://api.justi.fun/v1/launches" \
  -H "Content-Type: application/json" \
  -d '{"wallet":"<wallet>","name":"Kurumi","ticker":"KURUMI","description":"hold the line.","image":"https://example.com/kurumi.png","mode":"holders","creatorBps":0,"devBuyLamports":"100000000","mint":"<mint>"}'

#Send a signed launch (Jito, private)

POST/v1/launches/{id}/submit
Key optionalRate class submitBody 16kbsubmitLaunch

The transaction must be exactly the built message with every required signature. Answers live, or submitted after waitMs (default 20000); poll GET /v1/launches/{id}.

Parameters

NameTypeAbout
idrequiredpathstringUUID.

Body

FieldTypeAbout
transactionrequiredstringBase64 serialized versioned transaction. max 4000 chars
waitMsinteger0 to 60000
Response LaunchSubmitted
FieldTypeAbout
statusrequired"live" | "submitted"
mintrequiredaddress
signaturerequiredstring
Errors400 tx_mismatch, signature_invalid, chain_rejected, bad_request, invalid_params, invalid_json401 unauthorized404 not_found409 already_submitted410 expired413 payload_too_large429 rate_limited500 internal
curl -X POST "https://api.justi.fun/v1/launches/<id>/submit" \
  -H "Content-Type: application/json" \
  -d '{"transaction":"<signed base64 transaction>"}'

#Launch status

GET/v1/launches/{id}
Key optionalRate class readgetLaunch

Parameters

NameTypeAbout
idrequiredpathstringUUID.
Response Launch
FieldTypeAbout
launchIdrequiredstringUUID.
statusrequired"built" | "submitted" | "live" | "failed" | "expired"
mintrequiredaddress
curvePoolrequiredaddress
configrequiredaddress
tierrequiredstring
creatorrequiredaddress
namerequiredstring
tickerrequiredstring
customMintrequiredboolean
signaturerequiredstring | null
errorrequiredstring | null
devBuyLamportsrequiredu64 stringUnsigned integer as a decimal string (may exceed 2^53).
devBuyTokensrequiredu64 stringUnsigned integer as a decimal string (may exceed 2^53).
lastValidBlockHeightrequiredinteger
metadataUrirequiredstring
imagerequiredstring
viaApirequiredboolean
partnerrequiredstring | nullLabel of the API key that built it.
createdAtrequiredintegerUnix time in seconds.
updatedAtrequiredintegerUnix time in seconds.
Errors400 invalid_params401 unauthorized404 not_found429 rate_limited500 internal
curl "https://api.justi.fun/v1/launches/<id>"