curl "https://api.metastreams.io/v1/trades?identity=kol&limit=50" \
-H "Authorization: Bearer $API_KEY"
curl "https://api.metastreams.io/v1/trades?identity=fomoscan&chains=solana,base" \
-H "Authorization: Bearer $API_KEY"
const url = new URL("https://api.metastreams.io/v1/trades");
url.searchParams.set("identity", "kol");
url.searchParams.set("chains", "solana,base");
const response = await fetch(url, {
headers: { Authorization: `Bearer ${process.env.API_KEY}` },
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const { trades, nextCursor, hasMore } = await response.json();
{
"trades": [
{
"id": "4xQmVb8e2kT1nR7pZcW3sLdHfA9jEuY6gVnX1oB5iC0wQ2rT8yU3iO7pA1sD4fG6h:2",
"chain": "solana",
"token": "DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263",
"name": "Bonk",
"symbol": "Bonk",
"trader": "7YttLkHDoNj9wyDur5pM1ejNaAvT9X4eqaYcHQqtj2G5",
"transactionHash": "4xQmVb8e2kT1nR7pZcW3sLdHfA9jEuY6gVnX1oB5iC0wQ2rT8yU3iO7pA1sD4fG6h",
"side": "buy",
"amount": "12500000",
"price": { "native": "0.000000121", "usd": "0.0000216" },
"volume": { "native": "1.51", "usd": "270.12" },
"marketCap": { "native": "10741962.1", "usd": "1917440000" },
"identities": [
{
"source": "fomoscan",
"handle": "degenspartan",
"displayName": "Degen Spartan",
"avatar": "https://cdn.example.com/avatars/degenspartan.png",
"twitter": "degenspartan",
"telegram": null,
"farcaster": null
}
],
"timestamp": 1789632015120
}
],
"nextCursor": null,
"hasMore": false
}
{
"error": {
"code": "VALIDATION_ERROR",
"message": "One or more parameters are invalid.",
"details": [{ "field": "identity", "message": "Must be one of: kol, fomoscan." }]
}
}
REST
Identity trades
Page through trades by notable wallets across every chain and token.
GET
/
v1
/
trades
curl "https://api.metastreams.io/v1/trades?identity=kol&limit=50" \
-H "Authorization: Bearer $API_KEY"
curl "https://api.metastreams.io/v1/trades?identity=fomoscan&chains=solana,base" \
-H "Authorization: Bearer $API_KEY"
const url = new URL("https://api.metastreams.io/v1/trades");
url.searchParams.set("identity", "kol");
url.searchParams.set("chains", "solana,base");
const response = await fetch(url, {
headers: { Authorization: `Bearer ${process.env.API_KEY}` },
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const { trades, nextCursor, hasMore } = await response.json();
{
"trades": [
{
"id": "4xQmVb8e2kT1nR7pZcW3sLdHfA9jEuY6gVnX1oB5iC0wQ2rT8yU3iO7pA1sD4fG6h:2",
"chain": "solana",
"token": "DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263",
"name": "Bonk",
"symbol": "Bonk",
"trader": "7YttLkHDoNj9wyDur5pM1ejNaAvT9X4eqaYcHQqtj2G5",
"transactionHash": "4xQmVb8e2kT1nR7pZcW3sLdHfA9jEuY6gVnX1oB5iC0wQ2rT8yU3iO7pA1sD4fG6h",
"side": "buy",
"amount": "12500000",
"price": { "native": "0.000000121", "usd": "0.0000216" },
"volume": { "native": "1.51", "usd": "270.12" },
"marketCap": { "native": "10741962.1", "usd": "1917440000" },
"identities": [
{
"source": "fomoscan",
"handle": "degenspartan",
"displayName": "Degen Spartan",
"avatar": "https://cdn.example.com/avatars/degenspartan.png",
"twitter": "degenspartan",
"telegram": null,
"farcaster": null
}
],
"timestamp": 1789632015120
}
],
"nextCursor": null,
"hasMore": false
}
{
"error": {
"code": "VALIDATION_ERROR",
"message": "One or more parameters are invalid.",
"details": [{ "field": "identity", "message": "Must be one of: kol, fomoscan." }]
}
}
Recent trades by one identity feed, newest first, across every token. This is the only trade read not scoped to a token.
identity picks the feed. kol covers wallets labelled as key opinion leaders, and fomoscan covers wallets with a fomo.family profile. chains scopes the read to a comma-separated list of chain slugs, such as solana,base; leave it out for every spot chain, because a list that names nothing is refused.
Response
The page shape of Token trades:trades, nextCursor and hasMore. Each trade names its own chain and token, because one page spans both. The cursor behaves the same way here; see Paging.
Errors
| Code | When |
|---|---|
UNSUPPORTED_CHAIN | A slug in chains is not supported |
VALIDATION_ERROR | An unknown identity, an empty chains list, a cursor that does not decode, or an unknown parameter |
curl "https://api.metastreams.io/v1/trades?identity=kol&limit=50" \
-H "Authorization: Bearer $API_KEY"
curl "https://api.metastreams.io/v1/trades?identity=fomoscan&chains=solana,base" \
-H "Authorization: Bearer $API_KEY"
const url = new URL("https://api.metastreams.io/v1/trades");
url.searchParams.set("identity", "kol");
url.searchParams.set("chains", "solana,base");
const response = await fetch(url, {
headers: { Authorization: `Bearer ${process.env.API_KEY}` },
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const { trades, nextCursor, hasMore } = await response.json();
{
"trades": [
{
"id": "4xQmVb8e2kT1nR7pZcW3sLdHfA9jEuY6gVnX1oB5iC0wQ2rT8yU3iO7pA1sD4fG6h:2",
"chain": "solana",
"token": "DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263",
"name": "Bonk",
"symbol": "Bonk",
"trader": "7YttLkHDoNj9wyDur5pM1ejNaAvT9X4eqaYcHQqtj2G5",
"transactionHash": "4xQmVb8e2kT1nR7pZcW3sLdHfA9jEuY6gVnX1oB5iC0wQ2rT8yU3iO7pA1sD4fG6h",
"side": "buy",
"amount": "12500000",
"price": { "native": "0.000000121", "usd": "0.0000216" },
"volume": { "native": "1.51", "usd": "270.12" },
"marketCap": { "native": "10741962.1", "usd": "1917440000" },
"identities": [
{
"source": "fomoscan",
"handle": "degenspartan",
"displayName": "Degen Spartan",
"avatar": "https://cdn.example.com/avatars/degenspartan.png",
"twitter": "degenspartan",
"telegram": null,
"farcaster": null
}
],
"timestamp": 1789632015120
}
],
"nextCursor": null,
"hasMore": false
}
{
"error": {
"code": "VALIDATION_ERROR",
"message": "One or more parameters are invalid.",
"details": [{ "field": "identity", "message": "Must be one of: kol, fomoscan." }]
}
}
Authorizations
Send the API key as Authorization: Bearer <key>.
Query Parameters
Which identity feed to read.
A cross-token feed of trades by a notable identity: GET /v1/trades?identity=.
Available options:
kol, fomoscan Chains to scope to, CSV of the chain slugs. Absent means every spot chain.
Rows per page, clamped to 1-100; 20 when absent.
Required range:
1 <= x <= 100Opaque cursor from the previous page.
Response
Recent trades by the requested identity, newest first.
A page of trades, newest first: one token's (GET /v1/tokens/{chain}/{address}/trades)
or one identity's across every token (GET /v1/trades).