curl --request GET \
--url https://purps.lol/api/v2/coinsimport requests
url = "https://purps.lol/api/v2/coins"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://purps.lol/api/v2/coins', 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/coins",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://purps.lol/api/v2/coins"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://purps.lol/api/v2/coins")
.asString();require 'uri'
require 'net/http'
url = URI("https://purps.lol/api/v2/coins")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"ok": true,
"data": {
"total": 123,
"offset": 123,
"limit": 123,
"flagshipMint": "<string>",
"markets": [
"<string>"
],
"items": [
{
"mint": "<string>",
"chain": "solana",
"origin": "launchpad",
"name": "<string>",
"symbol": "<string>",
"imageUrl": "<string>",
"status": "pending",
"createdAt": "<string>",
"url": "<string>",
"marketCapUsd": 123,
"holders": 123,
"rewardMode": "burn",
"feeShareBps": 123,
"legs": [
{
"market": "<string>",
"direction": "long",
"leverage": 123
}
],
"openPositions": 123,
"accounting": {
"unit": "<string>",
"feesClaimed": 123,
"boughtBack": 123,
"buybackQueued": 123,
"reserve": 123,
"tokensBurned": 123,
"tokensPaidOut": 123,
"marginDepositedUsd": 123,
"realizedProfitUsd": 123,
"realizedLossUsd": 123,
"profitWithdrawnUsd": 123
},
"launch": {
"quote": {
"mint": "<string>",
"symbol": "<string>"
},
"curvePct": 123,
"migrated": true,
"raisedQuote": 123,
"paysHolders": true,
"airdrop": {
"potQuote": 123,
"paidQuote": 123,
"payouts": 123,
"lastAt": "<string>",
"lastHolders": 123
}
}
}
]
}
}{
"ok": true,
"error": "<string>",
"code": "invalid_request",
"retryable": true,
"retryAfterSeconds": 123
}{
"ok": true,
"error": "<string>",
"code": "invalid_request",
"retryable": true,
"retryAfterSeconds": 123
}List coins
Every visible coin on the platform, one page at a time, with market data. It’s the same list as the /coins page, in the same order. Fifty a page at most; to get every coin’s identity in one call, use /index instead of paging. An unknown parameter or value is a 400, not a silent default. Cached 10 seconds at the edge: polling faster returns the same answer, and repeats inside the window don’t count against your limit.
curl --request GET \
--url https://purps.lol/api/v2/coinsimport requests
url = "https://purps.lol/api/v2/coins"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://purps.lol/api/v2/coins', 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/coins",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://purps.lol/api/v2/coins"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://purps.lol/api/v2/coins")
.asString();require 'uri'
require 'net/http'
url = URI("https://purps.lol/api/v2/coins")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"ok": true,
"data": {
"total": 123,
"offset": 123,
"limit": 123,
"flagshipMint": "<string>",
"markets": [
"<string>"
],
"items": [
{
"mint": "<string>",
"chain": "solana",
"origin": "launchpad",
"name": "<string>",
"symbol": "<string>",
"imageUrl": "<string>",
"status": "pending",
"createdAt": "<string>",
"url": "<string>",
"marketCapUsd": 123,
"holders": 123,
"rewardMode": "burn",
"feeShareBps": 123,
"legs": [
{
"market": "<string>",
"direction": "long",
"leverage": 123
}
],
"openPositions": 123,
"accounting": {
"unit": "<string>",
"feesClaimed": 123,
"boughtBack": 123,
"buybackQueued": 123,
"reserve": 123,
"tokensBurned": 123,
"tokensPaidOut": 123,
"marginDepositedUsd": 123,
"realizedProfitUsd": 123,
"realizedLossUsd": 123,
"profitWithdrawnUsd": 123
},
"launch": {
"quote": {
"mint": "<string>",
"symbol": "<string>"
},
"curvePct": 123,
"migrated": true,
"raisedQuote": 123,
"paysHolders": true,
"airdrop": {
"potQuote": 123,
"paidQuote": 123,
"payouts": 123,
"lastAt": "<string>",
"lastHolders": 123
}
}
}
]
}
}{
"ok": true,
"error": "<string>",
"code": "invalid_request",
"retryable": true,
"retryAfterSeconds": 123
}{
"ok": true,
"error": "<string>",
"code": "invalid_request",
"retryable": true,
"retryAfterSeconds": 123
}Query Parameters
Order of the list: market cap, perp earnings, tokens burned, fees claimed, bought back, open positions, holder count, reserve balance, paid to holders, or newest first.
mcap, earnings, burned, fees, buyback, active, holders, reserve, paid, newest Which end of the sort comes first: desc (largest or newest first) or asc. Coins with no figure for the sort sit last either way.
desc, asc How many coins to skip.
x >= 0Page size.
1 <= x <= 50Keep only coins that match every listed fact, comma-separated: holders pays its holders, live has an open perp position, earning is in profit, strategy runs a strategy at all.
"holders,live"
Where the coin was born: our launchpad, pump.fun through this site, or a coin that was redirected here.
launchpad, pumpfun, redirects Which chain.
both, solana, robinhood Only coins whose strategy bets on this perp market, by symbol. The response's markets lists every symbol in use.
"BTC"
Only coins with a long, or a short, leg.
long, short A market-cap band in USD. Coins with no known cap are left out.
under10k, 10k-100k, 100k-1m, over1m The fewest wallets the coin must have. Coins not yet counted are left out.
10, 100, 1000 Only coins created within the window.
24h, 7d, 30d Only coins whose creator rewards this wallet holds: the launching wallet, or whoever it handed them to.