What the wallet that deployed a Solana token has done before
curl --request GET \
--url https://scienter.xyz/api/v1/solana/deployer/{address} \
--header 'Authorization: Bearer <token>'import requests
url = "https://scienter.xyz/api/v1/solana/deployer/{address}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://scienter.xyz/api/v1/solana/deployer/{address}', 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://scienter.xyz/api/v1/solana/deployer/{address}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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://scienter.xyz/api/v1/solana/deployer/{address}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://scienter.xyz/api/v1/solana/deployer/{address}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://scienter.xyz/api/v1/solana/deployer/{address}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"state": "ok",
"subject": "<string>",
"sources": [
{
"name": "scienter:intelligence",
"url": "<string>",
"as_of": 123
}
],
"as_of": 123,
"data": {
"entries": [
{
"address": "<string>",
"chain": "<string>",
"score": 123,
"first_flagged_at": "<string>",
"last_scored_at": "<string>",
"top_evidence": {},
"model_version": "<string>"
}
],
"count": 123,
"empty": true,
"empty_reason": "<string>",
"window_hours": 123,
"suppressed": 123
},
"reason": "<string>"
}Scienter API (paid)
Solana deployer record
What the wallet that deployed a Solana token has done before. Three answers, and the difference between two of them is the product.
GET
/
api
/
v1
/
solana
/
deployer
/
{address}
What the wallet that deployed a Solana token has done before
curl --request GET \
--url https://scienter.xyz/api/v1/solana/deployer/{address} \
--header 'Authorization: Bearer <token>'import requests
url = "https://scienter.xyz/api/v1/solana/deployer/{address}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://scienter.xyz/api/v1/solana/deployer/{address}', 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://scienter.xyz/api/v1/solana/deployer/{address}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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://scienter.xyz/api/v1/solana/deployer/{address}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://scienter.xyz/api/v1/solana/deployer/{address}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://scienter.xyz/api/v1/solana/deployer/{address}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"state": "ok",
"subject": "<string>",
"sources": [
{
"name": "scienter:intelligence",
"url": "<string>",
"as_of": 123
}
],
"as_of": 123,
"data": {
"entries": [
{
"address": "<string>",
"chain": "<string>",
"score": 123,
"first_flagged_at": "<string>",
"last_scored_at": "<string>",
"top_evidence": {},
"model_version": "<string>"
}
],
"count": 123,
"empty": true,
"empty_reason": "<string>",
"window_hours": 123,
"suppressed": 123
},
"reason": "<string>"
}no_record is not clean. Most wallets on Solana have deployed nothing we
measured, and this endpoint says so in a sentence rather than answering zero.The three answers
state | Means | HTTP |
|---|---|---|
flagged | Every settled launch by this wallet has died | 200 |
record | A settled record exists and at least one launch survived | 200 |
no_record | No settled launch by this wallet has been recorded | 200, state: "insufficient_evidence" |
Case is load-bearing. Solana addresses are base58, lowercasing one destroys it,
so the lookup is exact and a mis-cased address answers
no_record rather than
silently matching something else. A string that is not base58 gets a 400.A wallet with a record
curl
curl -H "Authorization: Bearer sc_..." \
https://scienter.xyz/api/v1/solana/deployer/8dEgpaZ6znNZWBWLuciBYF1kfRtUEQUmVTZQWebezu2n
{
"state": "ok",
"subject": "8dEgpaZ6znNZWBWLuciBYF1kfRtUEQUmVTZQWebezu2n",
"data": {
"address": "8dEgpaZ6znNZWBWLuciBYF1kfRtUEQUmVTZQWebezu2n",
"state": "flagged",
"flagged": true,
"settled_launches": 1136,
"died": 1136,
"survived": 0,
"death_rate": 1.0,
"mints": ["2byaApN7oCTER3d9DbCRsZoGnsaKt7uM8AgsYqGQpump", "8h3Kb3tK7bj1updqp2jVB7TZvm5cbLAaNXgonhSBpump"],
"finding": "Every one of this wallet's 1136 settled launches has died. Launches like these were still listed at least a day later about once in every hundred and twenty-five, against about one in twenty-three for a launch this screen does not flag.",
"rule": {
"version": "deployer-all-priors-died/1",
"measured_on": "2026-09-21",
"holdout_survival_flagged": 0.008,
"holdout_survival_unflagged": 0.0434,
"published_wallets": 60930,
"published_wallets_with_no_survivor": 57068
},
"window": { "first": "2026-09-08T22:50:20Z", "last": "2026-09-20T07:12:20Z" },
"caveat": "This is a negative screen, not a recommendation. ..."
},
"sources": [
{ "name": "solana-launch-census@2026-09-21", "url": "https://docs.scienter.xyz/methodology/launch-outcomes" }
]
}
mints carries a handful of the wallet’s launches so the claim can be checked
by hand on any explorer. finding and caveat travel inside data, next to
the claim they qualify, because an MCP client hands this object straight to a
language model and the model restates the conclusion without whatever
surrounded it.
A wallet with no record
{
"state": "insufficient_evidence",
"subject": "So11111111111111111111111111111111111111112",
"reason": "No settled launch by this wallet has been recorded here. That is not a clean record, it is no record. 60,930 wallets with at least one settled launch are published, covering launches recorded between 2026-09-08 and 2026-09-20."
}
How accurate it is
Asked as a hit rate, the question has no answer, and that is not evasion: this is not a prediction with a hit rate, it is a filter with a measured difference in survival. Nothing here scores a token or forecasts a price. What follows is the whole of the measured performance. The rule — flag a launch when every previously settled launch by the same deployer has died — was written down first and then scored once on a held-out later window, over 7,401 launches whose outcome was checked with the method on Launch outcomes.| Split | Flagged | Still listed when checked | Not flagged | Still listed when checked |
|---|---|---|---|---|
| Train | n=487 | 0.21% (CI 0.04–1.15%) | n=4,693 | 3.24% (CI 2.77–3.78%) |
| Holdout | n=377 | 0.80% (CI 0.27–2.31%) | n=1,844 | 4.34% (CI 3.50–5.37%) |
The population it was measured over
Every figure above is measured among launches whose deployer could be resolved. A launch nobody can attribute to a wallet is not in the numerator or the denominator, on either side of the comparison. That is the same population this endpoint serves, which is why the measurement matches the use: you can only ever ask this about a launch we attributed. It is not a claim about launches in general, and it would be a different — weaker — claim if it were, because attribution is not random. A deployer we cannot resolve is disproportionately one whose token died fast enough that no provider ever wrote a report for it. So read it as: among launches we can attribute, the flagged ones survived 0.80% of the time against 4.34%. Not: 0.80% of flagged launches survive. Read as a false-positive rate: about 1 flagged launch in 125 did survive the day. Read the other way, roughly 1 unflagged launch in 23 did. Both numbers are small, which is the point — this separates bad from worse, not good from bad.What it is not
- Not a buy signal. It says a flagged launch is several times less likely to still be listed tomorrow. The baseline study over 7,471 prospective outcomes reports no decile that pays a $100 clip back after costs, and nothing here changes that. Used as a reason to buy the unflagged ones, it would lose money.
- Not a score. There is no number to threshold. There is a record, or there is not one.
- Not a verdict on a wallet. Association, not causation, over one recorded window. A deployer whose tokens died is not thereby the cause of the next one dying.
- Survival is a low bar. Still listed with tradeable liquidity is not profit, legitimacy or safety.
Limits
Coverage is about 32.2% of launches (measured 2026-09-19), up from 11.8% when the rule was first scored and 24.7% a day later. And of the launches it can answer, it flags about 95%. Measured the same day on live traffic: 8,902 flagged of 9,365 screenable, leaving 463 that are not. That is not a malfunction. Of the 29,074 launches this census has actually resolved, 894 were still listed — 96.9% were not — so a wallet with one or two settled launches has usually had all of them die. But it changes how to read a reply. A flag is the common answer, and the informative one is its absence. If you are building a filter, the useful question is not “did it flag” but “is this one of the 5% it did not”. Treat a flag as the baseline expectation for a wallet we have a record on, not as a discovery about this particular launch. The rest are first-time deployers, or deployers whose earlier launches have not settled. Coverage rises as the census walk continues and as deployers are read off the chain for the mints no provider has a report for. For comparison, the creator-history flag carried by the nearest public provider fires on about 2.6% of mints. On the larger sample the separation holds: 704 flagged launches survived at 1.28% against 4.51% for the rest, still with non-overlapping intervals. That is a second look at a recomputed split rather than a fresh holdout, so the figures quoted above remain the ones from the single scoring. One window, 2026-09-08 to 2026-09-19. One chain, one venue mix. The rule was chosen after looking at the training data; the holdout is what makes it honest, and a different rule found the same way would need its own.Scienter analyses public blockchain records. A finding states what those records show and how confident we are; it is evidence, not proof of anyone’s identity, intent or wrongdoing, and an attribution we cite is the cited source’s. An empty result means not analysed, never safe. Nothing here is legal, tax or investment advice, or a recommendation to transact with any address or asset — see Disclaimers for the full text.
Authorizations
An sc_ key from https://scienter.xyz/settings/api, sent as Authorization: Bearer sc_.... The same key is accepted in the x-scienter-membership header. Prefer the header over any query form: a credential in a URL reaches access logs, proxies and browser history.
Path Parameters
A base58 Solana wallet address, exact case.
Pattern:
^[1-9A-HJ-NP-Za-km-z]{32,44}$Response
ok with the deployer record, or insufficient_evidence when no settled launch by this wallet has been recorded.
The four-state envelope. state: ok carries data as described; the three absences carry data: null and reason. See the Absent schema.