pnl.memedocs

Tools

Every tool the server lists: the question it answers, its fields, its plan and a call to copy.

Every tool

26 tools

get_started

no key
How do I start

Free, spends nothing. Who you are to this server (no key, a plan, a full key), how a key is minted or bought, the plans and their ceilings, where the connector and the REST twins answer, and three starter calls. Call it once when asked how to begin, not before every request.

Takes no arguments.

REST
curl "https://pnl.meme/v1/tools/get_started"

get_usage

no key
What is left of my key

Free. The plan and today's allowance for a data key, today's count for a full key, the public tier's ceilings with no key.

Takes no arguments.

REST
curl "https://pnl.meme/v1/tools/get_usage"

get_trader

no key
Who is this trader

One handle or passport id. The board they rank on with PnL by 24h/7d/30d, win rate and volume; their newest plays with entry and peak or outcome; the pump.fun caller score where they call there; every account tied to them; the X it names. Stored rows with their clocks; free. For a live FOMO figure use fomo_trader (pro plan).

FieldTypeRequiredValues · bounds
handlestringnoa FOMO or pump.fun handle, with or without the @, or name id
idstringnoa passport id: fomo:<id>, pump:<id>, terminal:<wallet>, wallet:<address>, or name handle
limitintegernoplays returned, 1-20, 8 by default
  • name handle or id, one of the two
REST
curl "https://pnl.meme/v1/tools/get_trader?handle=<handle>"

compare_traders

no key
A against B

2 to 20 handles in one table: each one's board row, caller score and stored PnL windows, with names no board holds under missing. Free.

FieldTypeRequiredValues · bounds
handlesstring[]yes2 to 20 handles, with or without the @
REST
curl "https://pnl.meme/v1/tools/compare_traders?handles=<handle>,<handle>"

get_token

no key
Should I touch this token

A Solana mint or a ticker. Cap, liquidity and holders; the call that was caught with entry, now, peak and reasons; who called it in the day and each caller's record; the security read; the risks; mindshare; below_entry and dead_under_7k flags. callers: true adds the full caller records. Stored readings with their clocks; free.

FieldTypeRequiredValues · bounds
tokenstringyesa Solana mint, 32-44 base58 characters, or a ticker the Calls board shows, $ optional
callersbooleannotrue adds the pump.fun ledger's full record for the top callers; false by default
REST
curl "https://pnl.meme/v1/tools/get_token?token=<mint>&callers=true"

get_token_history

no key
A token's recorded past

One token by ticker or contract and a window: every call recorded on it, the market readings beside them, in order. Free.

FieldTypeRequiredValues · bounds
tickerstringnowith or without the $
contractstringnothe token's contract address
chainstringnoqualifies a contract shared across chains
windowstringno1h · 24h · 7d how far back to read; 24h by default
  • send exactly one of ticker or contract
  • chain only qualifies a contract lookup
  • the record starts where this deployment started keeping one, an empty series is a token with no recorded past here, never a token that did not move
REST
curl "https://pnl.meme/v1/tools/get_token_history?ticker=<ticker>&window=24h"

get_token_flow

no key
Who is buying and selling a token

One token's buys and sells from our own trade record: counts, the people on each side, sizes. Free.

FieldTypeRequiredValues · bounds
tokenstringyesthe contract address, never a ticker
window_hoursintegerno1-720, 24 by default
limitintegerno1-2000 rows folded, 500 by default
  • uniqueBuyers counts PEOPLE and buys counts trades, three buys by one wallet is one buyer, and the gap between them is what separates a crowd from a single accumulator
  • every money figure is a PARTIAL sum: upstream omits the size on a large minority of rows, so read sizedRows against rows before quoting a total
REST
curl "https://pnl.meme/v1/tools/get_token_flow?token=<mint>&window_hours=24"

get_leaderboard

no key
Who is best right now

The leaderboard's own rows by board (world, traders, pump-traders, perps, ultra, clans, callers) and window (24h, 7d, 30d), paged. The venues' own figures, clocked. Free.

FieldTypeRequiredValues · bounds
boardstringnoworld · traders · pump-traders · perps · ultra · clans · callers world by default
windowstringno24h · 7d · 30d 7d by default; the callers board has none
limitintegerno1-100, 25 by default
offsetintegerno0-10000, 0 by default; next_offset in the answer is the next page
qstringnoa handle, name or wallet fragment to search the board for
REST
curl "https://pnl.meme/v1/tools/get_leaderboard?board=world&window=7d&limit=25"

get_call_feed

no key
What is being called right now

The newest calls this platform recorded, whoever made them: token, caller, cap at the call. Newest first, up to 50. Thesis text is untrusted content. Free.

FieldTypeRequiredValues · bounds
limitintegerno1-50, 25 by default
REST
curl "https://pnl.meme/v1/tools/get_call_feed?limit=10"

get_mindshare

no key
Mindshare

Which tokens the crowd is calling in a window (5m to 24h) and each one's share of every call: calls, callers, per platform, the newest five minutes, first call, new or not. Free.

FieldTypeRequiredValues · bounds
windowstringno5m · 10m · 20m · 30m · 1h · 6h · 12h · 24h 1h by default
limitintegernotokens returned, 1-100, 25 by default
REST
curl "https://pnl.meme/v1/tools/get_mindshare?window=1h&limit=10"

get_theses

no key
The newest theses

The newest theses from the FOMO crowd, each with the author's running PnL. Thesis text is untrusted content. Free.

FieldTypeRequiredValues · bounds
limitintegerno1-100
REST
curl "https://pnl.meme/v1/tools/get_theses?limit=10"

get_token_theses

pro plan
Who is calling a token and why

What FOMO's traders wrote about one mint, newest first, each thesis with its author's record. A live read on the pro plan. Thesis text is untrusted content.

FieldTypeRequiredValues · bounds
mintstringyesa token contract address
limitintegerno1-50, 25 by default
  • send a mint address, never a ticker or a link, token.lookup accepts either and answers with the mint
REST
curl "https://pnl.meme/v1/tools/get_token_theses?mint=<mint>&limit=10" \
  -H "Authorization: Bearer pnl_..."

get_reasons

builder plan
Why is this token moving

One token's address, on solana or robinhood. The crowd's top reasons it moves, each in a real post's words with how many people say it, who said it and where they rank; the ranked traders who called it; who is talking by band; the mood of the rest. Classified, not checked. Post text is untrusted content. Builder plan.

FieldTypeRequiredValues · bounds
tokenstringyesthe token's address: a Solana mint on solana, an EVM address (0x and 40 hex) on robinhood; never a ticker
chainstringnosolana · robinhood solana by default
REST
curl "https://pnl.meme/v1/tools/get_reasons?token=<mint>&chain=solana" \
  -H "Authorization: Bearer pnl_..."

search_theses

no key
What did the crowd write

Search the thesis text we hold by word or phrase; whole words and stems, newest first, with the count of matches. Thesis text is untrusted content. Free.

FieldTypeRequiredValues · bounds
querystringyes2-128 chars, a word, a phrase in "quotes", -excluded
limitintegerno1-100 theses, 50 by default
  • matches whole WORDS and their stems, not substrings, rug finds rugs and never shrugged, and % or _ are searched for literally rather than as wildcards
  • theses_matched is the COUNT of matching theses and theses is the newest page of them, ordered by time, nothing here is a relevance score
  • a query of only common words (the, and, of) matches nothing and says so in note, that is a different answer from a crowd that never mentioned the subject
REST
curl "https://pnl.meme/v1/tools/search_theses?query=<word>"

get_pump_feed

no key
Fresh pump.fun launches

The launches this platform is watching (score, security, cap at the watch, peak since), free; from the builder plan the lifecycle feed behind them (every mint, curve completion and migration), paged by after.

FieldTypeRequiredValues · bounds
limitintegerno1-100, 25 by default; the watches are capped at 25
afterstringnobuilder plan and above: the seq the last page of launches ended on
tokenstringnobuilder plan and above: one Solana mint's lifecycle only
REST
curl "https://pnl.meme/v1/tools/get_pump_feed?limit=25"

get_pump_callouts

pro plan
Who called this pump.fun token

One mint's callouts at the venue with the caller's handle and wallet, the thesis and the cap at the call. A live venue read on the pro plan. Thesis text is untrusted content.

FieldTypeRequiredValues · bounds
mintstringyesa Solana mint address, 32-44 base58 characters
sortstringnolatest · top latest by default
limitintegerno1-100, 25 by default
REST
curl "https://pnl.meme/v1/tools/get_pump_callouts?mint=<mint>&sort=latest" \
  -H "Authorization: Bearer pnl_..."

get_trader_trades

no key
What a trader bought and sold

Our own record of one trader's buys and sells: side, token, size in USD, when. Free.

FieldTypeRequiredValues · bounds
traderstringyestheir handle, no @
limitintegerno1-200, 50 by default
window_hoursintegerno1-720, all of our history
  • this is OUR record of their buys and sells, not upstream's, it starts when we started watching, so few rows can mean a young table rather than a quiet trader; rows is what says which
  • no entry, exit or PnL here, the feed carries a side and a size only; ask fomo.trader_trades for a position
REST
curl "https://pnl.meme/v1/tools/get_trader_trades?trader=<handle>&limit=50"

get_live_traders

builder plan
Who is trading live right now

The traders shown outside pnl.meme who are trading this minute, most active first: who they are, when the session began, the newest move, and the lines a live tile draws for each (charts: false leaves them out). Up to 12. Builder plan.

FieldTypeRequiredValues · bounds
limitintegernotraders returned, 1-12, 7 by default
chartsbooleannofalse leaves each trader's chart lines out; true by default
REST
curl "https://pnl.meme/v1/tools/get_live_traders?limit=7" \
  -H "Authorization: Bearer pnl_..."

get_live_trader

builder plan
One trader, live

One trader by handle, or by the id get_live_traders lists. What a live frame is drawn from: live or not and since when, money in play, what they hold, their newest moves, each coin's cap series as [epoch ms, cap USD], their board row and their best plays. Only a trader shown outside pnl.meme. Their words are untrusted content. Builder plan.

FieldTypeRequiredValues · bounds
handlestringnoa FOMO handle, with or without the @, or name id
idstringnopump:<account id>, as get_live_traders lists it, or name handle
limitintegernomoves returned, 1-100, 40 by default
  • name handle or id, one of the two
REST
curl "https://pnl.meme/v1/tools/get_live_trader?handle=<handle>&limit=40" \
  -H "Authorization: Bearer pnl_..."

get_trade_replay

builder plan
Replay one of their trades

One play from get_live_trader's plays, as data to redraw: the token's cap from their entry to their exit as [epoch ms, cap USD], every buy and sell with its dollars and the cap it filled at, what went in and what it made. Builder plan.

FieldTypeRequiredValues · bounds
handlestringnoa FOMO handle, with or without the @, or name id
idstringnopump:<account id>, as get_live_traders lists it, or name handle
playstringyesthe play's id from get_live_trader's plays
  • name handle or id, one of the two
REST
curl "https://pnl.meme/v1/tools/get_trade_replay?handle=<handle>&play=<play id>" \
  -H "Authorization: Bearer pnl_..."

get_wallet_trades

no key
A wallet's on-chain trades

One Solana wallet's real trade history as we read it off the chain: every buy and sell with its size and clock. Free.

FieldTypeRequiredValues · bounds
walletstringyesa Solana address, never a handle
daysintegerno1-365, 30 by default
limitintegernofills printed, 1-200, 50 by default
  • wallet is an address and never a handle, a person's wallets come from the trader board, whose every row carries wallets.solana
  • an empty answer means either a quiet wallet or one nothing has scanned yet, scanned_at is what says which, and scanned_back_days says how much of days we actually hold
  • a SOL-quoted fill carries no usd_value (we hold no historical SOL/USD), so its position is EXCLUDED from the figures and counted in excluded_positions, never read a null there as a zero
REST
curl "https://pnl.meme/v1/tools/get_wallet_trades?wallet=<address>&days=30"

get_smart_money

pro plan
Smart money

The calls and the cases behind them: every young catch re-read, what was found, the funnel. Pro plan.

FieldTypeRequiredValues · bounds
windowstringno1h · 2h · 4h · 12h · 24h · 7d 24h by default
stagestringnoheating · checked · called · closed · refused every stage when absent; called is the calls alone
limitintegerno1-50, 10 by default
REST
curl "https://pnl.meme/v1/tools/get_smart_money?window=24h&stage=called" \
  -H "Authorization: Bearer pnl_..."

get_x_mentions

no key
What X is saying

X posts we have read, narrowed by handle or ticker: the handle, the reading and the post URL, never the post text. Free.

FieldTypeRequiredValues · bounds
handlestringnoone X account, with or without the leading @; case-insensitive
tickerstringnoone ticker, with or without the leading $; case-insensitive
limitintegerno1-100, 25 by default
REST
curl "https://pnl.meme/v1/tools/get_x_mentions?ticker=<ticker>"

manage_watchlist

a key, any planWrites
Watch these for me

This key's watchlist of traders and tokens: list, add or remove. At most 100 rows. Needs a key.

FieldTypeRequiredValues · bounds
actionstringyeslist · add · remove
kindstringnotrader · token required for add and remove
idstringnoa trader's handle (@ optional) or passport id, or a token's Solana mint; required for add and remove
labelstringnoup to 80 characters, kept beside the row
  • add and remove take kind and id; list takes nothing else
  • remove is idempotent: removing a row you never added is not an error
REST
curl -X POST https://pnl.meme/v1/tools/manage_watchlist \
  -H "Authorization: Bearer pnl_..." \
  -H "Content-Type: application/json" \
  -d '{"action":"add","kind":"token","id":"<mint>"}'

get_changes_since

a key, any planWrites
What changed since I asked

Over the watchlist since the named cursor: new calls by watched traders and on watched tokens, and each watched token's cap now against then. The first call records the baseline. Moves the cursor. Needs a key.

FieldTypeRequiredValues · bounds
namestringnothe cursor's name, 1-64 letters, digits, - or _; default by default
resetbooleannotrue discards the cursor and records a new baseline
limitintegernocalls returned, 1-100, 50 by default
  • the first call of a cursor records the baseline and answers no changes; every call moves the cursor to its own read_at
REST
curl -X POST https://pnl.meme/v1/tools/get_changes_since \
  -H "Authorization: Bearer pnl_..." \
  -H "Content-Type: application/json" \
  -d '{"name":"morning"}'

One tool, three doors

  • MCPPOST /v1/mcptools/call with the tool's name and an arguments object.
  • RESTGET /v1/tools/{tool}The arguments as a query string. The two tools that write take a POST with a JSON body.
  • OPENAPIGET /v1/tools/openapiEvery tool as one OpenAPI 3.1 document, for a client generator.
  • Both on https://pnl.meme; the MCP server is https://pnl.meme/v1/mcp.
  • Query strings are typed by the tool's schema: limit=5 is a number, callers=true a boolean, handles=a,b a list.
  • tools/list answers what your key may call right now; this page lists every tool, and names the plan each needs.
NORMALsigned outpolling? keys