Get a token deployer's on-chain activity feed
curl --request GET \
--url https://demo-api.mobula.io/api/2/token/dev-historyimport requests
url = "https://demo-api.mobula.io/api/2/token/dev-history"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://demo-api.mobula.io/api/2/token/dev-history', 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://demo-api.mobula.io/api/2/token/dev-history",
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://demo-api.mobula.io/api/2/token/dev-history"
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://demo-api.mobula.io/api/2/token/dev-history")
.asString();require 'uri'
require 'net/http'
url = URI("https://demo-api.mobula.io/api/2/token/dev-history")
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{
"data": [
{
"type": "feeClaim",
"blockchain": "<string>",
"date": 123,
"transactionHash": "<string>",
"blockHeight": 123,
"instructionIndex": 123,
"protocol": "pumpfun",
"creatorAddress": "<string>",
"quoteAddress": "<string>",
"tokenAddress": "<string>",
"poolAddress": "<string>",
"amountRaw": "<string>",
"amountUSD": 123
}
],
"deployer": "<string>",
"pagination": {
"offset": 123,
"limit": 123,
"count": 123,
"hasMore": true
}
}Trades Data
Get Token Dev History
Merged, chronological feed of a token deployer’s on-chain activity — creator fee claims, swaps on the queried token, and transfers to/from the deployer.
GET
/
2
/
token
/
dev-history
Get a token deployer's on-chain activity feed
curl --request GET \
--url https://demo-api.mobula.io/api/2/token/dev-historyimport requests
url = "https://demo-api.mobula.io/api/2/token/dev-history"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://demo-api.mobula.io/api/2/token/dev-history', 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://demo-api.mobula.io/api/2/token/dev-history",
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://demo-api.mobula.io/api/2/token/dev-history"
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://demo-api.mobula.io/api/2/token/dev-history")
.asString();require 'uri'
require 'net/http'
url = URI("https://demo-api.mobula.io/api/2/token/dev-history")
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{
"data": [
{
"type": "feeClaim",
"blockchain": "<string>",
"date": 123,
"transactionHash": "<string>",
"blockHeight": 123,
"instructionIndex": 123,
"protocol": "pumpfun",
"creatorAddress": "<string>",
"quoteAddress": "<string>",
"tokenAddress": "<string>",
"poolAddress": "<string>",
"amountRaw": "<string>",
"amountUSD": 123
}
],
"deployer": "<string>",
"pagination": {
"offset": 123,
"limit": 123,
"count": 123,
"hasMore": true
}
}Alpha — This endpoint is in early access. Response shape, field names, and filter semantics may change without notice.
swap and transfer rows are chain-agnostic — they work on any chain Mobula indexes (Solana and every supported EVM chain). feeClaim coverage is launchpad-specific: all major Solana launchpads (PumpFun, PumpSwap, Meteora DBC) plus Clanker on EVM, with other EVM launchpads (e.g. Bankr) still rolling out.Query Details
This endpoint returns a polymorphic, chronological feed of a token deployer’s on-chain activity. Each row is one of threetypes:
type | Meaning |
|---|---|
feeClaim | The deployer drained their accumulated trading fees from a protocol vault. On Solana: PumpFun bonding curve, PumpSwap AMM, and Meteora DBC — the backbone of Bags, Moonshot, Believe, Subs.fun, Cults.fun, Time.fun, and most Solana launchpads. On EVM: Clanker creator-fee claims (primarily Base). |
swap | The deployer executed a swap on a pool that contains the queried token. side is buy if the deployer ended up with MORE of the queried token, sell otherwise. |
transfer | A direct transfer of the queried token to (direction: "in") or from (direction: "out") the deployer. |
| Parameter | Required | Description |
|---|---|---|
blockchain | Yes | Blockchain identifier (e.g., solana, base, ethereum). |
token | Yes | Token mint / contract address. |
type | No | Filter to a single entry type: feeClaim, swap, or transfer. |
limit | No | Page size. 1–200, default 50. |
offset | No | Pagination offset, default 0. |
For PumpFun and PumpSwap, the per-creator vault is shared across all of the deployer’s coins — a
feeClaim row under those protocols reflects the same on-chain claim event, but the amount may include fees from OTHER coins by the same creator. Rows from meteoradbc carry an exact tokenAddress and poolAddress and attribute 1:1 to a specific coin.Step-by-Step Tutorial
Response Overview
Eachdata[i] is discriminated on the type field. Common fields across all variants:
- type:
"feeClaim" | "swap" | "transfer"— the discriminator. - blockchain: Friendly blockchain name (e.g.
"solana"). - date: Event timestamp in milliseconds.
- transactionHash: On-chain transaction hash / signature.
feeClaim additional fields
- protocol:
"pumpfun" | "pumpswap" | "meteoradbc" | "clanker". - blockHeight: Block / slot number, or
null. - instructionIndex: Stable index of the claim instruction within the transaction.
- creatorAddress: Address that received the claimed fees (= the deployer).
- quoteAddress: Mint of the asset the claim is denominated in (wSOL, USDC, …).
- tokenAddress: Source coin mint for protocols with per-pool vaults (Meteora DBC).
nullfor per-creator vaults (PumpFun, PumpSwap). - poolAddress: Source pool address if available;
nullfor per-creator vaults. - amountRaw: Amount claimed in base units of
quoteAddress. - amountUSD: USD value (0 until enrichment lands).
swap additional fields
- side:
"buy"(deployer received the queried token) or"sell". - poolAddress: The pool the swap went through.
- baseTokenAddress / quoteTokenAddress: token0 / token1 of the pool. Not re-oriented to the queried token — compare addresses to know which side is which.
- baseTokenAmount / baseTokenAmountRaw / quoteTokenAmount / quoteTokenAmountRaw: amounts on each leg.
- amountUSD: USD value of the swap.
- swapSenderAddress: On-chain swap sender. Often a router (Jupiter, TG bots) when the deployer trades through an aggregator.
transfer additional fields
- direction:
"in"(deployer received) or"out"(deployer sent). - counterpartyAddress: The other side of the transfer.
- tokenAddress: Mint of the transferred token (= the queried token).
- amountRaw / amountUSD: transferred amount.
- data: array of polymorphic entries as described above.
- deployer: the queried token’s recorded deployer address, or
nullif unknown. - pagination:
{ offset, limit, count, hasMore }.
Usage Examples
Full feed for a Solana meme coin (GET):curl -X GET "https://api.mobula.io/api/2/token/dev-history?blockchain=solana&token=Fv8HhSVUquGC8WHqmMJLp7QEZMN4cZqcZjeYUPqvbrrr&limit=50"
curl -X GET "https://api.mobula.io/api/2/token/dev-history?blockchain=solana&token=Fv8HhSVUquGC8WHqmMJLp7QEZMN4cZqcZjeYUPqvbrrr&type=feeClaim"
curl -X GET "https://api.mobula.io/api/2/token/dev-history?blockchain=solana&token=Fv8HhSVUquGC8WHqmMJLp7QEZMN4cZqcZjeYUPqvbrrr&limit=50&offset=50"
Sample Response
{
"data": [
{
"type": "feeClaim",
"blockchain": "solana",
"date": 1745251935000,
"transactionHash": "5Uxxpff8iDTHM3Nu9D653aP6T2yzVbW8PfwsWBxi9ApwBAo7dbYm7ATLKBXbycAFP1yQQ1RYCByVqzzzaGNdVD6q",
"blockHeight": 358123456,
"instructionIndex": 2,
"protocol": "meteoradbc",
"creatorAddress": "82VbBzGtb8v5wFx1TM6iaMmLyRSLy8WeqA123orjHGzL",
"quoteAddress": "So11111111111111111111111111111111111111112",
"tokenAddress": "Fv8HhSVUquGC8WHqmMJLp7QEZMN4cZqcZjeYUPqvbrrr",
"poolAddress": "DrKy5sCkpNSWFuUKcPn5STN7g9ghcH9GYcrMqwJxUG4W",
"amountRaw": "10157228",
"amountUSD": 0
},
{
"type": "swap",
"blockchain": "solana",
"date": 1745251800000,
"transactionHash": "4n3xM...",
"side": "buy",
"poolAddress": "DrKy5sCkpNSWFuUKcPn5STN7g9ghcH9GYcrMqwJxUG4W",
"baseTokenAddress": "Fv8HhSVUquGC8WHqmMJLp7QEZMN4cZqcZjeYUPqvbrrr",
"quoteTokenAddress": "So11111111111111111111111111111111111111112",
"baseTokenAmount": 1234567.89,
"baseTokenAmountRaw": "1234567890000",
"quoteTokenAmount": 1.5,
"quoteTokenAmountRaw": "1500000000",
"amountUSD": 250.4,
"swapSenderAddress": "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4"
},
{
"type": "transfer",
"blockchain": "solana",
"date": 1745251500000,
"transactionHash": "2kPm...",
"direction": "out",
"counterpartyAddress": "5q54X...",
"tokenAddress": "Fv8HhSVUquGC8WHqmMJLp7QEZMN4cZqcZjeYUPqvbrrr",
"amountRaw": "500000000",
"amountUSD": 42.5
}
],
"deployer": "82VbBzGtb8v5wFx1TM6iaMmLyRSLy8WeqA123orjHGzL",
"pagination": {
"offset": 0,
"limit": 50,
"count": 3,
"hasMore": false
}
}
Error Responses
404 — Token not found:{ "statusCode": 404, "message": "Token not found" }
{ "statusCode": 400, "message": "Blockchain is required" }
{ "statusCode": 400, "message": "Token address is required" }
Use Cases
- Rug & dump detection: see if the deployer has been selling or transferring the token out.
- Trust scoring: quantify fee extraction (claim frequency & amount) across all supported launchpads — Bags, Moonshot, Believe, PumpFun, etc.
- Dev reputation: track a creator’s full activity on their coin across time in one feed.
- Pre-trade due diligence: check for recent unusual deployer activity before entering a position.
Query Parameters
Blockchain chain ID (e.g., "solana:solana")
Token mint address
Offset for pagination (default: 0)
Required range:
x >= 0Page size, max 200 (default: 50)
Required range:
1 <= x <= 200Filter to a single entry type: feeClaim, swap, or transfer
Available options:
feeClaim, swap, transfer Available options:
pumpfun, pumpswap, meteoradbc, clanker