Starkscan ExplorerStarkscanDocs
QuickstartBuildAgentsReference
Open explorer
Documentation homeQuickstartAuthenticationBase URLs and chainsConceptsGet your first API keyMonitor 10 WalletsPagination and cursorsRead a transactionYour first error
BuildLaunch MatrixPackage TrustAPIAdvanced UtilitiesAgent HTTP quickstartMigration skillsRate limitsRoute CertificationRoute examplesSelf-serve account routesSDKTypeScript SDK

Live reference

Interactive API referenceReference hub
AgentsAgent CLIBuild an agentConnect your agentMCP QuickstartMCP tools reference
Reference Hub
Docs/Quickstart/Monitor 10 Wallets

Monitor 10 Wallets

Canonical HTTP, SDK, and CLI starter for monitoring a fixed wallet set with recent activity, transactions, holdings, and token flows.

API referenceTypeScript SDKCLIAgents

In this guide

What this starter coversShared environmentHTTP file starterShell HTTP starterSDK starterCLI starter
Loading documentation content…
PreviousGet your first API keyCreate a Starkscan API key and make your first authenticated call in under five minutes.NextPagination and cursorsTreat cursors as opaque and follow nextCursor — never build or parse a cursor by hand.

On this page

What this starter coversShared environmentHTTP file starterShell HTTP starterSDK starterCLI starterWhich surface to keep using
Starkscan ExplorerStarkscanDocumentation

One product surface across the explorer, HTTP API, CLI, SDK, and MCP transport. The docs should guide you into the right path instead of behaving like a separate app.

Open explorerAPI referenceBack to top

Monitor 10 wallets

Use this guide when your job is not “explore one address” but “keep a fixed set of wallets under watch.”

This is the canonical public starter for that workflow across:

  • HTTP when you want zero-install integration
  • the TypeScript SDK when you are wiring application code
  • the CLI when you want reproducible shell commands and local files

What this starter covers

  • recent activity per watched wallet
  • recent transactions per watched wallet
  • current token holdings per watched wallet
  • token-specific inflows and outflows across the watched set

Shared environment

export STARKSCAN_BASE_URL="https://<your-starkscan-host>/api"
export STARKSCAN_API_KEY="mzk_live_your_key_here"
export STARKSCAN_CHAIN="SN_MAIN"

export STARKSCAN_WATCHED_WALLETS="0xwalletA,0xwalletB,0xwalletC,0xwalletD,0xwalletE,0xwalletF,0xwalletG,0xwalletH,0xwalletI,0xwalletJ"
export STARKSCAN_WATCHED_TOKENS="0xstrkToken,0xethToken,0xusdcToken"

export STARKSCAN_ACTIVITY_LIMIT="50"
export STARKSCAN_TRANSACTION_LIMIT="50"
export STARKSCAN_TRANSFER_LIMIT="100"

STARKSCAN_BASE_URL should already include /api for hosted external access. All examples below then call the normal /v1/* routes relative to that base.

HTTP file starter

Use this first when you are driving Starkscan from an editor with .http support and you want to see the exact request and response contract before you automate loops.

Save this as monitor-wallets.http:

@starkscan = https://<your-starkscan-host>/api
@chain = SN_MAIN
@apiKey = mzk_live_your_key_here
@wallet = 0xwalletA
@token = 0xstrkToken
@activityLimit = 50
@transactionLimit = 50
@transferLimit = 100

GET {{starkscan}}/v1/{{chain}}/address/{{wallet}}/activity?limit={{activityLimit}}
X-Starkscan-Api-Key: {{apiKey}}

###

GET {{starkscan}}/v1/{{chain}}/address/{{wallet}}/transactions?limit={{transactionLimit}}
X-Starkscan-Api-Key: {{apiKey}}

###

GET {{starkscan}}/v1/{{chain}}/address/{{wallet}}/token-holdings
X-Starkscan-Api-Key: {{apiKey}}

###

GET {{starkscan}}/v1/{{chain}}/token/{{token}}/transfers?address={{wallet}}&limit={{transferLimit}}
X-Starkscan-Api-Key: {{apiKey}}

Duplicate the request blocks per wallet or token when you need a small fixed watch set from the editor. If you need shell loops and JSON files on disk, use the shell starter below.

Shell HTTP starter

Use this when you want zero-install shell automation and local JSON artifacts.

OUTPUT_DIR="${OUTPUT_DIR:-./starkscan-wallet-monitor-rest}"
mkdir -p "$OUTPUT_DIR"

IFS=',' read -r -a STARKSCAN_WALLETS <<< "$STARKSCAN_WATCHED_WALLETS"
IFS=',' read -r -a STARKSCAN_TOKENS <<< "$STARKSCAN_WATCHED_TOKENS"

for wallet in "${STARKSCAN_WALLETS[@]}"; do
  wallet="$(printf '%s' "$wallet" | xargs)"

  curl -sS \
    -H "X-Starkscan-Api-Key: $STARKSCAN_API_KEY" \
    "$STARKSCAN_BASE_URL/v1/$STARKSCAN_CHAIN/address/$wallet/activity?limit=$STARKSCAN_ACTIVITY_LIMIT" \
    > "$OUTPUT_DIR/${wallet}.activity.json"

  curl -sS \
    -H "X-Starkscan-Api-Key: $STARKSCAN_API_KEY" \
    "$STARKSCAN_BASE_URL/v1/$STARKSCAN_CHAIN/address/$wallet/transactions?limit=$STARKSCAN_TRANSACTION_LIMIT" \
    > "$OUTPUT_DIR/${wallet}.transactions.json"

  curl -sS \
    -H "X-Starkscan-Api-Key: $STARKSCAN_API_KEY" \
    "$STARKSCAN_BASE_URL/v1/$STARKSCAN_CHAIN/address/$wallet/token-holdings" \
    > "$OUTPUT_DIR/${wallet}.holdings.json"
done

for token in "${STARKSCAN_TOKENS[@]}"; do
  token="$(printf '%s' "$token" | xargs)"
  url="$STARKSCAN_BASE_URL/v1/$STARKSCAN_CHAIN/token/$token/transfers?limit=$STARKSCAN_TRANSFER_LIMIT"
  for wallet in "${STARKSCAN_WALLETS[@]}"; do
    wallet="$(printf '%s' "$wallet" | xargs)"
    url="${url}&address=${wallet}"
  done

  curl -sS \
    -H "X-Starkscan-Api-Key: $STARKSCAN_API_KEY" \
    "$url" \
    > "$OUTPUT_DIR/${token}.transfers.json"
done

SDK starter

Only move to the SDK when this workflow belongs inside application code. If you are still validating routes, auth, or payloads, stay on one of the HTTP starters above.

Save this as monitor-wallets.ts:

import { mkdir, writeFile } from 'node:fs/promises';
import { join } from 'node:path';
import { createStarkscanClient } from '@starkscan/sdk';

function requiredEnv(name: string): string {
  const value = process.env[name]?.trim();
  if (!value) throw new Error(`${name} is required`);
  return value;
}

function csvEnv(name: string): string[] {
  return requiredEnv(name)
    .split(',')
    .map((value) => value.trim())
    .filter(Boolean);
}

const baseUrl = requiredEnv('STARKSCAN_BASE_URL');
const apiKey = requiredEnv('STARKSCAN_API_KEY');
const chainId = process.env.STARKSCAN_CHAIN?.trim() || 'SN_MAIN';
const wallets = csvEnv('STARKSCAN_WATCHED_WALLETS');
const tokens = csvEnv('STARKSCAN_WATCHED_TOKENS');
const activityLimit = Number(process.env.STARKSCAN_ACTIVITY_LIMIT || '50');
const transactionLimit = Number(process.env.STARKSCAN_TRANSACTION_LIMIT || '50');
const transferLimit = Number(process.env.STARKSCAN_TRANSFER_LIMIT || '100');
const outputDir = process.env.STARKSCAN_OUTPUT_DIR?.trim() || './starkscan-wallet-monitor-sdk';

const starkscan = createStarkscanClient({ apiKey, baseUrl, chainId });

await mkdir(outputDir, { recursive: true });

for (const wallet of wallets) {
  const [activity, transactions, holdings] = await Promise.all([
    starkscan.addressActivity(wallet, undefined, activityLimit),
    starkscan.addressTransactions(wallet, undefined, transactionLimit),
    starkscan.addressTokenHoldings(wallet),
  ]);

  await writeFile(join(outputDir, `${wallet}.activity.json`), JSON.stringify(activity, null, 2));
  await writeFile(
    join(outputDir, `${wallet}.transactions.json`),
    JSON.stringify(transactions, null, 2),
  );
  await writeFile(join(outputDir, `${wallet}.holdings.json`), JSON.stringify(holdings, null, 2));
}

for (const token of tokens) {
  const transfers = await starkscan.tokenTransfers(token, {
    addresses: wallets,
    limit: transferLimit,
  });

  await writeFile(
    join(outputDir, `${token}.transfers.json`),
    JSON.stringify(transfers, null, 2),
  );
}

Run it with:

npm install @starkscan/sdk@alpha
bun run ./monitor-wallets.ts

If you need a single typed summary layer, derive it from the activity, transactions, holdings, and filtered transfer reads above rather than depending on an unpublished batch helper.

Use that only as a top-level summary. Keep the activity, transactions, holdings, and transfer calls for the full monitoring view.

CLI starter

Use the CLI when you want repeatable shell commands, local JSON files, and no app code.

OUTPUT_DIR="${OUTPUT_DIR:-./starkscan-wallet-monitor-cli}"
mkdir -p "$OUTPUT_DIR"

IFS=',' read -r -a STARKSCAN_WALLETS <<< "$STARKSCAN_WATCHED_WALLETS"
IFS=',' read -r -a STARKSCAN_TOKENS <<< "$STARKSCAN_WATCHED_TOKENS"

for wallet in "${STARKSCAN_WALLETS[@]}"; do
  wallet="$(printf '%s' "$wallet" | xargs)"

  starkscan --output-format json address-activity "$wallet" --limit "$STARKSCAN_ACTIVITY_LIMIT" \
    > "$OUTPUT_DIR/${wallet}.activity.json"

  starkscan --output-format json address-transactions "$wallet" --limit "$STARKSCAN_TRANSACTION_LIMIT" \
    > "$OUTPUT_DIR/${wallet}.transactions.json"

  starkscan --output-format json address-token-holdings "$wallet" \
    > "$OUTPUT_DIR/${wallet}.holdings.json"
done

for token in "${STARKSCAN_TOKENS[@]}"; do
  token="$(printf '%s' "$token" | xargs)"
  transfer_args=()
  for wallet in "${STARKSCAN_WALLETS[@]}"; do
    wallet="$(printf '%s' "$wallet" | xargs)"
    transfer_args+=(--address "$wallet")
  done

  starkscan --output-format json token-transfers "$token" \
    "${transfer_args[@]}" \
    --limit "$STARKSCAN_TRANSFER_LIMIT" \
    > "$OUTPUT_DIR/${token}.transfers.json"
done

If your workflow needs a single shell sanity check before the full loop:

starkscan status
starkscan address-activity "$(printf '%s' "$STARKSCAN_WATCHED_WALLETS" | cut -d',' -f1)" --limit 10

Which surface to keep using

  • Stay on the API guide when you need raw HTTP debugging, auth behavior, or retries.
  • Stay on the SDK when the monitoring loop is part of application code.
  • Stay on the CLI when you want shell automation and local files.
  • Move to MCP only when the consumer is an MCP client rather than a direct integrator.