Deployer tokens
Every token a deployer address has launched, newest first, each with the peak market cap it reached. The summary block scores the address itself: how many launches, how many made it to Raydium, and the best peak any of them hit.
/v1/devs/:address/tokens
a deployer's full launch history
Example
curl -sS -H "Authorization: Bearer $API_KEY" \
"https://api.cookin.fun/v1/devs/Deployer123.../tokens?limit=50"
Response
{
"data": [
{
"mint": "BgNrWZK...",
"name": "Sample Token",
"symbol": "SMP",
"image_uri": "https://ipfs.io/ipfs/Qm...",
"deployed_at": "2026-09-20T12:00:00.000000Z",
"launchpad": "pumpfun",
"has_migrated": true,
"migrated_at": "2026-09-20T13:44:00.000000Z",
"dex_paid": false,
"ath_mcap": 412000,
"ath_slot": 371829104,
"ath_at": "2026-09-20T14:02:11.000000Z"
},
{
"mint": "7Kd2mNx...",
"name": "Earlier Attempt",
"symbol": "TRY",
"image_uri": null,
"deployed_at": "2026-09-14T08:11:00.000000Z",
"launchpad": "pumpfun",
"has_migrated": false,
"migrated_at": null,
"dex_paid": false,
"ath_mcap": 18400,
"ath_slot": 369102447,
"ath_at": "2026-09-14T08:19:36.000000Z"
}
],
"summary": {
"total_deployed": 37,
"bonded_count": 4,
"bond_rate": 10.81,
"best_ath_mcap": 412000,
"ath_sample_size": 29,
"ath_milestones": [
{ "mcap": 10000, "reached": 17, "pct": 58.62 },
{ "mcap": 20000, "reached": 9, "pct": 31.03 },
{ "mcap": 30000, "reached": 7, "pct": 24.14 },
{ "mcap": 50000, "reached": 4, "pct": 13.79 },
{ "mcap": 75000, "reached": 3, "pct": 10.34 },
{ "mcap": 100000, "reached": 2, "pct": 6.90 }
],
"ath_mcap_percentiles": {
"p25": 6200,
"p50": 11400,
"p75": 38900,
"p90": 94500
}
},
"meta": {
"request_id": "F9x...",
"cached_at": "2026-09-20T15:00:00Z",
"page": { "limit": 50, "offset": 0, "returned": 2 }
}
}
Query parameters
| Param | Type | Description |
|---|---|---|
limit | integer | Tokens per page. Defaults to 50, capped at 100. A larger value is clamped, not rejected. |
offset | integer | Tokens to skip. Defaults to 0. Launch bots can have tens of thousands of tokens, so page rather than trying to pull a history in one call. |
Either param returns 400 if it is not a non-negative integer. Broken pagination fails loudly instead of silently re-serving page one.
Token schema
| Field | Type | Description |
|---|---|---|
mint | string | Token mint address (base58). |
name | string | Token name. |
symbol | string | Token symbol. |
image_uri | string | null | Token image, once metadata has been retrieved. |
deployed_at | string (ISO 8601) | When the token was deployed. Results are ordered by this, newest first. |
launchpad | string | Which launchpad deployed it: pumpfun, meteora, bags, or raydium_launchpad. |
has_migrated | bool | Whether the token graduated to Raydium/PumpSwap. |
migrated_at | string (ISO 8601) | null | When it graduated. Null if it never did. |
dex_paid | bool | Whether a DexScreener paid order was confirmed. |
ath_mcap | integer | null | Highest market cap the token ever reached, in USD. See the note below on nulls. |
ath_slot | integer | null | Solana slot of the trade that set the peak. |
ath_at | string (ISO 8601) | null | Wall-clock time of that same trade. |
Summary schema
| Field | Type | Description |
|---|---|---|
total_deployed | integer | Tokens this address has ever launched. Covers the whole history, not the page. |
bonded_count | integer | How many of those graduated. |
bond_rate | float | bonded_count / total_deployed as a percentage (0..100). 0.0 for an address with no launches. |
best_ath_mcap | integer | null | Best peak across every token this address launched, in USD. |
ath_sample_size | integer | How many of this address's tokens have a recorded peak. This is the denominator the percentiles were computed over, and it can be well below total_deployed. |
ath_milestones | array | Survival curve for this address. One entry per market cap rung, ascending, each with mcap (USD), reached (how many tokens got there) and pct (share of ath_sample_size). |
ath_mcap_percentiles | object | null values | Spread of this address's peaks as p25, p50, p75, p90, each an integer USD market cap, or null when nothing has a recorded peak. |
Reading the milestones
ath_milestones answers "how often does this address produce a token that goes anywhere". Rungs are cumulative, so a token that peaked at 120k counts on every rung including 100k, and a token that peaked at 9k counts on none.
The shape of the curve carries the signal. An address where 40% clear 10k and 3% clear 100k is a different operation from one where 5% clear 10k and 4% clear 100k, even though their best launch might be identical. pct is a share of ath_sample_size, not of total_deployed, so it never counts a token we have no peak for as a failure.
Rungs may be added in future releases. Read the array in order and key off each entry's mcap rather than its position.
Reading the percentiles
best_ath_mcap is one launch, and one lucky launch lifts it on its own. p50 is the more honest number for judging an address: it says what a typical launch of theirs actually reaches.
Every percentile is a peak that one of this address's tokens really hit. We pick an observed value rather than interpolating between two, so you can always point at the launch a figure came from. With an even sample the lower of the two straddling values is returned.
Tokens with no recorded peak are left out of the calculation entirely rather than counted as zero. Compare ath_sample_size against total_deployed before trusting a median: a p50 drawn from 6 of 800 launches describes those 6, not the address.
Why ATH can be null
A null ath_mcap means no peak was ever recorded for that token, not that it peaked at zero. The two are different claims and this endpoint does not collapse them, so treat null as unknown rather than as a low score.
Peaks are recorded from the point a token is tracked. Tokens that stopped trading before peak tracking existed have no value and never will. Everything launched since has one.
Empty results
An address that has never deployed a token returns 200 with an empty data array and a zeroed summary, not a 404. "This address has launched nothing" is a real answer to the question you asked.
A malformed address returns 400. The address must be 32-44 base58 characters.