curl --request POST \
--url https://purps.lol/api/v1/launches/prepare \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"symbol": "<string>",
"quoteMint": "<string>",
"devBuySol": 123,
"creatorFeeBps": 123,
"strategy": {
"splitBuybackBps": 123,
"splitMarginBps": 123,
"splitReserveBps": 123,
"perpLegs": [
{}
],
"payoutMint": "<string>",
"payoutMint2": "<string>",
"strategy": {}
},
"creatorWallet": "<string>"
}
'import requests
url = "https://purps.lol/api/v1/launches/prepare"
payload = {
"name": "<string>",
"symbol": "<string>",
"quoteMint": "<string>",
"devBuySol": 123,
"creatorFeeBps": 123,
"strategy": {
"splitBuybackBps": 123,
"splitMarginBps": 123,
"splitReserveBps": 123,
"perpLegs": [{}],
"payoutMint": "<string>",
"payoutMint2": "<string>",
"strategy": {}
},
"creatorWallet": "<string>"
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
symbol: '<string>',
quoteMint: '<string>',
devBuySol: 123,
creatorFeeBps: 123,
strategy: {
splitBuybackBps: 123,
splitMarginBps: 123,
splitReserveBps: 123,
perpLegs: [{}],
payoutMint: '<string>',
payoutMint2: '<string>',
strategy: {}
},
creatorWallet: '<string>'
})
};
fetch('https://purps.lol/api/v1/launches/prepare', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://purps.lol/api/v1/launches/prepare",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'symbol' => '<string>',
'quoteMint' => '<string>',
'devBuySol' => 123,
'creatorFeeBps' => 123,
'strategy' => [
'splitBuybackBps' => 123,
'splitMarginBps' => 123,
'splitReserveBps' => 123,
'perpLegs' => [
[
]
],
'payoutMint' => '<string>',
'payoutMint2' => '<string>',
'strategy' => [
]
],
'creatorWallet' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://purps.lol/api/v1/launches/prepare"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"symbol\": \"<string>\",\n \"quoteMint\": \"<string>\",\n \"devBuySol\": 123,\n \"creatorFeeBps\": 123,\n \"strategy\": {\n \"splitBuybackBps\": 123,\n \"splitMarginBps\": 123,\n \"splitReserveBps\": 123,\n \"perpLegs\": [\n {}\n ],\n \"payoutMint\": \"<string>\",\n \"payoutMint2\": \"<string>\",\n \"strategy\": {}\n },\n \"creatorWallet\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://purps.lol/api/v1/launches/prepare")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"symbol\": \"<string>\",\n \"quoteMint\": \"<string>\",\n \"devBuySol\": 123,\n \"creatorFeeBps\": 123,\n \"strategy\": {\n \"splitBuybackBps\": 123,\n \"splitMarginBps\": 123,\n \"splitReserveBps\": 123,\n \"perpLegs\": [\n {}\n ],\n \"payoutMint\": \"<string>\",\n \"payoutMint2\": \"<string>\",\n \"strategy\": {}\n },\n \"creatorWallet\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://purps.lol/api/v1/launches/prepare")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"symbol\": \"<string>\",\n \"quoteMint\": \"<string>\",\n \"devBuySol\": 123,\n \"creatorFeeBps\": 123,\n \"strategy\": {\n \"splitBuybackBps\": 123,\n \"splitMarginBps\": 123,\n \"splitReserveBps\": 123,\n \"perpLegs\": [\n {}\n ],\n \"payoutMint\": \"<string>\",\n \"payoutMint2\": \"<string>\",\n \"strategy\": {}\n },\n \"creatorWallet\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"ok": true,
"data": {
"ts": 123,
"message": "<string>",
"expiresInSeconds": 123,
"hash": "<string>"
}
}{
"ok": true,
"error": "<string>"
}{
"ok": true,
"error": "<string>"
}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.
curl --request POST \
--url https://purps.lol/api/v1/launches/prepare \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"symbol": "<string>",
"quoteMint": "<string>",
"devBuySol": 123,
"creatorFeeBps": 123,
"strategy": {
"splitBuybackBps": 123,
"splitMarginBps": 123,
"splitReserveBps": 123,
"perpLegs": [
{}
],
"payoutMint": "<string>",
"payoutMint2": "<string>",
"strategy": {}
},
"creatorWallet": "<string>"
}
'import requests
url = "https://purps.lol/api/v1/launches/prepare"
payload = {
"name": "<string>",
"symbol": "<string>",
"quoteMint": "<string>",
"devBuySol": 123,
"creatorFeeBps": 123,
"strategy": {
"splitBuybackBps": 123,
"splitMarginBps": 123,
"splitReserveBps": 123,
"perpLegs": [{}],
"payoutMint": "<string>",
"payoutMint2": "<string>",
"strategy": {}
},
"creatorWallet": "<string>"
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
symbol: '<string>',
quoteMint: '<string>',
devBuySol: 123,
creatorFeeBps: 123,
strategy: {
splitBuybackBps: 123,
splitMarginBps: 123,
splitReserveBps: 123,
perpLegs: [{}],
payoutMint: '<string>',
payoutMint2: '<string>',
strategy: {}
},
creatorWallet: '<string>'
})
};
fetch('https://purps.lol/api/v1/launches/prepare', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://purps.lol/api/v1/launches/prepare",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'symbol' => '<string>',
'quoteMint' => '<string>',
'devBuySol' => 123,
'creatorFeeBps' => 123,
'strategy' => [
'splitBuybackBps' => 123,
'splitMarginBps' => 123,
'splitReserveBps' => 123,
'perpLegs' => [
[
]
],
'payoutMint' => '<string>',
'payoutMint2' => '<string>',
'strategy' => [
]
],
'creatorWallet' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://purps.lol/api/v1/launches/prepare"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"symbol\": \"<string>\",\n \"quoteMint\": \"<string>\",\n \"devBuySol\": 123,\n \"creatorFeeBps\": 123,\n \"strategy\": {\n \"splitBuybackBps\": 123,\n \"splitMarginBps\": 123,\n \"splitReserveBps\": 123,\n \"perpLegs\": [\n {}\n ],\n \"payoutMint\": \"<string>\",\n \"payoutMint2\": \"<string>\",\n \"strategy\": {}\n },\n \"creatorWallet\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://purps.lol/api/v1/launches/prepare")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"symbol\": \"<string>\",\n \"quoteMint\": \"<string>\",\n \"devBuySol\": 123,\n \"creatorFeeBps\": 123,\n \"strategy\": {\n \"splitBuybackBps\": 123,\n \"splitMarginBps\": 123,\n \"splitReserveBps\": 123,\n \"perpLegs\": [\n {}\n ],\n \"payoutMint\": \"<string>\",\n \"payoutMint2\": \"<string>\",\n \"strategy\": {}\n },\n \"creatorWallet\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://purps.lol/api/v1/launches/prepare")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"symbol\": \"<string>\",\n \"quoteMint\": \"<string>\",\n \"devBuySol\": 123,\n \"creatorFeeBps\": 123,\n \"strategy\": {\n \"splitBuybackBps\": 123,\n \"splitMarginBps\": 123,\n \"splitReserveBps\": 123,\n \"perpLegs\": [\n {}\n ],\n \"payoutMint\": \"<string>\",\n \"payoutMint2\": \"<string>\",\n \"strategy\": {}\n },\n \"creatorWallet\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"ok": true,
"data": {
"ts": 123,
"message": "<string>",
"expiresInSeconds": 123,
"hash": "<string>"
}
}{
"ok": true,
"error": "<string>"
}{
"ok": true,
"error": "<string>"
}Body
1 to 32 characters.
1 to 10 characters.
The pair, from /pairs meteora.
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.
airdrop, split, creator, strategy Your own first buy, in SOL. Converted to the pair on the way in when the pair is not SOL. Default 0.
Your fee tier, basis points of curve volume, on top of the platform's 1%. Default 100 (1%), maximum 1000.
Required when feePreset is strategy. Must be sent identically to submit.
Show child attributes
Show child attributes
The Solana wallet that signs and pays.