Where did this address get its money? Walks the funding chain upward and returns the accou
Where did this address get its money? Walks the funding chain upward and returns the account that ultimately paid for the wallet, plus a cluster id. Two addresses funded from the same account are not independent parties, however new and unremarkable each looks alone — the strongest cheap signal there is that an identity was manufactured. Works on any address, not only registered agents. Free alternative: GET /v1/provenance. Or 3 free calls of this endpoint per wallet per 24h: https://trust-agent.io/v1/trial.
10002 (raw units)
price
1
calls / 30d
1
unique payers
2026-09-13
updated
Provider
trust-agent.io · discovered, not yet claimed by its owner
Payment (x402 accepts[])
[
{
"scheme": "exact",
"network": "eip155:8453",
"payTo": "0x6121654D3Fd4C8B42a90d30472E4D40927C3e6BB",
"asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"amount": "10002",
"maxTimeoutSeconds": 60
}
]Output schema
{
"bazaar": {
"info": {
"input": {
"method": "GET",
"queryParams": {
"address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"chain": "base"
},
"type": "http"
},
"output": {
"example": {
"chain": "the funding chain walked upward, nearest first",
"cluster": "fund:<funder>; addresses sharing it were paid for from the same account",
"funder": "the address that first sent this one native tokens; null when unresolvable",
"measurable": "false means the provider could not be examined at all (outage, rate limit) — nothing in the response is a statement about the address",
"origin": "furthest resolved ancestor — where the money came from",
"resolved": "false means no funder exists for this address"
},
"type": "json"
}
},
"schema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"input": {
"additionalProperties": false,
"properties": {
"method": {
"enum": [
"GET"
],
"type": "string"
},
"queryParams": {
"properties": {
"address": {
"description": "REQUIRED. EVM address whose funding to trace.",
"type": "string"
},
"chain": {
"description": "OPTIONAL. Only \"base\" is served. Defaults to base.",
"type": "string"
}
},
"required": [
"address"
],
"type": "object"
},
"type": {
"const": "http",
"type": "string"
}
},
"required": [
"type",
"method"
],
"type": "object"
},
"output": {
"properties": {
"example": {
"properties": {
"chain": {
"description": "the funding chain walked upward, nearest first"
},
"cluster": {
"description": "fund:<funder>; addresses sharing it were paid for from the same account"
},
"funder": {
"description": "the address that first sent this one native tokens; null when unresolvable"
},
"measurable": {
"description": "false means the provider could not be examined at all (outage, rate limit) — nothing in the response is a statement about the address"
},
"origin": {
"description": "furthest resolved ancestor — where the money came from"
},
"resolved": {
"description": "false means no funder exists for this address"
}
},
"type": "object"
},
"type": {
"type": "string"
}
},
"required": [
"type"
],
"type": "object"
}
},
"required": [
"input"
],
"type": "object"
}
}
}Use it
curl
curl "https://trust-agent.io/v1/provenance/chain" # -> 402 Payment Required, accepts[] lists how to pay # retry with a PAYMENT-SIGNATURE (or PAYMENT header) once paid
JavaScript
const res = await fetch("https://trust-agent.io/v1/provenance/chain");
if (res.status === 402) {
const { accepts } = await res.json();
// pay one of accepts[] via an x402 client, then retry with the payment header
}Python
import httpx
res = httpx.get("https://trust-agent.io/v1/provenance/chain")
if res.status_code == 402:
accepts = res.json()["accepts"]
# pay one of accepts[] via an x402 client, then retry with the payment headerMachine-readable
Everything on this page is also available as clean JSON at /resources/5178.json, and this resource appears in /discovery/resources and /discovery/search.