What the wallet that deployed an EVM token did before
curl --request GET \
--url https://scienter.xyz/api/v1/evm/deployer/{chain}/{address} \
--header 'Authorization: Bearer <token>'import requests
url = "https://scienter.xyz/api/v1/evm/deployer/{chain}/{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/evm/deployer/{chain}/{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/evm/deployer/{chain}/{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/evm/deployer/{chain}/{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/evm/deployer/{chain}/{address}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://scienter.xyz/api/v1/evm/deployer/{chain}/{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>",
"data": {
"address": "<string>",
"chain": "<string>",
"state": "all_died",
"calibrated": true,
"listed_launches": 123,
"died": 123,
"survived": 123,
"never_listed": 123,
"death_rate": 123,
"launches": [
{
"address": "<string>",
"outcome": "live",
"created_at": 123,
"observed_age_days": 123,
"liquidity_usd": 123,
"volume_usd_24h": 123,
"transfers_observed": 123,
"transfers_truncated": true,
"via": "<string>"
}
],
"finding": "<string>",
"coverage": {
"captured_at": 123,
"direct_creations": 123,
"factories_walked": 123,
"factory_depth": 123,
"truncated": true,
"truncated_factories": [
"<string>"
],
"contracts_examined": 123,
"skipped": [
{
"address": "<string>",
"reason": "not_an_erc20"
}
],
"unchecked": 123,
"providers": [
"<string>"
]
},
"caveat": "<string>"
},
"reason": "<string>",
"sources": [
{}
],
"as_of": 123
}Scienter API (paid)
EVM deployer record
What the wallet that deployed an Ethereum token did before. A record of what was observed, deliberately not a scored screen.
GET
/
api
/
v1
/
evm
/
deployer
/
{chain}
/
{address}
What the wallet that deployed an EVM token did before
curl --request GET \
--url https://scienter.xyz/api/v1/evm/deployer/{chain}/{address} \
--header 'Authorization: Bearer <token>'import requests
url = "https://scienter.xyz/api/v1/evm/deployer/{chain}/{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/evm/deployer/{chain}/{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/evm/deployer/{chain}/{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/evm/deployer/{chain}/{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/evm/deployer/{chain}/{address}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://scienter.xyz/api/v1/evm/deployer/{chain}/{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>",
"data": {
"address": "<string>",
"chain": "<string>",
"state": "all_died",
"calibrated": true,
"listed_launches": 123,
"died": 123,
"survived": 123,
"never_listed": 123,
"death_rate": 123,
"launches": [
{
"address": "<string>",
"outcome": "live",
"created_at": 123,
"observed_age_days": 123,
"liquidity_usd": 123,
"volume_usd_24h": 123,
"transfers_observed": 123,
"transfers_truncated": true,
"via": "<string>"
}
],
"finding": "<string>",
"coverage": {
"captured_at": 123,
"direct_creations": 123,
"factories_walked": 123,
"factory_depth": 123,
"truncated": true,
"truncated_factories": [
"<string>"
],
"contracts_examined": 123,
"skipped": [
{
"address": "<string>",
"reason": "not_an_erc20"
}
],
"unchecked": 123,
"providers": [
"<string>"
]
},
"caveat": "<string>"
},
"reason": "<string>",
"sources": [
{}
],
"as_of": 123
}This endpoint is not the Solana deployer record
for EVM. That one returns
flagged, backed by a rule scored on a holdout and
again prospectively. Nothing here has been scored, so there is no flagged
field and every payload carries calibrated: false. The two shapes are
deliberately not interchangeable.The answers
state | Means | HTTP |
|---|---|---|
all_died | Every listed launch is below the liquidity a buyer could exit through | 200 |
mixed | At least one listed launch is still above it | 200 |
no_listed_launch | It deployed ERC-20s and no venue has ever listed one | 200 |
no_record | No contract creation this walk can attribute to it | 200, state: "insufficient_evidence" |
no_record is not clean. It means this walk found nothing, which is a
statement about the walk. A wallet that launches through a public launchpad’s
factory — one it did not deploy itself — reads as no_record here.Chains
Onlyethereum is served. Etherscan’s v2 endpoint refuses six of the ten
chains the engine covers on a free API key, including Base, where most new
launches now happen. A request for one of those answers not_supported naming
the specific refusal, never an empty record:
{
"state": "not_supported",
"subject": "0xff7efc6b437f822d8902c5377c9c24302ed51886",
"data": null,
"reason": "Deployer records are not produced for base. Etherscan v2 refuses chain 8453 on a free API key (\"Free API access is not supported for this chain\"). An Etherscan paid plan would be required. This is a limit of our data access, not a statement about this wallet: nothing was checked, so nothing was found, and that must not be read as a clean record.",
"sources": [],
"as_of": 1758500000
}
A wallet with a record
curl
curl -H "Authorization: Bearer sc_..." \
https://scienter.xyz/api/v1/evm/deployer/ethereum/0xff7efc6b437f822d8902c5377c9c24302ed51886
{
"state": "ok",
"subject": "0xff7efc6b437f822d8902c5377c9c24302ed51886",
"data": {
"address": "0xff7efc6b437f822d8902c5377c9c24302ed51886",
"chain": "ethereum",
"state": "mixed",
"calibrated": false,
"listed_launches": 1,
"died": 0,
"survived": 1,
"never_listed": 2,
"death_rate": 0,
"launches": [
{
"address": "0x69420bb3b07cd7cda30d589e0f6563ced3669420",
"outcome": "live",
"observed_age_days": 428.2,
"liquidity_usd": 45221,
"transfers_observed": 100,
"transfers_truncated": true,
"via": "factory:0x25a3812e663c7324c6c80780e4cddde9522f09c1"
},
{
"address": "0x69420d90c9c3642d1c01c24274ad4eb320a69420",
"outcome": "never_listed",
"observed_age_days": 440.1,
"liquidity_usd": null,
"transfers_observed": 0,
"transfers_truncated": false,
"via": "factory:0x25a3812e663c7324c6c80780e4cddde9522f09c1"
}
],
"coverage": {
"direct_creations": 8,
"factories_walked": 7,
"factory_depth": 1,
"truncated": false,
"contracts_examined": 10,
"unchecked": 0,
"providers": ["etherscan-v2", "dexscreener"]
}
}
}
transfers_observed: 0. That token was deployed and never moved a single
unit. It never launched. The Solana pipeline would have called it delisted
and counted it as a death; counting it here would manufacture a death record
out of a contract nobody ever touched. So never_listed is its own outcome and
is excluded from died and from the denominator.
via: "factory:0x25a...". The launches this address is actually known for
were deployed by a factory it created, not by the address directly. Seven of
its eight direct creations are not tokens at all. A walk that only read its own
transaction list would find one token, see it dead, and report every launch
died about a wallet with a live launch.
Reading coverage
Four kinds of nothing, kept apart, because collapsing them turns a gap in our
reading into a finding about a wallet:
| Meaning | |
|---|---|
skipped: not_an_erc20 | checked, and it is a router, a factory or an NFT |
skipped: attribution_mismatch | checked, and the chain credits someone else |
skipped: reverted_creation | the creating transaction reverted |
skipped: undetermined | we could not read it. Not a finding |
unchecked | the venue did not answer. Never a death |
never_listed | checked, and no venue lists a pair. Not a death |
truncated: true means the address has more history than one query returns, so
the counts are a floor rather than a total — the record’s own finding
sentence says so as well.
What this does not say
Every launch is measured at whatever age it happens to be now, recorded per launch asobserved_age_days; ages over a year are normal, and no horizon is
claimed. Coverage reaches one level of factory and no further. Survival means
listed with tradeable liquidity at the moment of the check — not profit, not
legitimacy, not safety.
Most importantly: a record saying every listed launch by an address is illiquid
is a statement about those contracts. It is not a prediction about the next one,
and no measurement here supports turning it into one.
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
The chain to walk. Only ethereum is served; every other value answers not_supported with the reason.
Available options:
ethereum A 20-byte hex EVM address, 0x-prefixed. Case is not significant and is normalised.
Pattern:
^0x[0-9a-fA-F]{40}$Response
ok with the deployer record; insufficient_evidence when nothing was found; not_supported for a chain we cannot read; not_deployed when the chain walk could not run.