curl --request POST \
--url https://purps.lol/api/v2/pumpfun/launches \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"symbol": "<string>",
"quoteMint": "<string>",
"devBuySol": 123,
"creatorWallet": "<string>",
"image": "<string>",
"imageUrl": "<string>",
"description": "<string>",
"twitter": "<string>",
"telegram": "<string>"
}
'import requests
url = "https://purps.lol/api/v2/pumpfun/launches"
payload = {
"name": "<string>",
"symbol": "<string>",
"quoteMint": "<string>",
"devBuySol": 123,
"creatorWallet": "<string>",
"image": "<string>",
"imageUrl": "<string>",
"description": "<string>",
"twitter": "<string>",
"telegram": "<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,
creatorWallet: '<string>',
image: '<string>',
imageUrl: '<string>',
description: '<string>',
twitter: '<string>',
telegram: '<string>'
})
};
fetch('https://purps.lol/api/v2/pumpfun/launches', 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/v2/pumpfun/launches",
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,
'creatorWallet' => '<string>',
'image' => '<string>',
'imageUrl' => '<string>',
'description' => '<string>',
'twitter' => '<string>',
'telegram' => '<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/v2/pumpfun/launches"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"symbol\": \"<string>\",\n \"quoteMint\": \"<string>\",\n \"devBuySol\": 123,\n \"creatorWallet\": \"<string>\",\n \"image\": \"<string>\",\n \"imageUrl\": \"<string>\",\n \"description\": \"<string>\",\n \"twitter\": \"<string>\",\n \"telegram\": \"<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/v2/pumpfun/launches")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"symbol\": \"<string>\",\n \"quoteMint\": \"<string>\",\n \"devBuySol\": 123,\n \"creatorWallet\": \"<string>\",\n \"image\": \"<string>\",\n \"imageUrl\": \"<string>\",\n \"description\": \"<string>\",\n \"twitter\": \"<string>\",\n \"telegram\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://purps.lol/api/v2/pumpfun/launches")
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 \"creatorWallet\": \"<string>\",\n \"image\": \"<string>\",\n \"imageUrl\": \"<string>\",\n \"description\": \"<string>\",\n \"twitter\": \"<string>\",\n \"telegram\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"ok": true,
"data": {
"mint": "<string>",
"transactions": [
"<string>"
],
"createIndex": 123,
"mintSecret": "<string>",
"imageUrl": "<string>",
"url": "<string>"
}
}{
"ok": true,
"error": "<string>"
}{
"ok": true,
"error": "<string>"
}{
"ok": true,
"error": "<string>"
}{
"ok": true,
"error": "<string>"
}{
"ok": true,
"error": "<string>"
}Build a pump.fun launch
One call, no message to sign. Builds the pump.fun create transaction with the coin’s creator fees already pointed at the coin’s PURPS wallet; the create transaction is the proof. Sign with the creator wallet and the mint key, send through /transactions/send, then call /pumpfun/fees to lock the fee routing and /redirects to attach the strategy. The creator wallet needs about 0.04 SOL plus the dev buy (0.045 with a custom pair) or the build is refused with a 400; a wallet the launchpad does not admit gets a 403. 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.
curl --request POST \
--url https://purps.lol/api/v2/pumpfun/launches \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"symbol": "<string>",
"quoteMint": "<string>",
"devBuySol": 123,
"creatorWallet": "<string>",
"image": "<string>",
"imageUrl": "<string>",
"description": "<string>",
"twitter": "<string>",
"telegram": "<string>"
}
'import requests
url = "https://purps.lol/api/v2/pumpfun/launches"
payload = {
"name": "<string>",
"symbol": "<string>",
"quoteMint": "<string>",
"devBuySol": 123,
"creatorWallet": "<string>",
"image": "<string>",
"imageUrl": "<string>",
"description": "<string>",
"twitter": "<string>",
"telegram": "<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,
creatorWallet: '<string>',
image: '<string>',
imageUrl: '<string>',
description: '<string>',
twitter: '<string>',
telegram: '<string>'
})
};
fetch('https://purps.lol/api/v2/pumpfun/launches', 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/v2/pumpfun/launches",
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,
'creatorWallet' => '<string>',
'image' => '<string>',
'imageUrl' => '<string>',
'description' => '<string>',
'twitter' => '<string>',
'telegram' => '<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/v2/pumpfun/launches"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"symbol\": \"<string>\",\n \"quoteMint\": \"<string>\",\n \"devBuySol\": 123,\n \"creatorWallet\": \"<string>\",\n \"image\": \"<string>\",\n \"imageUrl\": \"<string>\",\n \"description\": \"<string>\",\n \"twitter\": \"<string>\",\n \"telegram\": \"<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/v2/pumpfun/launches")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"symbol\": \"<string>\",\n \"quoteMint\": \"<string>\",\n \"devBuySol\": 123,\n \"creatorWallet\": \"<string>\",\n \"image\": \"<string>\",\n \"imageUrl\": \"<string>\",\n \"description\": \"<string>\",\n \"twitter\": \"<string>\",\n \"telegram\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://purps.lol/api/v2/pumpfun/launches")
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 \"creatorWallet\": \"<string>\",\n \"image\": \"<string>\",\n \"imageUrl\": \"<string>\",\n \"description\": \"<string>\",\n \"twitter\": \"<string>\",\n \"telegram\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"ok": true,
"data": {
"mint": "<string>",
"transactions": [
"<string>"
],
"createIndex": 123,
"mintSecret": "<string>",
"imageUrl": "<string>",
"url": "<string>"
}
}{
"ok": true,
"error": "<string>"
}{
"ok": true,
"error": "<string>"
}{
"ok": true,
"error": "<string>"
}{
"ok": true,
"error": "<string>"
}{
"ok": true,
"error": "<string>"
}Body
A pump.fun launch, in one call. No ts or signature: the create transaction you sign is the proof.
1 to 32 characters.
1 to 10 characters.
A pair from /pairs pumpfun. Omit for SOL. A custom pair needs customPairAccess in /launch-options.
Your own first buy, in SOL. Default 0.
The Solana wallet that signs the transactions and pays.
The coin's logo as a data URL (data:image/png;base64,…). PNG, JPEG, WebP or GIF, 512KB max. Send this or imageUrl.
A public https link to the logo instead of image. Fetched by us under the same size and type rules.
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.
https:// link.
https:// link.