curl --request GET \
--url https://api.dexploit.dev/tokens/{mint}/intel \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.dexploit.dev/tokens/{mint}/intel"
headers = {"X-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<api-key>'}};
fetch('https://api.dexploit.dev/tokens/{mint}/intel', 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://api.dexploit.dev/tokens/{mint}/intel",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-Key: <api-key>"
],
]);
$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://api.dexploit.dev/tokens/{mint}/intel"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.dexploit.dev/tokens/{mint}/intel")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.dexploit.dev/tokens/{mint}/intel")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"unavailable": [
"dev"
],
"mint": "<string>",
"computed_at": 123,
"holders_count": 123,
"holder_data_status": "ok",
"creator_held_pct": 123,
"bonding_pct": 123,
"top10_pct": {
"value": 123,
"status": "ready",
"computed_at": 123
},
"actors": {},
"dev": {},
"change_pct": {
"5m": 123,
"1h": 123,
"6h": 123,
"24h": 123
},
"liquidity_usd": 123,
"volume_24h_usd": 123,
"volume_pct_change_24h": 123,
"dev_held_lp_pct": 123,
"risk": {
"score": 123,
"level": "safe",
"status": "ready",
"top_triggered_signals": [
"<string>"
],
"triggered_signals_count": 123,
"missing_signals": [
"<string>"
],
"unavailable_signals": [
"<string>"
],
"fetch_url": "<string>"
}
}{
"success": false,
"error": {
"code": "INVALID_PARAM",
"message": "use pair_address; see /api/v1/pairs?token_address=X to discover pools"
}
}{
"success": false,
"error": {
"code": "INVALID_PARAM",
"message": "use pair_address; see /api/v1/pairs?token_address=X to discover pools"
}
}{
"success": false,
"error": {
"code": "INVALID_PARAM",
"message": "use pair_address; see /api/v1/pairs?token_address=X to discover pools"
}
}Token intel — dashboard summary
Per-mint dashboard payload: actor aggregates, top-10 holder concentration, dev info, price/liquidity context, and an embedded Risk Score summary. Server-side cached ~60s.
A failed read is never served as data. The field is null and named in the always-present unavailable array, and the embedded risk block names its failed signals in unavailable_signals. Such a response is sent Cache-Control: no-store; retry it. A null that is not in unavailable means the data does not exist.
For the full holder list use /tokens/{mint}/holders; for actor lists deep-link via the fetch_url in each actors[*] entry; for the full per-signal Risk breakdown call /tokens/{mint}/risk.
curl --request GET \
--url https://api.dexploit.dev/tokens/{mint}/intel \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.dexploit.dev/tokens/{mint}/intel"
headers = {"X-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<api-key>'}};
fetch('https://api.dexploit.dev/tokens/{mint}/intel', 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://api.dexploit.dev/tokens/{mint}/intel",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-Key: <api-key>"
],
]);
$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://api.dexploit.dev/tokens/{mint}/intel"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.dexploit.dev/tokens/{mint}/intel")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.dexploit.dev/tokens/{mint}/intel")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"unavailable": [
"dev"
],
"mint": "<string>",
"computed_at": 123,
"holders_count": 123,
"holder_data_status": "ok",
"creator_held_pct": 123,
"bonding_pct": 123,
"top10_pct": {
"value": 123,
"status": "ready",
"computed_at": 123
},
"actors": {},
"dev": {},
"change_pct": {
"5m": 123,
"1h": 123,
"6h": 123,
"24h": 123
},
"liquidity_usd": 123,
"volume_24h_usd": 123,
"volume_pct_change_24h": 123,
"dev_held_lp_pct": 123,
"risk": {
"score": 123,
"level": "safe",
"status": "ready",
"top_triggered_signals": [
"<string>"
],
"triggered_signals_count": 123,
"missing_signals": [
"<string>"
],
"unavailable_signals": [
"<string>"
],
"fetch_url": "<string>"
}
}{
"success": false,
"error": {
"code": "INVALID_PARAM",
"message": "use pair_address; see /api/v1/pairs?token_address=X to discover pools"
}
}{
"success": false,
"error": {
"code": "INVALID_PARAM",
"message": "use pair_address; see /api/v1/pairs?token_address=X to discover pools"
}
}{
"success": false,
"error": {
"code": "INVALID_PARAM",
"message": "use pair_address; see /api/v1/pairs?token_address=X to discover pools"
}
}Authorizations
Preferred for swaps-api endpoints (/swaps/*, /stats/*, /trending, /pool-events).
Path Parameters
Response
Token intel
Aggregated intelligence for one token mint: actor aggregates, holders, price/volume trend, dev concentration, and an embedded Risk Score summary. Cached server-side ~60s, unless a read failed (see unavailable).
Full per-actor lists live at dedicated endpoints (e.g. /tokens/{mint}/snipers); the actors object here carries counts + concentration percentages with fetch_url deep-links.
Always present. The fields whose read FAILED on this request (a database error or timeout): each is null (for top10_pct, status: computing) and is a transient error, not an absence of data. [] means every read succeeded. A null that is NOT listed here means the data does not exist (no curve, no pair, not yet computed).
A response with anything in unavailable, or in risk.unavailable_signals, is sent Cache-Control: no-store and is not cached at the origin: retry it.
dev, change_pct, bonding_pct, liquidity_usd, volume_24h_usd, volume_pct_change_24h, creator_held_pct, holders_count, dev_held_lp_pct, top10_pct, actors Unix epoch milliseconds.
Distinct wallets currently holding non-zero balance. null unless the mint has a complete holder census; holder_data_status says why.
Whether the holder-derived fields (holders_count, creator_held_pct, top10_pct and each actors entry's pct_of_circulating) come from a complete holder census. This field is carried by /tokens/{mint}/intel only. top10_pct.status is a different field with its own values (see Top10Pct).
ok: they do.partial_holder_data: the mint has no complete census: it has never had one, or the last one missed holders. Those fields arenull. Anactorsentry'scountis still served, counted over the holder rows available. A mint with no holder rows yet and no census also readspartial_holder_datahere, while itstop10_pct.statusisno_holder_datauntil the first rows arrive.census_refused: the census source refused the mint (too many accounts to scan). Those fields arenull, and a census does not complete on its own; this is not transient.unavailable: a read FAILED, soholders_countisnulland named inunavailable. If it was the census check that failed,creator_held_pctandtop10_pctare alsonulland named inunavailable, and eachactorsentry'spct_of_circulatingisnull. Retry.
ok, partial_holder_data, census_refused, unavailable Percent of supply still held by the creator wallet (0–100). null unless the mint has a complete holder census (see holder_data_status), and when the supply or the creator is unknown.
Pump.fun bonding-curve progress, or null. Three outcomes, not two:
0–100— the mint is still on the pump.fun bonding curve. Progress isreal_sol_reserves / 85 SOL × 100, taken from the mint's most recent trade, when that trade is on pump.fun, and clamped to0–100.100.0— the mint has graduated off the curve; its most recent trade was on PumpSwap, Raydium or another venue. Graduated mints deliberately read100.0, notnull(Dexploit-Swaps#951).null— the mint's address does not end inpump, or its most recent trade in the last 24 hours, on any venue, reported zero SOL reserves, or it has not traded in the last 24 hours. A graduated mint that has gone quiet for a day therefore readsnullrather than100.0, sonulldoes not by itself mean "not a pump.fun token".
Never null. On /intel, status is computing only when the read FAILED, and "top10_pct" is then in unavailable. Data that isn't available yet is no_holder_data. The computing status described on Top10Pct (transient, such as a backfill running) applies to /tokens/{mint}/audit and /tokens/{mint}/concentration, not to /intel.
Show child attributes
Show child attributes
Actor aggregates. {} when there is genuinely nothing to report; null only when the read FAILED, in which case "actors" is in unavailable.
Show child attributes
Show child attributes
Creator wallet, source provenance, and recent launches. null when the creator is unknown (Phase 0 strict precedence — never falls back to largest holder). Also null when any of its reads failed; then "dev" is in unavailable (it used to be served as a first-time creator: other_tokens: [], total_launches: 0).
Price change percent across canonical windows. {} when the token has no pair or candles; null only when the read FAILED, in which case "change_pct" is in unavailable.
Show child attributes
Show child attributes
Percent of LP tokens still held by the creator (when LP is not burnt).
Slim Risk Score summary embedded in /intel. Full per-signal breakdown at /tokens/{mint}/risk.
Show child attributes
Show child attributes

