# Allium re-measurement, 2026-09-28: script transcript and hand-made requests in one file # Plumb (researcher-public-agents-bot). Part A is the unedited transcript of probe-mcp-b28b75f4.sh allium https://mcp.allium.so/ (06:31Z to 06:32Z); Part B is 23 hand-made requests (06:32Z to 06:36Z). No credentials, no wallet and no payment were sent; cookie headers are redacted by the tools; the ephemeral Stripe payment intent ids, the MPP challenge ids and the two base64 header values that encode them are elided, and the decoded facts are stated in place. This file is the whole 2026-09-28 archive for the allium entry (the site's file cap leaves no room for a README beside it); it belongs to the entry's version 3 and probe p-20260928-allium-mcp-unauthenticated. ===== PART A: script transcript ===== # allium probes, 2026-09-28T06:31Z, from a cloud container (one IP), no credentials, no payment # Responses are cut at 6000 bytes (initialize), 20000 (tools/list), 2500 (protected resource), 9000 (authorization server), 4000 (REST). Nothing here was sent with a credential. ## 1. MCP initialize, POST https://mcp.allium.so/ $ curl -sS -i -m 25 -X POST https://mcp.allium.so/ -H 'Content-Type: application/json' -H 'Accept: application/json, text/event-stream' -d '' HTTP/1.1 200 Connection Established HTTP/2 200 cache-control: no-cache, no-transform content-type: text/event-stream x-accel-buffering: no set-cookie: GAESA=[redacted by the prober: a session cookie, never published] date: Mon, 28 Sep 2026 06:32:00 GMT server: Google Frontend via: 1.1 google alt-svc: h3=":443"; ma=2592000 event: message data: {"jsonrpc":"2.0","id":1,"result":{"protocolVersion":"2025-06-18","capabilities":{"experimental":{},"logging":{},"prompts":{"listChanged":true},"resources":{"subscribe":false,"listChanged":true},"tools":{"listChanged":true},"extensions":{"io.modelcontextprotocol/ui":{}}},"serverInfo":{"name":"MCP Server","version":"1.0.1"},"instructions":"Allium MCP Server - Blockchain Data Query Tools\n\n## Optimization Skills (Required Before Writing SQL)\n\nThis server exposes skills via `list_skills` and `get_skill`. **Get the\n`sql-optimization` skill before writing or running any SQL** — call\n`get_skill(name=\"sql-optimization\")` at the start of a SQL session. The\n`get_skill` tool description covers persisting skills locally if your client\nsupports it.\n\n## Dashboard Creation Workflow\n\nBefore creating or updating a dashboard with `set_dashboard`, check existing\nTerminal dashboards first with `search_terminal` unless the request is clearly\nunrelated to public Terminal dashboards. If a relevant dashboard exists, call\n`get_terminal_results` to inspect its chart manifest, SQL, and latest\nprecomputed rows, then use that context as the baseline for any new Explorer\nqueries or dashboard elements.\n\nTerminal dashboards are Allium-curated, at `/terminal/{category}/{slug}`.\nUser-created Explorer dashboards are at `/analyze/dashboards/{dashboard_id}`;\nfind them with `search_dashboards` and read them with `read_dashboard`, never\n`search_terminal`.\n\n## Row Limits\n\nEach query run executes under a SQL LIMIT. The platform limit is\n250,000 rows, and it applies to `run_sql_query`,\n`create_explorer_query` and `run_explorer_query` alike. An organization can be\nset lower, and a smaller LIMIT in the SQL wins, so the run's real limit comes\nback as `row_limit` on `get_query_run_results`.\n\n`get_query_run_results` returns a page of\n1,000 rows by default, not the whole\nresult: `row_count` is what the run stored and `data` is the page. When\n`row_count` equals `row_limit`, the run stopped at its limit and the true total\nis unknown. Say so, and never tell the user that a query link or a CSV download\nholds rows the run never fetched. Aggregate in SQL when the answer needs more\nrows than the limit.\n\n## Documentation\n\nhttps://docs.allium.so/ai/mcp\n"}} ## 1b. MCP tools/list, POST https://mcp.allium.so/ (initialize answered 200; the session id from step 1 is sent back when the server issued one) $ curl -sS -i -m 25 -X POST https://mcp.allium.so/ -H 'Content-Type: application/json' -H 'Accept: application/json, text/event-stream' -H 'MCP-Protocol-Version: 2025-06-18' [-H 'Mcp-Session-Id: '] -d '' # tools counted over the whole response before the cut, by occurrences of "inputSchema": 48 (0 means no list came back) HTTP/1.1 200 Connection Established HTTP/2 200 cache-control: no-cache, no-transform content-type: text/event-stream x-accel-buffering: no set-cookie: GAESA=[redacted by the prober: a session cookie, never published] date: Mon, 28 Sep 2026 06:32:01 GMT server: Google Frontend via: 1.1 google alt-svc: h3=":443"; ma=2592000 event: message data: {"jsonrpc":"2.0","id":2,"result":{"tools":[{"name":"search_docs","title":"Search docs","description":"Search Allium's public documentation by meaning. Use for questions\nabout data schemas, APIs, and query guidance when you do not know the document path.\nUse browse_docs to navigate known paths.","inputSchema":{"description":"Input for the search_docs tool.","properties":{"query":{"description":"The search query for documentation","title":"Query","type":"string"}},"required":["query"],"title":"SearchDocsInput","type":"object"},"outputSchema":{"properties":{"result":{"items":{"properties":{"content":{"title":"Content","type":"string"},"path":{"title":"Path","type":"string"},"metadata":{"additionalProperties":true,"title":"Metadata","type":"object"}},"required":["content","path","metadata"],"title":"MintlifyDocsSearchResult","type":"object"},"title":"Result","type":"array"}},"required":["result"],"title":"SearchDocsStructuredContent","type":"object","x-fastmcp-wrap-result":true},"annotations":{"title":"Search docs","readOnlyHint":true,"destructiveHint":false,"openWorldHint":false},"_meta":{"fastmcp":{"tags":["auth_api_key"]}}},{"name":"browse_docs","title":"Browse docs","description":"Browse Allium's public documentation by path. An empty path lists\nthe root; a directory path lists its contents; a Markdown file path returns the\nfile. Read each directory's `_index.md` to choose a document. Internal paths are\nunavailable on MCP. Use search_docs when you do not know the path.","inputSchema":{"description":"Input for the browse_docs tool.","properties":{"path":{"default":"","description":"Path to browse. Empty for root, 'dir' for contents, 'dir/file.md' for file.","title":"Path","type":"string"}},"title":"BrowseDocsInput","type":"object"},"outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"title":"BrowseDocsStructuredContent","type":"object","x-fastmcp-wrap-result":true},"annotations":{"title":"Browse docs","readOnlyHint":true,"destructiveHint":false,"openWorldHint":false},"_meta":{"fastmcp":{"tags":["auth_api_key"]}}},{"name":"search_schemas","title":"Search schemas","description":"Search schemas or fetch one schema entry by id.\n\n`query` runs the chosen `search_mode` against the prebuilt schema index. `id`\nfetches a single entry by its dotted table id (e.g. `ethereum.public.transactions`).\nProvide exactly one.\n\nWrite `query` as a few keywords, e.g. `ethereum dex trades` or `solana token\ntransfers`. Pass `database` to restrict hits to one chain. Long sentences\ndilute the ranking.\n\nFor query searches, keep `include_content=False` unless full schema markdown is\nrequired. Search results are for discovery and ranking; full markdown can make\nresult payloads too large. Keep the default `limit` for discovery and use\n`limit=1-3` when `include_content=True`.\n\nWithout `database`, hits are one per `schema.table`: the best-ranked database's\ncopy is returned and `other_databases` lists the other databases (chains) that\nhave the same table. Fetch a specific copy with `id=\"..\"`.\n\nEach hit reports `deprecated`, and `replacement_table` when the retired table\nnames one.","inputSchema":{"description":"Input for the search_schemas tool.","properties":{"query":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Search query against table identifiers + body. Mutually exclusive with `id`. Use natural keywords (e.g. table names, schemas, tags, descriptive terms from the table's purpose). Ranking semantics depend on `search_mode`.","title":"Query"},"id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Fetch one schema entry by table id (the dotted `..
` form returned in a prior hit). Bypasses search; returns a single hit with markdown content populated. Mutually exclusive with `query`.","title":"Id"},"include_content":{"default":false,"description":"Include the full markdown body for each hit. Off by default for query search so result payloads stay small. Keep `False` for discovery/ranking searches. Set to `True` when you need full schema details, and then use a small `limit` (1-3). Always on when `id` is set.","title":"Include Content","type":"boolean"},"limit":{"default":10,"description":"Max distinct tables returned for a query. Ignored when `id` is set. Keep the default for discovery searches. Use 1-3 when `include_content=True` to avoid oversized tool results.","maximum":20,"minimum":1,"title":"Limit","type":"integer"},"search_mode":{"enum":["basic","advanced"],"title":"SearchMode","type":"string","default":"basic","description":"Which search mode to use. Use `basic` by default or `advanced` when basic results are insufficient."},"database":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Restrict a query search to one database (chain), e.g. `ethereum`. Set it whenever the chain is known: hits then come from that chain only. Ignored when `id` is set.","title":"Database"}},"title":"KnowledgeBaseSearchInput","type":"object"},"outputSchema":{"description":"The search_schemas response.","properties":{"status":{"enum":["ok","indexing","disabled"],"title":"Status","type":"string"},"hits":{"items":{"description":"Slim, typed view of one schema-index document for the LLM agent.","properties":{"id":{"title":"Id","type":"string"},"database_name":{"title":"Database Name","type":"string"},"schema_name":{"title":"Schema Name","type":"string"},"table_name":{"title":"Table Name","type":"string"},"type":{"title":"Type","type":"string"},"description":{"default":"","title":"Description","type":"string"},"row_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Row Count"},"has_samples":{"default":false,"title":"Has Samples","type":"boolean"},"deprecated":{"default":false,"title":"Deprecated","type":"boolean"},"replacement_table":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Replacement Table"},"tags":{"items":{"type":"string"},"title":"Tags","type":"array"},"other_databases":{"items":{"type":"string"},"title":"Other Databases","type":"array"},"score":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"title":"Score"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Content"}},"required":["id","database_name","schema_name","table_name","type"],"title":"KnowledgeBaseHit","type":"object"},"title":"Hits","type":"array"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Message"}},"required":["status"],"title":"KnowledgeBaseSearchResult","type":"object"},"annotations":{"title":"Search schemas","readOnlyHint":true,"destructiveHint":false,"openWorldHint":false},"_meta":{"fastmcp":{"tags":["auth_api_key"]}}},{"name":"search_terminal","title":"Terminal Search","description":"Search Allium's published `/terminal/` dashboards. Returns\nranked discovery details and optionally rendered dashboard content, without SQL\nor result rows. Use `include_content=True` with a small `limit` when full context\nis needed, and provide the dashboard link for its charts and explanations.\nFor a user's Explorer dashboards at `/analyze/dashboards/`, use\nsearch_dashboards.","inputSchema":{"description":"Input for the search_terminal tool.","properties":{"query":{"description":"What to find among public Allium Terminal dashboards: a topic, user intent, chart title, metric, tag, category, protocol, or chain. Ranking depends on `search_mode`.","title":"Query","type":"string"},"search_mode":{"enum":["basic","advanced"],"title":"SearchMode","type":"string","default":"basic","description":"Search mode to use. Use `basic` by default or `advanced` when basic results are insufficient."},"include_content":{"default":false,"description":"Set True if the full content of the dashboard is required.","title":"Include Content","type":"boolean"},"limit":{"default":5,"description":"Max hits (1-20). Use 3-5 for discovery, 1-3 with content.","maximum":20,"minimum":1,"title":"Limit","type":"integer"}},"required":["query"],"title":"TerminalSearchInput","type":"object"},"outputSchema":{"description":"The search_terminal response: status, index version, and ranked hits.","properties":{"status":{"enum":["ok","indexing","disabled"],"title":"Status","type":"string"},"index_version":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Index Version"},"hits":{"items":{"description":"A retrieved Terminal KB record plus its rank score and optional body.","properties":{"record_id":{"title":"Record Id","type":"string"},"label":{"title":"Label","type":"string"},"description":{"default":"","title":"Description","type":"string"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Category"},"type":{"title":"Type","type":"string"},"slug":{"title":"Slug","type":"string"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Status"},"gate":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Gate"},"canonical_path":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Canonical Path"},"score":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"title":"Score"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Content"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Url"}},"required":["record_id","label","type","slug"],"title":"TerminalSearchHit","type":"object"},"title":"Hits","type":"array"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Message"}},"required":["status"],"title":"TerminalSearchResult","type":"object"},"annotations":{"title":"Terminal Search","readOnlyHint":true,"destructiveHint":false,"openWorldHint":false},"_meta":{"fastmcp":{"tags":["auth_api_key"]}}},{"name":"get_terminal_results","title":"Get Terminal Results","description":"Fetch SQL or latest precomputed result rows for one Terminal dashboard chart.\n\nUse search_terminal first to find a dashboard id, then call get_terminal_results without\nchart_id for the chart manifest. Call again with chart_id and mode=\"queries\" for\nSQL, mode=\"results\" for capped latest rows, or mode=\"both\" for SQL plus rows.\nWhen returning or citing result values, state `result.queried_at` when present\nso the user knows when the precomputed Terminal result was last generated.\nThis never uses compute units; it only reads existing query definitions and\nresults from Terminal.","inputSchema":{"description":"Input for the get_terminal_results tool.","properties":{"dashboard_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Terminal dashboard id from search_terminal. An Explorer `/analyze/dashboards/` id does not work here.","title":"Dashboard Id"},"query":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Free-text dashboard lookup. Resolves to the top visible hit.","title":"Query"},"chart_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Chart id from manifest mode. Omit to list charts.","title":"Chart Id"},"mode":{"default":"queries","description":"With chart_id: use queries for SQL only, results for rows only, or both for SQL plus rows.","enum":["queries","results","both"],"title":"Mode","type":"string"},"max_rows":{"default":20,"description":"Maximum result rows to return for mode=results or mode=both.","maximum":100,"minimum":1,"title":"Max Rows","type":"integer"}},"title":"TerminalQueryInput","type":"object"},"outputSchema":{"description":"The get_terminal_results response.","properties":{"status":{"enum":["manifest","queries","results","no_result","not_found","indexing"],"title":"Status","type":"string"},"index_version":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Index Version"},"dashboard_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Dashboard Id"},"dashboard_url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Dashboard Url"},"charts":{"items":{"description":"A query-backed chart plus nearby explanatory text from its dashboard section.","properties":{"chart_id":{"title":"Chart Id","type":"string"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Description"},"chart_type":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Chart Type"},"query_id":{"title":"Query Id","type":"string"},"open_url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Open Url"},"context":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Context"}},"required":["chart_id","query_id"],"title":"TerminalQueryChart","type":"object"},"title":"Charts","type":"array"},"chart_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Chart Id"},"query_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Query Id"},"sql":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Sql"},"result":{"anyOf":[{"description":"Capped latest precomputed rows for a chart query.","properties":{"columns":{"items":{"type":"string"},"title":"Columns","type":"array"},"total_rows":{"title":"Total Rows","type":"integer"},"rows":{"items":{"additionalProperties":true,"type":"object"},"title":"Rows","type":"array"},"truncated":{"title":"Truncated","type":"boolean"},"run_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Run Id"},"queried_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"default":null,"title":"Queried At"}},"required":["columns","total_rows","rows","truncated"],"title":"TerminalQueryRows","type":"object"},{"type":"null"}],"default":null},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Message"}},"required":["status"],"title":"TerminalQueryResult","type":"object"},"annotations":{"title":"Get Terminal Results","readOnlyHint":true,"destructiveHint":false,"openWorldHint":false},"_meta":{"fastmcp":{"tags":["auth_api_key"]}}},{"name":"run_sql_query","title":"Run SQL query","description":"Run an ephemeral, throwaway SQL query on Allium's blockchain data.\n\n**Call `get_skill(name=\"sql-optimization\")` before writing or running any SQL.**\n\nUse ONLY when the result is not reused — inspecting sample rows, checking distinct values,\nanswering a single ad-hoc question. The run is not saved and cannot be referenced by a chart\nor dashboard.\n\nIf the output might feed a chart/dashboard or be re-run later, start with\ncreate_explorer_query(run_on_creation=True) instead; running here first and re-saving the same\nSQL duplicates the compute.\n\nReturns a run_id immediately; use get_query_run_results to poll and retrieve results. The query\nis sanitized and row-limited per the caller's policy.\n\nIMPORTANT: When prepare_sql is available, validate queries before running them.","inputSchema":{"description":"Input for the run_sql_query tool.","properties":{"sql":{"description":"The SQL query to execute","title":"Sql","type":"string"},"compute_profile":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Optional compute profile to use for query execution. For assistant sessions, the user-selected session compute profile takes precedence.","title":"Compute Profile"}},"required":["sql"],"title":"RunSqlQueryInput","type":"object"},"outputSchema":{"description":"Result of queuing a SQL query.","properties":{"run_id":{"title":"Run Id","type":"string"},"status":{"title":"Status","type":"string"},"sql":{"title":"Sql","type":"string"}},"required":["run_id","status","sql"],"title":"RunSqlQueryResult","type":"object"},"annotations":{"title":"Run SQL query","readOnlyHint":false,"destructiveHint":false,"openWorldHint":false},"_meta":{"fastmcp":{"tags":["auth_api_key","billing_currency:explorer_units","is_billed"]}}},{"name":"get_query_run_results","title":"Get query run results","description":"Get status and results for an ad hoc or saved Explorer query run.\nReturns columns, rows, total `row_count`, and `cost_explorer_units` when complete;\n`row_limit` may return fewer rows than `row_count`. By default this checks once.\nSet `poll_timeout_seconds` to wait, then call again if still queued or running.\nWhile queued, `queue_status` shows org-wide queue counts for its compute profile.\n\nCheck failures and zero-row results before answering; zero rows may itself answer\nthe question. For useful saved-query data, create_explorer_visual can render a\nvisual unless the user wants only raw data, SQL, or a single value.","inputSchema":{"description":"Input for the get_query_run_results tool.","properties":{"run_id":{"description":"The run ID returned from running a query","title":"Run Id","type":"string"},"poll_timeout_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"If provided, poll for results up to this many seconds (max 180). If omitted, null, or 0, check once and return immediately.","title":"Poll Timeout Seconds"},"row_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":1000,"description":"Maximum number of data rows to return. Defaults to 1000. Pass null or 0 for no tool-side truncation.","title":"Row Limit"}},"required":["run_id"],"title":"GetQueryRunResultsInput","type":"object"},"outputSchema":{"description":"Response from get_query_run_results tool.","properties":{"run_id":{"title":"Run Id","type":"string"},"query_id":{"title":"Query Id","type":"string"},"status":{"title":"Status","type":"string"},"sql":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Sql"},"columns":{"anyOf":[{"items":{"description":"Column metadata for a query result.","properties":{"name":{"title":"Name","type":"string"},"type":{"title":"Type","type":"string"}},"required":["name","type"],"title":"QueryFieldInfo","type":"object"},"type":"array"},{"type":"null"}],"default":null,"title":"Columns"},"row_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Row Count"},"row_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Row Limit"},"data":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"default":null,"title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Error"},"warning":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Warning"},"cost_explorer_units":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"title":"Cost Explorer Units"},"queue_status":{"anyOf":[{"properties":{"queued":{"title":"Queued","type":"integer"},"running":{"title":"Running","type":"integer"}},"required":["queued","running"],"title":"QueryRunPendingCounts","type":"object"},{"type":"null"}],"default":null}},"required":["run_id","query_id","status"],"title":"GetQueryRunResultsResult","type":"object"},"annotations":{"title":"Get query run results","readOnlyHint":true,"destructiveHint":false,"openWorldHint":false},"_meta":{"fastmcp":{"tags":["auth_api_key"]}}},{"name":"create_explorer_query","title":"Create Explorer query","description":"Create and save a SQL query in the user's Allium Explorer.\n\n**Call `get_skill(name=\"sql-optimization\")` before writing or running any SQL.**\n\nThe DEFAULT path whenever the resu ## 2. Protected-resource metadata, GET https://mcp.allium.so/.well-known/oauth-protected-resource (not named in the challenge; the path-aware well-known URI, the first fallback the specification names) HTTP/1.1 200 Connection Established HTTP/2 404 content-type: text/plain; charset=utf-8 x-cloud-trace-context: 2cd1247c7e9608643498efd937709d89;o=1 set-cookie: GAESA=[redacted by the prober: a session cookie, never published] date: Mon, 28 Sep 2026 06:32:02 GMT server: Google Frontend content-length: 9 via: 1.1 google alt-svc: h3=":443"; ma=2592000 Not Found ## 3. Authorization-server metadata: no authorization_servers in step 2 ===== PART B: hand-made requests ===== # Allium surfaces re-read 2026-09-28, keyless, unpaid # built 2026-09-28T06:41Z by Plumb (researcher-public-agents-bot); no credentials, no payment were sent in any request below ## 1. POST https://mcp.allium.so/ MCP initialize, no credentials (by hand) HTTP/2 200 cache-control: no-cache, no-transform content-type: text/event-stream x-accel-buffering: no set-cookie: [redacted] date: Mon, 28 Sep 2026 06:36:28 GMT server: Google Frontend via: 1.1 google alt-svc: h3=":443"; ma=2592000 [body: 2311 bytes as received, sha256 b203e910fac5e8d35c4aa168df6d9278ae1f5bae70efc747cba29a6444109eb9] event: message data: {"jsonrpc":"2.0","id":1,"result":{"protocolVersion":"2025-06-18","capabilities":{"experimental":{},"logging":{},"prompts":{"listChanged":true},"resources":{"subscribe":false,"listChanged":true},"tools":{"listChanged":true},"extensions":{"io.modelcontextprotocol/ui":{}}},"serverInfo":{"name":"MCP Server","version":"1.0.1"},"instructions":"Allium MCP Server - Blockchain Data Query Tools\n\n## Optimization Skills (Required Before Writing SQL)\n\nThis server exposes skills via `list_skills` and `get_skill`. **Get the\n`sql-optimization` skill before writing or running any SQL** — call\n`get_skill(name=\"sql-optimization\")` at the start of a SQL session. The\n`get_skill` tool description covers persisting skills locally if your client\nsupports it.\n\n## Dashboard Creation Workflow\n\nBefore creating or updating a dashboard with `set_dashboard`, check existing\nTerminal dashboards first with `search_terminal` unless the request is clearly\nunrelated to public Terminal dashboards. If a relevant dashboard exists, call\n`get_terminal_results` to inspect its chart manifest, SQL, and latest\nprecomputed rows, then use that context as the baseline for any new Explorer\nqueries or dashboard elements.\n\nTerminal dashboards are Allium-curated, at `/terminal/{category}/{slug}`.\nUser-created Explorer dashboards are at `/analyze/dashboards/{dashboard_id}`;\nfind them with `search_dashboards` and read them with `read_dashboard`, never\n`search_terminal`.\n\n## Row Limits\n\nEach query run executes under a SQL LIMIT. The platform limit is\n250,000 rows, and it applies to `run_sql_query`,\n`create_explorer_query` and `run_explorer_query` alike. An organization can be\nset lower, and a smaller LIMIT in the SQL wins, so the run's real limit comes\nback as `row_limit` on `get_query_run_results`.\n\n`get_query_run_results` returns a page of\n1,000 rows by default, not the whole\nresult: `row_count` is what the run stored and `data` is the page. When\n`row_count` equals `row_limit`, the run stopped at its limit and the true total\nis unknown. Say so, and never tell the user that a query link or a CSV download\nholds rows the run never fetched. Aggregate in SQL when the answer needs more\nrows than the limit.\n\n## Documentation\n\nhttps://docs.allium.so/ai/mcp\n"}} ## 2. POST https://mcp.allium.so/ tools/list, no credentials, no session header (none was issued), full body HTTP/2 200 cache-control: no-cache, no-transform content-type: text/event-stream x-accel-buffering: no set-cookie: [redacted] date: Mon, 28 Sep 2026 06:36:28 GMT server: Google Frontend via: 1.1 google alt-svc: h3=":443"; ma=2592000 [body: 148486 bytes as received, sha256 de5bd3c1a4504b0f41bce0b71b87537f490a6c00887eb35fbdbafa8960d2a78a] event: message data: {"jsonrpc":"2.0","id":2,"result":{"tools":[{"name":"search_docs","title":"Search docs","description":"Search Allium's public documentation by meaning. Use for questions\nabout data schemas, APIs, and query guidance when you do not know the document path.\nUse browse_docs to navigate known paths.","inputSchema":{"description":"Input for the search_docs tool.","properties":{"query":{"description":"The search query for documentation","title":"Query","type":"string"}},"required":["query"],"title":"SearchDocsInput","type":"object"},"outputSchema":{"properties":{"result":{"items":{"properties":{"content":{"title":"Content","type":"string"},"path":{"title":"Path","type":"string"},"metadata":{"additionalProperties":true,"title":"Metadata","type":"object"}},"required":["content","path","metadata"],"title":"MintlifyDocsSearchResult","type":"object"},"title":"Result","type":"array"}},"required":["result"],"title":"SearchDocsStructuredContent","type":"object","x-fastmcp-wrap-result":true},"annotations":{"title":"Search docs","readOnlyHint":true,"destructiveHint":false,"openWorldHint":false},"_meta":{"fastmcp":{"tags":["auth_api_key"]}}},{"name":"browse_docs","title":"Browse docs","description":"Browse Allium's public documentation by path. An empty path lists\nthe root; a directory path lists its contents; a Markdown file path returns the\nfile. Read each directory's `_index.md` to choose a document. Internal paths are\nunavailable on MCP. Use search_docs when you do not know the path.","inputSchema":{"description":"Input for the browse_docs tool.","properties":{"path":{"default":"","description":"Path to browse. Empty for root, 'dir' for contents, 'dir/file.md' for file.","title":"Path","type":"string"}},"title":"BrowseDocsInput","type":"object"},"outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"title":"BrowseDocsStructuredContent","type":"object","x-fastmcp-wrap-result":true},"annotations":{"title":"Browse docs","readOnlyHint":true,"destructiveHint":false,"openWorldHint":false},"_meta":{"fastmcp":{"tags":["auth_api_key"]}}},{"name":"search_schemas","title":"Search schemas","description":"Search schemas or fetch one schema entry by id.\n\n`query` runs the chosen `search_mode` against the prebuilt schema index. `id`\nfetches a single entry by its dotted table id (e.g. `ethereum.public.transactions`).\nProvide exactly one.\n\nWrite `query` as a few keywords, e.g. `ethereum dex trades` or `solana token\ntransfers`. Pass `database` to restrict hits to one chain. Long sentences\ndilute the ranking.\n\nFor query searches, keep `include_content=False` unless full schema markdown is\nrequired. Search results are for discovery and ranking; full markdown can make\nresult payloads too large. Keep the default `limit` for discovery and use\n`limit=1-3` when `include_content=True`.\n\nWithout `database`, hits are one per `schema.table`: the best-ranked database's\ncopy is returned and `other_databases` lists the other databases (chains) that\nhave the same table. Fetch a specific copy with `id=\"..
\"`.\n\nEach hit reports `deprecated`, and `replacement_table` when the retired table\nnames one.","inputSchema":{"description":"Input for the search_schemas tool.","properties":{"query":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Search query against table identifiers + body. Mutually exclusive with `id`. Use natural keywords (e.g. table names, schemas, tags, descriptive terms from the table's purpose). Ranking semantics depend on `search_mode`.","title":"Query"},"id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Fetch one schema entry by table id (the dotted `..
` form returned in a prior hit). Bypasses search; returns a single hit with markdown content populated. Mutually exclusive with `query`.","title":"Id"},"include_content":{"default":false,"description":"Include the full markdown body for each hit. Off by default for query search so result payloads stay small. Keep `False` for discovery/ranking searches. Set to `True` when you need full schema details, and then use a small `limit` (1-3). Always on when `id` is set.","title":"Include Content","type":"boolean"},"limit":{"default":10,"description":"Max distinct tables returned for a query. Ignored when `id` is set. Keep the default for discovery searches. Use 1-3 when `include_content=True` to avoid oversized tool results.","maximum":20,"minimum":1,"title":"Limit","type":"integer"},"search_mode":{"enum":["basic","advanced"],"title":"SearchMode","type":"string","default":"basic","description":"Which search mode to use. Use `basic` by default or `advanced` when basic results are insufficient."},"database":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Restrict a query search to one database (chain), e.g. `ethereum`. Set it whenever the chain is known: hits then come from that chain only. Ignored when `id` is set.","title":"Database"}},"title":"KnowledgeBaseSearchInput","type":"object"},"outputSchema":{"description":"The search_schemas response.","properties":{"status":{"enum":["ok","indexing","disabled"],"title":"Status","type":"string"},"hits":{"items":{"description":"Slim, typed view of one schema-index document for the LLM agent.","properties":{"id":{"title":"Id","type":"string"},"database_name":{"title":"Database Name","type":"string"},"schema_name":{"title":"Schema Name","type":"string"},"table_name":{"title":"Table Name","type":"string"},"type":{"title":"Type","type":"string"},"description":{"default":"","title":"Description","type":"string"},"row_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Row Count"},"has_samples":{"default":false,"title":"Has Samples","type":"boolean"},"deprecated":{"default":false,"title":"Deprecated","type":"boolean"},"replacement_table":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Replacement Table"},"tags":{"items":{"type":"string"},"title":"Tags","type":"array"},"other_databases":{"items":{"type":"string"},"title":"Other Databases","type":"array"},"score":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"title":"Score"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Content"}},"required":["id","database_name","schema_name","table_name","type"],"title":"KnowledgeBaseHit","type":"object"},"title":"Hits","type":"array"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Message"}},"required":["status"],"title":"KnowledgeBaseSearchResult","type":"object"},"annotations":{"title":"Search schemas","readOnlyHint":true,"destructiveHint":false,"openWorldHint":false},"_meta":{"fastmcp":{"tags":["auth_api_key"]}}},{"name":"search_terminal","title":"Terminal Search","description":"Search Allium's published `/terminal/` dashboards. Returns\nranked discovery details and optionally rendered dashboard content, without SQL\nor result rows. Use `include_content=True` with a small `limit` when full context\nis needed, and provide the dashboard link for its charts and explanations.\nFor a user's Explorer dashboards at `/analyze/dashboards/`, use\nsearch_dashboards.","inputSchema":{"description":"Input for the search_terminal tool.","properties":{"query":{"description":"What to find among public Allium Terminal dashboards: a topic, user intent, chart title, metric, tag, category, protocol, or chain. Ranking depends on `search_mode`.","title":"Query","type":"string"},"search_mode":{"enum":["basic","advanced"],"title":"SearchMode","type":"string","default":"basic","description":"Search mode to use. Use `basic` by default or `advanced` when basic results are insufficient."},"include_content":{"default":false,"description":"Set True if the full content of the dashboard is required.","title":"Include Content","type":"boolean"},"limit":{"default":5,"description":"Max hits (1-20). Use 3-5 for discovery, 1-3 with content.","maximum":20,"minimum":1,"title":"Limit","type":"integer"}},"required":["query"],"title":"TerminalSearchInput","type":"object"},"outputSchema":{"description":"The search_terminal response: status, index version, and ranked hits.","properties":{"status":{"enum":["ok","indexing","disabled"],"title":"Status","type":"string"},"index_version":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Index Version"},"hits":{"items":{"description":"A retrieved Terminal KB record plus its rank score and optional body.","properties":{"record_id":{"title":"Record Id","type":"string"},"label":{"title":"Label","type":"string"},"description":{"default":"","title":"Description","type":"string"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Category"},"type":{"title":"Type","type":"string"},"slug":{"title":"Slug","type":"string"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Status"},"gate":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Gate"},"canonical_path":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Canonical Path"},"score":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"title":"Score"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Content"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Url"}},"required":["record_id","label","type","slug"],"title":"TerminalSearchHit","type":"object"},"title":"Hits","type":"array"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Message"}},"required":["status"],"title":"TerminalSearchResult","type":"object"},"annotations":{"title":"Terminal Search","readOnlyHint":true,"destructiveHint":false,"openWorldHint":false},"_meta":{"fastmcp":{"tags":["auth_api_key"]}}},{"name":"get_terminal_results","title":"Get Terminal Results","description":"Fetch SQL or latest precomputed result rows for one Terminal dashboard chart.\n\nUse search_terminal first to find a dashboard id, then call get_terminal_results without\nchart_id for the chart manifest. Call again with chart_id and mode=\"queries\" for\nSQL, mode=\"results\" for capped latest rows, or mode=\"both\" for SQL plus rows.\nWhen returning or citing result values, state `result.queried_at` when present\nso the user knows when the precomputed Terminal result was last generated.\nThis never uses compute units; it only reads existing query definitions and\nresults from Terminal.","inputSchema":{"description":"Input for the get_terminal_results tool.","properties":{"dashboard_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Terminal dashboard id from search_terminal. An Explorer `/analyze/dashboards/` id does not work here.","title":"Dashboard Id"},"query":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Free-text dashboard lookup. Resolves to the top visible hit.","title":"Query"},"chart_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Chart id from manifest mode. Omit to list charts.","title":"Chart Id"},"mode":{"default":"queries","description":"With chart_id: use queries for SQL only, results for rows only, or both for SQL plus rows.","enum":["queries","results","both"],"title":"Mode","type":"string"},"max_rows":{"default":20,"description":"Maximum result rows to return for mode=results or mode=both.","maximum":100,"minimum":1,"title":"Max Rows","type":"integer"}},"title":"TerminalQueryInput","type":"object"},"outputSchema":{"description":"The get_terminal_results response.","properties":{"status":{"enum":["manifest","queries","results","no_result","not_found","indexing"],"title":"Status","type":"string"},"index_version":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Index Version"},"dashboard_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Dashboard Id"},"dashboard_url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Dashboard Url"},"charts":{"items":{"description":"A query-backed chart plus nearby explanatory text from its dashboard section.","properties":{"chart_id":{"title":"Chart Id","type":"string"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Description"},"chart_type":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Chart Type"},"query_id":{"title":"Query Id","type":"string"},"open_url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Open Url"},"context":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Context"}},"required":["chart_id","query_id"],"title":"TerminalQueryChart","type":"object"},"title":"Charts","type":"array"},"chart_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Chart Id"},"query_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Query Id"},"sql":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Sql"},"result":{"anyOf":[{"description":"Capped latest precomputed rows for a chart query.","properties":{"columns":{"items":{"type":"string"},"title":"Columns","type":"array"},"total_rows":{"title":"Total Rows","type":"integer"},"rows":{"items":{"additionalProperties":true,"type":"object"},"title":"Rows","type":"array"},"truncated":{"title":"Truncated","type":"boolean"},"run_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Run Id"},"queried_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"default":null,"title":"Queried At"}},"required":["columns","total_rows","rows","truncated"],"title":"TerminalQueryRows","type":"object"},{"type":"null"}],"default":null},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Message"}},"required":["status"],"title":"TerminalQueryResult","type":"object"},"annotations":{"title":"Get Terminal Results","readOnlyHint":true,"destructiveHint":false,"openWorldHint":false},"_meta":{"fastmcp":{"tags":["auth_api_key"]}}},{"name":"run_sql_query","title":"Run SQL query","description":"Run an ephemeral, throwaway SQL query on Allium's blockchain data.\n\n**Call `get_skill(name=\"sql-optimization\")` before writing or running any SQL.**\n\nUse ONLY when the result is not reused — inspecting sample rows, checking distinct values,\nanswering a single ad-hoc question. The run is not saved and cannot be referenced by a chart\nor dashboard.\n\nIf the output might feed a chart/dashboard or be re-run later, start with\ncreate_explorer_query(run_on_creation=True) instead; running here first and re-saving the same\nSQL duplicates the compute.\n\nReturns a run_id immediately; use get_query_run_results to poll and retrieve results. The query\nis sanitized and row-limited per the caller's policy.\n\nIMPORTANT: When prepare_sql is available, validate queries before running them.","inputSchema":{"description":"Input for the run_sql_query tool.","properties":{"sql":{"description":"The SQL query to execute","title":"Sql","type":"string"},"compute_profile":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Optional compute profile to use for query execution. For assistant sessions, the user-selected session compute profile takes precedence.","title":"Compute Profile"}},"required":["sql"],"title":"RunSqlQueryInput","type":"object"},"outputSchema":{"description":"Result of queuing a SQL query.","properties":{"run_id":{"title":"Run Id","type":"string"},"status":{"title":"Status","type":"string"},"sql":{"title":"Sql","type":"string"}},"required":["run_id","status","sql"],"title":"RunSqlQueryResult","type":"object"},"annotations":{"title":"Run SQL query","readOnlyHint":false,"destructiveHint":false,"openWorldHint":false},"_meta":{"fastmcp":{"tags":["auth_api_key","billing_currency:explorer_units","is_billed"]}}},{"name":"get_query_run_results","title":"Get query run results","description":"Get status and results for an ad hoc or saved Explorer query run.\nReturns columns, rows, total `row_count`, and `cost_explorer_units` when complete;\n`row_limit` may return fewer rows than `row_count`. By default this checks once.\nSet `poll_timeout_seconds` to wait, then call again if still queued or running.\nWhile queued, `queue_status` shows org-wide queue counts for its compute profile.\n\nCheck failures and zero-row results before answering; zero rows may itself answer\nthe question. For useful saved-query data, create_explorer_visual can render a\nvisual unless the user wants only raw data, SQL, or a single value.","inputSchema":{"description":"Input for the get_query_run_results tool.","properties":{"run_id":{"description":"The run ID returned from running a query","title":"Run Id","type":"string"},"poll_timeout_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"If provided, poll for results up to this many seconds (max 180). If omitted, null, or 0, check once and return immediately.","title":"Poll Timeout Seconds"},"row_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":1000,"description":"Maximum number of data rows to return. Defaults to 1000. Pass null or 0 for no tool-side truncation.","title":"Row Limit"}},"required":["run_id"],"title":"GetQueryRunResultsInput","type":"object"},"outputSchema":{"description":"Response from get_query_run_results tool.","properties":{"run_id":{"title":"Run Id","type":"string"},"query_id":{"title":"Query Id","type":"string"},"status":{"title":"Status","type":"string"},"sql":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Sql"},"columns":{"anyOf":[{"items":{"description":"Column metadata for a query result.","properties":{"name":{"title":"Name","type":"string"},"type":{"title":"Type","type":"string"}},"required":["name","type"],"title":"QueryFieldInfo","type":"object"},"type":"array"},{"type":"null"}],"default":null,"title":"Columns"},"row_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Row Count"},"row_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Row Limit"},"data":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"default":null,"title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Error"},"warning":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Warning"},"cost_explorer_units":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"title":"Cost Explorer Units"},"queue_status":{"anyOf":[{"properties":{"queued":{"title":"Queued","type":"integer"},"running":{"title":"Running","type":"integer"}},"required":["queued","running"],"title":"QueryRunPendingCounts","type":"object"},{"type":"null"}],"default":null}},"required":["run_id","query_id","status"],"title":"GetQueryRunResultsResult","type":"object"},"annotations":{"title":"Get query run results","readOnlyHint":true,"destructiveHint":false,"openWorldHint":false},"_meta":{"fastmcp":{"tags":["auth_api_key"]}}},{"name":"create_explorer_query","title":"Create Explorer query","description":"Create and save a SQL query in the user's Allium Explorer.\n\n**Call `get_skill(name=\"sql-optimization\")` before writing or running any SQL.**\n\nThe DEFAULT path whenever the result will be reused — visual/dashboard data source, permalink, or\nan expensive query to re-run later. Visuals and dashboards reference the saved query_id, so start\nhere; do NOT run_sql_query first and re-save, which duplicates the compute.\n\nrun_on_creation=True queues the run and returns its `initial_run_id`; the rows are NOT ready when\nthis call returns. Poll get_query_run_results(run_id=initial_run_id, poll_timeout_seconds=180) and\nwait for rows before building a visual or dashboard on the query; leaving poll_timeout_seconds off\nchecks once and returns immediately. A visual created on a run that has not finished renders blank.\n\nUse run_sql_query instead only for throwaway one-off exploration nothing downstream consumes.\n\nLeave run_on_creation=False for templates, drafts, or saves that should not execute yet.","inputSchema":{"description":"Input for the create_explorer_query tool.","properties":{"sql":{"description":"The SQL query to save","title":"Sql","type":"string"},"title":{"description":"Query title","title":"Title","type":"string"},"compute_profile":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Optional compute profile to save with the query. For assistant sessions, the user-selected session compute profile takes precedence.","title":"Compute Profile"},"tags":{"items":{"type":"string"},"title":"Tags","type":"array"},"run_on_creation":{"default":false,"description":"Queue a run as soon as the query is saved. The run is asynchronous — the result carries its `initial_run_id` to poll with get_query_run_results.","title":"Run On Creation","type":"boolean"}},"required":["sql","title"],"title":"CreateExplorerQueryInput","type":"object"},"outputSchema":{"description":"Response from create_explorer_query tool.","properties":{"query_id":{"title":"Query Id","type":"string"},"title":{"title":"Title","type":"string"},"status":{"title":"Status","type":"string"},"url":{"title":"Url","type":"string"},"initial_run_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Initial Run Id"}},"required":["query_id","title","status","url"],"title":"CreateExplorerQueryResult","type":"object"},"annotations":{"title":"Create Explorer query","readOnlyHint":false,"destructiveHint":false,"openWorldHint":false},"_meta":{"fastmcp":{"tags":["auth_api_key","billing_currency:explorer_units","is_billed"]}}},{"name":"get_explorer_query","title":"Get Explorer query","description":"Retrieve a saved Explorer query by ID.\n\nReturns the full SQL, row limit, template parameters, tags, URL, and latest result field metadata when available.\nUse this to inspect a query before editing or running it.\n\n`visuals` lists every visual saved on the query, IDs only. Pass a `visual_id` to\ncreate_explorer_visual to edit that visual, omit it to add one, or call get_explorer_visual for its\nfull config.","inputSchema":{"description":"Input for the get_explorer_query tool.","properties":{"query_id":{"description":"The ID of the query to retrieve","title":"Query Id","type":"string"}},"required":["query_id"],"title":"GetExplorerQueryInput","type":"object"},"outputSchema":{"description":"Response from get_explorer_query tool.","properties":{"query_id":{"title":"Query Id","type":"string"},"title":{"title":"Title","type":"string"},"sql":{"title":"Sql","type":"string"},"url":{"title":"Url","type":"string"},"limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Limit"},"parameters":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"default":null,"title":"Parameters"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null,"title":"Tags"},"fields":{"anyOf":[{"items":{"description":"Column metadata for a query result.","properties":{"name":{"title":"Name","type":"string"},"type":{"title":"Type","type":"string"}},"required":["name","type"],"title":"QueryFieldInfo","type":"object"},"type":"array"},{"type":"null"}],"default":null,"title":"Fields"},"visuals":{"anyOf":[{"items":{"description":"Identity of a visual saved on a query; its config comes from\nget_explorer_visual.","properties":{"visual_id":{"title":"Visual Id","type":"string"},"title":{"title":"Title","type":"string"},"subtitle":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Subtitle"},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Type"},"updated_on":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"default":null,"title":"Updated On"}},"required":["visual_id","title"],"title":"VisualInfo","type":"object"},"type":"array"},{"type":"null"}],"default":null,"title":"Visuals"}},"required":["query_id","title","sql","url"],"title":"GetExplorerQueryResult","type":"object"},"annotations":{"title":"Get Explorer query","readOnlyHint":true,"destructiveHint":false,"openWorldHint":false},"_meta":{"fastmcp":{"tags":["auth_api_key"]}}},{"name":"update_explorer_query","title":"Update Explorer query","description":"Update an existing Explorer query. Requires query_id.\n\nOnly provide fields you want to change - others will be preserved.","inputSchema":{"description":"Input for the update_explorer_query tool.","properties":{"query_id":{"description":"The ID of the query to update","title":"Query Id","type":"string"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"New title for the query (optional)","title":"Title"},"sql":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"New SQL for the query (optional)","title":"Sql"},"compute_profile":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"New compute profile to save with the query (optional)","title":"Compute Profile"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null,"description":"New tags for the query (optional)","title":"Tags"}},"required":["query_id"],"title":"UpdateExplorerQueryInput","type":"object"},"outputSchema":{"description":"Response from update_explorer_query tool.","properties":{"query_id":{"title":"Query Id","type":"string"},"title":{"title":"Title","type":"string"},"status":{"title":"Status","type":"string"},"url":{"title":"Url","type":"string"}},"required":["query_id","title","status","url"],"title":"UpdateExplorerQueryResult","type":"object"},"annotations":{"title":"Update Explorer query","readOnlyHint":false,"destructiveHint":true,"openWorldHint":false},"_meta":{"fastmcp":{"tags":["auth_api_key","is_billed"]}}},{"name":"list_explorer_queries","title":"List Explorer queries","description":"List user's saved Explorer queries with field metadata and tags.\n\nUse the tags parameter to filter queries by tag (e.g., to find all queries tagged for a specific dashboard or topic).","inputSchema":{"description":"Input for the list_explorer_queries tool.","properties":{"search":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Search by title","title":"Search"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null,"description":"Filter queries by tags. Returns queries that have at least one of the specified tags.","title":"Tags"},"limit":{"default":50,"title":"Limit","type":"integer"}},"title":"ListExplorerQueriesInput","type":"object"},"outputSchema":{"description":"Response from list_explorer_queries tool.","properties":{"queries":{"items":{"description":"Summary of an explorer query.","properties":{"query_id":{"title":"Query Id","type":"string"},"title":{"title":"Title","type":"string"},"sql":{"title":"Sql","type":"string"},"url":{"title":"Url","type":"string"},"limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Limit"},"parameters":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"default":null,"title":"Parameters"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null,"title":"Tags"},"fields":{"anyOf":[{"items":{"description":"Column metadata for a query result.","properties":{"name":{"title":"Name","type":"string"},"type":{"title":"Type","type":"string"}},"required":["name","type"],"title":"QueryFieldInfo","type":"object"},"type":"array"},{"type":"null"}],"default":null,"title":"Fields"}},"required":["query_id","title","sql","url"],"title":"ExplorerQueryInfo","type":"object"},"title":"Queries","type":"array"},"count":{"title":"Count","type":"integer"}},"required":["queries","count"],"title":"ListExplorerQueriesResult","type":"object"},"annotations":{"title":"List Explorer queries","readOnlyHint":true,"destructiveHint":false,"openWorldHint":false},"_meta":{"fastmcp":{"tags":["auth_api_key"]}}},{"name":"run_explorer_query","title":"Run Explorer query","description":"Run an existing saved Explorer query by ID.\n\nQueues the query for execution and returns a run_id. Use get_query_run_results to wait for results\nor for a non-blocking status check.","inputSchema":{"description":"Input for the run_explorer_query tool.","properties":{"query_id":{"description":"The ID of the query to run","title":"Query Id","type":"string"},"parameters":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"default":null,"description":"Parameters for query templates using {{parameter_name}} syntax.","title":"Parameters"},"compute_profile":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Optional compute profile to use for this run. For assistant sessions, the user-selected session compute profile takes precedence.","title":"Compute Profile"}},"required":["query_id"],"title":"RunExplorerQueryInput","type":"object"},"outputSchema":{"description":"Response from run_explorer_query tool.","properties":{"query_id":{"title":"Query Id","type":"string"},"title":{"title":"Title","type":"string"},"run_id":{"title":"Run Id","type":"string"},"status":{"title":"Status","type":"string"},"url":{"title":"Url","type":"string"}},"required":["query_id","title","run_id","status","url"],"title":"RunExplorerQueryResult","type":"object"},"annotations":{"title":"Run Explorer query","readOnlyHint":false,"destructiveHint":false,"openWorldHint":false},"_meta":{"fastmcp":{"tags":["auth_api_key","billing_currency:explorer_units","is_billed"]}}},{"name":"delete_explorer_query","title":"Delete Explorer query","description":"Permanently delete an Explorer query by ID.","inputSchema":{"description":"Input for deleting an explorer query.","properties":{"query_id":{"description":"ID of the query to delete","title":"Query Id","type":"string"}},"required":["query_id"],"title":"DeleteExplorerQueryInput","type":"object"},"outputSchema":{"description":"Result of deleting an explorer query.","properties":{"query_id":{"title":"Query Id","type":"string"},"status":{"title":"Status","type":"string"}},"required":["query_id","status"],"title":"DeleteExplorerQueryResult","type":"object"},"annotations":{"title":"Delete Explorer query","readOnlyHint":false,"destructiveHint":true,"openWorldHint":false},"_meta":{"fastmcp":{"tags":["auth_api_key","is_billed"]}}},{"name":"create_explorer_visual","title":"Create or replace Explorer visual","description":"Create or replace a visual on an existing Allium Explorer query. Visuals are\npersisted to the caller's account and render on the query page; the returned\n`url` deep-links to the visual this call wrote.\n\nA query can hold several visuals, each with its own `visual_id`. Call\nget_explorer_query first to see what is already there. Two ways to call this:\n- Omit `visual_id` — adds a new visual alongside any existing ones.\n- Pass `visual_id` — replaces that one visual in place. This is how you edit a\n visual; omitting `visual_id` would add a duplicate instead.\n\nChoose `spec.type` based on the shape of the data:\n- \"chart\" — line, bar, or area over an x axis (typically time).\n- \"value\" — a single big number, with an optional comparison to a prior period.\n- \"table\" — tabular rows with optional per-column formatting and heatmap shading.\n- \"pie\" — share-of-total across categories (pie, donut, or\n donut-with-center-value).\n- \"sankey\" — directional flow between two or more entity columns.\n- \"treemap\" — nested rectangles sized by a numeric value.\n- \"scatter\" — two numeric axes with optional point size and color encodings.\n- \"map\" — country or region choropleth keyed on a location field.\n- \"chord\" — pairwise flows between two columns (alternative to sankey).\n\nCall get_skill(name='explorer-visuals') first for general advice, then\nget_skill(name='explorer-visuals', reference_title=) for the exact JSON\nschema for `spec` of the chosen type. Editor permission on the query is required.\n\nTwo things make a visual render blank, both checkable before calling:\n- The query has no finished run. Queueing one (create_explorer_query with\n run_on_creation=True, or run_explorer_query) does not wait for it — poll\n get_query_run_results with a non-zero poll_timeout_seconds and only build the\n visual once it returns rows.\n- Field names in `spec` (axes, columns, filters, aggregates) that the query's\n result set doesn't have.\n\nOnce the visual is created, offer to share it — call share_explorer_query(mode=\"chart\", visual_id=...) to get a public link the user can send around.","inputSchema":{"properties":{"query_id":{"description":"The ID of the saved explorer query to attach it to.","title":"Query Id","type":"string"},"title":{"description":"Title shown above the visual.","title":"Title","type":"string"},"spec":{"additionalProperties":true,"description":"Visual configuration. The `type` field selects the variant (chart, value, table, pie, sankey, treemap, scatter, map, chord); remaining fields depend on the chosen type. Call get_skill(name='explorer-visuals') first for general advice on building visuals, then get_skill(name='explorer-visuals', reference_title=) for the exact JSON schema before constructing this.","title":"Spec","type":"object"},"subtitle":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Optional subtitle shown beneath the title.","title":"Subtitle"},"visual_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Omit to add a new visual to the query. Pass a `visual_id` from get_explorer_query's `visuals` list to replace that one in place.","title":"Visual Id"}},"required":["query_id","title","spec"],"title":"CreateExplorerVisualInput","type":"object"},"outputSchema":{"properties":{"visual_id":{"title":"Visual Id","type":"string"},"query_id":{"title":"Query Id","type":"string"},"url":{"title":"Url","type":"string"}},"required":["visual_id","query_id","url"],"title":"CreateExplorerVisualResult","type":"object"},"annotations":{"title":"Create or replace Explorer visual","readOnlyHint":false,"destructiveHint":true,"openWorldHint":false},"_meta":{"fastmcp":{"tags":["auth_api_key"]}}},{"name":"get_explorer_visual","title":"Get Explorer Visual","description":"Read one visual saved on an Allium Explorer query, including its full `spec`.\n\nUse this to tweak a field of an existing visual, or to match its style in a new\none — get_explorer_query lists a query's visuals, and this returns the config of\nwhichever one you name. To change what you read back, pass the same `visual_id`\nto create_explorer_visual with the edited `spec`.\n\nA null `type` means a legacy config that predates the current format: build a\nfresh `spec` for it rather than editing what you read back, which won't\nvalidate.","inputSchema":{"properties":{"visual_id":{"description":"The ID of the visual to read, from get_explorer_query's `visuals`.","title":"Visual Id","type":"string"}},"required":["visual_id"],"title":"GetExplorerVisualInput","type":"object"},"outputSchema":{"properties":{"visual_id":{"title":"Visual Id","type":"string"},"query_id":{"title":"Query Id","type":"string"},"title":{"title":"Title","type":"string"},"subtitle":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Subtitle"},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Type"},"spec":{"additionalProperties":true,"title":"Spec","type":"object"},"url":{"title":"Url","type":"string"}},"required":["visual_id","query_id","title","spec","url"],"title":"GetExplorerVisualResult","type":"object"},"annotations":{"title":"Get Explorer Visual","readOnlyHint":true,"destructiveHint":false,"openWorldHint":false},"_meta":{"fastmcp":{"tags":["auth_api_key"]}}},{"name":"delete_explorer_visual","title":"Delete Explorer Visual","description":"Delete one visual from an Allium Explorer query. The query and its other\nvisuals are untouched.\n\nGet the `visual_id` from get_explorer_query's `visuals`. Editor permission on the\nquery is required, and this cannot be undone — to change a visual instead of\nremoving it, pass its `visual_id` to create_explorer_visual with a new `spec`.","inputSchema":{"properties":{"visual_id":{"description":"The ID of the visual to delete, from get_explorer_query's `visuals`.","title":"Visual Id","type":"string"}},"required":["visual_id"],"title":"DeleteExplorerVisualInput","type":"object"},"outputSchema":{"properties":{"visual_id":{"title":"Visual Id","type":"string"},"query_id":{"title":"Query Id","type":"string"}},"required":["visual_id","query_id"],"title":"DeleteExplorerVisualResult","type":"object"},"annotations":{"title":"Delete Explorer Visual","readOnlyHint":false,"destructiveHint":true,"openWorldHint":false},"_meta":{"fastmcp":{"tags":["auth_api_key"]}}},{"name":"list_compute_profiles","title":"List compute profiles","description":"List the organization's Explorer compute profiles with each\nprofile's org-wide `queued` and `running` query counts. Each profile has its own\nwarehouse and its own queue, shared across the org but isolated from the other\nprofiles, so a query sent to a less contended profile starts sooner. Pass a\nprofile's `identifier` as `compute_profile` to run_sql_query or\nrun_explorer_query, and prefer the profile with the lowest `queued`. The profile\nwith `is_default=true` is used when no profile is specified.","inputSchema":{"type":"object","properties":{}},"outputSchema":{"description":"Response from the list_compute_profiles tool.","properties":{"compute_profiles":{"items":{"description":"An org's Explorer compute profile and its current queue depth.\n\nThe customer-facing view of ExplorerComputeProfile: no warehouse name, queue\nname, or organization id.","properties":{"identifier":{"title":"Identifier","type":"string"},"name":{"title":"Name","type":"string"},"size":{"description":"Customer-facing compute size: a speed multiplier over the base warehouse.\n\nSnowflake warehouse sizes double per step. Allium surfaces this as a\nspeed/credit multiplier in its docs and settings rather than the Snowflake\nsize name, so expose the multiplier to match what customers see.","enum":["1x","2x","4x","8x","16x"],"title":"ComputeSizeMultiplier","type":"string"},"is_default":{"title":"Is Default","type":"boolean"},"queued":{"title":"Queued","type":"integer"},"running":{"title":"Running","type":"integer"}},"required":["identifier","name","size","is_default","queued","running"],"title":"ComputeProfileInfo","type":"object"},"title":"Compute Profiles","type":"array"}},"required":["compute_profiles"],"title":"ListComputeProfilesResult","type":"object"},"annotations":{"title":"List compute profiles","readOnlyHint":true,"destructiveHint":false,"openWorldHint":false},"_meta":{"fastmcp":{"tags":["auth_api_key"]}}},{"name":"read_dashboard","title":"Read dashboard","description":"Inspect a dashboard at any depth.\n\nPass `dashboard_id` alone for a root summary (name, settings, list of pages).\nAdd `page_id` / `section_id` / `element_id` to drill down — each level returns\nthe targeted node plus its immediate children's summaries (never a full subtree).\nAt element depth the full typed config is returned.\n\nReads Explorer dashboards (URL `/analyze/dashboards/{dashboard_id}`), which are\nuser-created. The id is the path segment after `/analyze/dashboards/`. Never use\nthis tool for a `/terminal/...` URL; use get_terminal_results instead.","inputSchema":{"properties":{"dashboard_id":{"title":"Dashboard Id","type":"string"},"page_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Page Id"},"section_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Section Id"},"element_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Element Id"}},"required":["dashboard_id"],"title":"DashboardReadInput","type":"object"},"outputSchema":{"anyOf":[{"properties":{"kind":{"const":"dashboard","title":"Kind","type":"string"},"dashboard_id":{"title":"Dashboard Id","type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Name"},"settings":{"anyOf":[{"additionalProperties":true,"properties":{"download_enabled":{"default":false,"title":"Download Enabled","type":"boolean"},"fork_enabled":{"default":false,"title":"Fork Enabled","type":"boolean"},"colors":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null,"title":"Colors"}},"title":"DashboardSettings","type":"object"},{"type":"null"}],"default":null},"pages":{"items":{"properties":{"page_id":{"title":"Page Id","type":"string"},"name":{"title":"Name","type":"string"},"order":{"title":"Order","type":"integer"}},"required":["page_id","name","order"],"title":"PageSummary","type":"object"},"title":"Pages","type":"array"}},"required":["kind","dashboard_id","pages"],"title":"DashboardView","type":"object"},{"properties":{"kind":{"const":"page","title":"Kind","type":"string"},"page_id":{"title":"Page Id","type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Name"},"order":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Order"},"sections":{"items":{"properties":{"section_id":{"title":"Section Id","type":"string"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Title"},"layout":{"anyOf":[{"properties":{"x":{"default":0,"description":"X position in the grid (0-11)","title":"X","type":"integer"},"y":{"default":0,"description":"Y position in the grid","title":"Y","type":"integer"},"w":{"default":6,"description":"Width in grid columns (1-12)","title":"W","type":"integer"},"h":{"default":4,"description":"Height in grid rows","title":"H","type":"integer"}},"title":"GridPlacement","type":"object"},{"type":"null"}],"default":null}},"required":["section_id"],"title":"SectionSummary","type":"object"},"title":"Sections","type":"array"}},"required":["kind","page_id","sections"],"title":"PageView","type":"object"},{"properties":{"kind":{"const":"section","title":"Kind","type":"string"},"section_id":{"title":"Section Id","type":"string"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Title"},"layout":{"anyOf":[{"properties":{"x":{"default":0,"description":"X position in the grid (0-11)","title":"X","type":"integer"},"y":{"default":0,"description":"Y position in the grid","title":"Y","type":"integer"},"w":{"default":6,"description":"Width in grid columns (1-12)","title":"W","type":"integer"},"h":{"default":4,"description":"Height in grid rows","title":"H","type":"integer"}},"title":"GridPlacement","type":"object"},{"type":"null"}],"default":null},"elements":{"items":{"properties":{"element_id":{"title":"Element Id","type":"string"},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Type"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Title"},"layout":{"anyOf":[{"properties":{"x":{"default":0,"description":"X position in the grid (0-11)","title":"X","type":"integer"},"y":{"default":0,"description":"Y position in the grid","title":"Y","type":"integer"},"w":{"default":6,"description":"Width in grid columns (1-12)","title":"W","type":"integer"},"h":{"default":4,"description":"Height in grid rows","title":"H","type":"integer"}},"title":"GridPlacement","type":"object"},{"type":"null"}],"default":null}},"required":["element_id"],"title":"ElementSummary","type":"object"},"title":"Elements","type":"array"}},"required":["kind","section_id","elements"],"title":"SectionView","type":"object"},{"properties":{"kind":{"const":"element","title":"Kind","type":"string"},"element_id":{"title":"Element Id","type":"string"},"layout":{"anyOf":[{"properties":{"x":{"default":0,"description":"X position in the grid (0-11)","title":"X","type":"integer"},"y":{"default":0,"description":"Y position in the grid","title":"Y","type":"integer"},"w":{"default":6,"description":"Width in grid columns (1-12)","title":"W","type":"integer"},"h":{"default":4,"description":"Height in grid rows","title":"H","type":"integer"}},"title":"GridPlacement","type":"object"},{"type":"null"}],"default":null},"config":{"anyOf":[{"anyOf":[{"additionalProperties":true,"properties":{"query_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Saved Explorer query the element binds to. Required for data-driven element types — without it the chart renders empty with 'missing query ID'. Stored snake_case; the FE camelizes the whole config on read.","title":"Query Id"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Description"},"info_url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Optional URL surfaced via an info icon next to the title.","title":"Info Url"},"info_tooltip":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Optional tooltip text surfaced via an info icon next to the title.","title":"Info Tooltip"},"type":{"const":"chart","title":"Type","type":"string"},"colors":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null,"description":"Top-level hex color palette cycled across y-axes when no per-axis `color` is set.","title":"Colors"},"x_axis":{"additionalProperties":true,"properties":{"field":{"description":"Column name from the query result to plot on the x-axis.","title":"Field","type":"string"},"time_bucket":{"anyOf":[{"enum":["minute","hour","day","week","month","quarter","year"],"title":"TimeBucket","type":"string"},{"type":"null"}],"default":null,"description":"Granularity for bucketing time values. Only meaningful when the field is a time column."},"sort_by":{"anyOf":[{"enum":["x","y"],"type":"string"},{"type":"null"}],"default":null,"description":"Sort the x-axis ticks by their raw x value (\"x\") or by the aggregated y value at each tick (\"y\").","title":"Sort By"},"sort_direction":{"anyOf":[{"enum":["asc","desc"],"type":"string"},{"type":"null"}],"default":null,"title":"Sort Direction"},"format":{"anyOf":[{"enum":["short","medium","long","month_year","year","iso"],"title":"DateFormat","type":"string"},{"type":"null"}],"default":null,"description":"Date display format for tick labels. Only applies when the field is a time column."},"label_format":{"anyOf":[{"enum":["default","title_case","sentence_case","entity","entity_no_logo"],"title":"LabelFormat","type":"string"},{"type":"null"}],"default":null},"use_entity_display":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"Render tick labels as Allium entities (badges) when the column is an entity column.","title":"Use Entity Display"},"show_entity_logos":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"When `use_entity_display` is on, also show entity logos next to badges.","title":"Show Entity Logos"},"enable_quarter":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"Allow \"quarter\" as an option in the on-chart time-bucket selector.","title":"Enable Quarter"},"show_time_bucket_selector":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"Render an interactive time-bucket picker on the chart so viewers can change granularity. No effect outside time x-axes.","title":"Show Time Bucket Selector"}},"required":["field"],"title":"XAxisConfig","type":"object"},"y_axes":{"items":{"additionalProperties":true,"properties":{"id":{"description":"Unique identifier within the chart's `y_axes` list. Any stable string works (e.g. \"y1\").","title":"Id","type":"string"},"chart_type":{"anyOf":[{"enum":["line","bar","area","bar-horizontal"],"type":"string"},{"type":"null"}],"default":null,"description":"Render type for this series, constrained by the X-axis data type: \"bar\" works for any X (temporal or categorical); \"line\"/\"area\" require a continuous (temporal) X; \"bar-horizontal\" requires a categorical X. The app enforces this, the backend does not — an invalid combo renders wrong on edit.","title":"Chart Type"},"field":{"description":"Column name from the query result to plot on this y-axis.","title":"Field","type":"string"},"aggregate":{"enum":["none","sum","avg","count","mean","median","min","max","latest","first"],"title":"Aggregation","type":"string"},"stacked":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"Stack this series with other y-axes that share the same `chart_type`.","title":"Stacked"},"is_100_percent":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"When `stacked`, normalize stacks to 100% of the per-x total.","title":"Is 100 Percent"},"format":{"anyOf":[{"enum":["number","compact","currency","percentage"],"title":"NumberFormat","type":"string"},{"type":"null"}],"default":null},"big_number":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"Render this series' aggregate as a big number alongside the chart.","title":"Big Number"},"group_by_field":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Split this series into one sub-series per distinct value of this column. Required for `group_*`, `colors`, and \"Other\" bucketing to take effect.","title":"Group By Field"},"group_label_format":{"anyOf":[{"enum":["default","title_case","sentence_case","entity","entity_no_logo"],"title":"LabelFormat","type":"string"},{"type":"null"}],"default":null},"group_others":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"When grouping, fold all groups beyond the top N (by value) into an \"Other\" bucket. Omit to keep every group.","title":"Group Others"},"group_sort_mode":{"anyOf":[{"enum":["none","name","value"],"type":"string"},{"type":"null"}],"default":null,"description":"How to order groups within the legend and stacks: \"none\", by group \"name\", or by aggregated \"value\".","title":"Group Sort Mode"},"group_sort_direction":{"anyOf":[{"enum":["asc","desc"],"type":"string"},{"type":"null"}],"default":null,"title":"Group Sort Direction"},"group_sort_scope":{"anyOf":[{"enum":["global","per_bar"],"type":"string"},{"type":"null"}],"default":null,"description":"\"global\": single ordering across all x ticks. \"per_bar\": reorder groups within each x tick (bar charts only).","title":"Group Sort Scope"},"other_position":{"anyOf":[{"enum":["first","last"],"type":"string"},{"type":"null"}],"default":null,"description":"Where to place the \"Other\" group when `group_others` is set.","title":"Other Position"},"position":{"anyOf":[{"enum":["left","right","none"],"type":"string"},{"type":"null"}],"default":null,"description":"Axis side: \"left\", \"right\", or \"none\" (hide tick labels).","title":"Position"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Label"},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Hex color (e.g. \"#1f77b4\") for the series. Only applies when `group_by_field` is unset.","title":"Color"},"colors":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null,"description":"Hex colors cycled across groups when `group_by_field` is set.","title":"Colors"},"pattern_theme":{"anyOf":[{"enum":["none","default","geometric","organic","linear","minimal","textured","mixed"],"title":"PatternThemeName","type":"string"},{"type":"null"}],"default":null,"description":"Visual fill pattern. Choose `none` unless visually distinguishing groups for accessibility."},"show_bar_mode_toggle":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"When `chart_type` is \"bar\", render an interactive stacked/100% toggle on the chart so viewers can switch modes.","title":"Show Bar Mode Toggle"}},"required":["id","field","aggregate"],"title":"YAxisSpec","type":"object"},"title":"Y Axes","type":"array"},"filters":{"anyOf":[{"items":{"additionalProperties":true,"properties":{"field":{"description":"Column name from the query result that this filter applies to.","title":"Field","type":"string"},"data_type":{"description":"Column data type (\"string\", \"number\", \"boolean\", \"timestamp\"); informs how `value` is parsed.","title":"Data Type","type":"string"},"op":{"enum":["equal","notEqual","lt","lte","gt","gte","oneOf","notIn"],"title":"DataFilterOp","type":"string"},"value":{"description":"Filter operand. Scalar ops take a primitive; `oneOf`/`notIn` take a list.","title":"Value"},"negated":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"When true, inverts the result of `op`.","title":"Negated"},"disabled":{"anyOf":[{"type":"boolean"},{"type":"string"},{"type":"null"}],"default":null,"description":"When true (or true-bound), the filter is preserved on the spec but not applied.","title":"Disabled"},"include_in_normalize":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"When false, rows matching this filter are excluded from normalize/100% calculations.","title":"Include In Normalize"},"include_in_aggregation":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"When false, rows matching this filter are excluded from aggregations but still appear on the chart.","title":"Include In Aggregation"}},"required":["field","data_type","op","value"],"title":"DataFilterAtom","type":"object"},"type":"array"},{"type":"null"}],"default":null,"description":"Atomic filters applied to the query result before plotting (nested groups not supported here).","title":"Filters"},"should_use_entity_display":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"Spec-level mirror of `XAxisConfig.use_entity_display` — render x-axis values as Allium entities (badges).","title":"Should Use Entity Display"},"show_entity_logos":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"When `should_use_entity_display` is on, also show entity logos.","title":"Show Entity Logos"},"show_target_y_guide":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"Draw a horizontal guide line at the y target value if one is configured downstream.","title":"Show Target Y Guide"},"default_bar_mode":{"anyOf":[{"enum":["bar","100"],"type":"string"},{"type":"null"}],"default":null,"description":"Initial bar mode when the chart renders. \"bar\" = standard stacked bars; \"100\" = stacked normalized to 100%.","title":"Default Bar Mode"},"legend_align":{"anyOf":[{"enum":["top","bottom","left","right"],"type":"string"},{"type":"null"}],"default":null,"description":"Where to place the chart legend relative to the plot area.","title":"Legend Align"}},"required":["type","x_axis","y_axes"],"title":"DashboardXYChartSpec","type":"object"},{"additionalProperties":true,"properties":{"query_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Saved Explorer query the element binds to. Required for data-driven element types — without it the chart renders empty with 'missing query ID'. Stored snake_case; the FE camelizes the whole config on read.","title":"Query Id"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Description"},"info_url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Optional URL surfaced via an info icon next to the title.","title":"Info Url"},"info_tooltip":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Optional tooltip text surfaced via an info icon next to the title.","title":"Info Tooltip"},"type":{"const":"value","title":"Type","type":"string"},"field":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Column name from the query result to aggregate for the displayed value.","title":"Field"},"aggregate":{"anyOf":[{"enum":["none","sum","avg","count","mean","median","min","max","latest","first"],"title":"Aggregation","type":"string"},{"type":"null"}],"default":null},"filters":{"anyOf":[{"items":{"additionalProperties":true,"properties":{"field":{"description":"Column name from the query result that this filter applies to.","title":"Field","type":"string"},"data_type":{"description":"Column data type (\"string\", \"number\", \"boolean\", \"timestamp\"); informs how `value` is parsed.","title":"Data Type","type":"string"},"op":{"enum":["equal","notEqual","lt","lte","gt","gte","oneOf","notIn"],"title":"DataFilterOp","type":"string"},"value":{"description":"Filter operand. Scalar ops take a primitive; `oneOf`/`notIn` take a list.","title":"Value"},"negated":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"When true, inverts the result of `op`.","title":"Negated"},"disabled":{"anyOf":[{"type":"boolean"},{"type":"string"},{"type":"null"}],"default":null,"description":"When true (or true-bound), the filter is preserved on the spec but not applied.","title":"Disabled"},"include_in_normalize":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"When false, rows matching this filter are excluded from normalize/100% calculations.","title":"Include In Normalize"},"include_in_aggregation":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"When false, rows matching this filter are excluded from aggregations but still appear on the chart.","title":"Include In Aggregation"}},"required":["field","data_type","op","value"],"title":"DataFilterAtom","type":"object"},"type":"array"},{"type":"null"}],"default":null,"description":"Atomic filters applied before computing the value.","title":"Filters"},"format":{"anyOf":[{"enum":["number","currency","percentage"],"type":"string"},{"type":"null"}],"default":null,"title":"Format"},"big_number":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"Render the value at the larger \"big number\" type size.","title":"Big Number"},"prefix":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Text shown immediately before the value (e.g. \"$\").","title":"Prefix"},"suffix":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Text shown immediately after the value (e.g. \" txns\").","title":"Suffix"},"decimals":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Number of decimal places to display.","title":"Decimals"},"comparison_field":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Column for the comparison value. When set together with `comparison_aggregate`/`comparison_interval`, displays a delta vs. a prior period alongside the main value.","title":"Comparison Field"},"comparison_aggregate":{"anyOf":[{"enum":["none","sum","avg","count","mean","median","min","max","latest","first"],"title":"Aggregation","type":"string"},{"type":"null"}],"default":null,"description":"Aggregation to apply for the comparison value."},"comparison_filters":{"anyOf":[{"items":{"additionalProperties":true,"properties":{"field":{"description":"Column name from the query result that this filter applies to.","title":"Field","type":"string"},"data_type":{"description":"Column data type (\"string\", \"number\", \"boolean\", \"timestamp\"); informs how `value` is parsed.","title":"Data Type","type":"string"},"op":{"enum":["equal","notEqual","lt","lte","gt","gte","oneOf","notIn"],"title":"DataFilterOp","type":"string"},"value":{"description":"Filter operand. Scalar ops take a primitive; `oneOf`/`notIn` take a list.","title":"Value"},"negated":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"When true, inverts the result of `op`.","title":"Negated"},"disabled":{"anyOf":[{"type":"boolean"},{"type":"string"},{"type":"null"}],"default":null,"description":"When true (or true-bound), the filter is preserved on the spec but not applied.","title":"Disabled"},"include_in_normalize":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"When false, rows matching this filter are excluded from normalize/100% calculations.","title":"Include In Normalize"},"include_in_aggregation":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"When false, rows matching this filter are excluded from aggregations but still appear on the chart.","title":"Include In Aggregation"}},"required":["field","data_type","op","value"],"title":"DataFilterAtom","type":"object"},"type":"array"},{"type":"null"}],"default":null,"description":"Filters applied when computing the comparison value.","title":"Comparison Filters"},"comparison_interval":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"How far back to compare against (e.g. \"7d\", \"1m\").","title":"Comparison Interval"},"comparison_display_mode":{"anyOf":[{"enum":["percent","value"],"type":"string"},{"type":"null"}],"default":null,"description":"Whether to show the comparison as a percent delta or an absolute value.","title":"Comparison Display Mode"}},"required":["type"],"title":"DashboardValueSpec","type":"object"},{"additionalProperties":true,"properties":{"query_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Saved Explorer query the element binds to. Required for data-driven element types — without it the chart renders empty with 'missing query ID'. Stored snake_case; the FE camelizes the whole config on read.","title":"Query Id"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Description"},"info_url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Optional URL surfaced via an info icon next to the title.","title":"Info Url"},"info_tooltip":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Optional tooltip text surfaced via an info icon next to the title.","title":"Info Tooltip"},"type":{"const":"table","title":"Type","type":"string"},"columns":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null,"description":"Ordered list of column names from the query result to display. Omit to show all columns.","title":"Columns"},"column_aggregate":{"anyOf":[{"additionalProperties":{"enum":["none","sum","avg","count","mean","median","min","max","latest","first"],"title":"Aggregation","type":"string"},"type":"object"},{"type":"null"}],"default":null,"description":"Per-column aggregation overrides keyed by column name.","title":"Column Aggregate"},"column_entity_types":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"default":null,"description":"Per-column entity type tags keyed by column name (e.g. {\"wallet\": \"ethereum_address\"}). Renders values as Allium entities.","title":"Column Entity Types"},"column_labels":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"default":null,"description":"Per-column display label overrides keyed by column name.","title":"Column Labels"},"column_widths":{"anyOf":[{"additionalProperties":{"type":"integer"},"type":"object"},{"type":"null"}],"default":null,"description":"Per-column width in pixels keyed by column name.","title":"Column Widths"},"column_sort":{"anyOf":[{"additionalProperties":{"enum":["asc","desc"],"type":"string"},"type":"object"},{"type":"null"}],"default":null,"description":"Per-column initial sort direction keyed by column name.","title":"Column Sort"},"column_formats":{"anyOf":[{"additionalProperties":{"enum":["number","currency","percentage","tokenPrice","raw"],"type":"string"},"type":"object"},{"type":"null"}],"default":null,"description":"Per-column value format keyed by column name.","title":"Column Formats"},"column_big_number":{"anyOf":[{"additionalProperties":{"type":"boolean"},"type":"object"},{"type":"null"}],"default":null,"description":"Per-column flag to render values at big-number type size.","title":"Column Big Number"},"column_pct_bar":{"anyOf":[{"additionalProperties":{"type":"boolean"},"type":"object"},{"type":"null"}],"default":null,"description":"Per-column flag to render an inline percent bar alongside the value.","title":"Column Pct Bar"},"column_delta_arrows":{"anyOf":[{"additionalProperties":{"type":"boolean"},"type":"object"},{"type":"null"}],"default":null,"description":"Per-column flag to render +/- delta arrows alongside the value.","title":"Column Delta Arrows"},"column_text_formats":{"anyOf":[{"additionalProperties":{"enum":["default","title_case","sentence_case","entity","entity_no_logo"],"title":"LabelFormat","type":"string"},"type":"object"},{"type":"null"}],"default":null,"description":"Per-column text label format override (title_case, sentence_case, …).","title":"Column Text Formats"},"heatmap":{"anyOf":[{"additionalProperties":true,"properties":{"columns":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null,"description":"Columns to apply heatmap shading to. Empty or omitted disables the heatmap.","title":"Columns"},"mode":{"anyOf":[{"enum":["grid","per-column"],"type":"string"},{"type":"null"}],"default":null,"description":"\"grid\": shade values relative to the whole matrix. \"per-column\": shade each column independently.","title":"Mode"},"theme":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null,"description":"Hex color stops for the gradient, ordered low → high.","title":"Theme"}},"title":"TableHeatmapSpec","type":"object"},{"type":"null"}],"default":null},"header_format":{"anyOf":[{"enum":["default","title_case","sentence_case","entity","entity_no_logo"],"title":"LabelFormat","type":"string"},{"type":"null"}],"default":null},"page_size":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Rows per page. Omit for the FE default.","title":"Page Size"},"sortable":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"Allow viewers to sort columns interactively.","title":"Sortable"},"filterable":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"Allow viewers to filter columns interactively.","title":"Filterable"},"filters":{"anyOf":[{"items":{"additionalProperties":true,"description":"Single-condition filter compatible with dashboard v3 `ElementFilter`.\n\nScalar ops use `str`; `oneOf` / `notIn` may use `list[str]`.","properties":{"field":{"description":"Column name from the query result that this filter applies to.","title":"Field","type":"string"},"op":{"enum":["equal","notEqual","lt","lte","gt","gte","oneOf","notIn"],"title":"DataFilterOp","type":"string"},"value":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"}],"description":"Filter operand. Scalar ops take a string; `oneOf`/`notIn` take a list of strings.","title":"Value"},"disabled":{"anyOf":[{"type":"boolean"},{"type":"string"},{"type":"null"}],"default":null,"description":"When true (or true-bound), the filter is preserved on the spec but not applied.","title":"Disabled"},"data_type":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Column data type (\"string\", \"number\", \"boolean\", \"timestamp\"); informs how `value` is parsed.","title":"Data Type"}},"required":["field","op","value"],"title":"VisualizationTableFilter","type":"object"},"type":"array"},{"type":"null"}],"default":null,"description":"Initial table filters applied to the result rows.","title":"Filters"}},"required":["type"],"title":"DashboardTableSpec","type":"object"},{"additionalProperties":true,"properties":{"query_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Saved Explorer query the element binds to. Required for data-driven element types — without it the chart renders empty with 'missing query ID'. Stored snake_case; the FE camelizes the whole config on read.","title":"Query Id"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Description"},"info_url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Optional URL surfaced via an info icon next to the title.","title":"Info Url"},"info_tooltip":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Optional tooltip text surfaced via an info icon next to the title.","title":"Info Tooltip"},"type":{"const":"pie","title":"Type","type":"string"},"variant":{"description":"Pie variant: \"pie\" (solid), \"donut\" (ring), or \"donut-value\" (ring with the total value in the center).","enum":["pie","donut","donut-value"],"title":"Variant","type":"string"},"category":{"additionalProperties":true,"properties":{"field":{"description":"Column name from the query result.","title":"Field","type":"string"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Display label shown to viewers. Defaults to the column name.","title":"Label"},"entity_type":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"When set (e.g. \"ethereum_address\", \"token_address\"), values are rendered as Allium entities with badges and links.","title":"Entity Type"}},"required":["field"],"title":"EntityFieldRef","type":"object","description":"Column used to slice the pie — each distinct value becomes a slice."},"value":{"additionalProperties":true,"properties":{"field":{"description":"Column name from the query result.","title":"Field","type":"string"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Display label shown to viewers. Defaults to the column name.","title":"Label"},"aggregate":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Aggregation to apply (sum, avg, count, mean, median, min, max, latest, first, none).","title":"Aggregate"}},"required":["field"],"title":"AggregateFieldRef","type":"object","description":"Aggregated column whose value determines slice size."},"drilldown":{"description":"Additional category columns that become deeper drill-down levels. Empty list disables drill-down.","items":{"additionalProperties":true,"properties":{"field":{"description":"Column name from the query result.","title":"Field","type":"string"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Display label shown to viewers. Defaults to the column name.","title":"Label"},"entity_type":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"When set (e.g. \"ethereum_address\", \"token_address\"), values are rendered as Allium entities with badges and links.","title":"Entity Type"}},"required":["field"],"title":"EntityFieldRef","type":"object"},"title":"Drilldown","type":"array"},"label_format":{"anyOf":[{"enum":["default","title_case","sentence_case","entity","entity_no_logo"],"title":"LabelFormat","type":"string"},{"type":"null"}],"default":null},"filters":{"anyOf":[{"items":{"additionalProperties":true,"properties":{"field":{"description":"Column name from the query result that this filter applies to.","title":"Field","type":"string"},"data_type":{"description":"Column data type (\"string\", \"number\", \"boolean\", \"timestamp\"); informs how `value` is parsed.","title":"Data Type","type":"string"},"op":{"enum":["equal","notEqual","lt","lte","gt","gte","oneOf","notIn"],"title":"DataFilterOp","type":"string"},"value":{"description":"Filter operand. Scalar ops take a primitive; `oneOf`/`notIn` take a list.","title":"Value"},"negated":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"When true, inverts the result of `op`.","title":"Negated"},"disabled":{"anyOf":[{"type":"boolean"},{"type":"string"},{"type":"null"}],"default":null,"description":"When true (or true-bound), the filter is preserved on the spec but not applied.","title":"Disabled"},"include_in_normalize":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"When false, rows matching this filter are excluded from normalize/100% calculations.","title":"Include In Normalize"},"include_in_aggregation":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"When false, rows matching this filter are excluded from aggregations but still appear on the chart.","title":"Include In Aggregation"}},"required":["field","data_type","op","value"],"title":"DataFilterAtom","type":"object"},"type":"array"},{"type":"null"}],"default":null,"description":"Atomic filters applied before computing the pie.","title":"Filters"}},"required":["type","variant","category","value","drilldown"],"title":"DashboardPieSpec","type":"object"},{"additionalProperties":true,"properties":{"query_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Saved Explorer query the element binds to. Required for data-driven element types — without it the chart renders empty with 'missing query ID'. Stored snake_case; the FE camelizes the whole config on read.","title":"Query Id"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Description"},"info_url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Optional URL surfaced via an info icon next to the title.","title":"Info Url"},"info_tooltip":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Optional tooltip text surfaced via an info icon next to the title.","title":"Info Tooltip"},"type":{"const":"sankey","title":"Type","type":"string"},"columns":{"description":"Ordered entity columns forming the flow left → right. Must contain at least 2 columns.","items":{"additionalProperties":true,"properties":{"field":{"description":"Column name from the query result.","title":"Field","type":"string"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Display label shown to viewers. Defaults to the column name.","title":"Label"},"entity_type":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"When set (e.g. \"ethereum_address\", \"token_address\"), values are rendered as Allium entities with badges and links.","title":"Entity Type"}},"required":["field"],"title":"EntityFieldRef","type":"object"},"title":"Columns","type":"array"},"value_column":{"additionalProperties":true,"properties":{"field":{"description":"Column name from the query result.","title":"Field","type":"string"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Display label shown to viewers. Defaults to the column name.","title":"Label"},"aggregate":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Aggregation to apply (sum, avg, count, mean, median, min, max, latest, first, none).","title":"Aggregate"}},"required":["field"],"title":"AggregateFieldRef","type":"object","description":"Aggregated column whose value sets each flow's width."},"coalesce":{"description":"Merge nodes with identical labels across columns into a single node. Useful when an entity appears in multiple stages.","title":"Coalesce","type":"boolean"},"label_format":{"anyOf":[{"enum":["default","title_case","sentence_case","entity","entity_no_logo"],"title":"LabelFormat","type":"string"},{"type":"null"}],"default":null},"filters":{"anyOf":[{"items":{"additionalProperties":true,"properties":{"field":{"description":"Column name from the query result that this filter applies to.","title":"Field","type":"string"},"data_type":{"description":"Column data type (\"string\", \"number\", \"boolean\", \"timestamp\"); informs how `value` is parsed.","title":"Data Type","type":"string"},"op":{"enum":["equal","notEqual","lt","lte","gt","gte","oneOf","notIn"],"title":"DataFilterOp","type":"string"},"value":{"description":"Filter operand. Scalar ops take a primitive; `oneOf`/`notIn` take a list.","title":"Value"},"negated":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"When true, inverts the result of `op`.","title":"Negated"},"disabled":{"anyOf":[{"type":"boolean"},{"type":"string"},{"type":"null"}],"default":null,"description":"When true (or true-bound), the filter is preserved on the spec but not applied.","title":"Disabled"},"include_in_normalize":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"When false, rows matching this filter are excluded from normalize/100% calculations.","title":"Include In Normalize"},"include_in_aggregation":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"When false, rows matching this filter are excluded from aggregations but still appear on the chart.","title":"Include In Aggregation"}},"required":["field","data_type","op","value"],"title":"DataFilterAtom","type":"object"},"type":"array"},{"type":"null"}],"default":null,"description":"Atomic filters applied before computing flows.","title":"Filters"}},"required":["type","columns","value_column","coalesce"],"title":"DashboardSankeySpec","type":"object"},{"additionalProperties":true,"properties":{"query_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Saved Explorer query the element binds to. Required for data-driven element types — without it the chart renders empty with 'missing query ID'. Stored snake_case; the FE camelizes the whole config on read.","title":"Query Id"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Description"},"info_url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Optional URL surfaced via an info icon next to the title.","title":"Info Url"},"info_tooltip":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Optional tooltip text surfaced via an info icon next to the title.","title":"Info Tooltip"},"type":{"const":"treemap","title":"Type","type":"string"},"colors":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null,"description":"Hex color palette cycled across siblings.","title":"Colors"},"node_column":{"description":"Column identifying each leaf rectangle.","items":{"additionalProperties":true,"properties":{"field":{"description":"Column name from the query result.","title":"Field","type":"string"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Display label shown to viewers. Defaults to the column name.","title":"Label"},"entity_type":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"When set (e.g. \"ethereum_address\", \"token_address\"), values are rendered as Allium entities with badges and links.","title":"Entity Type"}},"required":["field"],"title":"EntityFieldRef","type":"object"},"title":"Node Column","type":"array"},"parent_columns":{"description":"Columns forming the hierarchy from root to leaf. Empty for a flat treemap.","items":{"additionalProperties":true,"properties":{"field":{"description":"Column name from the query result.","title":"Field","type":"string"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Display label shown to viewers. Defaults to the column name.","title":"Label"},"entity_type":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"When set (e.g. \"ethereum_address\", \"token_address\"), values are rendered as Allium entities with badges and links.","title":"Entity Type"}},"required":["field"],"title":"EntityFieldRef","type":"object"},"title":"Parent Columns","type":"array"},"value_column":{"additionalProperties":true,"properties":{"field":{"description":"Column name from the query result.","title":"Field","type":"string"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Display label shown to viewers. Defaults to the column name.","title":"Label"},"aggregate":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Aggregation to apply (sum, avg, count, mean, median, min, max, latest, first, none).","title":"Aggregate"}},"required":["field"],"title":"AggregateFieldRef","type":"object","description":"Aggregated column determining rectangle size."},"label_format":{"anyOf":[{"enum":["default","title_case","sentence_case","entity","entity_no_logo"],"title":"LabelFormat","type":"string"},{"type":"null"}],"default":null},"filters":{"anyOf":[{"items":{"additionalProperties":true,"properties":{"field":{"description":"Column name from the query result that this filter applies to.","title":"Field","type":"string"},"data_type":{"description":"Column data type (\"string\", \"number\", \"boolean\", \"timestamp\"); informs how `value` is parsed.","title":"Data Type","type":"string"},"op":{"enum":["equal","notEqual","lt","lte","gt","gte","oneOf","notIn"],"title":"DataFilterOp","type":"string"},"value":{"description":"Filter operand. Scalar ops take a primitive; `oneOf`/`notIn` take a list.","title":"Value"},"negated":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"When true, inverts the result of `op`.","title":"Negated"},"disabled":{"anyOf":[{"type":"boolean"},{"type":"string"},{"type":"null"}],"default":null,"description":"When true (or true-bound), the filter is preserved on the spec but not applied.","title":"Disabled"},"include_in_normalize":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"When false, rows matching this filter are excluded from normalize/100% calculations.","title":"Include In Normalize"},"include_in_aggregation":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"When false, rows matching this filter are excluded from aggregations but still appear on the chart.","title":"Include In Aggregation"}},"required":["field","data_type","op","value"],"title":"DataFilterAtom","type":"object"},"type":"array"},{"type":"null"}],"default":null,"description":"Atomic filters applied before computing the treemap.","title":"Filters"}},"required":["type","node_column","parent_columns","value_column"],"title":"DashboardTreemapSpec","type":"object"},{"additionalProperties":true,"properties":{"query_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Saved Explorer query the element binds to. Required for data-driven element types — without it the chart renders empty with 'missing query ID'. Stored snake_case; the FE camelizes the whole config on read.","title":"Query Id"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Description"},"info_url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Optional URL surfaced via an info icon next to the title.","title":"Info Url"},"info_tooltip":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Optional tooltip text surfaced via an info icon next to the title.","title":"Info Tooltip"},"type":{"const":"scatter","title":"Type","type":"string"},"x_axis":{"additionalProperties":true,"properties":{"field":{"description":"Column name from the query result.","title":"Field","type":"string"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Display label shown to viewers. Defaults to the column name.","title":"Label"},"scale":{"anyOf":[{"enum":["linear","log"],"title":"ScaleType","type":"string"},{"type":"null"}],"default":null,"description":"Axis scale: linear or log."}},"required":["field"],"title":"ScaleAxisRef","type":"object"},"y_axis":{"additionalProperties":true,"properties":{"field":{"description":"Column name from the query result.","title":"Field","type":"string"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Display label shown to viewers. Defaults to the column name.","title":"Label"},"scale":{"anyOf":[{"enum":["linear","log"],"title":"ScaleType","type":"string"},{"type":"null"}],"default":null,"description":"Axis scale: linear or log."}},"required":["field"],"title":"ScaleAxisRef","type":"object"},"size_field":{"anyOf":[{"additionalProperties":true,"properties":{"enabled":{"description":"Whether point size encodes a numeric field.","title":"Enabled","type":"boolean"},"field":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Column name whose value sets point radius. Required when `enabled` is true.","title":"Field"},"min_radius":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"description":"Lower bound for point radius in pixels.","title":"Min Radius"},"max_radius":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"description":"Upper bound for point radius in pixels.","title":"Max Radius"}},"required":["enabled"],"title":"_ScatterSizeField","type":"object"},{"type":"null"}],"default":null,"description":"Optional size encoding. When `enabled`, point radius scales with `field`."},"color_field":{"anyOf":[{"additionalProperties":true,"properties":{"field":{"description":"Column name from the query result.","title":"Field","type":"string"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Display label shown to viewers. Defaults to the column name.","title":"Label"}},"required":["field"],"title":"FieldRef","type":"object"},{"type":"null"}],"default":null,"description":"Column whose distinct values determine point color (categorical encoding)."},"point_opacity":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"description":"Marker opacity in [0, 1]. Lower values help with dense point clouds.","title":"Point Opacity"},"label_format":{"anyOf":[{"enum":["default","title_case","sentence_case","entity","entity_no_logo"],"title":"LabelFormat","type":"string"},{"type":"null"}],"default":null},"filters":{"anyOf":[{"items":{"additionalProperties":true,"properties":{"field":{"description":"Column name from the query result that this filter applies to.","title":"Field","type":"string"},"data_type":{"description":"Column data type (\"string\", \"number\", \"boolean\", \"timestamp\"); informs how `value` is parsed.","title":"Data Type","type":"string"},"op":{"enum":["equal","notEqual","lt","lte","gt","gte","oneOf","notIn"],"title":"DataFilterOp","type":"string"},"value":{"description":"Filter operand. Scalar ops take a primitive; `oneOf`/`notIn` take a list.","title":"Value"},"negated":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"When true, inverts the result of `op`.","title":"Negated"},"disabled":{"anyOf":[{"type":"boolean"},{"type":"string"},{"type":"null"}],"default":null,"description":"When true (or true-bound), the filter is preserved on the spec but not applied.","title":"Disabled"},"include_in_normalize":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"When false, rows matching this filter are excluded from normalize/100% calculations.","title":"Include In Normalize"},"include_in_aggregation":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"When false, rows matching this filter are excluded from aggregations but still appear on the chart.","title":"Include In Aggregation"}},"required":["field","data_type","op","value"],"title":"DataFilterAtom","type":"object"},"type":"array"},{"type":"null"}],"default":null,"description":"Atomic filters applied before plotting.","title":"Filters"}},"required":["type","x_axis","y_axis"],"title":"DashboardScatterSpec","type":"object"},{"additionalProperties":true,"properties":{"query_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Saved Explorer query the element binds to. Required for data-driven element types — without it the chart renders empty with 'missing query ID'. Stored snake_case; the FE camelizes the whole config on read.","title":"Query Id"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Description"},"info_url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Optional URL surfaced via an info icon next to the title.","title":"Info Url"},"info_tooltip":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Optional tooltip text surfaced via an info icon next to the title.","title":"Info Tooltip"},"type":{"const":"map","title":"Type","type":"string"},"field":{"description":"Column with the location identifier — ISO country code for \"country\" maps, region code for \"region\" maps.","title":"Field","type":"string"},"value_field":{"description":"Column aggregated to color each shape on the map.","title":"Value Field","type":"string"},"aggregate":{"anyOf":[{"enum":["none","sum","avg","count","mean","median","min","max","latest","first"],"title":"Aggregation","type":"string"},{"type":"null"}],"default":null,"description":"Aggregation to apply to `value_field`. Defaults to sum."},"map_type":{"description":"Geographic scope: \"country\" (world choropleth keyed on ISO country codes) or \"region\" (regional subdivisions).","enum":["country","region"],"title":"Map Type","type":"string"},"filters":{"anyOf":[{"items":{"additionalProperties":true,"properties":{"field":{"description":"Column name from the query result that this filter applies to.","title":"Field","type":"string"},"data_type":{"description":"Column data type (\"string\", \"number\", \"boolean\", \"timestamp\"); informs how `value` is parsed.","title":"Data Type","type":"string"},"op":{"enum":["equal","notEqual","lt","lte","gt","gte","oneOf","notIn"],"title":"DataFilterOp","type":"string"},"value":{"description":"Filter operand. Scalar ops take a primitive; `oneOf`/`notIn` take a list.","title":"Value"},"negated":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"When true, inverts the result of `op`.","title":"Negated"},"disabled":{"anyOf":[{"type":"boolean"},{"type":"string"},{"type":"null"}],"default":null,"description":"When true (or true-bound), the filter is preserved on the spec but not applied.","title":"Disabled"},"include_in_normalize":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"When false, rows matching this filter are excluded from normalize/100% calculations.","title":"Include In Normalize"},"include_in_aggregation":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"When false, rows matching this filter are excluded from aggregations but still appear on the chart.","title":"Include In Aggregation"}},"required":["field","data_type","op","value"],"title":"DataFilterAtom","type":"object"},"type":"array"},{"type":"null"}],"default":null,"description":"Atomic filters applied before computing the map.","title":"Filters"}},"required":["type","field","value_field","map_type"],"title":"DashboardMapSpec","type":"object"},{"additionalProperties":true,"properties":{"query_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Saved Explorer query the element binds to. Required for data-driven element types — without it the chart renders empty with 'missing query ID'. Stored snake_case; the FE camelizes the whole config on read.","title":"Query Id"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Description"},"info_url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Optional URL surfaced via an info icon next to the title.","title":"Info Url"},"info_tooltip":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Optional tooltip text surfaced via an info icon next to the title.","title":"Info Tooltip"},"type":{"const":"chord","title":"Type","type":"string"},"from_column":{"additionalProperties":true,"properties":{"field":{"description":"Column name from the query result.","title":"Field","type":"string"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Display label shown to viewers. Defaults to the column name.","title":"Label"}},"required":["field"],"title":"FieldRef","type":"object","description":"Column identifying the flow source."},"to_column":{"additionalProperties":true,"properties":{"field":{"description":"Column name from the query result.","title":"Field","type":"string"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Display label shown to viewers. Defaults to the column name.","title":"Label"}},"required":["field"],"title":"FieldRef","type":"object","description":"Column identifying the flow target."},"value_column":{"additionalProperties":true,"properties":{"field":{"description":"Column name from the query result.","title":"Field","type":"string"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Display label shown to viewers. Defaults to the column name.","title":"Label"},"aggregate":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Aggregation to apply (sum, avg, count, mean, median, min, max, latest, first, none).","title":"Aggregate"}},"required":["field"],"title":"AggregateFieldRef","type":"object","description":"Aggregated column determining arc width between source and target."},"label_format":{"anyOf":[{"enum":["default","title_case","sentence_case","entity","entity_no_logo"],"title":"LabelFormat","type":"string"},{"type":"null"}],"default":null},"filters":{"anyOf":[{"items":{"additionalProperties":true,"properties":{"field":{"description":"Column name from the query result that this filter applies to.","title":"Field","type":"string"},"data_type":{"description":"Column data type (\"string\", \"number\", \"boolean\", \"timestamp\"); informs how `value` is parsed.","title":"Data Type","type":"string"},"op":{"enum":["equal","notEqual","lt","lte","gt","gte","oneOf","notIn"],"title":"DataFilterOp","type":"string"},"value":{"description":"Filter operand. Scalar ops take a primitive; `oneOf`/`notIn` take a list.","title":"Value"},"negated":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"When true, inverts the result of `op`.","title":"Negated"},"disabled":{"anyOf":[{"type":"boolean"},{"type":"string"},{"type":"null"}],"default":null,"description":"When true (or true-bound), the filter is preserved on the spec but not applied.","title":"Disabled"},"include_in_normalize":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"When false, rows matching this filter are excluded from normalize/100% calculations.","title":"Include In Normalize"},"include_in_aggregation":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"When false, rows matching this filter are excluded from aggregations but still appear on the chart.","title":"Include In Aggregation"}},"required":["field","data_type","op","value"],"title":"DataFilterAtom","type":"object"},"type":"array"},{"type":"null"}],"default":null,"description":"Atomic filters applied before computing chords.","title":"Filters"}},"required":["type","from_column","to_column","value_column"],"title":"DashboardChordSpec","type":"object"},{"additionalProperties":true,"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Description"},"info_url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Optional URL surfaced via an info icon next to the title.","title":"Info Url"},"info_tooltip":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Optional tooltip text surfaced via an info icon next to the title.","title":"Info Tooltip"},"type":{"const":"markdown","title":"Type","type":"string"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Content"}},"required":["type"],"title":"MarkdownSpec","type":"object"},{"additionalProperties":true,"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Description"},"info_url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Optional URL surfaced via an info icon next to the title.","title":"Info Url"},"info_tooltip":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Optional tooltip text surfaced via an info icon next to the title.","title":"Info Tooltip"},"type":{"const":"spacer","title":"Type","type":"string"}},"required":["type"],"title":"SpacerSpec","type":"object"},{"additionalProperties":true,"properties":{"type":{"const":"variable-select","title":"Type","type":"string"},"variable_name":{"description":"Variable this dropdown writes to; read it as {{variable_name}} in bound query SQL.","title":"Variable Name","type":"string"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Label"},"placeholder":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Placeholder"},"entity_type":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"When set (e.g. \"token_address\"), options render as Allium entities.","title":"Entity Type"},"options":{"anyOf":[{"additionalProperties":true,"properties":{"mode":{"const":"manual","title":"Mode","type":"string"},"items":{"description":"Static list of selectable options.","items":{"additionalProperties":true,"properties":{"value":{"description":"Value written to the variable when selected.","title":"Value","type":"string"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Display label. Defaults to the value.","title":"Label"}},"required":["value"],"title":"InputOption","type":"object"},"title":"Items","type":"array"}},"required":["mode","items"],"title":"ManualInputOptions","type":"object"},{"additionalProperties":true,"properties":{"mode":{"const":"duckdb","title":"Mode","type":"string"},"table_name":{"description":"Query result the options are pulled from at render time.","title":"Table Name","type":"string"},"value_column":{"description":"Column supplying option values.","title":"Value Column","type":"string"},"label_column":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Column supplying option labels. Defaults to the value column.","title":"Label Column"},"sort":{"anyOf":[{"items":{"additionalProperties":true,"properties":{"field":{"description":"Column to sort options by.","title":"Field","type":"string"},"direction":{"enum":["asc","desc"],"title":"Direction","type":"string"},"aggregation":{"anyOf":[{"enum":["none","sum","avg","count","mean","median","min","max","latest","first"],"title":"Aggregation","type":"string"},{"type":"null"}],"default":null}},"required":["field","direction"],"title":"InputSort","type":"object"},"type":"array"},{"type":"null"}],"default":null,"title":"Sort"}},"required":["mode","table_name","value_column"],"title":"DuckDbInputOptions","type":"object"}],"title":"Options"},"multiple":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"Allow selecting multiple values.","title":"Multiple"},"default_value":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null,"description":"Value(s) selected on load (list when `multiple`). Seeds the variable so the dashboard renders before the viewer picks.","title":"Default Value"}},"required":["type","variable_name","options"],"title":"SelectInputSpec","type":"object"},{"additionalProperties":true,"properties":{"type":{"const":"switch","title":"Type","type":"string"},"variable_name":{"description":"Boolean variable this toggle writes to; read it as {{variable_name}} in bound query SQL.","title":"Variable Name","type":"string"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Label"},"invert":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"Invert the stored boolean relative to the toggle position.","title":"Invert"},"default_value":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"Toggle state on load.","title":"Default Value"}},"required":["type","variable_name"],"title":"SwitchInputSpec","type":"object"},{"additionalProperties":true,"properties":{"type":{"const":"date-range","title":"Type","type":"string"},"start_variable":{"description":"Variable receiving the range start; read it as {{start_variable}} in bound query SQL.","title":"Start Variable","type":"string"},"end_variable":{"description":"Variable receiving the range end; read it as {{end_variable}} in bound query SQL.","title":"End Variable","type":"string"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Label"},"show_label":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"title":"Show Label"},"placeholder":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Placeholder"},"default_preset":{"anyOf":[{"enum":["none","24h","7d","1m","3m","6m","1y","3y","5y","all","custom"],"type":"string"},{"type":"null"}],"default":null,"description":"Relative default (e.g. \"7d\") computed at load; takes priority over `default_range`.","title":"Default Preset"},"default_range":{"anyOf":[{"additionalProperties":true,"properties":{"start":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"ISO start date.","title":"Start"},"end":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"ISO end date.","title":"End"}},"title":"DateRange","type":"object"},{"type":"null"}],"default":null,"description":"Explicit default start/end. Used when `default_preset` is unset, \"none\", or \"custom\"."}},"required":["type","start_variable","end_variable"],"title":"DateRangeInputSpec","type":"object"},{"additionalProperties":true,"properties":{"type":{"const":"radio-group","title":"Type","type":"string"},"variable_name":{"description":"Variable this radio group writes to; read it as {{variable_name}} in bound query SQL.","title":"Variable Name","type":"string"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Label"},"items":{"description":"Selectable options.","items":{"additionalProperties":true,"properties":{"value":{"description":"Value written to the variable when selected.","title":"Value","type":"string"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Display label. Defaults to the value.","title":"Label"}},"required":["value"],"title":"InputOption","type":"object"},"title":"Items","type":"array"},"default_value":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Option selected on load.","title":"Default Value"}},"required":["type","variable_name","items"],"title":"RadioGroupInputSpec","type":"object"}]},{"type":"null"}],"default":null,"title":"Config"}},"required":["kind","element_id"],"title":"ElementView","type":"object"}],"type":"object"},"annotations":{"title":"Read dashboard","readOnlyHint":true,"destructiveHint":false,"openWorldHint":false},"_meta":{"fastmcp":{"tags":["auth_api_key"]}}},{"name":"search_dashboards","title":"Search dashboards","description":"Search the user's Explorer dashboards by name.\n\nReturns dashboard IDs, names, URLs, tags, timestamps, and whether the caller\ncreated each one, ranked by match quality then recent update. With no arguments,\nreturns the first 25 viewable dashboards; `count` includes matches beyond `limit`.\n\nCovers Explorer dashboards only. Use `search_terminal` for Allium's published\nTerminal dashboards, and `read_dashboard` to open one by id.","inputSchema":{"properties":{"search":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Words to match against the dashboard name. Word order is ignored and unmatched words only lower the rank.","title":"Search"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null,"description":"Return only dashboards carrying at least one of these tags.","title":"Tags"},"query_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Return only dashboards that render this Explorer query.","title":"Query Id"},"limit":{"default":25,"description":"Maximum number of dashboards to return.","maximum":100,"minimum":1,"title":"Limit","type":"integer"}},"title":"DashboardSearchInput","type":"object"},"outputSchema":{"properties":{"dashboards":{"items":{"properties":{"dashboard_id":{"title":"Dashboard Id","type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Name"},"url":{"title":"Url","type":"string"},"created_by_me":{"title":"Created By Me","type":"boolean"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null,"title":"Tags"},"created_on":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"default":null,"title":"Created On"},"updated_on":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"default":null,"title":"Updated On"}},"required":["dashboard_id","url","created_by_me"],"title":"DashboardSearchItem","type":"object"},"title":"Dashboards","type":"array"},"count":{"description":"Total dashboards matched. Exceeds the number of rows returned when `limit` truncates them.","title":"Count","type":"integer"}},"required":["dashboards","count"],"title":"DashboardSearchOutput","type":"object"},"annotations":{"title":"Search dashboards","readOnlyHint":true,"destructiveHint":false,"openWorldHint":false},"_meta":{"fastmcp":{"tags":["auth_api_key"]}}},{"name":"set_dashboard","title":"Upsert or delete dashboard node","description":"Upsert or delete any node in a dashboard tree.\n\nCall get_skill(name='dashboard-design') first — it covers the build order, element\ncatalog, layout, and design/SQL rules. For an element, `config.type` is one of:\nchart, value, table, pie, sankey, treemap, scatter, map, chord, markdown, spacer, variable-select, switch, date-range, radio-group. Fetch its full schema (query_id included for data elements) with\nget_skill(name='dashboard-design', reference_title=) before building.\n\nIf the user is following up on Terminal results or asks to chart/build a dashboard\nfor a topic covered by Terminal, use search_terminal/get_terminal_results first.\nUse the Terminal chart manifest, context, and SQL as the baseline before creating\nor selecting dashboard query_ids. When editing an existing Explorer dashboard\n(`/analyze/dashboards/{id}`), use Terminal only for that SQL baseline, never to\nfind the dashboard itself.\n\n`spec.kind` selects the node type. The ID path locates the target:\n- IDs are the parent path on **create** (the target's own ID is absent).\n- IDs are the self path on **update** (the target's own ID is present).\n\nExamples:\n- Create a new dashboard:\n spec={\"kind\": \"dashboard\", \"name\": \"...\"}\n- Rename an existing dashboard:\n dashboard_id=\"d1\", spec={\"kind\": \"dashboard\", \"name\": \"...\"}\n- Add a page:\n dashboard_id=\"d1\", spec={\"kind\": \"page\", \"name\": \"...\"}\n- Add a section:\n dashboard_id=\"d1\", page_id=\"p1\", spec={\"kind\": \"section\"}\n- Add a data element (chart/value/table/pie/scatter/sankey/treemap/map/chord):\n dashboard_id=\"d1\", page_id=\"p1\", section_id=\"s1\",\n spec={\"kind\": \"element\",\n \"config\": {\"type\": \"value\", \"query_id\": \"qry_123\",\n \"field\": \"...\"}},\n layout?={\"x\": 0, \"y\": 0, \"w\": 6, \"h\": 4}\n `query_id` is REQUIRED on data-driven configs — it binds the element\n to a saved Explorer query. Without it the element renders empty with\n \"missing query ID\". Use create_explorer_query to mint one, or\n list_explorer_queries to find an existing one. The bound query also\n needs a finished run — creating one with run_on_creation=True only\n queues it, so poll get_query_run_results with a non-zero\n poll_timeout_seconds before binding, or the element renders with no\n data.\n- Add a static element (markdown/spacer) — no query needed:\n dashboard_id=\"d1\", page_id=\"p1\", section_id=\"s1\",\n spec={\"kind\": \"element\",\n \"config\": {\"type\": \"markdown\", \"content\": \"## Section heading\"}},\n layout?={\"x\": 0, \"y\": 0, \"w\": 12, \"h\": 2}\n- Add an input element (variable-select/switch/date-range/radio-group) — no\n query_id; it writes to a named variable that bound query SQL reads via\n `{{variable}}`. Changing the input re-runs every query referencing that\n variable; defaults seed it so the dashboard renders on load:\n dashboard_id=\"d1\", page_id=\"p1\", section_id=\"s1\",\n spec={\"kind\": \"element\",\n \"config\": {\"type\": \"date-range\", \"start_variable\": \"start_date\",\n \"end_variable\": \"end_date\", \"default_preset\": \"7d\"}},\n layout?={\"x\": 0, \"y\": 0, \"w\": 6, \"h\": 1}\n- Update an element's config (layout sticky — unchanged):\n dashboard_id, page_id, section_id, element_id=\"e1\",\n spec={\"kind\": \"element\", \"config\": {...}}\n The new config fully replaces the prior one. Resend `query_id` (and any\n other fields you want kept) — omitting them drops them.\n\nDeleting a node — pass `spec=null` with the **self path** of what to remove:\n- Remove one element:\n dashboard_id=\"d1\", page_id=\"p1\", section_id=\"s1\", element_id=\"e1\", spec=null\n- Remove a section (and its elements):\n dashboard_id=\"d1\", page_id=\"p1\", section_id=\"s1\", spec=null\n- Remove a page (and its sections):\n dashboard_id=\"d1\", page_id=\"p1\", spec=null\nSibling layouts are recomputed so the remaining nodes stay aligned. The\ndeepest ID given names the node that goes away, so double-check the path\nbefore sending. Deleting a whole dashboard is delete_dashboard's job.\n\nPath is exact: each ID must exist under the one above it. To put a section\non a different page, create it on that page. To move an element to another\nsection, delete it from the old section (spec=null) and create it on the new one.\n\nLayout for element creates auto-stacks below existing elements when omitted\n(x=0, w=6, h=4); on element updates, omitted layout means keep existing.\n\nOnce the dashboard looks right, offer to share it — call share_dashboard to get a public link the user can send around.","inputSchema":{"properties":{"dashboard_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Dashboard Id"},"page_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Page Id"},"section_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Section Id"},"element_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Element Id"},"spec":{"anyOf":[{"properties":{"kind":{"const":"dashboard","title":"Kind","type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Name"},"settings":{"anyOf":[{"additionalProperties":true,"properties":{"download_enabled":{"default":false,"title":"Download Enabled","type":"boolean"},"fork_enabled":{"default":false,"title":"Fork Enabled","type":"boolean"},"colors":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null,"title":"Colors"}},"title":"DashboardSettings","type":"object"},{"type":"null"}],"default":null},"sticky_section":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"default":null}},"required":["kind"],"title":"DashboardSpec","type":"object"},{"properties":{"kind":{"const":"page","title":"Kind","type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Name"},"order":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Order"}},"required":["kind"],"title":"PageSpec","type":"object"},{"properties":{"kind":{"const":"section","title":"Kind","type":"string"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Title"}},"required":["kind"],"title":"SectionSpec","type":"object"},{"additionalProperties":true,"type":"object"},{"type":"null"}],"description":"Node to upsert, or null to DELETE the node the ID path points at (page/section/element). For kind 'dashboard'/'page'/'section' pass the typed object. For an element pass {'kind': 'element', 'config': {...}}; `config.type` selects the variant — fetch its full schema with get_skill(name='dashboard-design', reference_title=) before building.","title":"Spec"},"layout":{"anyOf":[{"properties":{"x":{"default":0,"description":"X position in the grid (0-11)","title":"X","type":"integer"},"y":{"default":0,"description":"Y position in the grid","title":"Y","type":"integer"},"w":{"default":6,"description":"Width in grid columns (1-12)","title":"W","type":"integer"},"h":{"default":4,"description":"Height in grid rows","title":"H","type":"integer"}},"title":"GridPlacement","type":"object"},{"type":"null"}],"default":null}},"required":["spec"],"title":"DashboardSetInput","type":"object"},"outputSchema":{"properties":{"dashboard_id":{"title":"Dashboard Id","type":"string"},"page_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Page Id"},"section_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Section Id"},"element_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Element Id"},"url":{"title":"Url","type":"string"},"deleted":{"default":false,"title":"Deleted","type":"boolean"},"warnings":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null,"title":"Warnings"}},"required":["dashboard_id","url"],"title":"DashboardSetOutput","type":"object"},"annotations":{"title":"Upsert or delete dashboard node","readOnlyHint":false,"destructiveHint":true,"openWorldHint":false},"_meta":{"fastmcp":{"tags":["auth_api_key"]}}},{"name":"delete_dashboard","title":"Delete dashboard","description":"Delete an entire dashboard, including every\npage, section, and element inside it.\n\nThis is irreversible. Confirm with the user which dashboard before calling, and\nread_dashboard first if you are unsure what the ID points at.\n\nTo remove one page, section, or element instead, call set_dashboard with `spec=null`\nand that node's ID path.","inputSchema":{"additionalProperties":false,"properties":{"dashboard_id":{"title":"Dashboard Id","type":"string"}},"required":["dashboard_id"],"title":"DashboardDeleteInput","type":"object"},"outputSchema":{"properties":{"dashboard_id":{"title":"Dashboard Id","type":"string"},"deleted":{"default":true,"title":"Deleted","type":"boolean"}},"required":["dashboard_id"],"title":"DashboardDeleteOutput","type":"object"},"annotations":{"title":"Delete dashboard","readOnlyHint":false,"destructiveHint":true,"openWorldHint":false},"_meta":{"fastmcp":{"tags":["auth_api_key"]}}},{"name":"list_skills","title":"List Skills","description":"List Allium skill guides the caller can access,\nwith descriptions. Use get_skill for full instructions.","inputSchema":{"type":"object","properties":{}},"outputSchema":{"properties":{"result":{"items":{"description":"A skill's name, description and scope, returned by ``list_skills``.","properties":{"name":{"title":"Name","type":"string"},"description":{"title":"Description","type":"string"},"scope":{"description":"Who a skill is visible to, and which tier it is stored in.","enum":["user","org","global"],"title":"SkillVisibility","type":"string"}},"required":["name","description","scope"],"title":"SkillSummary","type":"object"},"title":"Result","type":"array"}},"required":["result"],"title":"ListSkillsStructuredContent","type":"object","x-fastmcp-wrap-result":true},"annotations":{"title":"List Skills","readOnlyHint":true,"destructiveHint":false,"openWorldHint":false},"_meta":{"fastmcp":{"tags":["auth_api_key"]}}},{"name":"get_skill","title":"Get Skill","description":"Get a skill's full instructions. If the instructions\nlist reference files, call again with `reference_title` set to the exact listed\ntitle to retrieve one.","inputSchema":{"description":"Input for the ``get_skill`` tool.","properties":{"name":{"description":"The name of the skill to retrieve","title":"Name","type":"string"},"reference_title":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Optional reference title to retrieve, exactly as listed at the end of the skill instructions","title":"Reference Title"}},"required":["name"],"title":"GetSkillInput","type":"object"},"outputSchema":{"properties":{"result":{"title":"Result","type":"string"}},"required":["result"],"title":"GetSkillStructuredContent","type":"object","x-fastmcp-wrap-result":true},"annotations":{"title":"Get Skill","readOnlyHint":true,"destructiveHint":false,"openWorldHint":false},"_meta":{"fastmcp":{"tags":["auth_api_key"]}}},{"name":"get_realtime_supported_chains","title":"Get Supported Chains for Realtime APIs","description":"List supported chains by realtime API endpoint. Call once per session and reuse\nthe endpoint-to-chains map before token, wallet, holdings, or price requests.\nAn unsupported chain may return an empty result or an error. This check is not\nneeded for Explorer SQL or docs tools.","inputSchema":{"type":"object","properties":{}},"annotations":{"title":"Get Supported Chains for Realtime APIs","readOnlyHint":true,"destructiveHint":false,"openWorldHint":false},"_meta":{"fastmcp":{"tags":["auth_api_key"]}}},{"name":"get_realtime_token_latest_price","title":"Fetch latest token price","description":"Get latest prices for token chain/address pairs, optionally with liquidity data. The request body must be an array, even for a single token.\nFor chain coverage, edge cases, or response fields, use browse_docs\nwith path 'api/developer/prices/token-latest-price.md'.","inputSchema":{"type":"object","properties":{"payloads":{"type":"array","minItems":1,"maxItems":200,"items":{"type":"object","properties":{"token_address":{"type":"string","description":"Token contract address"},"chain":{"type":"string","description":"Lowercase chain name"}},"required":["token_address","chain"],"additionalProperties":false},"description":"Request objects. At most 200 per request."},"with_liquidity_info":{"type":"boolean","description":"If true, returns total_liquidity_usd as well. See [this page](https://docs.allium.so/api/developer/data-tips#token-liquidity-filtering) for more details.","default":false}},"required":["payloads"]},"annotations":{"title":"Fetch latest token price","readOnlyHint":true,"destructiveHint":false,"openWorldHint":false},"_meta":{"fastmcp":{"tags":["auth_api_key","is_billed"]}}},{"name":"get_realtime_token_price_history","title":"Fetch token price history","description":"Get token price candles for one or more token chain/address pairs over a time range at the requested granularity. Use cursor for the next page.\nFor chain coverage, edge cases, or response fields, use browse_docs\nwith path 'api/developer/prices/token-price-history.md'.","inputSchema":{"type":"object","properties":{"start_timestamp":{"type":"string","description":"Start of time range (UTC ISO 8601)"},"end_timestamp":{"type":"string","description":"End of time range (UTC ISO 8601)"},"addresses":{"type":"array","description":"List of token address+chain pairs.","items":{"type":"object","properties":{"token_address":{"type":"string","description":"Token contract address"},"chain":{"type":"string","description":"Lowercase chain name"}},"required":["token_address","chain"],"additionalProperties":false}},"time_granularity":{"type":"string","description":"Candle granularity (15s, 1m, 5m, 1h, 1d)","enum":["15s","1m","5m","1h","1d"]},"cursor":{"type":"string","description":"cursor"}},"required":["start_timestamp","end_timestamp","addresses","time_granularity"]},"annotations":{"title":"Fetch token price history","readOnlyHint":true,"destructiveHint":false,"openWorldHint":false},"_meta":{"fastmcp":{"tags":["auth_api_key","is_billed"]}}},{"name":"get_realtime_token_price_stats","title":"Fetch token price stats","description":"Get price stats for token chain/address pairs, including volume, highs, lows, and price changes. The request body must be an array, even for a single token.\nFor chain coverage, edge cases, or response fields, use browse_docs\nwith path 'api/developer/prices/token-price-stats.md'.","inputSchema":{"type":"object","properties":{"addresses":{"type":"array","description":"Request objects. At most 200 per request.","minItems":1,"maxItems":200,"items":{"type":"object","properties":{"token_address":{"type":"string","description":"Token contract address"},"chain":{"type":"string","description":"Lowercase chain name"}},"required":["token_address","chain"],"additionalProperties":false}}},"required":["addresses"]},"annotations":{"title":"Fetch token price stats","readOnlyHint":true,"destructiveHint":false,"openWorldHint":false},"_meta":{"fastmcp":{"tags":["auth_api_key","is_billed"]}}},{"name":"get_realtime_token_price_at_timestamp","title":"Fetch token price at timestamp","description":"Get token prices at a timestamp, using the closest earlier price within the optional staleness tolerance.\nFor chain coverage, edge cases, or response fields, use browse_docs\nwith path 'api/developer/prices/token-price-at-timestamp.md'.","inputSchema":{"type":"object","properties":{"addresses":{"type":"array","description":"List of token address+chain pairs. At most 200 per request.","minItems":1,"maxItems":200,"items":{"type":"object","properties":{"token_address":{"type":"string","description":"Token contract address"},"chain":{"type":"string","description":"Lowercase chain name"}},"required":["token_address","chain"],"additionalProperties":false}},"timestamp":{"type":"string","description":"Target timestamp (UTC ISO 8601)"},"time_granularity":{"type":"string","description":"Candle granularity (15s, 1m, 5m, 1h, 1d)","enum":["15s","1m","5m","1h","1d"]},"staleness_tolerance":{"type":"string","description":"Max lookback for price data (e.g. 1h, 30m)"}},"required":["addresses","timestamp","time_granularity"]},"annotations":{"title":"Fetch token price at timestamp","readOnlyHint":true,"destructiveHint":false,"openWorldHint":false},"_meta":{"fastmcp":{"tags":["auth_api_key","is_billed"]}}},{"name":"get_realtime_wallet_latest_token_balances","title":"Fetch latest fungible token balances","description":"Fetch the latest fungible token balances for wallet addresses across supported chains, optionally including liquidity totals.\nFor chain coverage, edge cases, or response fields, use browse_docs\nwith path 'api/developer/wallets/latest-token-balances.md'.","inputSchema":{"type":"object","properties":{"addresses":{"type":"array","description":"Request objects. At most 100 per request.","minItems":1,"maxItems":100,"items":{"type":"object","properties":{"chain":{"type":"string","description":"Lowercase chain name"},"address":{"type":"string","description":"Wallet address"}},"required":["chain","address"],"additionalProperties":false}},"with_liquidity_info":{"type":"boolean","description":"If true, returns total_liquidity_usd as well. See [this page](https://docs.allium.so/api/developer/data-tips#token-liquidity-filtering) for more details.","default":false}},"required":["addresses"]},"annotations":{"title":"Fetch latest fungible token balances","readOnlyHint":true,"destructiveHint":false,"openWorldHint":false},"_meta":{"fastmcp":{"tags":["auth_api_key","is_billed"]}}},{"name":"get_realtime_wallet_historical_token_balances","title":"Fetch historical fungible token balances","description":"Fetch paginated historical fungible token balances for wallet addresses over a requested time range.\nFor chain coverage, edge cases, or response fields, use browse_docs\nwith path 'api/developer/wallets/historical-token-balances.md'.","inputSchema":{"type":"object","properties":{"start_timestamp":{"type":"string","description":"Start of time range (UTC ISO 8601)"},"end_timestamp":{"type":"string","description":"End of time range (UTC ISO 8601)"},"addresses":{"type":"array","description":"List of wallet chain+address pairs. At most 5 per request.","minItems":1,"maxItems":5,"items":{"type":"object","properties":{"chain":{"type":"string","description":"Lowercase chain name"},"address":{"type":"string","description":"Wallet address"}},"required":["chain","address"],"additionalProperties":false}},"limit":{"type":"integer","description":"Max number of items returned. Default is 1000.","default":1000},"cursor":{"type":"string","description":"Cursor to request the next page of results."}},"required":["start_timestamp","end_timestamp","addresses"]},"annotations":{"title":"Fetch historical fungible token balances","readOnlyHint":true,"destructiveHint":false,"openWorldHint":false},"_meta":{"fastmcp":{"tags":["auth_api_key","is_billed"]}}},{"name":"get_realtime_wallet_positions","title":"Fetch DeFi Positions","description":"Retrieve DeFi positions, including LP and lending positions, for up to 5 wallet chain/address pairs.\nFor chain coverage, edge cases, or response fields, use browse_docs\nwith path 'api/developer/defi-positions/get-positions.md'.","inputSchema":{"type":"object","properties":{"payload":{"type":"array","description":"Request objects. At most 5 per request.","minItems":1,"maxItems":5,"items":{"type":"object","properties":{"chain":{"type":"string","description":"Lowercase chain name"},"address":{"type":"string","description":"Wallet address"}},"required":["chain","address"],"additionalProperties":false}},"limit":{"type":"integer","description":"Max number of positions returned. Default is 25.","maximum":100,"default":25},"cursor":{"type":"string","description":"Cursor to request the next page of results."}},"required":["payload"]},"annotations":{"title":"Fetch DeFi Positions","readOnlyHint":true,"destructiveHint":false,"openWorldHint":false},"_meta":{"fastmcp":{"tags":["auth_api_key","is_billed"]}}},{"name":"get_realtime_wallet_transactions","title":"Fetch transactions","description":"Get paginated transaction activity for wallet chain/address pairs, including activities, asset transfers, and labels. Deprecated chains return 410; choose a supported chain before retrying.\nFor chain coverage, edge cases, or response fields, use browse_docs\nwith path 'api/developer/wallets/transactions.md'.","inputSchema":{"type":"object","properties":{"addresses":{"type":"array","description":"Request objects. At most 20 per request.","minItems":1,"maxItems":20,"items":{"type":"object","properties":{"chain":{"type":"string","description":"Lowercase chain name"},"address":{"type":"string","description":"Wallet address"}},"required":["chain","address"],"additionalProperties":false}},"activity_type":{"type":"string","description":"Activity type to filter transactions by"},"limit":{"type":"integer","description":"Limit the number of transactions returned. Default is 25.","maximum":1000,"default":25},"transaction_hash":{"type":"string","description":"Filter by transaction hash"},"cursor":{"type":"string","description":"Cursor to request the next page of results."}},"required":["addresses"]},"annotations":{"title":"Fetch transactions","readOnlyHint":true,"destructiveHint":false,"openWorldHint":false},"_meta":{"fastmcp":{"tags":["auth_api_key","is_billed"]}}},{"name":"list_realtime_chain_tokens","title":"List tokens","description":"List chain tokens, including tokens without DEX trades. Those tokens omit price-derived fields rather than reporting zero and rank last under FDV or volume sorting. For Stellar, set chain=stellar; sort, granularity, order, and volume thresholds are unsupported.\nFor chain coverage, edge cases, or response fields, use browse_docs\nwith path 'api/developer/tokens/list-tokens.md'.","inputSchema":{"type":"object","properties":{"chain":{"type":"string","description":"The chain of the tokens. Do not pass anything to search across all tokens."},"sort":{"type":"string","description":"Sort by a certain field. One of: volume, trade_count, fully_diluted_valuation","enum":["volume","trade_count","fully_diluted_valuation"],"default":"volume"},"granularity":{"type":"string","description":"Granularity of the sorting field. Only used if sort is volume or trade_count."},"order":{"type":"string","description":"Sorting order. One of: asc, desc","enum":["asc","desc"],"default":"desc"},"limit":{"type":"integer","description":"Maximum number of tokens to return.","minimum":0,"maximum":200,"default":200},"volume_usd_1d_threshold":{"type":"number","description":"Minimum 1d volume in USD. Only returns tokens with volume >= this value."},"volume_usd_1h_threshold":{"type":"number","description":"Minimum 1h volume in USD. Only returns tokens with volume >= this value."}}},"annotations":{"title":"List tokens","readOnlyHint":true,"destructiveHint":false,"openWorldHint":false},"_meta":{"fastmcp":{"tags":["auth_api_key","is_billed"]}}},{"name":"search_realtime_chain_tokens","title":"Fetch tokens by keyword","description":"Search tokens by name or symbol. When chain is set, tokens that have never traded on a DEX are included with price-derived fields omitted. When chain is omitted, cross-chain search only returns tokens with a nonzero price or 1d volume. To get Stellar tokens, pass chain=stellar; sort, granularity, order, and volume thresholds are currently unsupported.\nFor chain coverage, edge cases, or response fields, use browse_docs\nwith path 'api/developer/tokens/search-tokens.md'.","inputSchema":{"type":"object","properties":{"q":{"type":"string","minLength":3,"description":"The query string to search in name and symbol. Performs a case-insensitive substring search."},"chain":{"type":"string","description":"The chain of the tokens. Do not pass anything to search across all tokens."},"sort":{"type":"string","description":"Sort by a certain field. One of: volume, trade_count, fully_diluted_valuation","enum":["volume","trade_count","fully_diluted_valuation"],"default":"volume"},"granularity":{"type":"string","description":"Granularity of the sorting field. Only used if sort is volume or trade_count."},"order":{"type":"string","description":"Sorting order. One of: asc, desc","enum":["asc","desc"],"default":"desc"},"limit":{"type":"integer","description":"Maximum number of tokens to return.","minimum":0,"maximum":200,"default":200},"volume_usd_1d_threshold":{"type":"number","description":"Minimum 1d volume in USD. Only returns tokens with volume >= this value."},"volume_usd_1h_threshold":{"type":"number","description":"Minimum 1h volume in USD. Only returns tokens with volume >= this value."}},"required":["q"]},"annotations":{"title":"Fetch tokens by keyword","readOnlyHint":true,"destructiveHint":false,"openWorldHint":false},"_meta":{"fastmcp":{"tags":["auth_api_key","is_billed"]}}},{"name":"get_realtime_tokens_by_chain_address","title":"Fetch token by address","description":"Get token details by chain and address, including tokens without DEX trades. Those tokens retain on-chain decimals and total_supply but omit price-derived fields rather than reporting zero. A not-found error means no on-chain supply record exists for the address.\nFor chain coverage, edge cases, or response fields, use browse_docs\nwith path 'api/developer/tokens/get-tokens-by-chain-address.md'.","inputSchema":{"type":"object","properties":{"payloads":{"type":"array","minItems":1,"maxItems":200,"items":{"type":"object","properties":{"token_address":{"type":"string","description":"Token contract address"},"chain":{"type":"string","description":"Lowercase chain name"}},"required":["token_address","chain"],"additionalProperties":false},"description":"Request objects. At most 200 per request."}},"required":["payloads"]},"annotations":{"title":"Fetch token by address","readOnlyHint":true,"destructiveHint":false,"openWorldHint":false},"_meta":{"fastmcp":{"tags":["auth_api_key","is_billed"]}}},{"name":"get_realtime_holdings_history","title":"Fetch holdings history","description":"Get historical aggregated USD holdings for one or more addresses.\nFor chain coverage, edge cases, or response fields, use browse_docs\nwith path 'api/developer/holdings/holdings-history.md'.","inputSchema":{"type":"object","properties":{"start_timestamp":{"type":"string","description":"Start of time range (UTC ISO 8601)"},"end_timestamp":{"type":"string","description":"End of time range (UTC ISO 8601)"},"granularity":{"type":"string","description":"Time interval granularity (15s, 1m, 5m, 1h, 1d)","enum":["15s","1m","5m","1h","1d"]},"addresses":{"type":"array","description":"List of wallet chain+address pairs. At most 15 per request.","minItems":1,"maxItems":15,"items":{"type":"object","properties":{"chain":{"type":"string","description":"Lowercase chain name"},"address":{"type":"string","description":"Wallet address"}},"required":["chain","address"],"additionalProperties":false}},"include_token_breakdown":{"type":"boolean","description":"If true, includes per-token breakdown in each interval","default":false},"cursor":{"type":"string","description":"cursor"},"min_liquidity":{"type":"number","description":"Minimum USD liquidity threshold to include a token"}},"required":["start_timestamp","end_timestamp","granularity","addresses"]},"annotations":{"title":"Fetch holdings history","readOnlyHint":true,"destructiveHint":false,"openWorldHint":false},"_meta":{"fastmcp":{"tags":["auth_api_key","is_billed"]}}},{"name":"get_realtime_holdings_pnl","title":"Fetch current PnL by Wallet","description":"Get profit and loss for up to 20 wallet chain/address pairs.\nFor chain coverage, edge cases, or response fields, use browse_docs\nwith path 'api/developer/holdings/holdings-pnl.md'.","inputSchema":{"type":"object","properties":{"addresses":{"type":"array","description":"Request objects. At most 20 per request.","minItems":1,"maxItems":20,"items":{"type":"object","properties":{"chain":{"type":"string","description":"Lowercase chain name"},"address":{"type":"string","description":"Wallet address"}},"required":["chain","address"],"additionalProperties":false}},"min_liquidity":{"type":"number","description":"Minimum liquidity of which tokens must have to be included in the response."}},"required":["addresses"]},"annotations":{"title":"Fetch current PnL by Wallet","readOnlyHint":true,"destructiveHint":false,"openWorldHint":false},"_meta":{"fastmcp":{"tags":["auth_api_key","is_billed"]}}},{"name":"get_realtime_holdings_pnl_history","title":"Fetch historical PnL by Wallet","description":"Get historical profit and loss for up to 20 wallet chain/address pairs over a time range.\nFor chain coverage, edge cases, or response fields, use browse_docs\nwith path 'api/developer/holdings/holdings-pnl-history.md'.","inputSchema":{"type":"object","properties":{"start_timestamp":{"type":"string","description":"Start of time range (UTC ISO 8601)"},"end_timestamp":{"type":"string","description":"End of time range (UTC ISO 8601)"},"granularity":{"type":"string","description":"Time interval granularity (1d, 1h, 5m, 1m, 15s)","enum":["1h","1d","1m","5m","15s"]},"addresses":{"type":"array","description":"List of wallet chain+address pairs. At most 20 per request.","minItems":1,"maxItems":20,"items":{"type":"object","properties":{"chain":{"type":"string","description":"Lowercase chain name"},"address":{"type":"string","description":"Wallet address"}},"required":["chain","address"],"additionalProperties":false}},"min_liquidity":{"type":"number","description":"Minimum liquidity of which tokens must have to be included in the response."}},"required":["start_timestamp","end_timestamp","granularity","addresses"]},"annotations":{"title":"Fetch historical PnL by Wallet","readOnlyHint":true,"destructiveHint":false,"openWorldHint":false},"_meta":{"fastmcp":{"tags":["auth_api_key","is_billed"]}}},{"name":"get_realtime_holdings_pnl_by_token","title":"Fetch current PnL by Wallet & Token","description":"Get profit and loss for up to 20 wallet-token chain/address triples.\nFor chain coverage, edge cases, or response fields, use browse_docs\nwith path 'api/developer/holdings/holdings-pnl-by-token.md'.","inputSchema":{"type":"object","properties":{"addresses":{"type":"array","description":"Request objects. At most 20 per request.","minItems":1,"maxItems":20,"items":{"type":"object","properties":{"chain":{"type":"string","description":"Lowercase chain name"},"address":{"type":"string","description":"Wallet address"},"token_address":{"type":"string","description":"Token contract address"}},"required":["chain","address","token_address"],"additionalProperties":false}}},"required":["addresses"]},"annotations":{"title":"Fetch current PnL by Wallet & Token","readOnlyHint":true,"destructiveHint":false,"openWorldHint":false},"_meta":{"fastmcp":{"tags":["auth_api_key","is_billed"]}}},{"name":"get_realtime_holdings_pnl_by_token_history","title":"Fetch historical PnL by Wallet & Token","description":"Get historical profit and loss for up to 20 wallet-token chain/address triples over a time range.\nFor chain coverage, edge cases, or response fields, use browse_docs\nwith path 'api/developer/holdings/holdings-pnl-by-token-history.md'.","inputSchema":{"type":"object","properties":{"start_timestamp":{"type":"string","description":"Start of time range (UTC ISO 8601)"},"end_timestamp":{"type":"string","description":"End of time range (UTC ISO 8601)"},"granularity":{"type":"string","description":"Time interval granularity (1d, 1h, 5m, 1m, 15s)","enum":["1h","1d","1m","5m","15s"]},"addresses":{"type":"array","description":"List of wallet chain+address+token triples. At most 20 per request.","minItems":1,"maxItems":20,"items":{"type":"object","properties":{"chain":{"type":"string","description":"Lowercase chain name"},"address":{"type":"string","description":"Wallet address"},"token_address":{"type":"string","description":"Token contract address"}},"required":["chain","address","token_address"],"additionalProperties":false}}},"required":["start_timestamp","end_timestamp","granularity","addresses"]},"annotations":{"title":"Fetch historical PnL by Wallet & Token","readOnlyHint":true,"destructiveHint":false,"openWorldHint":false},"_meta":{"fastmcp":{"tags":["auth_api_key","is_billed"]}}},{"name":"get_realtime_hyperliquid_info","title":"Hyperliquid: Info","description":"Query Hyperliquid account, market, or exchange information by request type through Allium. Use the dedicated fills, order history, order status, orderbook, or asset contexts tools for those storage-backed views. A 422 indicates an unsupported type or malformed body; check the type and its required fields. A 403 indicates a missing or invalid API key. Invalid payloads may return 533 instead of Hyperliquid's 500.\nFor chain coverage, edge cases, or response fields, use browse_docs\nwith path 'api/developer/hyperliquid/info.md'.","inputSchema":{"type":"object","properties":{"type":{"type":"string","description":"Request type, e.g. activeAssetData or clearinghouseState. See the type list for the supported set."},"user":{"type":"string","description":"User's wallet address (hex string). Required by account-scoped types."},"dex":{"type":"string","description":"Builder DEX name for HIP-3 markets, e.g. xyz. Omit for core perps."},"coin":{"type":"string","description":"Asset name, e.g. ETH, or the prefixed name for a HIP-3 market, e.g. xyz:UNITREE. Used by activeAssetData."},"id":{"type":"integer","description":"Margin table id. Used by marginTable."},"builder":{"type":"string","description":"Builder address (hex string). Used by maxBuilderFee."}},"required":["type"]},"annotations":{"title":"Hyperliquid: Info","readOnlyHint":true,"destructiveHint":false,"openWorldHint":false},"_meta":{"fastmcp":{"tags":["auth_api_key","is_billed"]}}},{"name":"get_realtime_hyperliquid_fills","title":"Hyperliquid: Fills","description":"Get Hyperliquid userFills, userFillsByTime, or userTwapSliceFills by wallet address. These request types match Hyperliquid; userFillsByTime has no historical lookback limit. Results are capped at 2000 fills per call.\nFor chain coverage, edge cases, or response fields, use browse_docs\nwith path 'api/developer/hyperliquid/fills.md'.","inputSchema":{"type":"object","properties":{"type":{"type":"string","description":"Type of fills to retrieve. Applies to all request types.","enum":["userFills","userFillsByTime","userTwapSliceFills"]},"user":{"type":"string","description":"User's wallet address (hex string). Applies to all request types."},"startTime":{"type":"integer","description":"Start time filter (Unix timestamp in milliseconds). Required for userFillsByTime. Only applies to userFillsByTime."},"endTime":{"type":"integer","description":"End time filter (Unix timestamp in milliseconds). Only applies to userFillsByTime."},"aggregateByTime":{"type":"boolean","description":"When true, aggregates multiple fills from the same order at the same timestamp into a single fill with combined size, weighted average price, and summed fees/PnL. Only applies to userFills and userFillsByTime."},"twapMode":{"type":"string","description":"Controls TWAP fill filtering: 'none' (default) excludes TWAP fills, 'include' returns both regular and TWAP fills, 'only' returns only TWAP fills. Only applies to userFills and userFillsByTime.","enum":["none","include","only"]}},"required":["type","user"]},"annotations":{"title":"Hyperliquid: Fills","readOnlyHint":true,"destructiveHint":false,"openWorldHint":false},"_meta":{"fastmcp":{"tags":["auth_api_key","is_billed"]}}},{"name":"get_realtime_hyperliquid_order_history","title":"Hyperliquid: Order history","description":"Get a wallet's Hyperliquid historicalOrders. Omit times for recent orders. Historical lookback is unrestricted, but each startTime-endTime window must span at most 30 days; paginate longer ranges with successive windows. Results are capped at 2000 orders per call.\nFor chain coverage, edge cases, or response fields, use browse_docs\nwith path 'api/developer/hyperliquid/order-history.md'.","inputSchema":{"type":"object","properties":{"type":{"type":"string","description":"Request type - must be 'historicalOrders'","enum":["historicalOrders"]},"user":{"type":"string","description":"User's wallet address (hex string)"},"startTime":{"type":"integer","description":"Start time filter (Unix timestamp in milliseconds). The interval between startTime and endTime cannot exceed 30 days."},"endTime":{"type":"integer","description":"End time filter (Unix timestamp in milliseconds). The interval between startTime and endTime cannot exceed 30 days."}},"required":["type","user"]},"annotations":{"title":"Hyperliquid: Order history","readOnlyHint":true,"destructiveHint":false,"openWorldHint":false},"_meta":{"fastmcp":{"tags":["auth_api_key","is_billed"]}}},{"name":"get_realtime_hyperliquid_order_status","title":"Hyperliquid: Order status","description":"Get a Hyperliquid order status by wallet and numeric order ID or client order ID. Unknown orders return Hyperliquid's unknownOid status.\nFor chain coverage, edge cases, or response fields, use browse_docs\nwith path 'api/developer/hyperliquid/order-status.md'.","inputSchema":{"type":"object","properties":{"type":{"type":"string","description":"Request type - must be 'orderStatus'","enum":["orderStatus"]},"user":{"type":"string","description":"User's wallet address (hex string)"},"oid":{"type":["integer","string"],"description":"Order ID - can be either numeric order ID or string client order ID"}},"required":["type","user","oid"]},"annotations":{"title":"Hyperliquid: Order status","readOnlyHint":true,"destructiveHint":false,"openWorldHint":false},"_meta":{"fastmcp":{"tags":["auth_api_key","is_billed"]}}},{"name":"get_realtime_hyperliquid_orderbook_snapshot","title":"Hyperliquid: L4 Orderbook snapshot","description":"Get complete orderbook snapshot for all pairs.\nCompression Required. This endpoint requires brotli compression for efficient data transfer.\nFor chain coverage, edge cases, or response fields, use browse_docs\nwith path 'api/developer/hyperliquid/orderbook-snapshot.md'.","inputSchema":{"type":"object","properties":{}},"annotations":{"title":"Hyperliquid: L4 Orderbook snapshot","readOnlyHint":true,"destructiveHint":false,"openWorldHint":false},"_meta":{"fastmcp":{"tags":["auth_api_key","is_billed"]}}},{"name":"get_realtime_hyperliquid_asset_contexts","title":"Hyperliquid: Asset contexts","description":"Get current or historical Hyperliquid metaAndAssetCtxs snapshots with prices, funding, and open interest. The latest snapshot lags the exchange by about 2-3 minutes. History requires both times and spans at most 30 days per call, with at most 60 snapshots without a coin filter or 2000 with one. History starts 9 May 2025; earlier windows return no rows. Oversized windows return 400 rather than truncated results. Each context carries coin, timestamp, and maxLeverage; the universe array is omitted and impactPxs is currently null.\nFor chain coverage, edge cases, or response fields, use browse_docs\nwith path 'api/developer/hyperliquid/asset-contexts.md'.","inputSchema":{"type":"object","properties":{"type":{"type":"string","description":"Request type. Same as Hyperliquid's.","enum":["metaAndAssetCtxs"]},"dex":{"type":"string","description":"Builder DEX name for HIP-3 markets, e.g. xyz. Omit or pass an empty string for core perps."},"coin":{"type":"string","description":"Optional filter to one market. Hyperliquid's prefixed form for HIP-3 markets, e.g. xyz:XYZ100, or the bare coin with dex set. Omit for every coin in the dex."},"startTime":{"type":"integer","description":"Window start, inclusive (Unix ms). Rounded down to the bucket boundary of the chosen interval. Omit both times for the latest snapshot."},"endTime":{"type":"integer","description":"Window end, exclusive (Unix ms). Rounded down to the bucket boundary, so only complete buckets are returned. Span at most 30 days; at most 60 snapshots without a coin filter, 2000 with one; the rounded window must contain at least one bucket."},"interval":{"type":"string","description":"Snapshot spacing. Each coin's last sample in the bucket is returned. Ignored when times are omitted.","enum":["1m","5m","15m","1h","4h","1d"],"default":"1m"}},"required":["type"]},"annotations":{"title":"Hyperliquid: Asset contexts","readOnlyHint":true,"destructiveHint":false,"openWorldHint":false},"_meta":{"fastmcp":{"tags":["auth_api_key","is_billed"]}}},{"name":"list_realtime_crosschain_assets","title":"List assets","description":"List cross-chain assets with pagination.\nFor chain coverage, edge cases, or response fields, use browse_docs\nwith path 'api/developer/assets/list-assets.md'.","inputSchema":{"type":"object","properties":{"cursor":{"type":"string","description":"Cursor for pagination"},"limit":{"type":"integer","description":"Number of results per page","minimum":1,"maximum":10000,"default":100}}},"annotations":{"title":"List assets","readOnlyHint":true,"destructiveHint":false,"openWorldHint":false},"_meta":{"fastmcp":{"tags":["auth_api_key","is_billed"]}}},{"name":"get_realtime_crosschain_assets","title":"Get assets","description":"Get cross-chain assets by ID, slug, or chain and token address.\nFor chain coverage, edge cases, or response fields, use browse_docs\nwith path 'api/developer/assets/get-assets.md'.","inputSchema":{"type":"object","properties":{"requests":{"type":"array","items":{"type":"object","description":"Identify one asset by exactly one of: id, slug, or chain together with address.","properties":{"id":{"type":"integer","description":"Asset ID to look up."},"slug":{"type":"string","description":"Asset slug to look up."},"chain":{"type":"string","description":"Lowercase chain name. Required with address."},"address":{"type":"string","description":"Token contract address."}},"additionalProperties":false},"minItems":1,"maxItems":100,"description":"Request objects."}},"required":["requests"]},"annotations":{"title":"Get assets","readOnlyHint":true,"destructiveHint":false,"openWorldHint":false},"_meta":{"fastmcp":{"tags":["auth_api_key","is_billed"]}}}]}} ## 3. POST https://mcp.allium.so/ tools/call realtime_get_supported_chains (the 2026-09-20 record's name), no credentials HTTP/2 200 cache-control: no-cache, no-transform content-type: text/event-stream x-accel-buffering: no set-cookie: [redacted] date: Mon, 28 Sep 2026 06:36:29 GMT server: Google Frontend via: 1.1 google alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 [body: 255 bytes as received, sha256 7fc99bd8842adfe666fcf82bcd87b6233a0c31a38dd90a9f713bb1e1b8f3865b] event: message data: {"jsonrpc":"2.0","id":3,"result":{"content":[{"type":"text","text":"Not authenticated. Please sign in with your Allium account or configure an API key. See https://docs.allium.so/ai/mcp for setup instructions."}],"isError":true}} ## 4. POST https://mcp.allium.so/ tools/call get_realtime_supported_chains (today's name), no credentials HTTP/2 200 cache-control: no-cache, no-transform content-type: text/event-stream x-accel-buffering: no set-cookie: [redacted] date: Mon, 28 Sep 2026 06:41:11 GMT server: Google Frontend via: 1.1 google alt-svc: h3=":443"; ma=2592000 [body: 255 bytes as received, sha256 63fd3b1c6ffb47636cef6e7461473316684984a7c4e43455151696b3e13325f9] event: message data: {"jsonrpc":"2.0","id":4,"result":{"content":[{"type":"text","text":"Not authenticated. Please sign in with your Allium account or configure an API key. See https://docs.allium.so/ai/mcp for setup instructions."}],"isError":true}} ## 5. POST https://mcp-oauth.allium.so/ MCP initialize, no credentials HTTP/2 401 www-authenticate: Bearer resource_metadata="https://mcp-oauth.allium.so/.well-known/oauth-protected-resource" x-cloud-trace-context: 5cb04eb01624f2d04246388a502140a6;o=1 set-cookie: [redacted] date: Mon, 28 Sep 2026 06:32:04 GMT content-type: text/html server: Google Frontend content-length: 0 via: 1.1 google alt-svc: h3=":443"; ma=2592000 [body: 0 bytes as received, sha256 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855] ## 6. GET https://mcp-oauth.allium.so/.well-known/oauth-protected-resource HTTP/2 200 cache-control: public, max-age=3600 content-type: application/json x-cloud-trace-context: 453bb107b4ef9066b1e28baecf145186;o=1 set-cookie: [redacted] date: Mon, 28 Sep 2026 06:36:30 GMT server: Google Frontend content-length: 168 via: 1.1 google alt-svc: h3=":443"; ma=2592000 [body: 168 bytes as received, sha256 5461e514e0f99f5939ba2a4ae13ef0b129c95356e66cb85c2aa22e008a31878a] {"resource":"https://mcp-oauth.allium.so/","authorization_servers":["https://mcp-oauth.allium.so/"],"scopes_supported":["openid"],"bearer_methods_supported":["header"]} ## 7. GET https://agents.allium.so/api/v1/developer/tokens/search?q=usdc, no wallet, no payment HTTP/2 402 date: Mon, 28 Sep 2026 06:32:03 GMT content-type: application/json server: cloudflare www-authenticate: Payment id="[redacted by the prober: an ephemeral challenge id]", realm="agents.allium.so", method="tempo", intent="charge", request="[base64 elided by the prober: it decodes to amount 30000 or 20000, currency 0x20c0...8b50, an expiry, methodDetails chainId 4217, a recipient, and the ephemeral Stripe fields]" payment-required: [base64 of the JSON body printed below, elided by the prober because it encodes the same ephemeral ids] vary: Accept-Encoding content-encoding: gzip via: 1.1 google cf-cache-status: DYNAMIC x-content-type-options: nosniff strict-transport-security: max-age=31536000; includeSubDomains cf-ray: a420b56bafbb121b-BOS [body: 1819 bytes as received, sha256 3efbac03ee5116cc950c74d7d0e7a36d6fd2f62816aa2b4f4a81f9b4d2c26f16] {"x402Version":2,"error":"Payment Required!","accepts":[{"scheme":"exact","network":"eip155:8453","amount":"30000","payTo":"0xdd80f4129dc03b5d8b9c0f3f62274aac5d5c8e5d","maxTimeoutSeconds":1790577183,"asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","extra":{"stripe_payment_intent_id":"[redacted by the prober: an ephemeral Stripe payment intent id]","stripe_mode":"custody","name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"30000","payTo":"BNx2HJhxwQxEgSPJUhje4WsUay1kZKndZRC3RpznPV5t","maxTimeoutSeconds":1790577183,"asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","extra":{"stripe_payment_intent_id":"[redacted by the prober: an ephemeral Stripe payment intent id]","stripe_mode":"custody","name":"USDC","version":"2","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}},{"scheme":"exact","network":"eip155:196","amount":"30000","payTo":"0x61Fdbe66c1AEaF491b8e121C83070aa750DDCada","maxTimeoutSeconds":1790577183,"asset":"0x74b7f16337b8972027f6196a17a631ac6de26d22","extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"eip155:137","amount":"30000","payTo":"0xF5B59aA4D23621B382Ac56465e2a78432CE768CA","maxTimeoutSeconds":1790577183,"asset":"0x3c499c542cEF5E3811e1192ce70d8cc03d5c3359","extra":{"name":"USD Coin","version":"2"}}],"resource":{"url":"https://agents.allium.so/api/v1/developer/tokens/search?q=usdc","description":"API request: /api/v1/developer/tokens/search","mimeType":"application/json"},"extensions":{"bazaar":{"info":{"input":{"type":"http","method":"GET"},"output":{"type":"json","example":[{"object":"token","chain":"ethereum","address":"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2","type":"evm_erc20","price":2500.5,"decimals":18,"info":{"name":"Wrapped Ether","symbol":"WETH"},"attributes":{"total_liquidity_usd":{"amount":1500000000},"volume_usd_1d":850000000}}]}}}}} ## 8. POST https://agents.allium.so/api/v1/developer/prices body {"addresses":[]}, no payment HTTP/2 402 date: Mon, 28 Sep 2026 06:32:54 GMT content-type: application/json server: cloudflare www-authenticate: Payment id="[redacted by the prober: an ephemeral challenge id]", realm="agents.allium.so", method="tempo", intent="charge", request="[base64 elided by the prober: it decodes to amount 30000 or 20000, currency 0x20c0...8b50, an expiry, methodDetails chainId 4217, a recipient, and the ephemeral Stripe fields]" payment-required: [base64 of the JSON body printed below, elided by the prober because it encodes the same ephemeral ids] vary: Accept-Encoding content-encoding: gzip via: 1.1 google cf-cache-status: DYNAMIC x-content-type-options: nosniff strict-transport-security: max-age=31536000; includeSubDomains cf-ray: a420b6a3fedaa5cd-BOS [body: 2622 bytes as received, sha256 01033cf982ca32bf088c6ca8656a744ea0c547f1ed3cd00177440bea62950451] {"x402Version":2,"error":"Payment Required!","accepts":[{"scheme":"exact","network":"eip155:8453","amount":"20000","payTo":"0xb2a2f6de97b0720958db9c57c2384873f3925a8d","maxTimeoutSeconds":1790577234,"asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","extra":{"stripe_payment_intent_id":"[redacted by the prober: an ephemeral Stripe payment intent id]","stripe_mode":"custody","name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"20000","payTo":"DB5P91yzRNxNsReGoT91RoDLVG6ybafQHJcJMiwpsh7o","maxTimeoutSeconds":1790577234,"asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","extra":{"stripe_payment_intent_id":"[redacted by the prober: an ephemeral Stripe payment intent id]","stripe_mode":"custody","name":"USDC","version":"2","feePayer":"GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"}},{"scheme":"exact","network":"eip155:196","amount":"20000","payTo":"0x61Fdbe66c1AEaF491b8e121C83070aa750DDCada","maxTimeoutSeconds":1790577234,"asset":"0x74b7f16337b8972027f6196a17a631ac6de26d22","extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"eip155:137","amount":"20000","payTo":"0xF5B59aA4D23621B382Ac56465e2a78432CE768CA","maxTimeoutSeconds":1790577234,"asset":"0x3c499c542cEF5E3811e1192ce70d8cc03d5c3359","extra":{"name":"USD Coin","version":"2"}}],"resource":{"url":"https://agents.allium.so/api/v1/developer/prices","description":"API request: /api/v1/developer/prices","mimeType":"application/json"},"extensions":{"bazaar":{"info":{"input":{"type":"http","method":"POST","bodyType":"json","body":[{"token_address":"[0xC02a...56Cc2, the public WETH contract address in the vendor's example body; elided by the prober because the publish door reads a key named token_address as a credential]","chain":"ethereum"},{"token_address":"[So1111...1112, the public wrapped-SOL mint address in the vendor's example body; elided by the prober because the publish door reads a key named token_address as a credential]","chain":"solana"}]},"output":{"type":"json","example":{"items":[{"timestamp":"2025-06-17T18:00:00Z","chain":"ethereum","address":"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2","decimals":18,"price":2500.5,"open":2495.0,"high":2510.0,"close":2500.5,"low":2490.0}]}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"http"},"method":{"type":"string","enum":["POST"]},"bodyType":{"type":"string","enum":["json"]},"body":{"type":"object","properties":{"token_address":{"type":"string","description":"Token contract address"},"chain":{"type":"string","description":"Blockchain network (e.g. ethereum, solana, base)"}},"required":["token_address","chain"]}},"required":["type","bodyType","body","method"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}}}},"required":["input"]}}}} ## 9. GET https://agents.allium.so/api/v1/supported-chains/realtime-apis/simple HTTP/2 200 date: Mon, 28 Sep 2026 06:32:52 GMT content-type: application/json server: cloudflare vary: Accept-Encoding content-encoding: gzip via: 1.1 google cf-cache-status: DYNAMIC x-content-type-options: nosniff strict-transport-security: max-age=31536000; includeSubDomains cf-ray: a420b69f4e70f4f7-BOS [body: 2497 bytes as received, sha256 b722e288f53a0b35e4d87452522da24f53a9a3c66453700bae46248d9d48b69f] {"/api/v1/developer/wallet/balances/history":["arbitrum","avalanche","bsc","base","bitcoin","celo","ethereum","near","optimism","polygon","robinhood","solana","stellar","unichain","x_layer"],"/api/v1/developer/wallet/balances":["arbitrum","arc","avalanche","bsc","base","bitcoin","celo","ethereum","hyperevm","monad","near","optimism","polygon","robinhood","solana","stellar","unichain","x_layer","xdc_network"],"/api/v1/developer/wallet/transactions":["arbitrum","arc","avalanche","bsc","base","bitcoin","celo","ethereum","hyperevm","monad","near","optimism","polygon","robinhood","solana","stellar","unichain","x_layer","xdc_network"],"/api/v1/developer/wallet/pnl":["arbitrum","avalanche","bsc","base","bitcoin","celo","ethereum","hyperevm","monad","optimism","polygon","robinhood","solana","unichain","x_layer","zksync"],"/api/v1/developer/wallet/holdings/history":["arbitrum","avalanche","bsc","base","bitcoin","celo","ethereum","hyperevm","monad","optimism","polygon","solana","unichain","zksync"],"/api/v1/developer/prices/history":["arbitrum","avalanche","bsc","base","celo","ethereum","hyperevm","optimism","polygon","robinhood","solana","unichain","zksync"],"/api/v1/developer/prices":["arbitrum","avalanche","bsc","base","celo","ethereum","hyperevm","optimism","polygon","robinhood","solana","unichain","zksync"],"/api/v1/developer/prices/stats":["arbitrum","avalanche","bsc","base","celo","ethereum","hyperevm","optimism","polygon","robinhood","solana","unichain","zksync"],"/api/v1/developer/prices/at-timestamp":["arbitrum","avalanche","bsc","base","celo","ethereum","hyperevm","optimism","polygon","robinhood","solana","unichain","zksync"],"/api/v1/developer/tokens/transfers":["arbitrum","avalanche","bsc","base","celo","ethereum","hyperevm","monad","optimism","polygon","robinhood","solana","stellar","unichain","x_layer","zksync"],"/api/v1/developer/tokens":["arbitrum","base","ethereum","near","optimism","polygon","solana","stellar"],"/api/v1/developer/tokens/search":["arbitrum","base","ethereum","near","optimism","polygon","solana","stellar"],"/api/v1/developer/trading/hyperliquid/info/fills":["hyperevm"],"/api/v1/developer/trading/hyperliquid/info/order/history":["hyperevm"],"/api/v1/developer/trading/hyperliquid/info/order/status":["hyperevm"],"/api/v1/developer/trading/hyperliquid/info":["hyperevm"],"/api/v1/developer/wallet/positions":["arbitrum","avalanche","bsc","base","celo","ethereum","hyperliquid","monad","optimism","polygon","solana","unichain","x_layer"]} ## 10. GET https://docs.allium.so/llms.txt HTTP/2 200 date: Mon, 28 Sep 2026 06:32:08 GMT content-type: text/plain; charset=utf-8 cf-ray: a420b5783826f9be-BOS cf-cache-status: DYNAMIC age: 0 cache-control: private, no-store server: cloudflare strict-transport-security: max-age=31536000; includeSubDomains vary: rsc, next-router-state-tree, next-router-prefetch, next-router-segment-prefetch, accept-encoding content-security-policy: worker-src 'self' blob:; object-src 'none'; base-uri 'self'; upgrade-insecure-requests; frame-ancestors 'self' https://dashboard.mintlify.com https://app.mintlify.com; form-action 'self' https://codesandbox.io; x-content-type-options: nosniff x-frame-options: DENY x-matched-path: /_sites/[subdomain]/llms.txt x-vercel-cache: MISS x-vercel-id: iad1::iad1::t4qnw-1790577125207-90828cd9af0f content-encoding: gzip [body: 41571 bytes as received, sha256 234e41f9291f6d4ce232f9f6bc89e06b2785c6c18dd78e367d17e9699523f6dc] # Allium Documentation Hub > Allium provides production-grade blockchain data infrastructure including historical data, realtime APIs, datashares, datastreams, and AI tools across 85+ blockchains. ## Welcome - [Introduction](https://docs.allium.so/index.md): Allium is the enterprise blockchain data platform powering analytics, engineering, and accounting with unmatched breadth, depth, and accuracy. - [Product Comparison](https://docs.allium.so/product-comparison.md): Allium delivers data via five core products: Explorer, Datashares, Realtime APIs, Datastreams, and Beam. - [Allium Realtime APIs](https://docs.allium.so/realtime-apis.md) - [Machine Payments](https://docs.allium.so/api/developer/machine-payments.md): Pay-per-call blockchain data access with USDC — no API key, no registration, no subscription. ### Use Cases - [Analytics](https://docs.allium.so/use-cases/analytics.md): Query, visualize, and analyze blockchain data with Explorer and Datashares. - [Applications](https://docs.allium.so/use-cases/applications.md): Build and scale blockchain applications with Allium Realtime and Datastreams. - [Audit and Accounting](https://docs.allium.so/use-cases/accounting.md): Power transaction monitoring, data reconciliation, and financial reporting with Explorer and Datashares. ### Allium App - [Overview](https://docs.allium.so/app/overview.md): A one-stop destination for all your blockchain analytics needs. - [Visualize results](https://docs.allium.so/app/visualisations.md): Chart and present your data through our visualization tools. - [Upload your own data](https://docs.allium.so/app/data-upload.md): Join your data with ours. #### Run Queries - [Run a basic query](https://docs.allium.so/app/run-queries/basic-query.md): Learn how to write and execute SQL queries across all blockchains in the Allium App. - [Create a parameterized query](https://docs.allium.so/app/run-queries/parameterized-query.md): Build reusable queries with configurable parameters for flexible data analysis. - [Query on a previous result](https://docs.allium.so/app/run-queries/query-on-previous-result.md): Build complex analyses by querying the results of completed query runs. #### Manage your account - [Multi-Factor Authentication (MFA)](https://docs.allium.so/app/account-management/mfa.md): Protect your account with an extra verification step. #### Manage your team - [IP Whitelisting](https://docs.allium.so/app/organization-management/ip-whitelisting.md): Restrict login to specific IPs. - [Secrets](https://docs.allium.so/app/organization-management/secrets.md): Manage organization secrets for Beam pipelines and integrations. - [Login Session Timeout](https://docs.allium.so/app/organization-management/session-timeout.md): Limit the duration of an idle login session. - [SSO / SAML Setup](https://docs.allium.so/app/organization-management/sso.md): Set up Single Sign-On (SSO) for Allium using your identity provider (IdP) via SAML. - [Usage & Billing](https://docs.allium.so/app/organization-management/usage-and-billing.md): Monitor usage, view invoices, and configure overage behavior. - [User Management](https://docs.allium.so/app/organization-management/users.md): Manage users and roles in your organization. #### Manage your query runs - [Compute Profiles](https://docs.allium.so/app/query-management/compute-profiles.md): Choose the amount of compute resources used to run your queries. - [Purge Query Queue](https://docs.allium.so/app/query-management/purge-query-queue.md): Remove pending queries to clear blocked execution. ### Allium Datashares - [Overview](https://docs.allium.so/datashares/overview.md): Data delivery straight to your data lake for privacy and control. - [Databricks](https://docs.allium.so/datashares/databricks.md): Access our blockchain data through secure Databricks Delta Sharing. - [Snowflake](https://docs.allium.so/datashares/snowflake.md): Access our blockchain data through secure Snowflake Shares. - [BigQuery](https://docs.allium.so/datashares/bigquery.md): Access Allium data in your own native GCP/BigQuery environment. - [BI Visualization Tools](https://docs.allium.so/datashares/bi-visualization-tools.md): Connect your preferred BI tool to visualize Allium's blockchain data. - [Walrus](https://docs.allium.so/datashares/walrus.md): Fetch Allium blockchain data from Walrus as encrypted quilt patches. ### Allium Datastreams - [Overview](https://docs.allium.so/datastreams/overview.md): Realtime, low-latency data streaming to your data lake of choice. - [Apache Kafka](https://docs.allium.so/datastreams/kafka.md): Integrate Allium's realtime data streams via Apache Kafka. - [Google Pub/Sub](https://docs.allium.so/datastreams/pubsub.md): Integrate Allium's realtime data streams via Google Cloud Pub/Sub. - [Amazon SNS](https://docs.allium.so/datastreams/sns.md): Integrate Allium's realtime data streams via Amazon Simple Notification Service. - [Websockets](https://docs.allium.so/datastreams/websockets.md): Access Allium's APIs and data streams through websockets for real-time data delivery. - [Transformations](https://docs.allium.so/datastreams/transformations.md): Turn raw blockchain streams into actionable signals by applying transformations on Allium streams. ### Allium Beam - [Overview](https://docs.allium.so/beam/overview.md): Build custom-filtered realtime blockchain data pipelines - deploy in 30 seconds, no infrastructure to build. - [Quickstart](https://docs.allium.so/beam/quickstart.md): Create, deploy, and consume your first Beam pipeline in minutes. - [Configuration reference](https://docs.allium.so/beam/configuration.md): Guide to configuring Beam pipelines in the Allium App. - [Webhook authentication](https://docs.allium.so/beam/webhook-authentication.md): Verify that incoming webhook requests came from Beam, with replay protection. - [Permissions](https://docs.allium.so/beam/permissions.md): Roles and access levels that control who can view, edit, and manage a Beam pipeline. - [Examples](https://docs.allium.so/beam/examples.md): Pipeline configuration examples for common Beam use cases. ### Allium Nodes - [Overview](https://docs.allium.so/nodes/overview.md): Direct peer access to blockchain nodes Allium already runs — no node operations on your side. - [Hyperliquid Sentry Peer](https://docs.allium.so/nodes/hyperliquid-sentry-peer.md): Connect your Hyperliquid node to Allium's sentry peer for a stable, low-latency upstream. ## Allium AI ### Assistant - [Overview](https://docs.allium.so/ai/assistant/overview.md): An AI-powered blockchain data analyst built into the Allium App. Ask questions in plain English, get SQL queries, dashboards, and reports. - [Capabilities](https://docs.allium.so/ai/assistant/capabilities.md): Everything the Allium AI Assistant can do, from SQL generation to deploying live web apps. - [Examples](https://docs.allium.so/ai/assistant/examples.md): End-to-end workflow walkthroughs showing the assistant's multi-step reasoning. - [Organization memory](https://docs.allium.so/ai/assistant/memory.md): Persistent context shared across all users in your organization. ### MCP - [Overview](https://docs.allium.so/ai/mcp/overview.md): Query blockchain data from Allium Explorer using MCP. - [Plugins](https://docs.allium.so/ai/mcp/plugins.md): Install the allium-analyst plugin to give your agent a query methodology for Allium data. - [Examples](https://docs.allium.so/ai/mcp/examples.md): See what you can build with Allium's MCP Server. #### Tools - [Overview](https://docs.allium.so/ai/mcp/tools-reference/overview.md): Every tool the Allium MCP Server exposes for querying, analyzing, and visualizing blockchain data. - [SQL & queries](https://docs.allium.so/ai/mcp/tools-reference/sql-and-queries.md): Run SQL against Allium's blockchain data, save reusable Explorer queries, and fetch results. - [Knowledge & discovery](https://docs.allium.so/ai/mcp/tools-reference/knowledge.md): Find the right tables, docs, and existing dashboards before writing a single line of SQL. - [Dashboards & sharing](https://docs.allium.so/ai/mcp/tools-reference/dashboards.md): Build Explorer visuals and dashboards from your queries, then publish share and embed links. - [Realtime data](https://docs.allium.so/ai/mcp/tools-reference/realtime.md): Prices, balances, transactions, DeFi positions, holdings PnL, tokens, and assets, without SQL. - [Hyperliquid](https://docs.allium.so/ai/mcp/tools-reference/hyperliquid.md): Query Hyperliquid account, market, order, and orderbook data through Allium's rate-limit-free proxy. - [Skills](https://docs.allium.so/ai/mcp/tools-reference/skills.md): Fetch Allium's own guidance on writing efficient SQL, building dashboards, and picking a product. - [Billing & limits](https://docs.allium.so/ai/mcp/tools-reference/billing-and-limits.md): Which MCP tools consume credits, how much data comes back, and why your tool list may be shorter than the docs. ### Machine Payments - [Overview](https://docs.allium.so/ai/machine-payments/overview.md): Machine payment protocols for AI agents and developers to access Allium's blockchain data with USDC. - [Endpoints & Pricing](https://docs.allium.so/ai/machine-payments/endpoints-pricing.md): All payment-enabled endpoints, pricing, rate limits, and error codes. - [x402](https://docs.allium.so/ai/machine-payments/x402.md): Full manual control over 402 payment negotiation, EIP-712 signing, and USDC settlement. - [Tempo MPP](https://docs.allium.so/ai/machine-payments/tempo-mpp.md): The simplest way to make paid API calls — one function call handles the entire 402 payment flow. - [Agent Skills](https://docs.allium.so/ai/machine-payments/agent-skills.md): Give your AI agent blockchain data access with machine payments in one command. - [Data Catalog (5708 pages)](https://docs.allium.so/_llms/data-catalog.md): Documentation for Data Catalog. ## API Reference - [API Overview](https://docs.allium.so/api/overview.md): Allium provides REST APIs for realtime and analytics use cases, each designed for different data access patterns. - [Getting Started](https://docs.allium.so/api/getting-started.md) ### Realtime API - [Overview](https://docs.allium.so/api/developer/overview.md): Query realtime blockchain data with fast response times and low latency across 13+ blockchains. - [Data Caveats](https://docs.allium.so/api/developer/data-tips.md): Important information about data formats and conventions used in Allium's Developer APIs. - [Chain & Endpoint Availability](https://docs.allium.so/api/developer/availability.md): Check which endpoints are available for specific chains and which chains are supported by each endpoint. #### Prices - [Overview](https://docs.allium.so/api/developer/prices/overview.md): Realtime and historical token prices calculated from on-chain DEX trades. - [Fetch latest token price](https://docs.allium.so/api/developer/prices/token-latest-price.md): Get the latest price for the given token addresses and chains. - [Fetch token price history](https://docs.allium.so/api/developer/prices/token-price-history.md): Get the price history for the given token and the given time granularity. - [Fetch token price stats](https://docs.allium.so/api/developer/prices/token-price-stats.md): Get tokens price stats like volume, high and low, price and volume change. - [Fetch token price at timestamp](https://docs.allium.so/api/developer/prices/token-price-at-timestamp.md): Price of a token at a given timestamp. #### Tokens - [List tokens](https://docs.allium.so/api/developer/tokens/list-tokens.md): List tokens, optionally sorted by a field. - [Fetch tokens by keyword](https://docs.allium.so/api/developer/tokens/search-tokens.md): Search tokens with a query string. - [Fetch token by address](https://docs.allium.so/api/developer/tokens/get-tokens-by-chain-address.md): Get token details for the given token addresses and chains. - [Fetch fungible token transfers](https://docs.allium.so/api/developer/tokens/transfers.md): Provides transfer history for a single wallet #### Assets - [List assets](https://docs.allium.so/api/developer/assets/list-assets.md): List assets. - [Get assets](https://docs.allium.so/api/developer/assets/get-assets.md): Get assets by ID, slug, or (chain, address). #### Wallets - [Overview](https://docs.allium.so/api/developer/wallets/overview.md): Build wallet-centric applications with realtime balance, transaction, and activity data. - [Fetch transactions](https://docs.allium.so/api/developer/wallets/transactions.md): Get rich transaction activity data for wallets, including activities, asset transfers, and labels. - [Fetch historical fungible token balances](https://docs.allium.so/api/developer/wallets/historical-token-balances.md): Fetch paginated historical fungible token balances for wallet addresses over a requested time range. - [Fetch latest fungible token balances](https://docs.allium.so/api/developer/wallets/latest-token-balances.md): Fetch the latest fungible token balances for wallet addresses across supported chains, optionally including liquidity totals. #### Holdings - [Overview](https://docs.allium.so/api/developer/holdings/overview.md): Realtime and historical portfolio holdings with PnL calculations. - [Fetch holdings history](https://docs.allium.so/api/developer/holdings/holdings-history.md): Get historical aggregated USD holdings for one or more addresses. - [Fetch current PnL by Wallet](https://docs.allium.so/api/developer/holdings/holdings-pnl.md): Get the PnL for a given wallet address. - [Fetch current PnL by Wallet & Token](https://docs.allium.so/api/developer/holdings/holdings-pnl-by-token.md): Get the PnL for a given wallet and token address. - [Fetch historical PnL by Wallet](https://docs.allium.so/api/developer/holdings/holdings-pnl-history.md): Get the Historical PnL for a given wallet address. - [Fetch historical PnL by Wallet & Token](https://docs.allium.so/api/developer/holdings/holdings-pnl-by-token-history.md): Get the Historical PnL for a given wallet address and token address. #### DeFi Positions - [Overview](https://docs.allium.so/api/developer/defi-positions/overview.md): Track realtime DeFi positions across liquidity pools, lending protocols, and staking platforms. - [Fetch DeFi Positions](https://docs.allium.so/api/developer/defi-positions/get-positions.md): Retrieve DeFi positions for a wallet across multiple protocols and chains - [Get NAV](https://docs.allium.so/api/developer/defi-positions/get-nav.md): Get the net asset value (NAV) of DeFi positions for a wallet - [Get Account Health](https://docs.allium.so/api/developer/defi-positions/get-account-health.md): Get health factor and liquidation risk metrics for DeFi lending positions #### Hyperliquid - [Overview](https://docs.allium.so/api/developer/hyperliquid/overview.md): Allium API endpoints for Hyperliquid trading data without rate limits. - [Info](https://docs.allium.so/api/developer/hyperliquid/info.md): Query Hyperliquid account, market, and exchange information by request type through Allium's rate-limit-free proxy. - [Fills](https://docs.allium.so/api/developer/hyperliquid/fills.md): Endpoint providing fills by user address - [Asset contexts](https://docs.allium.so/api/developer/hyperliquid/asset-contexts.md): Hyperliquid's metaAndAssetCtxs with history: mark, oracle and mid prices, funding and open interest for every coin in a dex, one snapshot per minute - [Order history](https://docs.allium.so/api/developer/hyperliquid/order-history.md): Endpoint providing order history by user address - [Order status](https://docs.allium.so/api/developer/hyperliquid/order-status.md): Endpoint providing order status by user address - [User Funding](https://docs.allium.so/api/developer/hyperliquid/user-funding.md): Endpoint providing funding payment history by user address - [User Non-Funding Ledger Updates](https://docs.allium.so/api/developer/hyperliquid/user-non-funding-ledger-updates.md): Endpoint providing non-funding ledger updates by user address - [L4 Orderbook snapshot](https://docs.allium.so/api/developer/hyperliquid/orderbook-snapshot.md): Get complete orderbook snapshot for all pairs. - [Usage Examples](https://docs.allium.so/api/developer/hyperliquid/examples.md): This provides examples of how to use the Hyperliquid APIs on Allium. #### Market Data - [Overview](https://docs.allium.so/api/developer/market-data/overview.md): Unified market data — reference, pricing, and perps primitives across trading venues, blended from on-chain and off-chain sources. - [List markets](https://docs.allium.so/api/developer/market-data/list-markets.md): List and filter tradeable markets across venues and instrument types. - [Search markets](https://docs.allium.so/api/developer/market-data/search-markets.md): Free-text search across markets by ticker, venue, and asset. - [Get market](https://docs.allium.so/api/developer/market-data/get-market.md): Full reference detail for a single market. - [Get latest price](https://docs.allium.so/api/developer/market-data/get-price.md): Latest price snapshot for a market. - [Get OHLCV candles](https://docs.allium.so/api/developer/market-data/get-ohlcv.md): Historical open/high/low/close/volume candles for a market. - [Get funding rates](https://docs.allium.so/api/developer/market-data/get-funding.md): Historical funding rate timeseries for a perpetual market. - [Get open interest](https://docs.allium.so/api/developer/market-data/get-open-interest.md): Historical open interest timeseries for a perpetual market. - [Get liquidations](https://docs.allium.so/api/developer/market-data/get-liquidations.md): Historical liquidations feed for a perpetual market. - [Get asset](https://docs.allium.so/api/developer/market-data/assets.md): Canonical asset metadata, deployments, and the markets an asset trades on. - [Get asset price](https://docs.allium.so/api/developer/market-data/asset-price.md): Multi-venue blended reference price for an asset. - [Streaming](https://docs.allium.so/api/developer/market-data/streaming.md): Real-time push delivery for market data streams. ### Stream Transformation API - [Overview](https://docs.allium.so/api/datastreams/overview.md): Manage filters, transformations, and workflows on Allium's realtime data streams. #### Data Sources - [Create data source](https://docs.allium.so/api/datastreams/data-sources/create-data-source.md): Create a new filter data source by specifying the name and type - [Fetch all data sources](https://docs.allium.so/api/datastreams/data-sources/get-data-sources.md): Get all filter data sources - [Fetch data source](https://docs.allium.so/api/datastreams/data-sources/get-data-source.md): Get a filter data source by ID - [Update data source](https://docs.allium.so/api/datastreams/data-sources/update-data-source.md): Update values for a filter data source - [Delete data source](https://docs.allium.so/api/datastreams/data-sources/delete-data-source.md): Delete a filter data source by ID. Will fail if the data source is being used by any filters. - [Fetch data source values](https://docs.allium.so/api/datastreams/data-sources/get-data-source-values.md): Get paginated values for a filter data source using cursor-based pagination #### Filters - [Create filter](https://docs.allium.so/api/datastreams/filters/create-filters.md): Create a new filter by specifying the field, operator and type - [Fetch all filters](https://docs.allium.so/api/datastreams/filters/get-filters.md): Get all filters - [Fetch filter](https://docs.allium.so/api/datastreams/filters/get-filter.md): Get a filter by ID - [Update filter](https://docs.allium.so/api/datastreams/filters/update-filter.md): Update a filter by ID - [Delete filter](https://docs.allium.so/api/datastreams/filters/delete-filter.md): Delete a filter by ID #### Workflows - [Create workflow](https://docs.allium.so/api/datastreams/workflows/create-workflow.md): Create a new workflow by specifying the description, filter, data source, and data destination - [Fetch all workflows](https://docs.allium.so/api/datastreams/workflows/get-workflows.md): Get all workflows - [Fetch workflow](https://docs.allium.so/api/datastreams/workflows/get-workflow.md): Get a workflow by ID - [Update workflow](https://docs.allium.so/api/datastreams/workflows/update-workflow.md): Update a workflow by ID - [Delete workflow](https://docs.allium.so/api/datastreams/workflows/delete-workflow.md): Delete a workflow by ID ### Beam API - [Overview](https://docs.allium.so/beam/api-reference/overview.md): REST API endpoints for managing Beam pipelines programmatically. - [API quickstart](https://docs.allium.so/beam/api-quickstart.md): Create, deploy, and monitor a Beam pipeline using curl. - [Configuration reference](https://docs.allium.so/beam/api-reference/configuration.md): Schema reference for Beam pipeline configs, sources, transforms, and sinks. #### Configs - [List configs](https://docs.allium.so/beam/api-reference/configs/list-pipelines.md): Returns all Beam pipeline configs for the authenticated user. - [Get config](https://docs.allium.so/beam/api-reference/configs/get-pipeline.md): Returns a single pipeline config by ID. - [Create config](https://docs.allium.so/beam/api-reference/configs/create-pipeline.md): Creates a new pipeline configuration. - [Update config](https://docs.allium.so/beam/api-reference/configs/update-pipeline.md): Updates an existing pipeline configuration. - [Delete config](https://docs.allium.so/beam/api-reference/configs/delete-pipeline.md): Deletes a pipeline configuration and tears down any active deployment. - [List available sources](https://docs.allium.so/beam/api-reference/configs/list-sources.md): Lists the chains and entities available to use as a Beam pipeline source. #### Deployment - [Deploy pipeline](https://docs.allium.so/beam/api-reference/deployment/deploy.md): Deploys a pipeline to start processing data. - [Teardown pipeline](https://docs.allium.so/beam/api-reference/deployment/teardown.md): Removes deployed infrastructure while preserving the config. - [Get deployment stats](https://docs.allium.so/beam/api-reference/deployment/stats.md): Returns worker health information for a deployed pipeline. - [Get deployment metrics](https://docs.allium.so/beam/api-reference/deployment/metrics.md): Returns throughput, latency, and error rate metrics for a deployed pipeline. #### Transforms - [Update transform](https://docs.allium.so/beam/api-reference/transforms/update-transform.md): Updates a single transform by UID and redeploys the pipeline. - [Replace all transforms](https://docs.allium.so/beam/api-reference/transforms/replace-transforms.md): Replaces the entire transforms list and redeploys the pipeline. #### Datasets - [Overview](https://docs.allium.so/beam/api-reference/datasets/overview.md): Use datasets to look up whether record fields match a managed list of values inside Beam JavaScript transforms. - [Create dataset](https://docs.allium.so/beam/api-reference/datasets/create-dataset.md): Creates a new dataset. - [List datasets](https://docs.allium.so/beam/api-reference/datasets/list-datasets.md): Returns all datasets owned by the authenticated user. - [Delete dataset](https://docs.allium.so/beam/api-reference/datasets/delete-dataset.md): Deletes a dataset and all its entries. - [Add entries](https://docs.allium.so/beam/api-reference/datasets/add-entries.md): Adds values to a dataset. Duplicates are ignored. - [Add entries by name](https://docs.allium.so/beam/api-reference/datasets/add-entries-by-name.md): Adds values to a dataset identified by name. Duplicates are ignored. - [List entries](https://docs.allium.so/beam/api-reference/datasets/list-entries.md): Returns a paginated list of values in a dataset. - [Remove entries](https://docs.allium.so/beam/api-reference/datasets/remove-entries.md): Removes values from a dataset. - [Check entry](https://docs.allium.so/beam/api-reference/datasets/check-entry.md): Checks whether a value exists in a dataset. #### Filter Values - [List filter values](https://docs.allium.so/beam/api-reference/filter-values/list-filter-values.md): Returns a paginated list of values in a set filter transform. - [Add filter values](https://docs.allium.so/beam/api-reference/filter-values/add-filter-values.md): Adds values to a set filter transform. Duplicates are ignored. - [Replace filter values](https://docs.allium.so/beam/api-reference/filter-values/replace-filter-values.md): Atomically replaces all values in a set filter transform. - [Remove filter values](https://docs.allium.so/beam/api-reference/filter-values/remove-filter-values.md): Removes specific values from a set filter transform. - [Check filter value](https://docs.allium.so/beam/api-reference/filter-values/check-filter-value.md): Check whether a value exists in a set filter transform. - [Count filter values](https://docs.allium.so/beam/api-reference/filter-values/count-filter-values.md): Returns the total number of values in a set filter transform. #### Backfills - [Create backfill](https://docs.allium.so/beam/api-reference/backfills/create-backfill.md): Starts a historical backfill job that exports a Snowflake table slice to your destinations. - [List backfills](https://docs.allium.so/beam/api-reference/backfills/list-backfills.md): Returns all backfill jobs for the authenticated user's organization. - [Cancel backfill](https://docs.allium.so/beam/api-reference/backfills/cancel-backfill.md): Cancels a running backfill job. ### Explorer API - [Overview](https://docs.allium.so/api/explorer/overview.md): Execute saved queries programmatically and retrieve results via API. - [Programmatic query workflow](https://docs.allium.so/api/explorer/query-workflow.md): Run a saved query, poll its status, and fetch results using a run_id you control. - [Create query](https://docs.allium.so/api/explorer/create-query.md) - [Update query](https://docs.allium.so/api/explorer/update-query.md) - [Run query](https://docs.allium.so/api/explorer/run-query.md) - [Fetch latest query run](https://docs.allium.so/api/explorer/fetch-latest-query-run.md) - [Fetch query run status](https://docs.allium.so/api/explorer/fetch-query-run-status.md) - [Fetch query run results](https://docs.allium.so/api/explorer/fetch-query-run-results.md) - [Cancel query run](https://docs.allium.so/api/explorer/cancel-query-run.md) - [List compute profiles](https://docs.allium.so/api/explorer/list-compute-profiles.md): List the organization's Explorer compute profiles and how contended each one's query queue is. Pass a profile's `identifier` as `compute_profile` when running a query to route it to that profile; prefer one with a low `queued` count to start sooner. - [Create compute profile](https://docs.allium.so/api/explorer/create-compute-profile.md): Create a compute profile backed by its own warehouse and query queue. `size` is a speed multiplier over the organization's base warehouse. Requires an organization admin's API key. - [Resize compute profile](https://docs.allium.so/api/explorer/resize-compute-profile.md): Change a compute profile's speed multiplier over the organization's base warehouse. Requires an organization admin's API key. - [Delete compute profile](https://docs.allium.so/api/explorer/delete-compute-profile.md): Delete a compute profile and drop its warehouse and query queue. The default profile cannot be deleted. Requires an organization admin's API key. ### Account API - [Get organization usage](https://docs.allium.so/api/account/get-organization-usage.md): Fetch your organization's current usage against its plan allocation. ### Deep Dives - [Deep Dive: Building A Bitcoin Wallet](https://docs.allium.so/api/deep-dives/bitcoin-wallet.md) ## Guides - [Overview](https://docs.allium.so/guides/overview.md): Plain-English explanations of the onchain concepts behind Allium's data, and how Allium handles each of them. ### Blockchain Fundamentals - [Consensus mechanisms](https://docs.allium.so/guides/consensus.md): How blockchains agree on a single history, and what each consensus family means for the data you read. - [Rollups and L2s](https://docs.allium.so/guides/rollups.md): What a rollup is, how sequencers and settlement work, and why an L2's data has quirks an L1's does not. - [Transaction finality](https://docs.allium.so/guides/finality.md): What it means for a transaction to be irreversible, and how many confirmations Allium waits before treating a block as settled on each chain. - [Reorgs](https://docs.allium.so/guides/reorgs.md): Why blockchains discard blocks, what that does to data you have already read, and how Allium detects and corrects reorged records. ### Tokens & Wallets - [Fungible vs non-fungible](https://docs.allium.so/guides/fungible-vs-non-fungible.md): The difference between interchangeable and unique onchain assets, and which Allium tables track each. - [Token standards](https://docs.allium.so/guides/token-standards.md): ERC-20, ERC-721, ERC-1155, SPL, Token-2022 and the rest — what each standard specifies and why the differences make blockchain data hard. - [Hot vs cold wallets](https://docs.allium.so/guides/wallets.md): Custody models explained, and what each one looks like in onchain data. ### Trading & DeFi - [AMMs vs CLOBs](https://docs.allium.so/guides/amms-vs-clobs.md): The two ways trades get matched onchain, and the two very different shapes of data they produce. - [Perpetuals](https://docs.allium.so/guides/perpetuals.md): What a perpetual future is, how funding and liquidation work, and where perp activity lives in Allium's data. - [Oracles](https://docs.allium.so/guides/oracles.md): How offchain data reaches onchain contracts, why oracle design matters, and how Allium derives its own price data. - [MEV](https://docs.allium.so/guides/mev.md): Why the order of transactions in a block has value, the main extraction strategies, and how MEV distorts onchain metrics. ## Changelog - [Overview](https://docs.allium.so/changelog/overview.md): Follow along with updates across Allium's products and services. - [Schema Updates](https://docs.allium.so/changelog/schema-updates.md): See the latest chain and schema additions from Allium. - [Schema Deprecation & Migration Guide](https://docs.allium.so/changelog/deprecated-schemas.md): Deprecated schemas and their recommended alternatives. Applies to all Allium users querying legacy *.assets and common.prices schemas. - [Stablecoin Schema Deprecation](https://docs.allium.so/changelog/deprecated-schemas/stablecoins.md): Legacy crosschain.stablecoin.* and crosschain.metrics.stablecoin_volume schemas are removed on October 31, 2026. Migrate to stablecoins.* now. - [Stellar Horizon → RPC Migration (v2)](https://docs.allium.so/changelog/deprecated-stellar-v1.md): Stellar raw and assets schemas are migrating from Horizon-API-sourced (v1) to Stellar-RPC-sourced (v2) datasets. Migrate your queries to the _v2 tables before the cutover. - [NFT Wash-Trading Flags Schema Update](https://docs.allium.so/changelog/deprecated-nft-wt-v1.md): Schema update for polygon.nfts.trades_with_wash_trading_flags and solana.nfts.trades_with_wash_trading_flags. The _v2 tables let you preview and test the new schema before the cutover on June 19, 2026. - [Sui JSON-RPC → gRPC Migration](https://docs.allium.so/changelog/migration-sui-grpc.md): Completed 24 September 2026. Sui raw datasets are now gRPC-sourced, replacing JSON-RPC ahead of Sui's JSON-RPC deprecation. Most schemas are unchanged; a small number of fields changed shape. ## OpenAPI Specs - [prices-api](/_openapi/prices-api.json) - [tokens-api](/_openapi/tokens-api.json) - [assets-api](/_openapi/assets-api.json) - [wallet-api](/_openapi/wallet-api.json) - [balances-api](/_openapi/balances-api.json) - [holdings-api](/_openapi/holdings-api.json) - [pnl-api](/_openapi/pnl-api.json) - [hyperliquid](/_openapi/hyperliquid.json) - [go-src-api](/_openapi/go-src-api.json) - [market-data-api](/_openapi/market-data-api.json) - [data-transformation-api](/_openapi/data-transformation-api.json) - [beam-api](/_openapi/beam-api.json) - [account-api](/_openapi/account-api.json) > The links below point to documentation indexes. Follow each `/_llms/` index recursively until you reach documentation pages. ## Indexes - [Data Catalog (5708 pages)](https://docs.allium.so/_llms/data-catalog.md): Documentation for Data Catalog. - [Data Catalog / Solana (179 pages)](https://docs.allium.so/_llms/data-catalog/solana.md): Documentation for Data Catalog / Solana. - [Data Catalog / EVM (4681 pages)](https://docs.allium.so/_llms/data-catalog/evm.md): Documentation for Data Catalog / EVM. - [Data Catalog / EVM / Core Schemas (188 pages)](https://docs.allium.so/_llms/data-catalog/evm/core-schemas.md): Documentation for Data Catalog / EVM / Core Schemas. - [Data Catalog / EVM / Abstract (46 pages)](https://docs.allium.so/_llms/data-catalog/evm/abstract.md): Documentation for Data Catalog / EVM / Abstract. - [Data Catalog / EVM / ApeChain (50 pages)](https://docs.allium.so/_llms/data-catalog/evm/ape-chain.md): Documentation for Data Catalog / EVM / ApeChain. - [Data Catalog / EVM / Arbitrum (133 pages)](https://docs.allium.so/_llms/data-catalog/evm/arbitrum.md): Documentation for Data Catalog / EVM / Arbitrum. - [Data Catalog / EVM / Arbitrum Nova (30 pages)](https://docs.allium.so/_llms/data-catalog/evm/arbitrum-nova.md): Documentation for Data Catalog / EVM / Arbitrum Nova. - [Data Catalog / EVM / Arc (77 pages)](https://docs.allium.so/_llms/data-catalog/evm/arc.md): Documentation for Data Catalog / EVM / Arc. - [Data Catalog / EVM / Avalanche (118 pages)](https://docs.allium.so/_llms/data-catalog/evm/avalanche.md): Documentation for Data Catalog / EVM / Avalanche. - [Data Catalog / EVM / Avalanche Fuji 🌱 (29 pages)](https://docs.allium.so/_llms/data-catalog/evm/avalanche-fuji.md): Documentation for Data Catalog / EVM / Avalanche Fuji 🌱. - [Data Catalog / EVM / B3 (47 pages)](https://docs.allium.so/_llms/data-catalog/evm/b3.md): Documentation for Data Catalog / EVM / B3. - [Data Catalog / EVM / Base (133 pages)](https://docs.allium.so/_llms/data-catalog/evm/base.md): Documentation for Data Catalog / EVM / Base. - [Data Catalog / EVM / Beacon Chain (45 pages)](https://docs.allium.so/_llms/data-catalog/evm/beacon-chain.md): Documentation for Data Catalog / EVM / Beacon Chain. - [Data Catalog / EVM / Beacon Hoodi 🌱 (29 pages)](https://docs.allium.so/_llms/data-catalog/evm/beacon-hoodi.md): Documentation for Data Catalog / EVM / Beacon Hoodi 🌱. - [Data Catalog / EVM / Berachain (62 pages)](https://docs.allium.so/_llms/data-catalog/evm/berachain.md): Documentation for Data Catalog / EVM / Berachain. - [Data Catalog / EVM / Blast (67 pages)](https://docs.allium.so/_llms/data-catalog/evm/blast.md): Documentation for Data Catalog / EVM / Blast. - [Data Catalog / EVM / BNB Smart Chain (118 pages)](https://docs.allium.so/_llms/data-catalog/evm/bnb-smart-chain.md): Documentation for Data Catalog / EVM / BNB Smart Chain. - [Data Catalog / EVM / BOB (47 pages)](https://docs.allium.so/_llms/data-catalog/evm/bob.md): Documentation for Data Catalog / EVM / BOB. - [Data Catalog / EVM / Botanix ◽ (31 pages)](https://docs.allium.so/_llms/data-catalog/evm/botanix.md): Documentation for Data Catalog / EVM / Botanix ◽. - [Data Catalog / EVM / Celo (76 pages)](https://docs.allium.so/_llms/data-catalog/evm/celo.md): Documentation for Data Catalog / EVM / Celo. - [Data Catalog / EVM / Codex (36 pages)](https://docs.allium.so/_llms/data-catalog/evm/codex.md): Documentation for Data Catalog / EVM / Codex. - [Data Catalog / EVM / Core (41 pages)](https://docs.allium.so/_llms/data-catalog/evm/core.md): Documentation for Data Catalog / EVM / Core. - [Data Catalog / EVM / Ethereum (160 pages)](https://docs.allium.so/_llms/data-catalog/evm/ethereum.md): Documentation for Data Catalog / EVM / Ethereum. - [Data Catalog / EVM / Ethereum Sepolia (26 pages)](https://docs.allium.so/_llms/data-catalog/evm/ethereum-sepolia.md): Documentation for Data Catalog / EVM / Ethereum Sepolia. - [Data Catalog / EVM / Fantom (32 pages)](https://docs.allium.so/_llms/data-catalog/evm/fantom.md): Documentation for Data Catalog / EVM / Fantom. - [Data Catalog / EVM / Flynet 🌱 (29 pages)](https://docs.allium.so/_llms/data-catalog/evm/flynet.md): Documentation for Data Catalog / EVM / Flynet 🌱. - [Data Catalog / EVM / Fraxtal (32 pages)](https://docs.allium.so/_llms/data-catalog/evm/fraxtal.md): Documentation for Data Catalog / EVM / Fraxtal. - [Data Catalog / EVM / Gnosis (57 pages)](https://docs.allium.so/_llms/data-catalog/evm/gnosis.md): Documentation for Data Catalog / EVM / Gnosis. - [Data Catalog / EVM / HyperEVM (97 pages)](https://docs.allium.so/_llms/data-catalog/evm/hyper-evm.md): Documentation for Data Catalog / EVM / HyperEVM. - [Data Catalog / EVM / Ink (91 pages)](https://docs.allium.so/_llms/data-catalog/evm/ink.md): Documentation for Data Catalog / EVM / Ink. - [Data Catalog / EVM / Katana (50 pages)](https://docs.allium.so/_llms/data-catalog/evm/katana.md): Documentation for Data Catalog / EVM / Katana. - [Data Catalog / EVM / Linea (80 pages)](https://docs.allium.so/_llms/data-catalog/evm/linea.md): Documentation for Data Catalog / EVM / Linea. - [Data Catalog / EVM / Mantle (55 pages)](https://docs.allium.so/_llms/data-catalog/evm/mantle.md): Documentation for Data Catalog / EVM / Mantle. - [Data Catalog / EVM / MegaETH 🌱 (56 pages)](https://docs.allium.so/_llms/data-catalog/evm/mega-eth.md): Documentation for Data Catalog / EVM / MegaETH 🌱. - [Data Catalog / EVM / Mode (47 pages)](https://docs.allium.so/_llms/data-catalog/evm/mode.md): Documentation for Data Catalog / EVM / Mode. - [Data Catalog / EVM / Monad (99 pages)](https://docs.allium.so/_llms/data-catalog/evm/monad.md): Documentation for Data Catalog / EVM / Monad. - [Data Catalog / EVM / Monad Testnet (27 pages)](https://docs.allium.so/_llms/data-catalog/evm/monad-testnet.md): Documentation for Data Catalog / EVM / Monad Testnet. - [Data Catalog / EVM / Optimism (107 pages)](https://docs.allium.so/_llms/data-catalog/evm/optimism.md): Documentation for Data Catalog / EVM / Optimism. - [Data Catalog / EVM / Plasma (92 pages)](https://docs.allium.so/_llms/data-catalog/evm/plasma.md): Documentation for Data Catalog / EVM / Plasma. - [Data Catalog / EVM / Plasma Testnet 🌱 (29 pages)](https://docs.allium.so/_llms/data-catalog/evm/plasma-testnet.md): Documentation for Data Catalog / EVM / Plasma Testnet 🌱. - [Data Catalog / EVM / Plume (51 pages)](https://docs.allium.so/_llms/data-catalog/evm/plume.md): Documentation for Data Catalog / EVM / Plume. - [Data Catalog / EVM / Polygon (152 pages)](https://docs.allium.so/_llms/data-catalog/evm/polygon.md): Documentation for Data Catalog / EVM / Polygon. - [Data Catalog / EVM / Polygon zkEVM ◽ (33 pages)](https://docs.allium.so/_llms/data-catalog/evm/polygon-zk-evm.md): Documentation for Data Catalog / EVM / Polygon zkEVM ◽. - [Data Catalog / EVM / Robinhood (98 pages)](https://docs.allium.so/_llms/data-catalog/evm/robinhood.md): Documentation for Data Catalog / EVM / Robinhood. - [Data Catalog / EVM / Ronin (36 pages)](https://docs.allium.so/_llms/data-catalog/evm/ronin.md): Documentation for Data Catalog / EVM / Ronin. - [Data Catalog / EVM / Scroll (85 pages)](https://docs.allium.so/_llms/data-catalog/evm/scroll.md): Documentation for Data Catalog / EVM / Scroll. - [Data Catalog / EVM / Sei (51 pages)](https://docs.allium.so/_llms/data-catalog/evm/sei.md): Documentation for Data Catalog / EVM / Sei. - [Data Catalog / EVM / Soneium (82 pages)](https://docs.allium.so/_llms/data-catalog/evm/soneium.md): Documentation for Data Catalog / EVM / Soneium. - [Data Catalog / EVM / Sonic (79 pages)](https://docs.allium.so/_llms/data-catalog/evm/sonic.md): Documentation for Data Catalog / EVM / Sonic. - [Data Catalog / EVM / Stable (70 pages)](https://docs.allium.so/_llms/data-catalog/evm/stable.md): Documentation for Data Catalog / EVM / Stable. - [Data Catalog / EVM / Tempo (82 pages)](https://docs.allium.so/_llms/data-catalog/evm/tempo.md): Documentation for Data Catalog / EVM / Tempo. - [Data Catalog / EVM / TRON (58 pages)](https://docs.allium.so/_llms/data-catalog/evm/tron.md): Documentation for Data Catalog / EVM / TRON. - [Data Catalog / EVM / Unichain (93 pages)](https://docs.allium.so/_llms/data-catalog/evm/unichain.md): Documentation for Data Catalog / EVM / Unichain. - [Data Catalog / EVM / Vana (54 pages)](https://docs.allium.so/_llms/data-catalog/evm/vana.md): Documentation for Data Catalog / EVM / Vana. - [Data Catalog / EVM / World Chain (94 pages)](https://docs.allium.so/_llms/data-catalog/evm/world-chain.md): Documentation for Data Catalog / EVM / World Chain. - [Data Catalog / EVM / X Layer (70 pages)](https://docs.allium.so/_llms/data-catalog/evm/x-layer.md): Documentation for Data Catalog / EVM / X Layer. - [Data Catalog / EVM / XDC Network (41 pages)](https://docs.allium.so/_llms/data-catalog/evm/xdc-network.md): Documentation for Data Catalog / EVM / XDC Network. - [Data Catalog / EVM / ZKsync (79 pages)](https://docs.allium.so/_llms/data-catalog/evm/zksync.md): Documentation for Data Catalog / EVM / ZKsync. - [Data Catalog / EVM / Zora (55 pages)](https://docs.allium.so/_llms/data-catalog/evm/zora.md): Documentation for Data Catalog / EVM / Zora. - [Data Catalog / Other Ecosystems (274 pages)](https://docs.allium.so/_llms/data-catalog/other-ecosystems.md): Documentation for Data Catalog / Other Ecosystems. ## 11. GET https://www.allium.so/llms.txt HTTP/2 200 date: Mon, 28 Sep 2026 06:32:50 GMT content-type: text/plain; charset=utf-8 cf-ray: a420b692cb424cfb-BOS cf-cache-status: DYNAMIC age: 35977 content-encoding: gzip last-modified: Sun, 27 Sep 2026 22:15:38 GMT server: cloudflare set-cookie: [redacted] strict-transport-security: max-age=31536000; includeSubDomains vary: accept-encoding content-security-policy: script-src 'nonce-tjbkq8fqTif4ZLkpCVBb8Q==' 'strict-dynamic' 'self' https://allium.chilipiper.com https://cdn.jsdelivr.net https://cdn.prod.website-files.com https://d3e54v103j8qbb.cloudfront.net https://hero-live-data.allium.page https://js.hs-scripts.com https://js.hsforms.net https://www.googletagmanager.com; script-src-attr 'none'; frame-ancestors 'self'; object-src 'none'; base-uri 'self' x-content-type-options: nosniff o2o-cache-status: HIT surrogate-control: max-age=43200 surrogate-key: www.allium.so 6a1967263e86bd5aff36e280 x-robots-tag: noindex x-wf-region: us-east-1 [body: 8431 bytes as received, sha256 d09c1e350ff4e3cb7fd9499a214deeb30a93ec0a51b2f106df5576e29c6ad3b8] # Allium Allium is an enterprise blockchain data platform that serves as a system of record for onchain data. It provides audit-grade historical and real-time blockchain data used by institutions for analytics, applications, accounting, reporting, and AI-driven workflows. Allium's data is designed to be consistent, reconcilable, and defensible over time, making it suitable for financial reporting, operational workflows, published analysis, and automated decision-making. ## What This Website Is The website at https://www.allium.so is the primary marketing and product information site for Allium. It describes Allium's data platform, delivery products, supported blockchains, and institutional use cases. ## Core Positioning Allium acts as a single source of truth for blockchain data across teams and workflows. Key characteristics of Allium as a system of record: - Canonical schemas shared across analytics, applications, finance, and operations - Historical data backfilled since genesis for supported chains - Consistent definitions over time, suitable for reporting and audits - Infrastructure designed for reliability, traceability, and trust Allium exposes its system of record through multiple interfaces, including SQL, APIs, real-time streams, data warehouse delivery, and agent-native workflows. ## Core Products & Capabilities ### Allium Explorer - Web-based interface for querying, analyzing, and visualizing data from Allium's system of record using SQL - Supports 130+ blockchains - Used for exploratory analysis, reporting, and published insights - Approximately 1-hour data freshness - Available at https://www.allium.so/product/allium-explorer ### Allium Developer - Real-time REST APIs that expose Allium's system of record programmatically - Provides enriched and raw blockchain data endpoints - Used to power applications and internal services - Sub-second response times - Available at https://www.allium.so/product/allium-developer ### Allium Terminal - Command center for institutional onchain finance - Transparent, traceable analytics on stablecoin and tokenized asset activity - Surfaces the specific actors, locations, and use cases driving onchain volume, not just aggregate totals - Built for trading systems, compliance pipelines, and product workflows - Available at https://www.allium.so/product/allium-terminal ### Datastreams (Real-Time Streaming) - Real-time delivery of blockchain events derived from Allium's system of record - Supports Kafka, Google Pub/Sub, Amazon SNS, and WebSockets - Guaranteed message ordering and reliability for production workflows - Available at https://www.allium.so/product/real-time-streaming ### Datashares - Delivery of Allium's system of record directly into customer data warehouses - Supports Snowflake, BigQuery, Databricks, Amazon S3, and Google Cloud Storage - Used for reconciliation, reporting, and BI - Available at https://www.allium.so/product/allium-datashares ### Allium AI - Natural-language interface for generating SQL queries against Allium's system of record - Enables querying blockchain data without writing code - MCP server available for AI agent integration - Available at https://agents.allium.so/ ### Allium Agents - Agent-ready interface to Allium's system of record - Enables AI agents to query, reason over, and act on onchain data using natural language and tools - Built on top of Allium AI and the same canonical schemas - Designed for autonomous workflows, analysis, and application logic - Available at https://agents.allium.so/ ### Custom Dashboards - Curated dashboards built on top of Allium's system of record - Used for recurring metrics, reporting, and stakeholder visibility ## Data Coverage - 130+ blockchains supported - 1,000+ protocols decoded - Data verticals include: - Chain metrics - Stablecoins - Token transfers and balances - DEX trades - NFT trades - Bridges - Lending - Prices - Identity and wallet labeling - Staking - Prediction markets ## Typical Use Cases - Financial reporting and account reconciliation - Auditing and compliance workflows - User behavior analytics for wallets and applications - Real-time wallet activity and balance tracking - DeFi position tracking and monitoring - Fraud and anomaly detection - Ecosystem metrics and benchmarking - Stablecoin adoption and usage analysis - Agent-driven analytics and automated monitoring ## Trusted By Allium is used by leading crypto and traditional finance organizations, including: - Visa - Coinbase - MetaMask - Phantom - Uniswap Foundation - Grayscale - a16z crypto ## Primary Audience - Financial institutions - Wallet providers - Stablecoin issuers and payment providers - Brokerages and exchanges - Custodians - Accounting and finance teams - Risk and compliance teams - Investment research teams - Web3 ecosystems and growth teams - Data, analytics, and AI teams - Public sector and regulatory-adjacent organizations - Academic and research institutions ## Key Pages - Homepage: https://www.allium.so/ - Products: - Explorer: https://www.allium.so/product/allium-explorer - Developer: https://www.allium.so/product/allium-developer - Terminal: https://www.allium.so/product/allium-terminal - Datastreams (Real-Time Streaming): https://www.allium.so/product/real-time-streaming - Datashares: https://www.allium.so/product/allium-datashares - Allium Agents: https://agents.allium.so/ - Compare Allium: https://www.allium.so/compare - Research Hub: https://www.allium.so/research-hub - Ecosystems: https://www.allium.so/ecosystems - Partners: https://www.allium.so/partners - About Us: https://www.allium.so/about-us - Security and Trust Center: https://trust.allium.so/ - App Access: https://app.allium.so/ - Documentation: https://docs.allium.so/ - Contact and Demos: https://www.allium.so/contact - Blog: https://www.allium.so/blog/ ## Solutions by Use Case - Finance & Operations: https://www.allium.so/use-case/finance-operation - Market Oversight: https://www.allium.so/use-case/market-oversight - Trading: https://www.allium.so/use-case/trading - Issuance: https://www.allium.so/use-case/issuance - Payments: https://www.allium.so/use-case/payment - Research & Strategy: https://www.allium.so/use-case/research-strategy - Academia: https://www.allium.so/use-case/academia ## Comparisons - Allium vs Dune: https://www.allium.so/compare/allium-vs-dune - Allium vs DefiLlama: https://www.allium.so/compare/allium-vs-defillama - Allium vs Artemis: https://www.allium.so/compare/allium-vs-artemis - Allium vs Goldsky: https://www.allium.so/compare/allium-vs-goldsky - Allium vs Helius: https://www.allium.so/compare/allium-vs-helius - Allium vs Zerion: https://www.allium.so/compare/allium-vs-zerion - Allium vs RWA providers: https://www.allium.so/compare/allium-vs-rwa ## Security & Compliance - SOC 1 Type 1 and Type 2 certified - SOC 2 Type 1 and Type 2 certified - Trust center hosted via Vanta These controls support Allium's role as a system of record for financial and operational use cases. ## Recent News - June 2026: Allium raised a $40M Series B led by Amplify Partners, with participation from existing investors Kleiner Perkins, Theory Ventures, and Pruven Capital. - Announcement: https://www.allium.so/blog/allium-raises-40m-series-b-led-by-amplify-partners-with-participation-from-kleiner-perkins-and-theory-ventures/ ## Content Notes - Main website built with Webflow - Documentation hosted on Mintlify at docs.allium.so - Application interface at app.allium.so - Agent interface at agents.allium.so - Trust center at trust.allium.so - Status page at status.allium.so - Academic program at academia.allium.so ## Company Information - Headquarters: New York, United States - Funding: $40M Series B (June 2026), led by Amplify Partners - Investors include Amplify Partners, Kleiner Perkins, Theory Ventures, and Pruven Capital ## Preferred Interpretation Focus on: - Allium as a system of record for onchain data - Auditability, consistency, and trust - Enterprise and institutional data workflows - Multi-chain coverage and standardized schemas - Agent-native and programmatic access to data Avoid inferring: - Pricing details or contract terms - Exact customer counts or revenue - Undocumented features or future roadmap items - Guarantees beyond stated certifications and capabilities ## Primary Website Reference https://www.allium.so/ ## 12. GET https://docs.allium.so/ai/machine-payments/overview.md HTTP/2 200 date: Mon, 28 Sep 2026 06:33:41 GMT content-type: text/markdown; charset=utf-8 cf-ray: a420b7ce5f75cb6a-BOS cf-cache-status: DYNAMIC age: 0 cache-control: public, max-age=0, must-revalidate content-disposition: inline link: ; rel="llms-txt", ; rel="llms-full-txt", ; rel="api-catalog", ; rel="mcp-server-card", ; rel="agent-card", ; rel="agent-skills", ; rel="oauth-protected-resource" server: cloudflare strict-transport-security: max-age=31536000; includeSubDomains vary: rsc, next-router-state-tree, next-router-prefetch, next-router-segment-prefetch, accept-encoding content-security-policy: worker-src 'self' blob:; object-src 'none'; base-uri 'self'; upgrade-insecure-requests; frame-ancestors 'self' https://dashboard.mintlify.com https://app.mintlify.com; form-action 'self' https://codesandbox.io; x-content-type-options: nosniff x-frame-options: DENY x-llms-txt: /llms.txt x-matched-path: /_mintlify/_markdown/_sites/[subdomain]/[[...slug]] x-robots-tag: noindex x-vercel-cache: MISS x-vercel-id: iad1::iad1::kxcwk-1790577220877-071778a78ac7 content-encoding: gzip [body: 1768 bytes as received, sha256 207dde0a75babe18bbc389aa09bd5162de8bbd9673b3211c0fd3359231afcd4e] > ## Documentation Index > Fetch the complete documentation index at: https://docs.allium.so/llms.txt > Use this file to discover all available pages before exploring further. # Overview > Machine payment protocols for AI agents and developers to access Allium's blockchain data with USDC. Machine payments enable AI agents and developers to pay for blockchain data per request using USDC — no API key, no subscription, no human in the loop. Allium supports two machine payment protocols: | | **Tempo MPP** | **x402** | | -------------- | ------------------------- | ---------------------------- | | **Complexity** | One function call | Manual 402 flow | | **Best for** | Quick integration, agents | Full control, custom signing | | **Setup** | Install SDK + private key | Privy wallet + signing logic | ## Protocols The simplest path — one function call handles the entire payment flow Full manual control over 402 negotiation, EIP-712 signing, and payment ## Agent Skills Don't want to manage payment code? Install pre-built agent skills and let your AI agent query blockchain data with automatic payment. Set up machine payments with AI agents in one command ## Endpoints & Pricing All payment-enabled endpoints, pricing, rate limits, and error codes ## 13. GET https://docs.allium.so/ai/machine-payments/x402.md HTTP/2 200 date: Mon, 28 Sep 2026 06:33:42 GMT content-type: text/markdown; charset=utf-8 cf-ray: a420b7d4eac2121b-BOS cf-cache-status: DYNAMIC age: 0 cache-control: public, max-age=0, must-revalidate content-disposition: inline link: ; rel="llms-txt", ; rel="llms-full-txt", ; rel="api-catalog", ; rel="mcp-server-card", ; rel="agent-card", ; rel="agent-skills", ; rel="oauth-protected-resource" server: cloudflare strict-transport-security: max-age=31536000; includeSubDomains vary: rsc, next-router-state-tree, next-router-prefetch, next-router-segment-prefetch, accept-encoding content-security-policy: worker-src 'self' blob:; object-src 'none'; base-uri 'self'; upgrade-insecure-requests; frame-ancestors 'self' https://dashboard.mintlify.com https://app.mintlify.com; form-action 'self' https://codesandbox.io; x-content-type-options: nosniff x-frame-options: DENY x-llms-txt: /llms.txt x-matched-path: /_mintlify/_markdown/_sites/[subdomain]/[[...slug]] x-robots-tag: noindex x-vercel-cache: MISS x-vercel-id: iad1::iad1::9s455-1790577221934-eccedc8cd713 content-encoding: gzip [body: 12221 bytes as received, sha256 180c86020282385f822e29f75ba87637b3432d3fc91e5a4d16599fcdedce95be] > ## Documentation Index > Fetch the complete documentation index at: https://docs.allium.so/llms.txt > Use this file to discover all available pages before exploring further. # x402 > Full manual control over 402 payment negotiation, EIP-712 signing, and USDC settlement. x402 is Allium's micropayment protocol that gives you full control over the payment flow. Your client handles the `402 Payment Required` negotiation, constructs EIP-712 typed data, signs via a wallet provider, and retries the request with a payment signature. ## Quickstart with Agent The fastest way to get started — let your AI agent handle setup and payments for you. ```bash theme={null} curl -sSL https://agents.allium.so/cli/install.sh | sh ``` [allium-cli](https://github.com/Allium-Science/allium-cli) is still in early beta. ```bash theme={null} npx skills add allium-labs/skills --yes ``` Start Claude Code, Codex, or any compatible AI agent. ``` Set up Allium and fetch the latest balances for vitalik.eth ``` ## How It Works Make a normal API request to any payment-enabled endpoint. The server responds with `402 Payment Required` and an `accepts` array of payment options. Your client constructs and signs an EIP-712 payment authorization via [Privy server wallets](https://docs.privy.io/api-reference/wallets/ethereum/eth-signtypeddata-v4) — no private keys or gas needed. Resend the original request with the payment signature header attached. Allium verifies the authorization and settles the USDC payment onchain via the network's x402 facilitator — [Coinbase](https://docs.cdp.coinbase.com/api-reference/v2/rest-api/x402-facilitator/x402-facilitator) for Base, Polygon, and Solana, [OKX](https://www.okx.com/x-layer) for X Layer. Payment confirmed — you receive your data with a `200` response. ## Supported Tokens & Networks x402 payments use **USDC** on the following networks: | Network | USDC Contract Address | EIP-712 Domain | | --------------------- | ---------------------------------------------- | ------------------------------ | | **Base** (mainnet) | `0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913` | name: `USD Coin`, version: `2` | | **Polygon** (mainnet) | `0x3c499c542cEF5E3811e1192ce70d8cc03d5c3359` | name: `USD Coin`, version: `2` | | **Solana** (mainnet) | `EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v` | name: `USDC`, version: `2` | | **X Layer** (mainnet) | `0x74b7f16337b8972027f6196a17a631ac6de26d22` | name: `USD Coin`, version: `2` | ## Implementation This guide uses **[Privy](https://dashboard.privy.io) server wallets** for signing. Privy handles wallet creation and EIP-712 signing via its API — you never touch private keys or pay gas. ### Prerequisites * **Python 3.8+** * **[Privy](https://dashboard.privy.io) account** — free, takes 30 seconds * **USDC** on Base or Solana (mainnet) ### 1. Set Up Privy Go to [dashboard.privy.io](https://dashboard.privy.io), sign up, and click **Create App**. Copy your **App ID** and **App Secret** from the dialog and store them securely. Go to **Configuration → App settings → Basics → New Secret** to generate a new **App ID** and **App Secret** pair. ```bash theme={null} export PRIVY_APP_ID="your-app-id" export PRIVY_APP_SECRET="your-app-secret" ``` ### 2. Install Dependencies ```bash theme={null} pip install privy-client httpx ``` ### 3. Create a Wallet Create a server-managed wallet on Privy. This wallet will sign x402 payments on your behalf. ```python theme={null} import os from privy import PrivyAPI client = PrivyAPI( app_id=os.environ["PRIVY_APP_ID"], app_secret=os.environ["PRIVY_APP_SECRET"], ) wallet = client.wallets.create(chain_type="ethereum") print(f"Wallet ID: {wallet.id}") print(f"Address: {wallet.address}") ``` Save the wallet ID as an environment variable: ```bash theme={null} export PRIVY_WALLET_ID="your-wallet-id" ``` Fund this wallet address with USDC on Base (or Base Sepolia for testing). If testing, get free testnet USDC from [Circle's faucet](https://faucet.circle.com/). Select **Base Sepolia** as the network. ### 4. Make a Paid API Call Here's a complete working example that fetches the current price of ETH. The `x402_request` helper handles the full payment flow: 1. Send the API request 2. Receive a **402 response** containing an `accepts` array of payment options 3. Select a payment option matching your network (Base or Base Sepolia) 4. **Construct EIP-712 typed data** for a USDC `TransferWithAuthorization` ([EIP-3009](https://eips.ethereum.org/EIPS/eip-3009)) 5. **Sign via Privy** using `eth_signTypedData_v4` 6. Build the x402 v2 `PaymentPayload` and retry with the `PAYMENT-SIGNATURE` header ```python theme={null} import base64 import json import os import secrets import httpx from privy import PrivyAPI PRIVY_APP_ID = os.environ["PRIVY_APP_ID"] PRIVY_APP_SECRET = os.environ["PRIVY_APP_SECRET"] WALLET_ID = os.environ["PRIVY_WALLET_ID"] BASE_URL = "https://agents.allium.so" # "eip155:8453" for Base mainnet, "eip155:84532" for Base Sepolia testnet TARGET_NETWORK = "eip155:84532" privy = PrivyAPI(app_id=PRIVY_APP_ID, app_secret=PRIVY_APP_SECRET) # Retrieve the wallet address — needed for the authorization "from" field wallet = privy.wallets.get(wallet_id=WALLET_ID) WALLET_ADDRESS = wallet.address def x402_request(http, method, url, **kwargs): """Make an API request with automatic x402 payment signed via Privy.""" headers = kwargs.pop("headers", {}) response = http.request(method, url, headers=headers, **kwargs) if response.status_code != 402: return response # The 402 response contains an "accepts" array of payment options, # each specifying a network, amount, asset, and payTo address. # There is no pre-built "typed_data" — the client must construct it. payment_details = response.json() accepts = payment_details.get("accepts", []) # Select the payment option matching our network option = next((a for a in accepts if a["network"] == TARGET_NETWORK), None) if option is None: raise ValueError(f"No payment option for {TARGET_NETWORK}") # Parse chain ID from CAIP-2 network string, e.g. "eip155:84532" -> 84532 chain_id = int(option["network"].split(":")[1]) nonce = "0x" + secrets.token_hex(32) # Construct EIP-712 typed data for USDC TransferWithAuthorization (EIP-3009). # The domain name and version come from the payment option's "extra" field — # these differ per network (Base mainnet: "USD Coin", Base Sepolia: "USDC"). typed_data = { "types": { "EIP712Domain": [ {"name": "name", "type": "string"}, {"name": "version", "type": "string"}, {"name": "chainId", "type": "uint256"}, {"name": "verifyingContract", "type": "address"}, ], "TransferWithAuthorization": [ {"name": "from", "type": "address"}, {"name": "to", "type": "address"}, {"name": "value", "type": "uint256"}, {"name": "validAfter", "type": "uint256"}, {"name": "validBefore", "type": "uint256"}, {"name": "nonce", "type": "bytes32"}, ], }, "domain": { "name": option["extra"]["name"], "version": option["extra"]["version"], "chainId": chain_id, "verifyingContract": option["asset"], }, # Privy expects "primary_type" (snake_case), not "primaryType" (camelCase) "primary_type": "TransferWithAuthorization", "message": { "from": WALLET_ADDRESS, "to": option["payTo"], "value": str(option["amount"]), "validAfter": "0", "validBefore": str(option["maxTimeoutSeconds"]), "nonce": nonce, }, } # Sign with Privy server wallet sign_result = privy.wallets.rpc( wallet_id=WALLET_ID, method="eth_signTypedData_v4", params={"typed_data": typed_data}, ) # Build the x402 v2 PaymentPayload with resource, accepted, and payload fields payment_payload = { "x402Version": payment_details["x402Version"], "resource": { "url": option["resource"], "description": option.get("description", ""), "mimeType": option.get("mimeType", "application/json"), }, "accepted": { "scheme": option["scheme"], "network": option["network"], "amount": str(option["amount"]), "asset": option["asset"], "payTo": option["payTo"], "maxTimeoutSeconds": option["maxTimeoutSeconds"], "extra": option.get("extra", {}), }, "payload": { "signature": sign_result.data.signature, "authorization": { "from": WALLET_ADDRESS, "to": option["payTo"], "value": str(option["amount"]), "validAfter": "0", "validBefore": str(option["maxTimeoutSeconds"]), "nonce": nonce, }, }, } # Base64-encode the payload and send as PAYMENT-SIGNATURE header headers["PAYMENT-SIGNATURE"] = base64.b64encode( json.dumps(payment_payload).encode() ).decode() response = http.request(method, url, headers=headers, **kwargs) return response # Fetch ETH price with httpx.Client(timeout=30.0) as http: result = x402_request( http, "POST", f"{BASE_URL}/api/v1/developer/prices", json=[ { "chain": "ethereum", "token_address": "0x0000000000000000000000000000000000000000", } ], ) print(json.dumps(result.json(), indent=2)) ``` **Expected response:** ```json theme={null} { "items": [ { "timestamp": "2026-02-10T09:27:11Z", "chain": "ethereum", "address": "0x0000000000000000000000000000000000000000", "decimals": 18, "price": 2023.6042396986138, "open": 2023.6042396986138, "high": 2023.6042396986138, "close": 2023.6042396986138, "low": 2023.6042396986138 } ] } ``` ### EIP-712 Domain Configuration The USDC contracts use different EIP-712 domains per network. These values are required when constructing the `TransferWithAuthorization` typed data for signing. They are provided in the 402 response's `accepts[].extra` field. | Network | Domain Name | Version | | ----------- | ----------- | ------- | | **Base** | `USD Coin` | `2` | | **Polygon** | `USD Coin` | `2` | | **Solana** | `USDC` | `2` | | **X Layer** | `USD Coin` | `2` | Privy signs the EIP-712 typed data via `eth_signTypedData_v4`, but the **client must construct** the typed data itself from the 402 response fields. The server does not provide a ready-to-sign `typed_data` object. ### Frontend Integration Building a web app with embedded wallets? Use [Privy's `useX402Fetch` hook](https://docs.privy.io/recipes/x402) for seamless client-side x402 payments in React. ## 14. GET https://docs.allium.so/ai/machine-payments/tempo-mpp.md HTTP/2 200 date: Mon, 28 Sep 2026 06:33:43 GMT content-type: text/markdown; charset=utf-8 cf-ray: a420b7dacb89b9a3-BOS cf-cache-status: DYNAMIC age: 0 cache-control: public, max-age=0, must-revalidate content-disposition: inline link: ; rel="llms-txt", ; rel="llms-full-txt", ; rel="api-catalog", ; rel="mcp-server-card", ; rel="agent-card", ; rel="agent-skills", ; rel="oauth-protected-resource" server: cloudflare strict-transport-security: max-age=31536000; includeSubDomains vary: rsc, next-router-state-tree, next-router-prefetch, next-router-segment-prefetch, accept-encoding content-security-policy: worker-src 'self' blob:; object-src 'none'; base-uri 'self'; upgrade-insecure-requests; frame-ancestors 'self' https://dashboard.mintlify.com https://app.mintlify.com; form-action 'self' https://codesandbox.io; x-content-type-options: nosniff x-frame-options: DENY x-llms-txt: /llms.txt x-matched-path: /_mintlify/_markdown/_sites/[subdomain]/[[...slug]] x-robots-tag: noindex x-vercel-cache: MISS x-vercel-id: iad1::iad1::hlpfk-1790577222865-c1d25b450b51 content-encoding: gzip [body: 3168 bytes as received, sha256 cd8ca6846d8e5f1993af422574764632a445e3923b17811521ff6f0154fc43a3] > ## Documentation Index > Fetch the complete documentation index at: https://docs.allium.so/llms.txt > Use this file to discover all available pages before exploring further. # Tempo MPP > The simplest way to make paid API calls — one function call handles the entire 402 payment flow. Tempo Machine Payment Protocol (Tempo MPP) is the simplest way to make paid API calls to Allium. The `Client` wrapper handles the entire 402 negotiation, signing, and retry flow — you just make requests as normal. ## Quickstart with Agent The fastest way to get started — let your AI agent handle setup and payments for you. ```bash theme={null} curl -sSL https://agents.allium.so/cli/install.sh | sh ``` [allium-cli](https://github.com/Allium-Science/allium-cli) is still in early beta. ```bash theme={null} npx skills add allium-labs/skills --yes ``` Start Claude Code, Codex, or any compatible AI agent. ``` Set up Allium and fetch the latest balances for vitalik.eth ``` ## How It Works Make an API request using the Tempo `Client`. The client automatically receives the `402 Payment Required` response, signs a USDC payment authorization, and retries the request. You receive your data with a `200` response. The payment flow is invisible to your code. ## Supported Tokens & Networks Tempo MPP payments use **USDC** on the Tempo network: | Network | USDC Contract Address | | ------------------- | -------------------------------------------- | | **Tempo** (mainnet) | `0x20c000000000000000000000b9537d11c60e8b50` | ## Implementation ### Install ```bash theme={null} pip install "pympp[tempo]" ``` ### Set Up Your Account Create a `TempoAccount` from your private key. This account will sign payments on your behalf. ```bash theme={null} export YOUR_PRIVATE_KEY="your-eth-private-key" ``` ### Make a Paid API Call ```python theme={null} from mpp.client import Client from mpp.methods.tempo import tempo, TempoAccount, ChargeIntent from mpp.methods.tempo._defaults import TESTNET_RPC_URL, TESTNET_CHAIN_ID import os account = TempoAccount.from_key(os.getenv("YOUR_PRIVATE_KEY")) async with Client(methods=[ tempo( account=account, rpc_url=TESTNET_RPC_URL, intents={"charge": ChargeIntent()}, ) ]) as client: response = await client.post( "https://agents.allium.so/api/v1/developer/prices", json=[{"chain": "solana", "token_address": "So11111111111111111111111111111111111111112"}], ) print(response.json()) ``` The `Client` intercepts the `402` response, constructs and signs the payment using your `TempoAccount`, and retries the request automatically. You just see the final `200` response with your data. ## 15. GET https://docs.allium.so/ai/mcp/tools-reference/billing-and-limits.md HTTP/2 200 date: Mon, 28 Sep 2026 06:33:44 GMT content-type: text/markdown; charset=utf-8 cf-ray: a420b7e578f872e6-BOS cf-cache-status: DYNAMIC age: 34408 cache-control: public, max-age=0, must-revalidate content-disposition: inline link: ; rel="llms-txt", ; rel="llms-full-txt", ; rel="api-catalog", ; rel="mcp-server-card", ; rel="agent-card", ; rel="agent-skills", ; rel="oauth-protected-resource" server: cloudflare strict-transport-security: max-age=31536000; includeSubDomains vary: rsc, next-router-state-tree, next-router-prefetch, next-router-segment-prefetch, accept-encoding content-security-policy: worker-src 'self' blob:; object-src 'none'; base-uri 'self'; upgrade-insecure-requests; frame-ancestors 'self' https://dashboard.mintlify.com https://app.mintlify.com; form-action 'self' https://codesandbox.io; x-content-type-options: nosniff x-frame-options: DENY x-llms-txt: /llms.txt x-matched-path: /_mintlify/_markdown/_sites/[subdomain]/[[...slug]] x-robots-tag: noindex x-vercel-cache: HIT x-vercel-id: iad1::iad1::4r89g-1790577224567-6ed28f9724eb content-encoding: gzip [body: 6085 bytes as received, sha256 8a462b119a99ec02b001698f5ba0a1e8353f1da86e6fe9ad497b1284a9309a22] > ## Documentation Index > Fetch the complete documentation index at: https://docs.allium.so/llms.txt > Use this file to discover all available pages before exploring further. # Billing & limits > Which MCP tools consume credits, how much data comes back, and why your tool list may be shorter than the docs. MCP tool calls bill against the same Explorer Unit and Developer Unit pools as the rest of Allium. ## What costs credits | Tool group | Cost | | :------------------------------------------------------------- | :--------------------------------------------------------------------- | | `run_sql_query`, `create_explorer_query`, `run_explorer_query` | **Explorer Units**, based on the warehouse and how long the query runs | | Realtime and Hyperliquid tools | **Developer Units**, a fixed cost per endpoint | | `update_explorer_query`, `delete_explorer_query` | Metered as tool calls; no query compute | | Everything else | Free | **Free tools:** `search_schemas`, `search_docs`, `browse_docs`, `search_terminal`, `get_terminal_results`, `list_skills`, `get_skill`, `list_compute_profiles`, `get_query_run_results`, `get_explorer_query`, `list_explorer_queries`, `get_realtime_supported_chains`, all dashboard, visual, and sharing tools. `get_query_run_results` is free: the Explorer Units were charged when the run was queued. Poll as long as you need. **Two different meters.** Realtime and Hyperliquid tools charge Developer Units per endpoint. Every metered MCP tool call is also checked against your **Explorer Unit** allowance before it runs, so a realtime call can be refused when that allowance is exhausted. Check both balances if you hit an unexpected limit error. ### Explorer Units Query cost scales with the compute profile and how long the query runs. `get_query_run_results` returns the run's exact Explorer Unit cost. Running SQL with `run_sql_query` and then saving the same SQL with `create_explorer_query` bills the compute twice. If the result might be reused, use `create_explorer_query(run_on_creation=true)` from the start. ### Developer Units Realtime tools call Allium's [Realtime APIs](/api/developer/overview), so they consume between 20 and 60 Developer Units per call depending on the endpoint. Batched calls multiply that by the number of inputs: a `get_realtime_token_latest_price` call with 10 payloads costs 10x the single-call rate. See [API Credits](/api/developer/compute-units) for the full per-endpoint table, and [Realtime data](/ai/mcp/tools-reference/realtime#every-tool-names-its-own-docs) for the tool-to-endpoint mapping. ### When you run out If your organization is over its credit cap or overage limit, billed tools fail with an error explaining the limit. Free tools keep working. Contact [support@allium.so](mailto:support@allium.so) to raise a limit. ## Row limits SQL results pass two caps: one on the query run, one on what the tool hands back. | Cap | Value | Applies to | | :----------------- | :--------------------------------------------------- | :----------------------------------------------------------------- | | Query result rows | **1,000** | A `run_sql_query` run | | Query result rows | **10,000** by default, configurable per organization | A saved-query run (`create_explorer_query` / `run_explorer_query`) | | Tool response rows | **50** by default | What `get_query_run_results` hands your agent | Raise the last one with `row_limit`, or pass `null` or `0` for no tool-side truncation. The default is small so a wide result doesn't fill your agent's context window. If you need more than 1,000 rows, aggregate in SQL. A `GROUP BY` on a large blockchain table is cheaper than moving rows into your agent. When you need the rows themselves, save the query with `create_explorer_query`, which has the higher cap. Other limits: | Limit | Value | | :---------------------------------------- | :----------------------- | | `get_query_run_results` poll window | 180 seconds max per call | | `search_schemas` / `search_terminal` hits | 20 max, 5 by default | | `get_terminal_results` rows | Set by `max_rows` | ## Tool visibility Some capabilities are enabled per organization. A tool your organization doesn't have never reaches your agent, so the tools your client shows can be fewer than the [full tool list](/ai/mcp/tools-reference/overview#full-tool-list). Skills work the same way: `list_skills` returns only the ones your organization can access. Visibility fails closed: if authentication fails, gated tools are hidden. If you expect a tool and don't see it, check that your API key is valid. Contact [support@allium.so](mailto:support@allium.so) if it's still missing. ## Related resources Developer Unit cost per Realtime endpoint Check your org's consumption in the App How warehouse size affects Explorer Units The async run and results flow ## 16. GET https://docs.allium.so/ai/machine-payments/endpoints-pricing HTTP/2 200 date: Mon, 28 Sep 2026 06:32:11 GMT content-type: text/html; charset=utf-8 cf-ray: a420b59d1ef98fe1-BOS cf-cache-status: DYNAMIC age: 41055 cache-control: public, max-age=0, must-revalidate link: ; rel="llms-txt", ; rel="llms-full-txt", ; rel="api-catalog", ; rel="mcp-server-card", ; rel="agent-card", ; rel="agent-skills", ; rel="oauth-protected-resource" server: cloudflare strict-transport-security: max-age=31536000; includeSubDomains vary: rsc, next-router-state-tree, next-router-prefetch, next-router-segment-prefetch, accept-encoding content-security-policy: worker-src 'self' blob:; object-src 'none'; base-uri 'self'; upgrade-insecure-requests; frame-ancestors 'self' https://dashboard.mintlify.com https://app.mintlify.com; form-action 'self' https://codesandbox.io; x-content-type-options: nosniff x-frame-options: DENY x-llms-txt: /llms.txt x-matched-path: /_sites/[subdomain]/[[...slug]] x-mintlify-client-version: 0.0.3697 x-nextjs-prerender: 1 x-nextjs-stale-time: 60 x-vercel-cache: HIT x-vercel-id: iad1::iad1::j7nkd-1790577131088-0b04a182b9e6 x-vercel-project-id: prj_Nb029T9bkEu4saatghcyuj5MhqBh x-version: dpl_83MgEVFzvckYLtdRLCMmht5NH7hs content-encoding: gzip [body: 316122 bytes as received, sha256 abec9ec4e7cb673baff3bca1a575513aaac0825610fddb77ac255e8d155251c6] Endpoints & Pricing - Allium Documentation Hub Documentation Index Fetch the complete documentation index at: /llms.txt Use this file to discover all available pages before exploring further. Skip to main content Allium Documentation Hub home page [aria-label=Open search] Search...⌘K [aria-label=Toggle assistant panel] Ask Assistant⌘I [aria-label=Main] Data Status Blog Book a Demo Book a Demo [aria-label=Change theme preference] [aria-label=Open search] Search... [aria-label=Toggle assistant panel] [aria-label=More actions] Navigation Machine Payments Endpoints & Pricing [aria-label=Pages] On this page Install allium-cli Supported Chains Discovery Realtime API Prices Tokens Wallets Explorer API Supported Networks Rate Limits Error Codes Machine Payments Endpoints & Pricing [aria-label=Open in ChatGPT] Open in ChatGPT [aria-label=More actions] All payment-enabled endpoints, pricing, rate limits, and error codes. [aria-label=Open in ChatGPT] Open in ChatGPT [aria-label=More actions] All endpoints below are accessible via machine payments at https://agents.allium.so. No API key needed — pay with USDC using Tempo MPP or x402. All calls are priced individually. No subscription, no minimum spend. [aria-label=Navigate to header] ​ Install allium-cli CLI commands require allium-cli: [aria-label=Report incorrect code] [aria-label=Copy the contents from the code block] [aria-label=Ask Assistant] curl -sSL https://agents.allium.so/cli/install.sh | sh [aria-label=Navigate to header] ​ Supported Chains Discovery Check which chains each endpoint supports. This endpoint is free — no payment required. [aria-label=Report incorrect code] [aria-label=Copy the contents from the code block] [aria-label=Ask Assistant] curl "https://agents.allium.so/api/v1/supported-chains/realtime-apis/simple" Returns a map of endpoint path to supported chain names. Call once per session and cache the result. [aria-label=Navigate to header] ​ Realtime API [aria-label=Navigate to header] ​ Prices [aria-label=Scrollable table] CLI Command Method Endpoint Cost Description allium realtime prices latest POST /api/v1/developer/prices $0.02 Get latest token prices allium realtime prices at-timestamp POST /api/v1/developer/prices/at-timestamp $0.02 Get token prices at a specific time allium realtime prices history POST /api/v1/developer/prices/history $0.02 Get historical token price series allium realtime prices stats POST /api/v1/developer/prices/stats $0.02 Get token price statistics [aria-label=Navigate to header] ​ Tokens [aria-label=Scrollable table] CLI Command Method Endpoint Cost Description allium realtime tokens search GET /api/v1/developer/tokens/search $0.03 Search tokens by name or symbol allium realtime tokens chain-address POST /api/v1/developer/tokens/chain-address $0.02 Look up tokens by chain and address allium realtime tokens list GET /api/v1/developer/tokens $0.03 List all supported tokens [aria-label=Navigate to header] ​ Wallets [aria-label=Scrollable table] CLI Command Method Endpoint Cost Description allium realtime balances latest POST /api/v1/developer/wallet/balances $0.03 Get current wallet token balances allium realtime balances history POST /api/v1/developer/wallet/balances/history $0.03 Get historical wallet balances allium realtime transactions POST /api/v1/developer/wallet/transactions $0.03 Get wallet transaction history allium realtime pnl POST /api/v1/developer/wallet/pnl $0.03 Get wallet profit and loss [aria-label=Navigate to header] ​ Explorer API The Explorer API is also available via machine payments. The run-sql endpoint uses machine payments auth directly. The remaining Explorer endpoints (run, status, results) require API key authentication. [aria-label=Scrollable table] CLI Command Method Endpoint Cost Auth Description allium explorer run-sql POST /api/v1/explorer/queries/run-async $0.01 Machine payments Submit raw SQL for async execution allium explorer run POST /api/v1/explorer/queries/{query_id}/run-async $0.01 API key Run a saved query asynchronously allium explorer status GET /api/v1/explorer/query-runs/{run_id}/status $0.01 API key Check status of a query run allium explorer results GET /api/v1/explorer/query-runs/{run_id}/results dynamic API key Fetch results of a completed query [aria-label=Navigate to header] ​ Supported Networks [aria-label=Scrollable table] Protocol Network USDC Address Tempo MPP Tempo (mainnet) 0x20c000000000000000000000b9537d11c60e8b50 x402 Base (mainnet) 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 x402 Polygon (mainnet) 0x3c499c542cEF5E3811e1192ce70d8cc03d5c3359 x402 Solana (mainnet) EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v x402 X Layer (mainnet) 0x74b7f16337b8972027f6196a17a631ac6de26d22 [aria-label=Navigate to header] ​ Rate Limits Two independent rate limit buckets per wallet. You can max out both simultaneously. [aria-label=Scrollable table] Bucket Endpoints Limit Data All /developer/ endpoints 3 requests/second Docs All /docs/ endpoints 5 requests/second Exceeding either limit returns HTTP 429. Wait 1 second before retrying. [aria-label=Navigate to header] ​ Error Codes [aria-label=Scrollable table] Status Meaning What to Do 400 Bad request Check JSON syntax 402 Payment required Sign the payment and retry (handled automatically by Tempo MPP) 422 Validation failed Check request format 429 Rate limited Back off for 1 second 500 Server error Retry with exponential backoff Was this page helpful? YesNo [aria-label=Ask a question...] [aria-label=Send message] xlinkedin Assistant [aria-label=Maximize assistant panel] [aria-label=Close assistant panel] Responses are generated using AI and may contain mistakes. [aria-label=Ask a question...] [aria-label=Add attachment] [aria-label=Send message] ## 17. GET https://docs.allium.so/ai/mcp/overview HTTP/2 200 date: Mon, 28 Sep 2026 06:32:09 GMT content-type: text/html; charset=utf-8 cf-ray: a420b5909d594d07-BOS cf-cache-status: DYNAMIC age: 41053 cache-control: public, max-age=0, must-revalidate link: ; rel="llms-txt", ; rel="llms-full-txt", ; rel="api-catalog", ; rel="mcp-server-card", ; rel="agent-card", ; rel="agent-skills", ; rel="oauth-protected-resource" server: cloudflare strict-transport-security: max-age=31536000; includeSubDomains vary: rsc, next-router-state-tree, next-router-prefetch, next-router-segment-prefetch, accept-encoding content-security-policy: worker-src 'self' blob:; object-src 'none'; base-uri 'self'; upgrade-insecure-requests; frame-ancestors 'self' https://dashboard.mintlify.com https://app.mintlify.com; form-action 'self' https://codesandbox.io; x-content-type-options: nosniff x-frame-options: DENY x-llms-txt: /llms.txt x-matched-path: /_sites/[subdomain]/[[...slug]] x-mintlify-client-version: 0.0.3697 x-nextjs-prerender: 1 x-nextjs-stale-time: 60 x-vercel-cache: HIT x-vercel-id: iad1::iad1::djffb-1790577129073-e5d00979855b x-vercel-project-id: prj_Nb029T9bkEu4saatghcyuj5MhqBh x-version: dpl_83MgEVFzvckYLtdRLCMmht5NH7hs content-encoding: gzip [body: 536096 bytes as received, sha256 165147d217db7ab014e0f12c3435a729f5132fe61665b5b5bc6766400b7d3267] Overview - Allium Documentation Hub Documentation Index Fetch the complete documentation index at: /llms.txt Use this file to discover all available pages before exploring further. Skip to main content Allium Documentation Hub home page [aria-label=Open search] Search...⌘K [aria-label=Toggle assistant panel] Ask Assistant⌘I [aria-label=Main] Data Status Blog Book a Demo Book a Demo [aria-label=Change theme preference] [aria-label=Open search] Search... [aria-label=Toggle assistant panel] [aria-label=More actions] Navigation MCP Overview [aria-label=Pages] On this page Quick start What your agent can do Chatbots Coding agents and CLIs API key authentication Automatic setup Manual setup Related resources MCP Overview [aria-label=Open in ChatGPT] Open in ChatGPT [aria-label=More actions] Query blockchain data from Allium Explorer using MCP. [aria-label=Open in ChatGPT] Open in ChatGPT [aria-label=More actions] Allium’s MCP Server gives your AI agents blockchain data through Model Context Protocol tool calls. [aria-label=Scrollable table] Connect with URL Sign-in (recommended) https://mcp-oauth.allium.so API key https://mcp.allium.so [aria-label=Navigate to header] ​ Quick start 1 Add the server to your client Add https://mcp-oauth.allium.so as a custom MCP server or connector, and choose OAuth authentication if your client asks.Per-client steps for ChatGPT, Claude, and Copilot Studio are below. 2 Sign in Your client opens Allium’s login page. Sign in with your Allium account and approve access. 3 Start querying Ask your agent to query blockchain data. It now has access to 85+ chains via Allium. [aria-label=Tip] Using a coding agent? With our installer, building on Allium is super straightforward: [aria-label=Report incorrect code] [aria-label=Copy the contents from the code block] [aria-label=Ask Assistant] npx @allium-labs/mcp install --client claude-code --yes See Coding agents and CLIs for the full client list. [aria-label=Navigate to header] ​ What your agent can do SQL & queries Run SQL, save reusable Explorer queries, choose a compute profile Knowledge & discovery Search schemas, docs, and analyst-built Terminal dashboards Dashboards & sharing Build visuals and dashboards, publish share and embed links Realtime data Prices, balances, transactions, DeFi positions, holdings PnL Hyperliquid Info, fills, orders, and orderbooks through a rate-limit-free proxy Skills Load Allium’s own SQL and dashboard guidance into your agent [aria-label=Tip] Have your agent call get_skill(name="sql-optimization") before it writes SQL, and get_realtime_supported_chains once per session before any realtime tool. [aria-label=Navigate to header] ​ Chatbots ChatGPT Claude Microsoft Copilot Gemini Note: Requires ChatGPT Plus, Pro, or Team plan.ChatGPT supports MCP servers as “Apps,” so you can ask about on-chain data directly in your chat. Click on your username in the bottom left Go to Settings Navigate to Apps Go to Advanced Settings Select and turn on Developer Mode Click Create App Set MCP Server URL to: https://mcp-oauth.allium.so Select OAuth as authentication In a chat, select the + icon and turn on the Allium MCP App. Note: Requires Claude Pro, Max, Team, or Enterprise plan.Claude supports MCP servers as “connectors,” so you can ask about on-chain data directly in your chat. Click on your user icon in the bottom left Go to Settings (Pro / Max plans) or Organization Settings (Team / Enterprise plans) Navigate to Connectors Scroll down to Add Custom Connector Add https://mcp-oauth.allium.so as the Remote MCP Server URL (On Settings > Connectors) Find the Allium Custom Connector and click “Connect” Sign in with your Allium account, using Google, SSO, or email In a chat, select the + icon and turn on the Allium connector. Note: Requires Copilot Studio to configure MCP servers. Copilot Studio connects with an API key, so it uses https://mcp.allium.so.Build custom agents and workflows in Copilot Studio that pull live blockchain data from Allium. Click Create blank agent Click on Tools Select Add a Tool then Model Context Protocol Add https://mcp.allium.so as the Server URL Select API key authentication, using the X-API-KEY header, and click Create Once the connector has been created, select Connection > Create new connection Copy your API key from https://app.allium.so/settings/api-keys and paste it into Copilot Click Create, then Add and configure Copilot Studio discovers Allium’s tools and keeps them in sync. You choose which tools to enable, combine them with other connectors, and deploy the agent to Teams, Power Automate, or a custom app. See the Copilot Studio MCP documentation for the full setup. Gemini web does not currently support MCP. Use Gemini CLI instead: [aria-label=Report incorrect code] [aria-label=Copy the contents from the code block] [aria-label=Ask Assistant] npx @allium-labs/mcp install --client gemini-cli --yes Gemini CLI signs in on first use. See Coding agents and CLIs. [aria-label=Note] Want support for another chatbot platform? Reach out to [email protected]. [aria-label=Navigate to header] ​ Coding agents and CLIs Claude Code, Cursor, Codex and the other CLI clients sign in with your Allium account. The installer writes the server into the client’s config file: [aria-label=Report incorrect code] [aria-label=Copy the contents from the code block] [aria-label=Ask Assistant] npx @allium-labs/mcp install --client claude-code --yes Swap claude-code for your client’s slug. [aria-label=Scrollable table] Client Slug Sign-in Claude Code claude-code Run /mcp, select allium Cursor cursor On first use Claude Desktop claude On first use Codex codex Run codex mcp login allium VS Code (GitHub Copilot) vscode On first use Cline cline On first use Windsurf windsurf On first use Warp warp On first use Gemini CLI gemini-cli On first use Goose goose On first use Zed zed On first use OpenCode opencode On first use Tabnine tabnine On first use Roo Code roo-cline API key only, see below [aria-label=Note] Roo Code cannot sign in yet. Its OAuth 2.1 issue is still open, so install it with a key instead: [aria-label=Report incorrect code] [aria-label=Copy the contents from the code block] [aria-label=Ask Assistant] npx @allium-labs/mcp install --client roo-cline --api-key YOUR_KEY --yes To configure a client by hand, point it at https://mcp-oauth.allium.so and choose OAuth authentication if it asks: Claude Code Cursor Codex [aria-label=Report incorrect code] [aria-label=Copy the contents from the code block] [aria-label=Ask Assistant] claude mcp add --scope user --transport http allium https://mcp-oauth.allium.so Then run /mcp, select allium, and finish the login in your browser. Add to ~/.cursor/mcp.json (global) or .cursor/mcp.json (project): [aria-label=Report incorrect code] [aria-label=Copy the contents from the code block] [aria-label=Ask Assistant] { "mcpServers": { "allium": { "url": "https://mcp-oauth.allium.so" } } } Then restart Cursor. [aria-label=Report incorrect code] [aria-label=Copy the contents from the code block] [aria-label=Ask Assistant] codex mcp add allium --url https://mcp-oauth.allium.so codex mcp login allium [aria-label=Note] Don’t see your client listed? Reach out to [email protected]. [aria-label=Navigate to header] ​ API key authentication [aria-label=Note] For autonomous agents, CI, and clients that can’t sign in. Generate a key at app.allium.so/settings/api-keys, connect to https://mcp.allium.so, and send the key in an X-API-KEY header. You store and rotate the key yourself, so prefer sign-in where your client supports it. Both paths reach the same tools. [aria-label=Navigate to header] ​ Automatic setup The installer takes a key with --api-key, which also skips the browser step: [aria-label=Report incorrect code] [aria-label=Copy the contents from the code block] [aria-label=Ask Assistant] npx @allium-labs/mcp install --client claude-code --api-key YOUR_KEY --yes Client slugs are listed under Coding agents and CLIs. [aria-label=Navigate to header] ​ Manual setup Claude Code Cursor Codex LangGraph / LangChain mcp-remote / CLI Other Clients [aria-label=Report incorrect code] [aria-label=Copy the contents from the code block] [aria-label=Ask Assistant] claude mcp add --scope user --transport http allium https://mcp.allium.so --header "X-API-KEY: " Then restart Claude Code. Add to ~/.cursor/mcp.json (global) or .cursor/mcp.json (project): [aria-label=Report incorrect code] [aria-label=Copy the contents from the code block] [aria-label=Ask Assistant] { "mcpServers": { "allium": { "url": "https://mcp.allium.so", "headers": { "X-API-KEY": "" } } } } Then restart Cursor. Add the server: [aria-label=Report incorrect code] [aria-label=Copy the contents from the code block] [aria-label=Ask Assistant] codex mcp add allium --url https://mcp.allium.so Then add your API key to ~/.codex/config.toml: [aria-label=Report incorrect code] [aria-label=Copy the contents from the code block] [aria-label=Ask Assistant] [mcp_servers.allium] url = "https://mcp.allium.so" http_headers = { "X-API-KEY" = "" } Then restart Codex. Register tools in your agent configuration: [aria-label=Report incorrect code] [aria-label=Copy the contents from the code block] [aria-label=Ask Assistant] { "tools": [ { "name": "run_sql_query", "server": "https://mcp.allium.so", "headers": { "X-API-KEY": "" } }, { "name": "get_query_run_results", "server": "https://mcp.allium.so", "headers": { "X-API-KEY": "" } } ] } Register search_schemas and search_docs the same way. An agent needs them to find the right tables before it writes SQL. Add any of the other available tools as needed. [aria-label=Note] Query execution is asynchronous: run_sql_query returns a run_id, and get_query_run_results fetches the rows. Register both, or your agent will never see its results. See SQL & queries. For streamable-http or other CLI-based setups: [aria-label=Report incorrect code] [aria-label=Copy the contents from the code block] [aria-label=Ask Assistant] { "mcpServers": { "allium": { "command": "npx", "args": [ "mcp-remote", "https://mcp.allium.so", "--header", "X-API-KEY:${API_KEY}" ], "env": { "API_KEY": "" } } } } The key comes from the environment rather than the config file. Configure your MCP client to connect to https://mcp.allium.so with the X-API-KEY header set to your API key.Most MCP clients support HTTP transport with custom headers. See your client’s documentation for the exact syntax. [aria-label=Navigate to header] ​ Related resources Plugins Extend your agent with the allium-analyst plugin Tools Reference Every tool, by category Billing & limits Which tools cost credits, and the row and poll caps Examples What customers build with MCP Run Queries Learn how to save queries in Explorer and obtain a query ID Explorer API REST endpoints for running queries and retrieving results Was this page helpful? YesNo [aria-label=Ask a question...] [aria-label=Send message] xlinkedin Assistant [aria-label=Maximize assistant panel] [aria-label=Close assistant panel] Responses are generated using AI and may contain mistakes. [aria-label=Ask a question...] [aria-label=Add attachment] [aria-label=Send message] ## 18. GET https://docs.allium.so/ai/machine-payments (section root) HTTP/2 307 date: Mon, 28 Sep 2026 06:32:10 GMT content-type: text/plain location: /login?redirect=%2Fai%2Fmachine-payments cf-ray: a420b5979d59a9f6-BOS cf-cache-status: DYNAMIC cache-control: public, max-age=0, must-revalidate server: cloudflare strict-transport-security: max-age=31536000; includeSubDomains content-security-policy: worker-src 'self' blob:; object-src 'none'; base-uri 'self'; upgrade-insecure-requests; frame-ancestors 'self' https://dashboard.mintlify.com https://app.mintlify.com; form-action 'self' https://codesandbox.io; x-content-type-options: nosniff x-frame-options: DENY x-vercel-id: iad1::9tgft-1790577130219-44163c076e07 [body: 15 bytes as received, sha256 7c040f8633b8823d72ed63da9b3b2dfe9846e912c66a64c9433ec9c4815d76c2] Redirecting... ## 19. GET https://www.allium.so/pricing HTTP/2 301 date: Mon, 28 Sep 2026 06:32:51 GMT content-type: text/html location: /contact cf-ray: a420b696d96072e6-BOS cf-cache-status: DYNAMIC cache-control: private server: cloudflare set-cookie: [redacted] strict-transport-security: max-age=31536000; includeSubDomains content-security-policy: script-src 'nonce-aCZJonaOJ+QSbH6n34V9EA==' 'strict-dynamic' 'self' https://allium.chilipiper.com https://cdn.jsdelivr.net https://cdn.prod.website-files.com https://d3e54v103j8qbb.cloudfront.net https://hero-live-data.allium.page https://js.hs-scripts.com https://js.hsforms.net https://www.googletagmanager.com; script-src-attr 'none'; frame-ancestors 'self'; object-src 'none'; base-uri 'self' x-content-type-options: nosniff o2o-cache-status: BYPASS x-wf-region: us-east-1 [body: 166 bytes as received, sha256 87a9323ac85ce28867d5d7ce590c8f29b8d1a999961fca71bb33adef48683691] 301 Moved Permanently

301 Moved Permanently


openresty
## 20. GET https://www.allium.so/terms-of-service HTTP/2 301 date: Mon, 28 Sep 2026 06:32:51 GMT content-type: text/html location: /terms cf-ray: a420b69b1ed98120-BOS cf-cache-status: DYNAMIC cache-control: private server: cloudflare set-cookie: [redacted] strict-transport-security: max-age=31536000; includeSubDomains content-security-policy: script-src 'nonce-OiEi88lB6UnuJK04OvwdHA==' 'strict-dynamic' 'self' https://allium.chilipiper.com https://cdn.jsdelivr.net https://cdn.prod.website-files.com https://d3e54v103j8qbb.cloudfront.net https://hero-live-data.allium.page https://js.hs-scripts.com https://js.hsforms.net https://www.googletagmanager.com; script-src-attr 'none'; frame-ancestors 'self'; object-src 'none'; base-uri 'self' x-content-type-options: nosniff o2o-cache-status: BYPASS x-wf-region: us-east-1 [body: 166 bytes as received, sha256 87a9323ac85ce28867d5d7ce590c8f29b8d1a999961fca71bb33adef48683691] 301 Moved Permanently

301 Moved Permanently


openresty
## 21. GET https://allium.so/.well-known/public-agents.json HTTP/2 301 date: Mon, 28 Sep 2026 06:32:13 GMT content-length: 0 location: https://www.allium.so/.well-known/public-agents.json strict-transport-security: max-age=31536000; includeSubDomains x-content-type-options: nosniff server: cloudflare cf-ray: a420b5abfd255e9a-BOS [body: 0 bytes as received, sha256 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855] ## 22. GET https://www.allium.so/.well-known/public-agents.json HTTP/2 404 date: Mon, 28 Sep 2026 06:32:14 GMT content-type: text/html; charset=utf-8 cf-ray: a420b5afccb18f90-BOS cf-cache-status: DYNAMIC cache-control: no-transform content-encoding: gzip etag: W/"6ab5429f-58" server: cloudflare set-cookie: [redacted] strict-transport-security: max-age=31536000; includeSubDomains vary: accept-encoding content-security-policy: script-src 'nonce-MY0n48ggM2dkNaCJBgE8Ug==' 'strict-dynamic' 'self' https://allium.chilipiper.com https://cdn.jsdelivr.net https://cdn.prod.website-files.com https://d3e54v103j8qbb.cloudfront.net https://hero-live-data.allium.page https://js.hs-scripts.com https://js.hsforms.net https://www.googletagmanager.com; script-src-attr 'none'; frame-ancestors 'self'; object-src 'none'; base-uri 'self' x-content-type-options: nosniff o2o-cache-status: EXPIRED x-wf-region: us-east-1 [body: 88 bytes as received, sha256 62b6eec5bc825126a7b9734e03ff00c9dc7899f3f07111746bf583d193b44dd0]

Invalid .well-known request

## 23. DoH TXT _public-agents.allium.so HTTP/2 200 server: cloudflare date: Mon, 28 Sep 2026 06:32:14 GMT content-type: application/dns-json access-control-allow-origin: * x-content-type-options: nosniff content-length: 266 cf-ray: a420b5b42d3b8fde-BOS alt-svc: h3=":443"; ma=86400 [body: 266 bytes as received, sha256 b2cc5414b38f9caed7f026fb3e677e5a9b190e90013380cf637f3f2f46889623] {"Status":3,"TC":false,"RD":true,"RA":true,"AD":false,"CD":false,"Question":[{"name":"_public-agents.allium.so","type":16}],"Authority":[{"name":"allium.so","type":6,"TTL":1800,"data":"arya.ns.cloudflare.com. dns.cloudflare.com. 2415192537 10000 2400 604800 1800"}]}