Skip to main content
Glama

Search the money-movement ledger

get_movements
Read-onlyIdempotent

Search the raw money-movement ledger, newest first: deposits, withdrawals, internal transfers, income and trades, each with venue, source, status, its amount in NATIVE token units and value_usd (its USD value on the day; null if unpriced). Filters combine with AND: kind picks the event type; asset, venue and source take comma-separated lists; status must be copied from countsByStatus (venue-native, case-sensitive); q is a substring search over asset, transaction id, status and address fragments; period bounds the time (omit for all time). limit (default 100, max 200) caps the rows returned while total still counts every match; there is no paging, so narrow the filters to reach older rows. The countsBySource / countsByVenue / countsByStatus facets list the filter values this account actually has. Use to find individual events, e.g. "my BTC withdrawals from Binance this year". For dollar totals of money in and out use get_money_flows; for income totals use get_income.

Input Schema

NameRequiredDescriptionDefault
qNoCase-insensitive substring search over asset, transaction id, status and stored details such as an address fragment.
kindNoINFLOW = deposit, OUTFLOW = withdrawal, TRANSFER = between the user's own accounts, INCOME = yield, staking or airdrop, TRADE = a buy or sell. Omit for every kind.
assetNoAsset ticker, e.g. "BTC"; comma-separate for several ("BTC,ETH"). Case-insensitive.
limitNoHow many of the newest matching rows to return, 1-200. Defaults to 100.
venueNoVenue name as it appears in countsByVenue, e.g. "binance"; comma-separate for several.
periodNoTime window ending now: last_24h, last_7d, last_30d, last_90d, ytd (since 1 January UTC) or all. Omit for all time.
sourceNoSource label as it appears in countsBySource, e.g. "deposit" or "staking"; comma-separate for several.
statusNoStatus exactly as it appears in countsByStatus, e.g. "SUCCESS" or "2".
profileNoWhich portfolio to read, for accounts with more than one: its id, or its name (exact, case-insensitive, e.g. "Trading"). Omit to read this connection's default portfolio; every answer names the portfolio it read in `profile`. An unknown or shared name returns profile_not_found or profile_ambiguous listing the real ones, and list_profiles shows them up front.

Output Schema

NameRequiredDescriptionDefault
errorNoPresent ONLY when the call was refused instead of answered: upgrade_required (Pro plan needed), not_found, profile_not_found, profile_ambiguous, invalid_arguments, write_not_permitted. No data fields come with it; read `message` to the user rather than retrying the same call.
itemsNoNewest first, at most `limit` rows.
totalNoEvery row matching the filters, before `limit`.
messageNoPlain-language explanation that accompanies `error`, `data_status` or a proposed change. Read it to the user.
profileNoThe portfolio these figures belong to (absent on list_profiles).
next_stepNoWhat the user should do about data_status.
truncatedNoPresent only when a list was longer than the 200-row cap and was cut: list field name -> {total, kept, keep, from, to}. A `<field>_note` string beside that list says the same in words. Never present a cut list as complete.
hiddenSpamNoRows hidden because they were marked spam.
items_noteNoPresent only when `items` was cut; says how many rows were kept and which.
source_urlNoLink to the page in the WhereItGoes app that shows this data.
data_statusNoPresent only when the portfolio has no data yet. nothing_connected: no exchange and no wallet is connected, so empty lists and zeros mean "no data", NOT a $0 portfolio, and no data fields come with it (except on get_connections, get_alerts, get_target_allocation and list_profiles, which also answer). Send the user to next_step. syncing: a source is connected but its first sync is still running, so figures are partial and not final.
upgrade_urlNoWhere the user can upgrade, on an upgrade_required refusal.
stock_assetsNoPresent when the answer mentions Binance Stocks shares (EQ_<ticker>): they are US stocks, not crypto.
countsByVenueNo
countsBySourceNo
countsByStatusNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed3 schema fields changed
    • addedOutput schema / properties / data_status
      Added value: +{
      +  "description": "Present only when the portfolio has no data yet. nothing_connected: no exchange and no wallet is connected, so empty lists and zeros mean \"no data\", NOT a $0 portfolio, and no data fields come with it (except on get_connections, get_alerts, get_target_allocation and list_profiles, which also answer). Send the user to next_step. syncing: a source is connected but its first sync is still running, so figures are partial and not final.",
      +  "enum": [
      +    "nothing_connected",
      +    "syncing"
      +  ],
      +  "type": "string"
      +}
    • changedOutput schema / properties / message / description
      Previous value: -"Plain-language explanation that accompanies `error` or a proposed change."New value: +"Plain-language explanation that accompanies `error`, `data_status` or a proposed change. Read it to the user."
    • addedOutput schema / properties / next_step
      Added value: +{
      +  "additionalProperties": true,
      +  "description": "What the user should do about data_status.",
      +  "properties": {
      +    "action": {
      +      "enum": [
      +        "connect_a_source",
      +        "wait_for_first_sync"
      +      ],
      +      "type": "string"
      +    },
      +    "add_exchange_url": {
      +      "description": "App page to connect an exchange with a read-only API key.",
      +      "type": "string"
      +    },
      +    "add_wallet_url": {
      +      "description": "App page to add a wallet address to watch.",
      +      "type": "string"
      +    },
      +    "settings_url": {
      +      "type": "string"
      +    },
      +    "sync_status_url": {
      +      "description": "App page showing sync progress.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "action"
      +  ],
      +  "type": "object"
      +}
  2. Changed5 schema fields changed
    • changedInput schema / properties / kind / description
      Previous value: -"INFLOW = deposit, OUTFLOW = withdrawal, TRANSFER = a move between the user's own accounts, INCOME = yield, staking or airdrop, TRADE = a buy or sell. Omit for every kind."New value: +"INFLOW = deposit, OUTFLOW = withdrawal, TRANSFER = between the user's own accounts, INCOME = yield, staking or airdrop, TRADE = a buy or sell. Omit for every kind."
    • changedInput schema / properties / period / description
      Previous value: -"Time window ending now: last_24h (today / since yesterday), last_7d, last_30d, last_90d, ytd (since 1 January UTC), or all. Omit for all time."New value: +"Time window ending now: last_24h, last_7d, last_30d, last_90d, ytd (since 1 January UTC) or all. Omit for all time."
    • changedInput schema / properties / q / description
      Previous value: -"Free-text substring search (case-insensitive) over asset, transaction id, status and stored details such as an address fragment."New value: +"Case-insensitive substring search over asset, transaction id, status and stored details such as an address fragment."
    • changedInput schema / properties / status / description
      Previous value: -"Status exactly as it appears in countsByStatus. Venue-native and case-sensitive (\"SUCCESS\", \"2\"), so copy it from the facet rather than guessing."New value: +"Status exactly as it appears in countsByStatus, e.g. \"SUCCESS\" or \"2\"."
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$schema": "http://json-schema.org/draft-07/schema#",
      +  "additionalProperties": true,
      +  "properties": {
      +    "countsBySource": {
      +      "items": {
      +        "additionalProperties": true,
      +        "properties": {
      +          "n": {
      +            "type": "number"
      +          },
      +          "source": {
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "source",
      +          "n"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "countsByStatus": {
      +      "items": {
      +        "additionalProperties": true,
      +        "properties": {
      +          "n": {
      +            "type": "number"
      +          },
      +          "source": {
      +            "type": "string"
      +          },
      +          "status": {
      +            "type": "string"
      +          },
      +          "venue": {
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "venue",
      +          "source",
      +          "status",
      +          "n"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "countsByVenue": {
      +      "items": {
      +        "additionalProperties": true,
      +        "properties": {
      +          "display": {
      +            "type": "string"
      +          },
      +          "n": {
      +            "type": "number"
      +          },
      +          "venue": {
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "venue",
      +          "n",
      +          "display"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "error": {
      +      "description": "Present ONLY when the call was refused instead of answered: upgrade_required (Pro plan needed), not_found, profile_not_found, profile_ambiguous, invalid_arguments, write_not_permitted. No data fields come with it; read `message` to the user rather than retrying the same call.",
      +      "type": "string"
      +    },
      +    "hiddenSpam": {
      +      "description": "Rows hidden because they were marked spam.",
      +      "type": "number"
      +    },
      +    "items": {
      +      "description": "Newest first, at most `limit` rows.",
      +      "items": {
      +        "additionalProperties": true,
      +        "properties": {
      +          "base_amount": {
      +            "description": "Amount of base_asset, NATIVE token units as a decimal string (not USD).",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "base_asset": {
      +            "description": "Asset moved.",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "executed_at": {
      +            "description": "When it happened, epoch ms.",
      +            "type": "number"
      +          },
      +          "fee": {
      +            "description": "Fee charged, native units of fee_asset.",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "fee_asset": {
      +            "description": "Asset the fee was charged in.",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "id": {
      +            "description": "Stable row id, e.g. \"cex:123\" or \"wallet:456\".",
      +            "type": "string"
      +          },
      +          "kind": {
      +            "description": "INFLOW (deposit), OUTFLOW (withdrawal), TRANSFER (between own accounts), INCOME, or TRADE.",
      +            "type": "string"
      +          },
      +          "quote_amount": {
      +            "description": "Second leg amount, native units.",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "quote_asset": {
      +            "description": "Second leg asset, for trades.",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "source": {
      +            "description": "Venue-native source label, e.g. \"deposit\", \"withdraw\", \"staking\".",
      +            "type": "string"
      +          },
      +          "status": {
      +            "description": "Venue-native status, case-sensitive.",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "value_usd": {
      +            "description": "USD value on the day it happened; null when unpriced.",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "venue": {
      +            "description": "Exchange or wallet venue the row came from.",
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "id",
      +          "venue",
      +          "source",
      +          "kind",
      +          "base_asset",
      +          "base_amount",
      +          "quote_asset",
      +          "quote_amount",
      +          "fee",
      +          "fee_asset",
      +          "status",
      +          "executed_at",
      +          "value_usd"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "items_note": {
      +      "description": "Present only when `items` was cut; says how many rows were kept and which.",
      +      "type": "string"
      +    },
      +    "message": {
      +      "description": "Plain-language explanation that accompanies `error` or a proposed change.",
      +      "type": "string"
      +    },
      +    "profile": {
      +      "additionalProperties": true,
      +      "description": "The portfolio these figures belong to (absent on list_profiles).",
      +      "properties": {
      +        "id": {
      +          "type": "string"
      +        },
      +        "name": {
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "id",
      +        "name"
      +      ],
      +      "type": "object"
      +    },
      +    "source_url": {
      +      "description": "Link to the page in the WhereItGoes app that shows this data.",
      +      "type": "string"
      +    },
      +    "stock_assets": {
      +      "additionalProperties": true,
      +      "description": "Present when the answer mentions Binance Stocks shares (EQ_<ticker>): they are US stocks, not crypto.",
      +      "properties": {
      +        "assets": {
      +          "items": {
      +            "additionalProperties": true,
      +            "properties": {
      +              "asset": {
      +                "type": "string"
      +              },
      +              "ticker": {
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "asset",
      +              "ticker"
      +            ],
      +            "type": "object"
      +          },
      +          "type": "array"
      +        },
      +        "note": {
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "note",
      +        "assets"
      +      ],
      +      "type": "object"
      +    },
      +    "total": {
      +      "description": "Every row matching the filters, before `limit`.",
      +      "type": "number"
      +    },
      +    "truncated": {
      +      "additionalProperties": {
      +        "additionalProperties": true,
      +        "properties": {
      +          "from": {
      +            "description": "Day or bucket of the first kept row, for a dated series.",
      +            "type": "string"
      +          },
      +          "keep": {
      +            "description": "Which rows survived the cut.",
      +            "enum": [
      +              "first",
      +              "most_recent",
      +              "evenly_spaced",
      +              "best_and_worst"
      +            ],
      +            "type": "string"
      +          },
      +          "kept": {
      +            "description": "Rows returned.",
      +            "type": "number"
      +          },
      +          "to": {
      +            "description": "Day or bucket of the last kept row, for a dated series.",
      +            "type": "string"
      +          },
      +          "total": {
      +            "description": "Rows the full answer had.",
      +            "type": "number"
      +          }
      +        },
      +        "required": [
      +          "total",
      +          "kept",
      +          "keep"
      +        ],
      +        "type": "object"
      +      },
      +      "description": "Present only when a list was longer than the 200-row cap and was cut: list field name -> {total, kept, keep, from, to}. A `<field>_note` string beside that list says the same in words. Never present a cut list as complete.",
      +      "type": "object"
      +    },
      +    "upgrade_url": {
      +      "description": "Where the user can upgrade, on an upgrade_required refusal.",
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
  3. Changed9 schema fields changed
    • changedInput schema / properties / asset / description
      Previous value: -"Filter to one asset ticker, e.g. \"BTC\"."New value: +"Asset ticker, e.g. \"BTC\"; comma-separate for several (\"BTC,ETH\"). Case-insensitive."
    • changedInput schema / properties / kind / description
      Previous value: -"INFLOW = deposit, OUTFLOW = withdrawal."New value: +"INFLOW = deposit, OUTFLOW = withdrawal, TRANSFER = a move between the user's own accounts, INCOME = yield, staking or airdrop, TRADE = a buy or sell. Omit for every kind."
    • changedInput schema / properties / limit / description
      Previous value: -"Maximum rows to return (capped at 200)."New value: +"How many of the newest matching rows to return, 1-200. Defaults to 100."
    • changedInput schema / properties / period / description
      Previous value: -"Time window. \"last_24h\" for today/since-yesterday, \"all\" for full history. Defaults to the endpoint's own default (usually last 30 days)."New value: +"Time window ending now: last_24h (today / since yesterday), last_7d, last_30d, last_90d, ytd (since 1 January UTC), or all. Omit for all time."
    • changedInput schema / properties / profile / description
      Previous value: -"Which portfolio to read, by name or id, for accounts that have more than one. Omit to use this connection's default. Call list_profiles first if the user names a portfolio you have not seen."New value: +"Which portfolio to read, for accounts with more than one: its id, or its name (exact, case-insensitive, e.g. \"Trading\"). Omit to read this connection's default portfolio; every answer names the portfolio it read in `profile`. An unknown or shared name returns profile_not_found or profile_ambiguous listing the real ones, and list_profiles shows them up front."
    • changedInput schema / properties / q / description
      Previous value: -"Free-text search over the ledger."New value: +"Free-text substring search (case-insensitive) over asset, transaction id, status and stored details such as an address fragment."
    • changedInput schema / properties / source / description
      Previous value: -"Filter to one source label."New value: +"Source label as it appears in countsBySource, e.g. \"deposit\" or \"staking\"; comma-separate for several."
    • changedInput schema / properties / status / description
      Previous value: -"Filter by movement status."New value: +"Status exactly as it appears in countsByStatus. Venue-native and case-sensitive (\"SUCCESS\", \"2\"), so copy it from the facet rather than guessing."
    • changedInput schema / properties / venue / description
      Previous value: -"Filter to one venue, e.g. \"binance\"."New value: +"Venue name as it appears in countsByVenue, e.g. \"binance\"; comma-separate for several."
  4. First observed

TDQS

Score is being calculated.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.