EN | RU
Local OSINT / AML tracer for TON (Gram, Jetton).
Open a wallet or transaction → mark leads → build a money-flow tree → set target addresses and automatically catch "search → target" links.
No Docker, no npm, no pip - just Python 3 and a browser.
- Search by address (
EQ…/UQ…) or transaction hash - Transfer feed with income / expense highlighting
- Leads - manual marking of suspicious transfers
- Next hops - auto-suggestions: next hop, same sus wallet, neighboring outgoing
- Tree - hierarchy of confirmed leads + potential branches
- Target addresses - address pool with pink accent in the UI
- Auto-links - if the open wallet is linked to a target (directly or via 1 hop), the transfer immediately becomes a lead
- Target↔target links - direct transfers and common intermediaries
Data source: TonAPI.
git clone <repo-url> ton-trace-targets
cd ton-trace-targets
python3 start.pyOpens http://127.0.0.1:8787.
Without a key, public rate limits apply. For stable operation:
- Get a key from @tonapi_bot
- Run:
export TONAPI_KEY=your_token_here
python3 start.pyIf port 8787 is busy, the server picks a free one automatically.
- Paste address or hash into Transaction or wallet → Search
- In the feed, click Lead on the transfer you need
- Next hops appear on the right - add to chain or skip
- Tree tab - view hierarchy
- In Target addresses, enter one or more addresses comma-separated
- Save - targets are highlighted in feed / tree
- Open a suspicious wallet in search
- If there is a path search → target, links automatically become leads
- Links tab / Links button - full report (direct + via intermediary)
An address in a transfer card is clickable - opens that wallet in search.
ton-trace-targets/
├── start.py # entry point: server + browser
├── server.py # HTTP API, TonAPI, links/leads logic
├── frontend/
│ ├── index.html
│ ├── styles.css
│ └── app.js
├── README.md
└── .gitignore
| File | Role |
|---|---|
start.py |
Runs server.main() |
server.py |
Stdlib HTTP server, TonAPI cache/retries, leads, suggestions, links |
frontend/ |
UI: feed, tree, links, targets |
| Method | Path | Description |
|---|---|---|
POST |
/api/search |
{ "query": "EQ…|hash" } → transfers |
POST |
/api/leads |
add lead |
GET |
/api/leads |
list leads |
DELETE |
/api/leads/{id} |
remove lead |
GET |
/api/suggestions?lead_id= |
next hops |
POST |
/api/links |
{ "addresses": [...], "source": "EQ…" } → links |
POST |
/api/dismiss |
dismiss potential |
POST |
/api/reset |
reset case |
Lead state is in process memory (resets after server restart).
Target addresses are also cached in browser localStorage.
| Variable | Default | Description |
|---|---|---|
TONAPI_KEY |
- | TonAPI Bearer token |
TONAPI_BASE |
https://tonapi.io |
API base URL |
- Auto-link depth: direct transfer + 1 hop via intermediary
- History comes from recent TonAPI events (not full network archive)
- Mixers / privacy layers heavily reduce traceability
- Rate limit without a key may cause temporary errors - cache and retries included
- Python 3 (stdlib only)
- Vanilla JS + CSS
- TonAPI v2
MIT