MEMODU ยท FOR DEVELOPERS AND AI AGENTS
API
A small JSON API over the same engine the site uses. Built for developers and AI agents. No key, no sign up.
Basics
- Base URL:
https://memodu.com - All endpoints are
GETand return JSON. Cross origin requests are allowed. - Fair use limits per IP address in any 10 minutes: 12 requests to
/api/traceand/api/path, 60 requests to the other endpoints. Over the limit you get429withretry_after_seconds. - Machine readable descriptions: /openapi.json, /api, /llms.txt.
Endpoints
| Endpoint | Parameters | Returns |
|---|---|---|
/api/trace | target: address or transaction hash. hops: 1 to 6, default 4. branch: 1 to 8, default 4. | Flow graph, findings and a plain language summary. |
/api/path | from, to: two addresses. | Chains of transfers that link them, strength of each link, type of both endpoints. |
/api/check | address | Frozen by Tether or not, on the OFAC list or not, flagged counterparties. |
/api/profile | address | Type of address by behaviour, totals, top counterparties, flags. |
/api/ask | address, q: question in English or Russian. | Answer text and the profile it is based on. |
Trace
curl "https://memodu.com/api/trace?target=TXyz...&hops=4"
{
"type": "trace",
"start": "TXyz...",
"traced_usdt": 1000.0,
"nodes": [
{"address": "TXyz...", "hop": 0, "kind": "wallet", "tracked": 1000.0, "held": 10.0, "flags": []},
{"address": "TAbc...", "hop": 1, "kind": "deposit", "label": "Binance deposit (likely)",
"deposit_of": "Binance", "tracked": 600.0, "end": "service", "flags": []}
],
"edges": [
{"src": "TXyz...", "dst": "TAbc...", "amount": 600.0, "count": 1, "hop": 1,
"first": "2026-11-02 10:10 UTC", "delay_hours": 0.17, "sample_tx": "9f2c..."}
],
"findings": {
"share_to_services": 0.99, "share_held": 0.01,
"services": [{"address": "TAbc...", "name": "Binance deposit (likely)", "usdt": 600.0, "share": 0.6, "step": 1}],
"pass_through": [], "held": [], "flagged": []
},
"summary": ["TXyz... sent 1,000.00 USDT in the transfers we read. ..."],
"checks": {"tether_freeze_list": {"status": "ready", "addresses": 8200}, "ofac_sdn_list": {"addresses": 351}}
}
| Field | Meaning |
|---|---|
nodes[].kind | wallet, service (named), hub (busy service by behaviour), collector (collection wallet), deposit (likely exchange deposit address), distributor (payout wallet), others (grouped small recipients), empty. |
nodes[].end | Why the trail stops here: service, held (funds have not moved), depth (step limit reached), not_followed (small flows). null when the trail continues. |
nodes[].tracked, held | USDT attributed to this address, and the part that has not moved on. |
nodes[].flags | List matches. Codes: tether_frozen, ofac_sanctioned. |
edges[] | Followed flows: amount, number of transfers, first time, delay after the money arrived, and one example transaction. |
findings | Totals by outcome: services reached, funds held, pass-through wallets, flagged addresses, and shares of the traced amount. |
summary | The same result as sentences, ready to show to a person. |
Check
curl "https://memodu.com/api/check?address=TXyz..."
{
"type": "check",
"address": "TXyz...",
"frozen_by_tether": false,
"ofac_sanctioned": false,
"flags": [],
"flagged_counterparties": [
{"address": "TDef...", "direction": "sent to", "amount": 300.0, "count": 1,
"flags": ["Frozen by Tether"], "sample_tx": "41ab..."}
],
"counterparties_checked": 37,
"kind": "wallet",
"summary": ["This address is not frozen by Tether and is not on the OFAC sanctions list.", "..."]
}
The address itself is checked directly against the USDT contract at request time. Counterparties are compared with the freeze list held in memory, which is refreshed every few hours. The checks object in every response says how fresh the lists are.
Ask
curl "https://memodu.com/api/ask?address=TXyz...&q=is%20it%20frozen%20and%20where%20did%20it%20send%20money"
Topics it understands: balance, type of address, where it sent money, where money came from, when it was active, freeze and sanctions status. A question in Russian gets an answer in Russian.
Errors
| Status | Meaning |
|---|---|
400 | The address or hash is not valid. The error field says what is expected. |
429 | Too many requests. Wait retry_after_seconds. |
502 | Blockchain data could not be read right now. Try again in a minute. |
For AI agents
Responses are designed to be passed to a language model as they are: every result carries a summary written in plain sentences next to the structured data. Pay per request access over the x402 protocol is planned for heavier use. The free tier stays.
What the data can and cannot say
- Only USDT (TRC20) on TRON, public data only.
- Labels by behaviour are estimates, not confirmed identities.
- A flag is a list match, not a verdict about a person. No match does not prove that funds are clean.
More on the method: How it works. Rules of use: Terms.