Wallets
Register crypto wallet addresses, link them to identities, read risk and sanctions enrichment, and schedule recurring market abuse scans.
A wallet is a crypto address you want to monitor. Each wallet is identified
by its address and chain, can be linked to one or more
identities, carries risk
enrichment (categories, sanctions, a risk score), and can run recurring
work such as a market abuse scan.
Wallets are scoped to the workspace of the API key on the request (a dev
key works on the separate development workspace). Deletes are soft: a
deleted wallet goes to the trash and can be restored. Every change is written to
the audit trail.
Address and chain
| Field | Rules |
|---|---|
address | Trimmed, then 10 to 128 characters of letters, digits, _, - and :. |
chain | Trimmed and uppercased, then letters and digits only, max 20 characters. |
label | Optional, trimmed, max 100 characters. Returned as "" when empty. |
The API checks the address only for length and characters: it does not
check that the address looks like one of the given chain (a Bitcoin address
under ETH is accepted). Get the pair right on your side.
Supported chains
Any code matching the rule above is accepted, but these are the ones the dashboard offers and the rest of the platform understands:
| Code | Chain | Market abuse scans |
|---|---|---|
ETH | Ethereum | Yes |
BTC | Bitcoin | Yes |
SOL | Solana | Yes |
BSC | BNB Smart Chain | Yes |
POLYGON | Polygon | Yes |
ARBITRUM | Arbitrum | Yes |
OPTIMISM | Optimism | Yes |
BASE | Base | Yes |
TRX | Tron | Yes |
TON | TON | Yes |
DOGE | Dogecoin | Yes |
AVAX | Avalanche | Yes |
EVM chains share one address format, so the same EVM address is a separate wallet on each chain: register it once per chain you care about.
The pair (address, chain) is unique across the whole platform. Creating
a pair that already exists fails with
400 Failed to create wallet (address+chain may already exist).
Create a wallet
POST /v1/wallet/ with an address and a chain (see
Supported chains for the codes). Seqlense starts an
enrichment lookup in the background right away (see Enrichment).
curl -X POST "https://monitoring.seqlense.com/api/v1/wallet/" \
-H "Authorization: Bearer sq_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"address": "0xABC0000000000000000000000000000000000001",
"chain": "ETH",
"label": "Treasury"
}'{ "status": "ok", "id": "b1d3f0a2-0000-4000-8000-000000000001" }Bulk create
POST /v1/wallet/bulk registers 1 to 500 wallets in one call, under the key
wallets. Each item follows the rules above and is checked on its own: invalid
items and pairs that already exist are counted in failed, the others are
created. The response gives counts only, not which items failed.
curl -X POST "https://monitoring.seqlense.com/api/v1/wallet/bulk" \
-H "Authorization: Bearer sq_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"wallets": [
{ "address": "0xABC0000000000000000000000000000000000001", "chain": "ETH" },
{ "address": "bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh", "chain": "BTC", "label": "Ops" }
]
}'{ "status": "ok", "created": 2, "failed": 0 }Bulk-created wallets are not enriched on the spot: the background sweep picks them up within minutes.
List, search and paginate
GET /v1/wallet/ returns your active wallets, newest first.
| Parameter | Meaning |
|---|---|
chain | Exact chain code, for example ETH. |
q | Substring search on address or label (max 100 characters). |
page | 1-based page number (default 1). |
limit | Page size, default 20, clamped to 10..100. |
curl -H "Authorization: Bearer sq_YOUR_API_KEY" \
"https://monitoring.seqlense.com/api/v1/wallet/?chain=ETH&q=treasury&page=1&limit=50"{
"wallets": [
{
"id": "b1d3f0a2-0000-4000-8000-000000000001",
"address": "0xABC0000000000000000000000000000000000001",
"chain": "ETH",
"label": "Treasury",
"created_at": "2026-07-27 10:00:00",
"updated_at": "2026-07-27 10:00:00"
}
]
}The response has no total: keep asking for the next page until you get fewer
than limit wallets. For a full dump, use Export.
GET /v1/wallet/detail?id=... returns one wallet plus its linked active
identities (id, type, display_name, country), most recently linked first.
Update
PUT /v1/wallet/ changes label and/or chain; fields you leave out keep
their value, and "label": "" clears the label. The address cannot change:
delete the wallet and create a new one.
curl -X PUT "https://monitoring.seqlense.com/api/v1/wallet/" \
-H "Authorization: Bearer sq_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "id": "b1d3f0a2-0000-4000-8000-000000000001", "label": "Cold storage" }'Delete, trash and restore
DELETE /v1/wallet/?id=... moves a wallet to the trash. It disappears from the
list, detail, export and enrichment by id, and its schedules stop running.
Identity links and schedules are kept, so a restore brings everything back.
| Call | What it does |
|---|---|
DELETE /v1/wallet/?id=... | Soft-delete a wallet. |
GET /v1/wallet/deleted | List the trash. Same chain, q, page, limit as the list, plus total (wallets in the trash, filters ignored) and page. |
POST /v1/wallet/restore | Restore one wallet: body { "id": "..." }. |
curl -X POST "https://monitoring.seqlense.com/api/v1/wallet/restore" \
-H "Authorization: Bearer sq_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "id": "b1d3f0a2-0000-4000-8000-000000000001" }'Restoring an id that is not in your trash (unknown, another workspace's, or not
deleted) returns 404. In the dashboard, the trash and restore are for
workspace admins only; API keys can always use them.
Export
GET /v1/wallet/export returns up to 10,000 active wallets, newest first,
with the same chain and q filters as the list.
- JSON (default):
{ "wallets": [...], "total": N }, wheretotalis the number of wallets in this export. - CSV (
format=csv): awallets-export.csvattachment. Header rowid,address,chain,label,created_at,updated_at, every value in double quotes, quotes inside a label doubled.
curl -H "Authorization: Bearer sq_YOUR_API_KEY" \
"https://monitoring.seqlense.com/api/v1/wallet/export?format=csv" -o wallets.csvid,address,chain,label,created_at,updated_at
"b1d3f0a2-0000-4000-8000-000000000001","0xABC0000000000000000000000000000000000001","ETH","Treasury","2026-07-27 10:00:00","2026-07-27 10:00:00"Enrichment
Seqlense looks up every wallet in its crypto intelligence provider and stores the result: address type, categories, labels, sanctions, a risk score and a risk level.
- A lookup starts in the background when you create a wallet.
- A background sweep enriches wallets that have no result yet first, then refreshes results older than 30 days, oldest first.
GET /v1/wallet/enrichreturns the stored result if it is under 30 days old (cached: true), otherwise runs a fresh lookup (cached: false). Passforce=trueto always run a fresh lookup.
Name the wallet by id, or by address when that is all you have (the first
wallet of your workspace with that exact address is used, whatever its chain).
id wins when you send both.
curl -H "Authorization: Bearer sq_YOUR_API_KEY" \
"https://monitoring.seqlense.com/api/v1/wallet/enrich?id=b1d3f0a2-0000-4000-8000-000000000001"{
"status": "ok",
"wallet_id": "b1d3f0a2-0000-4000-8000-000000000001",
"type": "wallet",
"categories": ["exchange"],
"labels": ["Acme Exchange hot wallet"],
"sanctions": {},
"risk_score": 12,
"risk_level": "low",
"enriched_at": "2026-07-27 10:00:05",
"cached": true
}type, categories, labels, sanctions, risk_score and risk_level are
passed through from the provider. When it leaves one out, you get unknown,
[], [], {}, 0 and low respectively.
If the provider is unreachable or rejects the lookup, the endpoint still
answers HTTP 200 with { "status": "error", "error": "Enrichment API unavailable" }.
Check status before reading the risk fields.
Link identities
Link a wallet to the people and entities that control it. Both must belong to your workspace.
curl -X POST "https://monitoring.seqlense.com/api/v1/wallet/link-identity" \
-H "Authorization: Bearer sq_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"wallet_id": "b1d3f0a2-0000-4000-8000-000000000001",
"identity_id": "7c2e9a10-0000-4000-8000-000000000002"
}'- Linking a pair that is already linked succeeds and changes nothing.
- A wallet or identity outside your workspace returns
400 Wallet not found or no accessor400 Identity not found or no access. DELETE /v1/wallet/link-identity?wallet_id=...&identity_id=...removes the link (and returnsokeven if there was none).
Linked identities appear in GET /v1/wallet/detail.
Schedules
A wallet can carry recurring work, so you do not have to trigger it yourself.
Today the only kind is MABU: a market abuse scan
of the wallet on its chain.
curl -X POST "https://monitoring.seqlense.com/api/v1/wallet/schedules" \
-H "Authorization: Bearer sq_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"wallet_id": "b1d3f0a2-0000-4000-8000-000000000001",
"kind": "MABU",
"interval_days": 7,
"enabled": true
}'{ "status": "ok", "id": "3f7a1c22-0000-4000-8000-000000000003" }| Field | Rules |
|---|---|
kind | MABU (case-insensitive). |
interval_days | JSON integer from 1 to 90: daily at the tightest, quarterly at the loosest. |
enabled | Optional, default true. false parks the schedule without deleting it. |
How it runs:
- A wallet holds one schedule per kind. Posting the same kind again updates
it (and clears
last_error) instead of failing. - A new enabled schedule is due at once. The scheduler checks every minute, so
the first scan starts within about a minute, then every
interval_daysdays. - A
MABUschedule on a chain the scanner does not read (any code outside Supported chains) is refused up front with400 Market abuse scans do not cover <CHAIN>. - If a launch fails, the reason is kept in
last_errorand the cadence stands: one failed launch is not a reason to stop watching a wallet. The next successful run clears it. - Schedules of a deleted wallet do not run until it is restored.
Other calls:
GET /v1/wallet/schedules?wallet_id=...lists the wallet's schedules (withlast_run_at,next_run_at,last_error), pluskinds,min_interval_daysandmax_interval_days.DELETE /v1/wallet/schedules?wallet_id=...&kind=MABUremoves one.
Full reference
Every endpoint, parameter, schema and a live "try it" console are in the API Reference.