Seqlense docs

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

FieldRules
addressTrimmed, then 10 to 128 characters of letters, digits, _, - and :.
chainTrimmed and uppercased, then letters and digits only, max 20 characters.
labelOptional, 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:

CodeChainMarket abuse scans
ETHEthereumYes
BTCBitcoinYes
SOLSolanaYes
BSCBNB Smart ChainYes
POLYGONPolygonYes
ARBITRUMArbitrumYes
OPTIMISMOptimismYes
BASEBaseYes
TRXTronYes
TONTONYes
DOGEDogecoinYes
AVAXAvalancheYes

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.

ParameterMeaning
chainExact chain code, for example ETH.
qSubstring search on address or label (max 100 characters).
page1-based page number (default 1).
limitPage 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.

CallWhat it does
DELETE /v1/wallet/?id=...Soft-delete a wallet.
GET /v1/wallet/deletedList the trash. Same chain, q, page, limit as the list, plus total (wallets in the trash, filters ignored) and page.
POST /v1/wallet/restoreRestore 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 }, where total is the number of wallets in this export.
  • CSV (format=csv): a wallets-export.csv attachment. Header row id,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.csv
id,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/enrich returns the stored result if it is under 30 days old (cached: true), otherwise runs a fresh lookup (cached: false). Pass force=true to 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 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 access or 400 Identity not found or no access.
  • DELETE /v1/wallet/link-identity?wallet_id=...&identity_id=... removes the link (and returns ok even 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" }
FieldRules
kindMABU (case-insensitive).
interval_daysJSON integer from 1 to 90: daily at the tightest, quarterly at the loosest.
enabledOptional, 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_days days.
  • A MABU schedule on a chain the scanner does not read (any code outside Supported chains) is refused up front with 400 Market abuse scans do not cover <CHAIN>.
  • If a launch fails, the reason is kept in last_error and 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 (with last_run_at, next_run_at, last_error), plus kinds, min_interval_days and max_interval_days.
  • DELETE /v1/wallet/schedules?wallet_id=...&kind=MABU removes one.

Full reference

Every endpoint, parameter, schema and a live "try it" console are in the API Reference.

On this page