API reference
$PEAR API
Everything this site shows, as JSON. No key, no sign-up, nothing to connect. Base address /api/public/v1.
/api/public/v1Overview
Lists every endpoint. No key, no sign-up, no wallet. Every answer is { ok: true, data } or { ok: false, error }.
Start here. This one call tells you every address the API answers on, so you never have to hard-code a list that might change.
Every endpoint answers the same two shapes: when things worked you get { ok: true, data }, and when they didn't you get { ok: false, error } with a plain sentence in error. Check ok first and you can treat every route the same way.
It's open to any website β the answers carry permissive sharing headers, so browser code can call it directly with no key and no proxy. Answers are cached for a few seconds, so hammering it won't get you fresher numbers.
What comes back
okβ true when the call workeddata.endpointsβ every address you can call, with a one-line description
curl "https://pearit.now/api/public/v1"
const res = await fetch("https://pearit.now/api/public/v1");
const body = await res.json();
if (!body.ok) {
console.error(body.error); // a plain sentence, safe to show people
} else {
console.log(body.data.endpoints);
}/api/public/v1/coinsAll coins
Every coin launched here with its live price, market cap, 24h change and volume.
This is the same list the home grid is built from: every coin launched through $PEAR, with live market numbers attached at the moment you ask.
Use sort to order it β newest for a feed, volume for what's busy today, marketcap for the biggest. Use search to look one up by name, ticker, or by pasting a full address. Use limit to keep the answer small; anything over 200 is trimmed to 200.
Numbers come from live market data, so a brand-new coin that hasn't traded yet comes back with its name and address but no price. Always treat usdPrice, mcap and volume24h as possibly missing.
If market data is briefly unavailable you get { ok: false, error } with a 503. Retry after a few seconds rather than immediately.
What you can pass
sortβ newest (default), volume or marketcapsearchβ name, ticker or full addresslimitβ 1β200, default 50
What comes back
idβ the coin's address on Solananame / symbolβ its name and tickericonβ picture address, when it has oneusdPriceβ price in dollars right nowmcapβ market cap in dollarsvolume24hβ buys plus sells over the last 24 hours, in dollarspriceChange24hβ percent move over 24 hoursholderCountβ how many wallets hold itcreatedAtβ when it first tradedgraduatedAtβ when it filled its pump.fun curve, if it has
curl "https://pearit.now/api/public/v1/coins?sort=volume&limit=5"
const res = await fetch("https://pearit.now/api/public/v1/coins?sort=marketcap&limit=10");
const { ok, data, error } = await res.json();
if (!ok) throw new Error(error);
for (const coin of data) {
const price = coin.usdPrice ? `$${coin.usdPrice.toPrecision(3)}` : "not trading yet";
console.log(coin.symbol, price, coin.mcap);
}function Coins() {
const [coins, setCoins] = useState([]);
useEffect(() => {
let alive = true;
const load = () =>
fetch("https://pearit.now/api/public/v1/coins?sort=volume&limit=20")
.then((r) => r.json())
.then((b) => { if (alive && b.ok) setCoins(b.data); });
load();
const timer = setInterval(load, 30000); // fresh every 30s is plenty
return () => { alive = false; clearInterval(timer); };
}, []);
return coins.map((c) => <div key={c.id}>{c.symbol} β {c.mcap}</div>);
}curl "https://pearit.now/api/public/v1/coins?search=pear"
/api/public/v1/coins/{mint}One coin
A single coin by address, plus the question it is paired with: the side it backs, the live chance, when it closes and whether it won or lost.
Swap {mint} for the coin's address β the id field from the list above, or the long string in its pump.fun link.
This is the only endpoint that returns the paired outcome, so use it for a coin page rather than filtering the whole list.
market is null when the coin was launched without a question. When it is there, odds is a fraction: 0.62 means a 62% chance. It refreshes in the background, so a page that re-asks every minute stays current.
Once the question is answered, result fills in and outcome tells you straight away whether this coin's side won. Before that both are empty strings, not null.
An address that isn't a real coin here comes back 404 with { ok: false, error }.
What comes back
tokenβ the same fields as the list above, for this one coinmarket.questionβ the yes/no question it backs, when it has onemarket.sideβ yes or no β the side this coin pickedmarket.oddsβ the chance of that side, 0 to 1, refreshed on its ownmarket.closeTimeβ when the question stops taking answersmarket.resultβ yes, no, or empty while it is still openmarket.outcomeβ won, lost, or empty β the side compared with the resultmarket.urlβ the question on Polymarket or Kalshi
curl "https://pearit.now/api/public/v1/coins/9iKAPEqEDNqfZ2wD3g25RMRpYFW78AnXJgm6yNq5zpad"
const mint = "9iKAPEqEDNqfZ2wD3g25RMRpYFW78AnXJgm6yNq5zpad";
const res = await fetch(`https://pearit.now/api/public/v1/coins/${mint}`);
const { ok, data, error } = await res.json();
if (!ok) throw new Error(error); // 404 when the address isn't one of ours
console.log(data.token.symbol, data.token.usdPrice);
if (data.market) {
const chance = Math.round(data.market.odds * 100);
console.log(`backs ${data.market.side} on "${data.market.question}" β ${chance}%`);
if (data.market.outcome) console.log("this coin", data.market.outcome);
}/api/public/v1/marketsOpen questions
Live yes/no questions from Polymarket and Kalshi β the same list the launch form searches.
These are real questions from two prediction markets, merged into one list and filtered down to plain yes/no ones. Only open questions come back.
sort=volume gives you the ones people care about most; sort=closing gives you the ones answering soonest β handy for a 'settling today' section.
yesPrice is the chance of yes as a fraction, so the chance of no is 1 minus it. Multiply by 100 for a percentage.
Both sources are polled and cached for about a minute, so calling this in a tight loop returns the same answer. One of the two sources is fetched through our server because it doesn't allow browser calls β you don't have to do anything, it's already handled.
The id you get here is what a coin stores when it pairs with a question, so you can match a coin to its question across both endpoints.
What you can pass
searchβ words to look forsortβ volume (default) or closinglimitβ 1β100, default 30
What comes back
sourceβ polymarket or kalshiidβ the question's own id at that source β pass this back when launchingquestionβ the yes/no question, in wordsyesPriceβ the chance of yes, 0 to 1volumeβ how much has been traded on it, in dollarscloseTimeβ when it stops taking answersurlβ the question on its own sitestatusβ open, closed or settled
curl "https://pearit.now/api/public/v1/markets?search=election&sort=closing"
const res = await fetch("https://pearit.now/api/public/v1/markets?sort=closing&limit=10");
const { ok, data, error } = await res.json();
if (!ok) throw new Error(error);
for (const q of data) {
const chance = Math.round(q.yesPrice * 100);
const closes = new Date(q.closeTime).toLocaleString();
console.log(`[${q.source}] ${q.question} β yes ${chance}% β closes ${closes}`);
}/api/public/v1/buybacksBuybacks and burns
Every $PEAR buy-and-burn with the SOL spent, the $PEAR burned and both transaction signatures.
When a coin launches with buyback picked, its creator fees are collected, spent on $PEAR, and that $PEAR is destroyed. This endpoint is the public receipt book for all of it.
totals is the running score β the same number shown in the site header. events is the individual burns, newest first.
Both signatures are real Solana transactions. Stick either on the end of https://solscan.io/tx/ and anyone can check it themselves.
burnSignature can be empty for a burn that was bought but not yet destroyed; show it as pending rather than as zero.
What you can pass
limitβ 1β200, default 50
What comes back
totals.solSpentβ all the SOL ever spent buying $PEAR backtotals.padBurnedβ all the $PEAR ever burnedtotals.burnsβ how many burns have happenedevents[].createdAtβ when that burn happenedevents[].solSpentβ SOL spent on that oneevents[].padBurnedβ $PEAR destroyed on that oneevents[].swapSignatureβ the buy, checkable on Solscanevents[].burnSignatureβ the burn, checkable on Solscan
curl "https://pearit.now/api/public/v1/buybacks?limit=5"
const res = await fetch("https://pearit.now/api/public/v1/buybacks?limit=20");
const { ok, data, error } = await res.json();
if (!ok) throw new Error(error);
console.log(`${data.totals.padBurned} $PEAR burned across ${data.totals.burns} burns`);
for (const burn of data.events) {
const link = burn.burnSignature
? `https://solscan.io/tx/${burn.burnSignature}`
: "burn pending";
console.log(new Date(burn.createdAt).toDateString(), burn.padBurned, link);
}