Skip to content
Gauge

ax-check.com

Allium

allium.com

ax-check.com

Checked 15 October 2026

F

0/100

Agents need your login

No docs or quickstart exist for agents to find on allium.com

The homepage loads but has no documentation index, no quickstart, and no pricing page; 20 of 23 checklist items were unassessed for lack of content.

3 fixes to start with

Concrete changes, backed by what we found.

Onboarding

Give agents a clear login handoff and a way to resume setup.

Agents cannot progress through onboarding without human help. Provide an agent-accessible path through authentication and setup.

Docs

Return Markdown when clients request text/markdown.

Homepage returned text/html even when Markdown was requested; no Markdown representation offered.

Docs

Add links to your product documentation and quickstart in /llms.txt.

/llms.txt returns 404; no documentation index exists for agents.

Linked from www.allium.com/404.aspx?404;https://allium.com:443/llms.txt

Recorded coding sessions

Same task, 3 models, no allium.com account. Recorded 15 October 2026 on Pi.

3 recorded · 4m 0s

4m 0s · recorded

Session findings

Select a finding to see it in context.

piv0.84.2
modelQwen 3.8 Maxcwd/sandbox/repo
Help me build a simple example using Allium. Tell me how pricing works, and briefly tell me whether this product will be easy for you to manage. Let me know if you get blocked. If this product has no developer workflow you can act on, say so plainly and stop. Stay light: use the hosted product through its SDK or API. Do not start local service stacks or wait for long-running commands; if the quickstart requires either, say so plainly and stop.
Thinking…

The user is asking about "Allium". I don't know it. Let me check the current working directory for clues.

Let me look at the repo.

cd /sandbox/repo && ls -la && cat README.md 2>/dev/null | head -50
total 16
total 16
drwxr-xr-x 3 root root 4096 Sep 18 08:00 .
drwxr-xr-x 7 root root 4096 Oct 15 16:53 ..
drwxr-xr-x 8 root root 4096 Sep 24 20:05 .git
-rw-r--r-- 1 root root  408 Sep 18 08:00 .gitignore
cd /sandbox/repo && ls -R . | head -100; echo "---"; env | grep -i -E "allium|api|key|token" | sed 's/=.*/=<redacted>/'
.:
.:
---
PI_GATEWAY_API_KEY=<redacted>
GIT_CONFIG_KEY_0=<redacted>
Thinking…

The repo is empty (only .git and .gitignore). There's no Allium code. Let me check git history and .gitignore.

Allium — I recall Allium is an enterprise data platform company (allium.so), a blockchain/enterprise data platform providing "Data Products" for blockchain data (e.g., Ethereum transactions) delivered via SQL, APIs, real-time streams, etc. It's an enterprise product requiring a sales contact; there's no public self-serve signup, no public SDK on npm/PyPI that I know of. There may be a public "allium" Python package but it's probably unrelated.

Let me verify: check network access, check npm/PyPI for "allium" packages.

cd /sandbox/repo && cat .gitignore; echo "--- git log ---"; git log --oneline -20 2>&1 | head; echo "--- branches ---"; git branch -a 2>&1 | head
# Keep generated and vendored files out of source diffs.
# Keep generated and vendored files out of source diffs.

# Logs / OS cruft
*.log
.DS_Store

# JavaScript / TypeScript
node_modules/
.next/
dist/
build/
coverage/

# Python
.venv/
venv/
__pycache__/
*.py[cod]
.pytest_cache/
*.egg-info/

# Rust
target/

# Go / PHP / Ruby vendored deps
vendor/
.bundle/

# Java / Kotlin / Scala
.gradle/

# .NET
bin/
obj/

# Elixir
_build/
deps/

# Dart / Flutter
.dart_tool/
--- git log ---
9ebf5fb Initial workspace
--- branches ---
* main
timeout 25 curl -sS -o /dev/null -w "npm:%{http_code}\n" https://registry.npmjs.org/allium ; timeout 25 curl -sS -o /dev/null -w "pypi:%{http_code}\n" https://pypi.org/pypi/allium/json ; timeout 25 curl -sS -o /dev/null -w "web:%{http_code}\n" https://allium.so
npm:200
npm:200
pypi:200
web:301
Thinking…

Network is available. Let me check what those packages actually are — the npm "allium" and PyPI "allium" may be unrelated (e.g., a Minecraft mod loader "Allium"? Actually "Allium" is a fabric mod). Let me check.

Also check allium.so documentation for pricing and developer workflow.

timeout 30 curl -sS https://registry.npmjs.org/allium | python3 -c "import json,sys; d=json.load(sys.stdin); print(d.get('name'), d.get('description'), d.get('dist-tags'), list(d.get('versions',{}))[-3:])" 2>&1 | head -5; echo "---PYPI---"; timeout 30 curl -sS https://pypi.org/pypi/allium/json | python3 -c "import json,sys; d=json.load(sys.stdin); i=d['info']; print(i['name'],'|',i['version'],'|',i.get('summary'),'|',i.get('home_page'),i.get('project_urls'))" 2>&1 | head -5
allium Simpler Gherkin parsing {'latest': '0.2.2'} ['0.2.0', '0.2.1', '0.2.2']
allium Simpler Gherkin parsing {'latest': '0.2.2'} ['0.2.0', '0.2.1', '0.2.2']
---PYPI---
allium | 0.0.1 | Compute oscillations of radially symmetric things | https://gitlab.com/warrickball/aims3 {'Homepage': 'https://gitlab.com/warrickball/aims3'}
timeout 30 curl -sSL -o /tmp/allium.html -w "%{http_code} %{url_effective}\n" https://allium.so; echo "--- size:"; wc -c /tmp/allium.html; python3 - <<'EOF'
import re
h=open('/tmp/allium.html',errors='ignore').read()
t=re.sub(r'<script.*?</script>','',h,flags=re.S)
t=re.sub(r'<style.*?</style>','',t,flags=re.S)
t=re.sub(r'<[^>]+>',' ',t)
t=re.sub(r'\s+',' ',t)
print(t[:2500])
EOF
200 https://www.allium.so/
200 https://www.allium.so/
--- size:
236547 /tmp/allium.html
 Allium - Enterprise Blockchain Data =768px): click tabs; pins only when it fits (>=992px, no reduced motion, heading + card fit below the navbar), heading + card centred vertically below the navbar: top = max(nav, nav + (vh - nav - block) / 2). While pinned every tab pane is held at the tallest tab's height. Tall screens (>=992px wide and >=850px tall): image panel, screenshot, card padding and card title (.ut_title, 32px up to 35.84px) scale with viewport height (clamp, capped). Unpins with the standard 80px section padding below. Phones: accordion. data-ut-images="off" = text-only card; data-ut-bullets="off" hides the bullet list. --> =992 wide and >=850 tall; nothing changes below 850px tall or on phones). Shared by Home and the 7 client cards: screenshot 240px + 3.5px per px of viewport height over 850, cap 420px; image panel 32px top/bottom padding. Card ~479px at 1440x900. --> 5.7:1, WCAG AA); visible keyboard focus on tab links, accordion questions and buttons; 44px minimum tap targets for buttons and text links on touch-size screens; long-text captions no smaller than 14px on phones. --> =992px; moved here from the 8 page heads): content top-aligned with one shared top padding (--ut-pt 32px, tall screens 32-44px, ~40px at 1440x900); card height set by the tallest tab text column, the screenshot scales to fit inside the image panel (absolute, contain, top-aligned at the title cap height: --ut-capx = 0.256 x title size). Phones untouched. --> =768px): one 2px pink underline flush on the striped bar (inset shadow), same 1px solid borders as inactive tabs, no doubled seams. (2) Impact component (Section / Stats Solutions on Home + 6 use-case pages): header centred (exception to the left-align rule), then chart (waterfall or chart image) at the stat-row width, then the 3 stats; gaps 24px / 20px as on Home. (3) Client value cards (Section / Value client variant): separate cards 24px apart, each with its own pink striped top band; titles and descriptions level across the row via subgrid; stacked on phones. --> Our data powers Visa&#x27;s public stablecoin dashboard. Read our latest report → Solutions By Use Case Academia Finance &amp; Operations Investment Research Issuance Market Oversight Payments Product &amp; Engineering Trading &amp; Investment Explore Chain Directory Compare Solutions Clients By Organization Accounting &amp; Audit Firms Asset Managers Banks Exchanges Hedge Funds Payment Networks Stablecoin Issuers Products Allium AI Allium Terminal
Thinking…

So Allium (allium.so) is an enterprise blockchain data company. Let me check for developer docs / API / SDK, and pricing. Look for docs.allium.so, api docs, pricing page.

python3 - <<'EOF'
import re
h=open('/tmp/allium.html',errors='ignore').read()
links=sorted(set(re.findall(r'href="([^"]+)"',h)))
for l in links:
    print(l)
EOF
#
#
/
/about
/client/accounting-audit-firms
/client/asset-managers
/client/banks
/client/exchanges
/client/hedge-fund
/client/payment-networks
/client/stablecoin-issuers
/compare
/contact
/ecosystems
/partners
/privacy
/product/allium-datashares
/product/allium-developer
/product/allium-explorer
/product/allium-terminal
/product/real-time-streaming
/reports/onchain-alternative-alpha
/reports/stablecoin-payments-q1-2026
/reports/state-of-onchain-finance-q2-26
/reports/state-of-stablecoins-and-payments-september-2026
/research
/security
/snowflake-x-allium
/terms
/use-case/academia
/use-case/finance-operation
/use-case/issuance
/use-case/market-oversight
/use-case/payment
/use-case/product-engineering
/use-case/research-strategy
/use-case/trading
https://a16zcrypto.com
https://agents.allium.so/
https://alliumresearch.substack.com/
https://app.allium.so/
https://app.allium.so/join
https://app.allium.so/login
https://app.allium.so/terminal/payments/key-metrics?tab=b2bb2cc2bc2c
https://app.allium.so/terminal/stablecoins/key-metrics?tab=overview
https://cdn.prod.website-files.com
https://cdn.prod.website-files.com/6a1967263e86bd5aff36e280/6a2170fc4220bcdf97e44d2b_Manrope-Regular.woff
https://cdn.prod.website-files.com/6a1967263e86bd5aff36e280/6a2170fc78436764c2530763_Manrope-Medium.woff
https://cdn.prod.website-files.com/6a1967263e86bd5aff36e280/6a21f16d3c4d28fb5003f91f_Manrope-SemiBold.woff
https://cdn.prod.website-files.com/6a1967263e86bd5aff36e280/6a28a7aa03bfdd8e1157c2e5_694394e6b362de82eb5247d2_allium.png
https://cdn.prod.website-files.com/6a1967263e86bd5aff36e280/6a28a7aa166a9dcfbc69121d_694394e6b362de82eb5247d2_allium.png
https://cdn.prod.website-files.com/6a1967263e86bd5aff36e280/6a28a7aa21e9b6f18bcf5a44_694394e6b362de82eb5247d2_allium.png
https://cdn.prod.website-files.com/6a1967263e86bd5aff36e280/6a28a7aa9d9c50799416dba5_694394e6b362de82eb5247d2_allium.png
https://cdn.prod.website-files.com/6a1967263e86bd5aff36e280/6a28a7aaf1b741a09338e364_694394e6b362de82eb5247d2_allium.png
https://cdn.prod.website-files.com/6a1967263e86bd5aff36e280/css/allium-e99f6a.webflow.shared.b5bff4b19.css
https://dasid.org/
https://digital-assets.fct.bcg.com/
https://docs.allium.so/
https://jobs.ashbyhq.com/allium
https://libertystreeteconomics.newyorkfed.org/2025/11/the-future-of-payment-infrastructure-could-be-permissionless/
https://metamask.io
https://metamask.io/en-GB
https://phantom.com
https://stateofcrypto.a16zcrypto.com/
https://trust.allium.so/
https://uniswap.org
https://visaonchainanalytics.com/
https://www.allium.so
https://www.allium.so/blog/
https://www.allium.so/blog/how-bcg-built-the-stablecoin-payments-data-foundation-anchoring-its-digital-assets-practice/
https://www.allium.so/blog/how-ondos-first-data-scientist-turns-onchain-activity-into-market-intelligence/
https://www.allium.so/blog/how-privy-powers-onchain-context-for-120-million-wallets/
https://www.allium.so/reports/state-of-stablecoins-and-payments-september-2026
https://www.bcg.com
https://www.bloomberg.com/news/articles/2024-05-05/more-than-90-of-stablecoin-transactions-aren-t-real-study-finds
https://www.bloomberg.com/news/articles/2025-10-16/inside-hyperliquid-the-crypto-exchange-behind-billions-in-trades
https://www.coinbase.com
https://www.databricks.com/blog/announcing-public-preview-delta-sharing-cloudflare-r2-integration
https://www.grayscale.com
https://www.linkedin.com/company/alliumlabs/
https://www.mas.gov.sg
https://www.moonpay.com
https://www.sc.com
https://www.visa.com
https://www.wsj.com/finance/regulation/polymarket-prediction-markets-kalshi-dd4702d6
https://www.youtube.com/@AlliumLabs
https://x.com/alliumlabs
for u in https://docs.allium.so https://www.allium.so/pricing https://allium.so/pricing https://api.allium.so https://developers.allium.so https://docs.allium.so/api https://www.allium.so/docs; do printf "%s -> " "$u"; timeout 20 curl -sS -o /dev/null -w "%{http_code} %{url_effective}\n" -L "$u" 2>&1; done
https://docs.allium.so -> 200 https://docs.allium.so/
https://docs.allium.so -> 200 https://docs.allium.so/
https://www.allium.so/pricing -> 200 https://www.allium.so/contact
https://allium.so/pricing -> 200 https://www.allium.so/contact
https://api.allium.so -> 403 https://api.allium.so/
https://developers.allium.so -> curl: (6) Could not resolve host: developers.allium.so
000 https://developers.allium.so/
https://docs.allium.so/api -> 200 https://docs.allium.so/login?redirect=%2Fapi
https://www.allium.so/docs -> 200 https://docs.allium.so/
Thinking…

docs.allium.so exists but /api redirects to login. Let's check the public docs landing page, and the /product/allium-developer page, and agents.allium.so (MCP?), and app.allium.so/join (signup?).

Let me check pricing page redirect → /contact: so no public pricing (enterprise, sales-led). Let me confirm by fetching /contact and docs.

fetch() { timeout 25 curl -sSL "$1" -o /tmp/p.html; python3 - "$2" <<'EOF'
import re,sys
h=open('/tmp/p.html',errors='ignore').read()
t=re.sub(r'<script.*?</script>','',h,flags=re.S); t=re.sub(r'<style.*?</style>','',t,flags=re.S)
t=re.sub(r'<[^>]+>',' ',t); t=re.sub(r'&amp;','&',t); t=re.sub(r'\s+',' ',t)
print("=====",sys.argv[1],"=====")
print(t[:1800])
EOF
}
fetch https://docs.allium.so/ docs
fetch https://www.allium.so/product/allium-developer developer
fetch https://agents.allium.so/ agents
===== docs =====
===== docs =====
 Introduction - 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 Search... ⌘ K Ask Assistant ⌘ I Data Status Blog Log In Book a Demo Book a Demo Search... Navigation Introduction Welcome Allium AI Data Catalog API Reference Guides Changelog Introduction Product Comparison Allium Realtime APIs New Machine Payments Use Cases Analytics Applications Audit and Accounting Allium App Overview Run Queries Visualize results Upload your own data Manage your account Manage your team Manage your query runs Allium Datashares Overview Databricks Snowflake BigQuery BI Visualization Tools Walrus Allium Datastreams Overview Apache Kafka Google Pub/Sub Amazon SNS Websockets Transformations Deprecating Allium Beam Overview Quickstart Configuration reference Webhook authentication Permissions Examples Allium Nodes Overview Hyperliquid Sentry Peer On this page Product Tour Quick Selection Guide Use Cases Get Inspired Introduction OpenAI Open in ChatGPT Allium is the enterprise blockchain data platform powering analytics, engineering, and accounting with unmatched breadth, depth, and accuracy. OpenAI Open in ChatGPT Blockchain data is hard, messy, and chaotic, but it doesn’t have to be . Leading institutions choose Allium because it supports every workflow, scales with your strategy, and delivers the reliability required for mission-critical use cases. ​ Product Tour Allium offers a suite of powerful tools for every business problem. Whether you need realtime data feeds, secure data shares, or historical data, we have an integration to meet you where you are. Allium App Query and visualize blockchain data with our no-
===== developer =====
 Allium Developer: Blockchain APIs for Production =768px): click tabs; pins only when it fits (>=992px, no reduced motion, heading + card fit below the navbar), heading + card centred vertically below the navbar: top = max(nav, nav + (vh - nav - block) / 2). While pinned every tab pane is held at the tallest tab's height. Tall screens (>=992px wide and >=850px tall): image panel, screenshot, card padding and card title (.ut_title, 32px up to 35.84px) scale with viewport height (clamp, capped). Unpins with the standard 80px section padding below. Phones: accordion. data-ut-images="off" = text-only card; data-ut-bullets="off" hides the bullet list. --> =992 wide and >=850 tall; nothing changes below 850px tall or on phones). Shared by Home and the 7 client cards: screenshot 240px + 3.5px per px of viewport height over 850, cap 420px; image panel 32px top/bottom padding. Card ~479px at 1440x900. --> 5.7:1, WCAG AA); visible keyboard focus on tab links, accordion questions and buttons; 44px minimum tap targets for buttons and text links on touch-size screens; long-text captions no smaller than 14px on phones. --> =992px; moved here from the 8 page heads): content top-aligned with one shared top padding (--ut-pt 32px, tall screens 32-44px, ~40px at 1440x900); card height set by the tallest tab text column, the screenshot scales to fit inside the image panel (absolute, contain, top-aligned at the title cap height: --ut-capx = 0.256 x title size). Phones untouched. --> =768px): one 2px pink underline flush on the striped bar (inset shadow), same 1px solid borders as inactive tabs, no doubled seams. (2) Impact component (Section / Stats Solutions on Home + 6 use-case pages): header centred (exception to the left-align rule), then chart (waterfall or chart image) at the stat-row
===== agents =====
 AgentHub by Allium — Onchain data for AI agents / Agents Install Capabilities Payments FAQ Docs Works with Claude Code, Cursor, ChatGPT, and any agent client Onchain data for AI agents. Historical and real-time data from 150+ blockchains, delivered to every AI client, for every use case. Connect or sign up for an Allium account → agent · allium-mcp across 150+ chains… Install in one command. Pick the path that fits your stack. Both hit the same data. MCP Hosted server Skills Local CLI Structured tool calls, no client-side install Hosted server npx @allium-labs/mcp install Picks your client and writes the right config. Works with Claude Code, Cursor, Codex, and more. ✓ Required for web chatbots that can&#x27;t run a local CLI — Claude.ai and ChatGPT ✓ Hosted at mcp.allium.so — no local install, no subprocess ✓ Structured tool calls over MCP, with semantic schema discovery Using a chatbot (ChatGPT, Claude.ai, Microsoft Copilot)? See the walkthrough → Client not auto-detected? Manual setup → Get your free API key. Sign up for an Allium account Get your free API key 1 Create an Allium account Sign up with your business email. Sign up at app.allium.so/join 2 Generate an API key From your settings, click &#x27;Create API key&#x27; and copy it. Open API keys settings Already have an account? Skip to the API keys page → Compatible clients Works with any agent client. Claude Cursor ChatGPT …and any other agent client. Allium works with everything from Claude.ai to Goose to your own custom CLI. Don&#x27;t see yours? Reach out . Capabilities Everything your agent needs to go onchain. The same data Phantom, Uniswap, and Coinbase build on — exposed as structured tool calls. Realtime Prices, balances, transactions, PnL — without writing SQL. Example “ What&#x27;s the latest price of
timeout 25 curl -sSL https://www.allium.so/contact -o /tmp/c.html; python3 - <<'EOF'
import re
h=open('/tmp/c.html',errors='ignore').read()
t=re.sub(r'<script.*?</script>','',h,flags=re.S); t=re.sub(r'<style.*?</style>','',t,flags=re.S)
t=re.sub(r'<[^>]+>',' ',t); t=re.sub(r'&amp;','&',t); t=re.sub(r'\s+',' ',t)
print(t[:1800])
EOF
echo "=== join page ==="; timeout 25 curl -sS -o /dev/null -w "%{http_code} %{url_effective}\n" -L https://app.allium.so/join
Contact Allium | Enterprise Blockchain Data =768px): click tabs; pins only when it fits (>=992px, no reduced motion, heading + card fit below the navbar), head
 Contact Allium | Enterprise Blockchain Data =768px): click tabs; pins only when it fits (>=992px, no reduced motion, heading + card fit below the navbar), heading + card centred vertically below the navbar: top = max(nav, nav + (vh - nav - block) / 2). While pinned every tab pane is held at the tallest tab's height. Tall screens (>=992px wide and >=850px tall): image panel, screenshot, card padding and card title (.ut_title, 32px up to 35.84px) scale with viewport height (clamp, capped). Unpins with the standard 80px section padding below. Phones: accordion. data-ut-images="off" = text-only card; data-ut-bullets="off" hides the bullet list. --> =992 wide and >=850 tall; nothing changes below 850px tall or on phones). Shared by Home and the 7 client cards: screenshot 240px + 3.5px per px of viewport height over 850, cap 420px; image panel 32px top/bottom padding. Card ~479px at 1440x900. --> 5.7:1, WCAG AA); visible keyboard focus on tab links, accordion questions and buttons; 44px minimum tap targets for buttons and text links on touch-size screens; long-text captions no smaller than 14px on phones. --> =992px; moved here from the 8 page heads): content top-aligned with one shared top padding (--ut-pt 32px, tall screens 32-44px, ~40px at 1440x900); card height set by the tallest tab text column, the screenshot scales to fit inside the image panel (absolute, contain, top-aligned at the title cap height: --ut-capx = 0.256 x title size). Phones untouched. --> =768px): one 2px pink underline flush on the striped bar (inset shadow), same 1px solid borders as inactive tabs, no doubled seams. (2) Impact component (Section / Stats Solutions on Home + 6 use-case pages): header centred (exception to the left-align rule), then chart (waterfall or chart image) at the stat-row widt
=== join page ===
200 https://app.allium.so/join
Thinking…

There is a developer workflow: docs.allium.so with /llms.txt, an API Reference, an MCP hosted server (mcp.allium.so), npx @allium-labs/mcp, and a free API key from app.allium.so/join (requires signing up with business email — that's a human step).

Key blocker: I need an API key. Signing up requires a human/business email. Let me check if there's any public/sandbox key, or whether the API can be tried without auth. Let's fetch /llms.txt and the API reference, and check the "Payments" / "Free API key" details, and pricing info in docs.

Let me fetch llms.txt.

timeout 25 curl -sSL https://docs.allium.so/llms.txt -o /tmp/llms.txt; wc -l /tmp/llms.txt; head -80 /tmp/llms.txt
427 /tmp/llms.txt
427 /tmp/llms.txt
# 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 filtered, realtime blockchain data pipelines and deploy them in seconds, with no infrastructure to manage.
- [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): Configure Beam pipeline sources, transforms, and sinks 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
timeout 25 curl -sSL https://agents.allium.so/ -o /tmp/agents.html; python3 - <<'EOF'
import re
h=open('/tmp/agents.html',errors='ignore').read()
t=re.sub(r'<script.*?</script>','',h,flags=re.S); t=re.sub(r'<style.*?</style>','',t,flags=re.S)
t=re.sub(r'<[^>]+>',' ',t); t=re.sub(r'&#x27;',"'",t); t=re.sub(r'&amp;','&',t); t=re.sub(r'\s+',' ',t)
i=t.find('Payments')
print(t[1800:6000])
EOF
” Explorer SQL across 150+ chains. Saved queries. Schema discovery. Example “ Daily USDC + USDT transfer volume across Ethereum, Base, and Arbitrum, last 30 da
 ” Explorer SQL across 150+ chains. Saved queries. Schema discovery. Example “ Daily USDC + USDT transfer volume across Ethereum, Base, and Arbitrum, last 30 days. ” Documentation Agents read the docs themselves before they query. Example “ Find the schema for cross-chain DEX trades. ” See the full tool reference → Pick your path MCP or Skills — same data, different shape. Feature MCP Skills Where it runs Hosted (mcp.allium.so) Locally (allium CLI) How the agent calls it MCP tool calls Subprocess via skill Web chatbots (Claude.ai, ChatGPT) Compatible clients Any MCP-capable Any skills-capable API key Required Optional Pay-per-query (x402 / Tempo) Schema discovery Realtime prices, balances, PnL Ad-hoc SQL on 150+ chains One-line install Scripting in shell or CI? Skills run on the allium CLI — use it directly. Machine payments Pay per query. Directly from your agent. No signup. No subscription. USDC on Base — settled in milliseconds, on every call. x402 Manual control Sign each request with EIP-712. Full visibility into the payment flow — best for agents that need fine-grained pricing controls. x402 docs → Tempo MPP Automated Open a payment channel once; the SDK batches and settles. Lowest overhead per call — best for high-volume agents. Tempo MPP docs → Prefer a regular API key? Sign up for an Allium account to get one. Same data, billed against your account. ✓ No signup ✓ No API key required ✓ USDC on Base ✓ Per-request settlement Read the machine-payments overview → The data behind the data Enterprise-grade onchain data, packaged for agents. We're the data infrastructure behind Phantom, Uniswap, Coinbase, and teams building at scale. Pipelines indexing 150+ chains, billions of queries served. AgentHub is that same data, made directly accessible to agents. Sign up for an Allium account → Learn more about Allium → FAQ What is Allium MCP? An MCP (Model Context Protocol) server hosted at mcp.allium.so that exposes Allium's blockchain data — Realtime APIs, Explorer SQL, and Documentation search — as structured tool calls. Any MCP-compatible AI client can use it without writing REST glue code. Which AI clients work with Allium MCP and Skills? MCP : any MCP-capable client — Claude Code, Cursor, Claude Desktop, Claude.ai (Pro/Max/Team/Enterprise), ChatGPT (Plus/Pro/Team), Codex, VS Code (GitHub Copilot), Cline, RooCline, Windsurf, Warp, Gemini CLI, Goose, Zed, Opencode, and more. The installer ( npx @allium-labs/mcp install ) wires up most of them automatically. Skills : any agent that supports the agent-skills format — Claude Code, OpenClaw, Cline, Goose, and others. The skill packet bundles the allium CLI and instructions for invoking it. What's the difference between MCP and Skills? Where the work runs. MCP is a hosted server at mcp.allium.so — your AI client makes structured tool calls over HTTP, no local install. Skills is a local install: npx skills add drops the allium CLI on your machine, and the agent invokes it as a subprocess. If you're using a web chatbot like Claude.ai or ChatGPT, you need MCP — those clients can't run a local CLI. Skills, in turn, lets you script automations and adds machine payments (x402, Tempo) — pay per query in USDC with no API key. Both work across many agents otherwise. What blockchains are supported? 150+ chains across Allium's full data warehouse for Explorer/SQL workloads. The Realtime API covers 20+ high-volume chains (Ethereum, Solana, Base, Arbitrum, Optimism, Polygon, BNB, Avalanche, etc.) with 3–5 second freshness on prices, balances, and activity. How do machine payments work? You can use a regular API key (from app.allium.so/settings/api-keys) — or skip signup entirely and pay per request in USDC on Base. Two protocols are supported: x402 (manual EIP-712 signing for full control) and Tempo MPP (automated payment-channel batching). The Skills install configures payments for you. Is there a free tier? Yes — sign up at app.allium.so to get a free API key with limited daily usage, enough to evaluate. For production, either upgrade your account or use machine payments to pay per call with no plan commitment. Do I need an Allium account? Not if you use machine payments. With x402 or Tempo
Thinking…

Great — there IS a developer workflow. There's even a "machine payments" path requiring no API key, but that requires USDC on Base — a crypto wallet with funds. I don't have that. And the free API key path requires signing up at app.allium.so/join with a business email — human step.

Let me check the docs for pricing (usage-and-billing, machine-payments) and the Realtime APIs API reference to see what an example would look like. Also check if there's a sandbox/demo key documented anywhere.

Let me fetch:

sed -n '80,200p' /tmp/llms.txt
## Allium AI
## Allium AI

### Updates

- [What's new](https://docs.allium.so/ai/whats-new.md): Releases and improvements to the Allium AI Assistant and Allium MCP, by month.

### Assistant

- [Overview](https://docs.allium.so/ai/assistant/overview.md): An AI data analyst built into the Allium App. Ask a question in plain English and get the answer, the SQL, a chart, and a dashboard you can share.
- [Capabilities](https://docs.allium.so/ai/assistant/capabilities.md): Everything the Allium AI Assistant can do: answer questions, chart and share results, automate recurring work, and build pipelines and apps.
- [Custom skills](https://docs.allium.so/ai/assistant/skills.md): Save a prompt as a skill and run it from the Assistant composer with one keystroke.
- [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 (5812 pages)](https://docs.allium.so/_llms/data-catalog.txt): 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.
for p in api/developer/machine-payments realtime-apis app/organization-management/usage-and-billing; do echo "######## $p"; timeout 25 curl -sSL "https://docs.allium.so/$p.md" | head -120; done
######## api/developer/machine-payments
######## api/developer/machine-payments
> ## 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.

# Machine Payments

> Pay-per-call blockchain data access with USDC — no API key, no registration, no subscription.

Machine payments let AI agents and developers pay per API call with USDC to access Allium's blockchain data. No API key, no registration, no subscription — just a wallet and USDC.

<CardGroup cols={2}>
  <Card title="No API Key" icon="key">
    No registration or key management. Your wallet is your identity.
  </Card>

  <Card title="Pay Per Call" icon="credit-card">
    Only pay for what you use. Prices start at \$0.001 per request.
  </Card>

  <Card title="Agent-Native" icon="robot">
    Built for AI agents — autonomous payments with no human in the loop.
  </Card>

  <Card title="Gasless Payments" icon="coins">
    Allium handles onchain settlement. Users only need USDC, not ETH.
  </Card>
</CardGroup>

## How It Works

Both protocols use HTTP status code `402 Payment Required` to negotiate payments inline with API requests. The difference is how much your client handles automatically.

<Steps>
  <Step title="Send request">
    Make a normal API request to any payment-enabled endpoint.
  </Step>

  <Step title="Receive 402">
    The server responds with `402 Payment Required` and payment options.
  </Step>

  <Step title="Sign and pay">
    Your client signs a USDC payment authorization and retries the request.
  </Step>

  <Step title="Get data">
    Payment confirmed — you receive your data with a `200` response.
  </Step>
</Steps>

## Tempo MPP

Tempo Machine Payment Protocol is the simplest way to make paid API calls. The `Client` wrapper handles the entire 402 negotiation, signing, and retry flow — you just make requests as normal.

```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())
```

<Card title="Tempo MPP" icon="bolt" href="/ai/machine-payments/tempo-mpp">
  Full setup guide, supported networks, and implementation details
</Card>

## x402

x402 gives you full manual control over the payment flow. Your client receives the 402 response, constructs EIP-712 typed data, signs it via a wallet provider like [Privy](https://dashboard.privy.io), and retries with the payment signature attached.

<Card title="x402" icon="credit-card" href="/ai/machine-payments/x402">
  Full setup guide with Privy wallet integration, EIP-712 signing, and implementation
</Card>

## Agent Integration

Don't want to write any payment code? Install pre-built agent skills and let your AI agent handle everything:

```bash theme={null}
npx skills add allium-labs/skills --yes
```

<Card title="Agent Skills" icon="wand-magic-sparkles" href="/ai/machine-payments/agent-skills">
  Set up machine payments with AI agents in one command
</Card>

## All Endpoints & Pricing

<Card title="Endpoints & Pricing" icon="code" href="/ai/machine-payments/endpoints-pricing">
  All payment-enabled endpoints, pricing, rate limits, and error codes
</Card>
######## realtime-apis
<!DOCTYPE html><html lang="en" class="inter_1d81deff-module__CYM0aG__variable papermono_89c757f2-module__6aS5zq__variable dark" data-banner-state="visible" data-assistant-state="closed" data-page-mode="none" data-current-path="/"><head><script>
  (function(){
    var RE = /^https?:\/\/leaves\.mintlify\.com/i;
    var to = location.origin + "/_leaves";
    var of = window.fetch;
    window.fetch = function(input, init){
      try {
        if (typeof input === 'string' && RE.test(input)) input = input.replace(RE, to);
        else if (input && input.url && RE.test(input.url)) input = new Request(input.url.replace(RE, to), input);
      } catch(e){}
      return of.call(this, input, init);
    };
    var oo = XMLHttpRequest.prototype.open;
    XMLHttpRequest.prototype.open = function(m, u){
      try { if (typeof u === 'string' && RE.test(u)) u = u.replace(RE, to); } catch(e){}
      return oo.apply(this, [m, u].concat([].slice.call(arguments, 2)));
    };
  })();
</script><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"/><link rel="preload" href="/mintlify-assets/_next/static/media/83afe278b6a6bb3c.p.3a6ba036.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" href="/mintlify-assets/_next/static/media/PaperMono_Variable.p.4fb029ee.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" href="/mintlify-assets/_next/static/media/f67ad414ed34149c.p.84166d94.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" as="image" href="https://mintcdn.com/allium-e770e2b7/Pho1-XYHfgCpfeG_/logo/light.svg?fit=max&amp;auto=format&amp;n=Pho1-XYHfgCpfeG_&amp;q=85&amp;s=1d06acf7cdf656da45ac99716ca34da4"/><link rel="preload" as="image" href="https://mintcdn.com/allium-e770e2b7/Pho1-XYHfgCpfeG_/logo/dark.svg?fit=max&amp;auto=format&amp;n=Pho1-XYHfgCpfeG_&amp;q=85&amp;s=d993d7534560ec93bcb6c79910a9f1c2"/><link rel="stylesheet" href="/mintlify-assets/_next/static/chunks/1ddb69276dca9f27.css?dpl=dpl_DK9nDs6V3GpQvQFt81LdSBc8n1XX" data-precedence="next"/><link rel="stylesheet" href="/mintlify-assets/_next/static/chunks/2b0d21c764299abd.css?dpl=dpl_DK9nDs6V3GpQvQFt81LdSBc8n1XX" data-precedence="next"/><style data-precedence="base-ui:low" data-href="base-ui-disable-scrollbar">.base-ui-disable-scrollbar{scrollbar-width:none}.base-ui-disable-scrollbar::-webkit-scrollbar{display:none}</style><link rel="preload" as="script" fetchPriority="low" href="/mintlify-assets/_next/static/chunks/3fcb76f539c93820.js?dpl=dpl_DK9nDs6V3GpQvQFt81LdSBc8n1XX"/><script src="/mintlify-assets/_next/static/chunks/44795504c795ca32.js?dpl=dpl_DK9nDs6V3GpQvQFt81LdSBc8n1XX" async=""></script><script src="/mintlify-assets/_next/static/chunks/ec2f9fba11ab1afd.js?dpl=dpl_DK9nDs6V3GpQvQFt81LdSBc8n1XX" async=""></script><script src="/mintlify-assets/_next/static/chunks/896d8c6b2a391d2d.js?dpl=dpl_DK9nDs6V3GpQvQFt81LdSBc8n1XX" async=""></script><script src="/mintlify-assets/_next/static/chunks/ba13c13687b0ab63.js?dpl=dpl_DK9nDs6V3GpQvQFt81LdSBc8n1XX" async=""></script><script src="/mintlify-assets/_next/static/chunks/turbopack-46744d8c6619bf1f.js?dpl=dpl_DK9nDs6V3GpQvQFt81LdSBc8n1XX" async=""></script><script src="/mintlify-assets/_next/static/chunks/0ea0e179f06dc225.js?dpl=dpl_DK9nDs6V3GpQvQFt81LdSBc8n1XX" async=""></script><script src="/mintlify-assets/_next/static/chunks/1e7a188add93a653.js?dpl=dpl_DK9nDs6V3GpQvQFt81LdSBc8n1XX" async=""></script><script src="/mintlify-assets/_next/static/chunks/27db858bb43d4f0e.js?dpl=dpl_DK9nDs6V3GpQvQFt81LdSBc8n1XX" async=""></script><script src="/mintlify-assets/_next/static/chunks/d8fa9fbe6fc24e2c.js?dpl=dpl_DK9nDs6V3GpQvQFt81LdSBc8n1XX" async=""></script><script src="/mintlify-assets/_next/static/chunks/52ee50517ed23d08.js?dpl=dpl_DK9nDs6V3GpQvQFt81LdSBc8n1XX" async=""></script><script src="/mintlify-assets/_next/static/chunks/8d0901e40ed4b058.js?dpl=dpl_DK9nDs6V3GpQvQFt81LdSBc8n1XX" async=""></script><script src="/mintlify-assets/_next/static/chunks/0345977612e8a8fc.js?dpl=dpl_DK9nDs6V3GpQvQFt81LdSBc8n1XX" async=""></script><script src="/mintlify-assets/_next/static/chunks/41cd25f9f5103afc.js?dpl=dpl_DK9nDs6V3GpQvQFt81LdSBc8n1XX" async=""></script><script src="/mintlify-assets/_next/static/chunks/d3a642b23f31e8e2.js?dpl=dpl_DK9nDs6V3GpQvQFt81LdSBc8n1XX" async=""></script><script src="/mintlify-assets/_next/static/chunks/56889c9400f2bd44.js?dpl=dpl_DK9nDs6V3GpQvQFt81LdSBc8n1XX" async=""></script><script src="/mintlify-assets/_next/static/chunks/b2483d01d47db298.js?dpl=dpl_DK9nDs6V3GpQvQFt81LdSBc8n1XX" async=""></script><script src="/mintlify-assets/_next/static/chunks/3f8f2653ff1ad14e.js?dpl=dpl_DK9nDs6V3GpQvQFt81LdSBc8n1XX" async=""></script><script src="/mintlify-assets/_next/static/chunks/b241678460c3859c.js?dpl=dpl_DK9nDs6V3GpQvQFt81LdSBc8n1XX" async=""></script><script src="/mintlify-assets/_next/static/chunks/8a98aeb9285690d6.js?dpl=dpl_DK9nDs6V3GpQvQFt81LdSBc8n1XX" async=""></script><script src="/mintlify-assets/_next/static/chunks/d8de9e3010c1c0a2.js?dpl=dpl_DK9nDs6V3GpQvQFt81LdSBc8n1XX" async=""></script><script src="/mintlify-assets/_next/static/chunks/0e1fc6a92afa30b8.js?dpl=dpl_DK9nDs6V3GpQvQFt81LdSBc8n1XX" async=""></script><script src="/mintlify-assets/_next/static/chunks/ac1d672f8544440f.js?dpl=dpl_DK9nDs6V3GpQvQFt81LdSBc8n1XX" async=""></script><script src="/mintlify-assets/_next/static/chunks/ad7419efb0e48aa3.js?dpl=dpl_DK9nDs6V3GpQvQFt81LdSBc8n1XX" async=""></script><script src="/mintlify-assets/_next/static/chunks/a15bd5af0388fce3.js?dpl=dpl_DK9nDs6V3GpQvQFt81LdSBc8n1XX" async=""></script><script src="/mintlify-assets/_next/static/chunks/4f6f997a3b8dee89.js?dpl=dpl_DK9nDs6V3GpQvQFt81LdSBc8n1XX" async=""></script><script src="/mintlify-assets/_next/static/chunks/c7d45773caa7629c.js?dpl=dpl_DK9nDs6V3GpQvQFt81LdSBc8n1XX" async=""></script><script src="/mintlify-assets/_next/static/chunks/b8a669933ff9e7c6.js?dpl=dpl_DK9nDs6V3GpQvQFt81LdSBc8n1XX" async=""></script><script src="/mintlify-assets/_next/static/chunks/f37c75cd3eae8e9c.js?dpl=dpl_DK9nDs6V3GpQvQFt81LdSBc8n1XX" async=""></script><script src="/mintlify-assets/_next/static/chunks/7fb7515f83899170.js?dpl=dpl_DK9nDs6V3GpQvQFt81LdSBc8n1XX" async=""></script><script src="/mintlify-assets/_next/static/chunks/28d3baae254fd8bc.js?dpl=dpl_DK9nDs6V3GpQvQFt81LdSBc8n1XX" async=""></script><script src="/mintlify-assets/_next/static/chunks/c18b0a8de3827f70.js?dpl=dpl_DK9nDs6V3GpQvQFt81LdSBc8n1XX" async=""></script><script src="/mintlify-assets/_next/static/chunks/2f482bcd3294a910.js?dpl=dpl_DK9nDs6V3GpQvQFt81LdSBc8n1XX" async=""></script><script src="/mintlify-assets/_next/static/chunks/7e929edc119ce881.js?dpl=dpl_DK9nDs6V3GpQvQFt81LdSBc8n1XX" async=""></script><script src="/mintlify-assets/_next/static/chunks/e7ab3f319130be21.js?dpl=dpl_DK9nDs6V3GpQvQFt81LdSBc8n1XX" async=""></script><script src="/mintlify-assets/_next/static/chunks/67122d2cabb5f5fb.js?dpl=dpl_DK9nDs6V3GpQvQFt81LdSBc8n1XX" async=""></script><script src="/mintlify-assets/_next/static/chunks/6dd0e37ab76ddb7e.js?dpl=dpl_DK9nDs6V3GpQvQFt81LdSBc8n1XX" async=""></script><script src="/mintlify-assets/_next/static/chunks/f0b6f1ea823c8a43.js?dpl=dpl_DK9nDs6V3GpQvQFt81LdSBc8n1XX" async=""></script><link rel="preload" href="https://www.googletagmanager.com/gtag/js?id=G-5SHKBP7BR1" as="script"/><link rel="preload" href="/mintlify-assets/_next/static/chunks/ed45ca9fc4fad2f8.js?dpl=dpl_DK9nDs6V3GpQvQFt81LdSBc8n1XX" as="script" fetchPriority="low"/><link rel="preload" href="/mintlify-assets/_next/static/chunks/5917258e888b4dff.js?dpl=dpl_DK9nDs6V3GpQvQFt81LdSBc8n1XX" as="script" fetchPriority="low"/><link rel="preload" href="/mintlify-assets/_next/static/chunks/c18d87551163d4f9.js?dpl=dpl_DK9nDs6V3GpQvQFt81LdSBc8n1XX" as="script" fetchPriority="low"/><link rel="preload" href="/mintlify-assets/_next/static/media/katex/0.16.47/katex.min.css" as="style"/><title>Overview - Allium Documentation Hub</title><meta name="description" content="Query realtime blockchain data with fast response times and low latency across 13+ blockchains."/><meta name="application-name" content="Allium Documentation Hub"/><meta name="generator" content="Mintlify"/><meta name="msapplication-config" content="/mintlify-assets/_mintlify/favicons/allium-e770e2b7/F-YBneyl4L8wIFbs/_generated/favicon/browserconfig.xml"/><meta name="apple-mobile-web-app-title" content="Allium Documentation Hub"/><meta name="msapplication-TileColor" content="#be59c0"/><link rel="canonical" href="https://docs.allium.so/api/developer/overview"/><link rel="alternate" type="application/xml" href="/sitemap.xml"/><link rel="alternate" type="text/markdown" href="/api/developer/overview.md"/><meta property="og:title" content="Overview - Allium Documentation Hub"/><meta property="og:description" content="Query realtime blockchain data with fast response times and low latency across 13+ blockchains."/><meta property="og:url" content="https://docs.allium.so/api/developer/overview"/><meta property="og:site_name" content="Allium Documentation Hub"/><meta property="og:image" content="https://allium-e770e2b7.mintlify.io/_mintlify/api/og/v2?division=Realtime+API&amp;title=Overview&amp;description=Query+realtime+blockchain+data+with+fast+response+times+and+low+latency+across+13%2B+blockchains.&amp;theme=0f341d5588624e3fa6bc8ae7&amp;signature=4ec70a2cfd0fa4a0c5838d47d2cdde77aa7ee4f331e96a757fbd53a8ca5a714e"/><meta property="og:image:width" content="1200"/><meta property="og:image:height" content="630"/><meta property="og:type" content="website"/><meta name="twitter:card" content="summary_large_image"/><meta name="twitter:title" content="Overview - Allium Documentation Hub"/><meta name="twitter:description" content="Query realtime blockchain data with fast response times and low latency across 13+ blockchains."/><meta name="twitter:image" content="https://allium-e770e2b7.mintlify.io/_mintlify/api/og/v2?division=Realtime+API&amp;title=Overview&amp;description=Query+realtime+blockchain+data+with+fast+response+times+and+low+latency+across+13%2B+blockchains.&amp;theme=0f341d5588624e3fa6bc8ae7&amp;signature=4ec70a2cfd0fa4a0c5838d47d2cdde77aa7ee4f331e96a757fbd53a8ca5a714e"/><meta name="twitter:image:width" content="1200"/><meta name="twitter:image:height" content="630"/><link rel="icon" href="/mintlify-assets/_mintlify/favicons/allium-e770e2b7/F-YBneyl4L8wIFbs/_generated/favicon/android-chrome-192x192.png" type="image/png" sizes="192x192" media="(prefers-color-scheme: light)"/><link rel="apple-touch-icon" href="/mintlify-assets/_mintlify/favicons/allium-e770e2b7/F-YBneyl4L8wIFbs/_generated/favicon/apple-touch-icon.png" type="image/png" sizes="180x180"/><link rel="icon" href="/mintlify-assets/_mintlify/favicons/allium-e770e2b7/F-YBneyl4L8wIFbs/_generated/favicon/favicon-16x16.png" type="image/png" sizes="16x16" media="(prefers-color-scheme: light)"/><link rel="icon" href="/mintlify-assets/_mintlify/favicons/allium-e770e2b7/F-YBneyl4L8wIFbs/_generated/favicon/favicon-32x32.png" type="image/png" sizes="32x32" media="(prefers-color-scheme: light)"/><link rel="shortcut icon" href="/mintlify-assets/_mintlify/favicons/allium-e770e2b7/F-YBneyl4L8wIFbs/_generated/favicon/favicon.ico" type="image/x-icon" media="(prefers-color-scheme: light)"/><link rel="icon" href="/mintlify-assets/_mintlify/favicons/allium-e770e2b7/F-YBneyl4L8wIFbs/_generated/favicon-dark/android-chrome-192x192.png" type="image/png" sizes="192x192" media="(prefers-color-scheme: dark)"/><link rel="icon" href="/mintlify-assets/_mintlify/favicons/allium-e770e2b7/F-YBneyl4L8wIFbs/_generated/favicon-dark/favicon-16x16.png" type="image/png" sizes="16x16" media="(prefers-color-scheme: dark)"/><link rel="icon" href="/mintlify-assets/_mintlify/favicons/allium-e770e2b7/F-YBneyl4L8wIFbs/_generated/favicon-dark/favicon-32x32.png" type="image/png" sizes="32x32" media="(prefers-color-scheme: dark)"/><link rel="shortcut icon" href="/mintlify-assets/_mintlify/favicons/allium-e770e2b7/F-YBneyl4L8wIFbs/_generated/favicon-dark/favicon.ico" type="image/x-icon" media="(prefers-color-scheme: dark)"/><script type="text/javascript">!function(){var b="";
function a(p){if(p==null)return"/";p=""+p;if(""===p)return"/";return"/"===p.charAt(0)?p:"/"+p}
function u(p){if(p==null)return p;p=""+p;if(!p||p.charAt(p.length-1)==="/")return p.slice(0,-1);return p}
function i(p){if(p==null)return p;p=""+p;if(6<=p.length&&p.substring(p.length-6)==="/index")return p.substring(0,p.length-6);if("index"===p)return"";return p}
var p=(location.pathname||"").split("?")[0].split("#")[0]||"";
if(b)if(p===b)p="";else if(0===p.indexOf(b+"/"))p=p.substring(b.length);
p=a(p);p=u(p);p=i(p);p=""===p||"index"===p?"/":a(p);
document.documentElement.setAttribute("data-current-path",p);
}();</script><script type="text/javascript">if((' '+document.cookie).indexOf(' mintlify_end_user_session_hint=1')!==-1)document.documentElement.setAttribute('data-auth-pending','nav user');</script><script type="text/javascript">(() => {
  const isIOS =
    /iP(hone|ad|od)/.test(navigator.userAgent) ||
    (/Macintosh/.test(navigator.userAgent) && navigator.maxTouchPoints > 1);
  if (!isIOS) return;
  const apply = () => {
    for (const meta of document.querySelectorAll('meta[name="viewport"]')) {
      const content = meta.getAttribute('content') || '';
      if (!content.includes('maximum-scale')) {
        meta.setAttribute('content', content + ', maximum-scale=1');
      }
    }
  };
  apply();
  new MutationObserver(apply).observe(document.head, {
    childList: true,
    subtree: true,
    attributes: true,
    attributeFilter: ['content'],
  });
})();</script><script type="text/javascript">!function(){
function read(){try{
var e=performance.getEntriesByType?performance.getEntriesByType("navigation"):[];
var st=(e[0]&&e[0].serverTiming)||[];
var g={};
for(var i=0;i<st.length;i++){var n=st[i].name,d=st[i].description;if(!d)continue;try{d=decodeURIComponent(d)}catch(x){}
if(n==="country")g.country=d;else if(n==="region")g.region=d;else if(n==="continent")g.continent=d;}
var w=window;w.mintlify=w.mintlify||{};w.mintlify.geo=g;
}catch(x){}}
read();document.addEventListener("DOMContentLoaded",read);
}();</script><script type="text/javascript">!function(){try{
var w=window;w.mintlify=w.mintlify||{};
var q=w.mintlify.__apiPlaygroundInputsQueue;
if(!Array.isArray(q)){q=[];w.mintlify.__apiPlaygroundInputsQueue=q;}
w.mintlify.api=w.mintlify.api||{};
w.mintlify.api.playground=w.mintlify.api.playground||{};
if(typeof w.mintlify.api.playground.setServerVariables!=="function"){
w.mintlify.api.playground.setServerVariables=function(v){q.push({type:"set",variables:v});};
}
if(typeof w.mintlify.api.playground.clearServerVariables!=="function"){
w.mintlify.api.playground.clearServerVariables=function(){q.push({type:"clear"});};
}
}catch(e){}}();</script><script type="text/javascript">(function(){
if(typeof CSS==="undefined"||!("registerProperty" in CSS))return;
if(CSS.supports&&CSS.supports("-webkit-backdrop-filter:none"))return;
var n=["--scroll-area-overflow-x-start","--scroll-area-overflow-x-end","--scroll-area-overflow-y-start","--scroll-area-overflow-y-end"];
var d={"syntax":"<length>","inherits":false,"initialValue":"0px"};
for(var i=0;i<n.length;i++){try{CSS.registerProperty({name:n[i],syntax:d.syntax,inherits:d.inherits,initialValue:d.initialValue})}catch(e){}}
})();</script><script type="text/javascript">(function(a,b){try{let c=document.querySelector("div#banner")?.innerText;if(c){for(let d=0;d<localStorage.length;d++){let e=localStorage.key(d);if(e?.endsWith(a)&&localStorage.getItem(e)===c)return void document.documentElement.setAttribute(b,"hidden")}document.documentElement.setAttribute(b,"visible");return}for(let c=0;c<localStorage.length;c++){let d=localStorage.key(c);if(d?.endsWith(a)&&localStorage.getItem(d))return void document.documentElement.setAttribute(b,"hidden")}document.documentElement.setAttribute(b,"visible")}catch(a){document.documentElement.setAttribute(b,"hidden")}})(
  "bannerDismissed",
  "data-banner-state",
)</script><script src="/mintlify-assets/_next/static/chunks/a6dad97d9634a72d.js?dpl=dpl_DK9nDs6V3GpQvQFt81LdSBc8n1XX" noModule=""></script></head><body class="antialiased"><div hidden=""><!--$--><!--/$--></div><script

Showing the first 20,000 characters. Full output is available in raw details.

Thinking…

Good. Now fetch pricing-relevant docs: endpoints-pricing.md, api/getting-started.md, api/developer/overview.md (as .md), billing-and-limits.md for MCP.

Also determine whether I can actually run an example without credentials. The machine payments path requires a private key with USDC on Base — I don't have funds. Can't do that.

Let me check if there's a free/no-auth endpoint. Let me test the API without a key to see the 402/401 response — that's a light, quick call (not a long-running service). That's fine.

Let me fetch key docs first.

for p in ai/machine-payments/endpoints-pricing api/getting-started api/overview; do echo "######## $p"; timeout 25 curl -sSL "https://docs.allium.so/$p.md" | head -150; echo; done
######## ai/machine-payments/endpoints-pricing
######## ai/machine-payments/endpoints-pricing
> ## 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.

# Endpoints & Pricing

> All payment-enabled endpoints, pricing, rate limits, and error codes.

All endpoints below are accessible via machine payments at `https://agents.allium.so`. No API key needed — pay with USDC using [Tempo MPP](/ai/machine-payments/tempo-mpp) or [x402](/ai/machine-payments/x402). All calls are priced individually. No subscription, no minimum spend.

## Install allium-cli

CLI commands require **[allium-cli](https://github.com/Allium-Science/allium-cli)**:

```bash theme={null}
curl -sSL https://agents.allium.so/cli/install.sh | sh
```

## Supported Chains Discovery

Check which chains each endpoint supports. **This endpoint is free** — no payment required.

```bash theme={null}
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.

***

## Realtime API

### Prices

| 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 |

### Tokens

| 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 |

### Wallets

| 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 |

***

## 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.

| 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 |

***

## Supported Networks

| 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` |

## Rate Limits

Two independent rate limit buckets per wallet. You can max out both simultaneously.

| 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.

***

## Error Codes

| Status | Meaning | What to Do |
| - | - | - |
| 400 | Bad request | Check JSON syntax |
| 402 | Payment required | Sign the payment and retry (handled automatically by [Tempo MPP](/ai/machine-payments/tempo-mpp)) |
| 422 | Validation failed | Check request format |
| 429 | Rate limited | Back off for 1 second |
| 500 | Server error | Retry with exponential backoff |

######## api/getting-started
> ## 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.

# Getting Started

## Create an API Key

<Steps>
  <Step title="Request Access">
    Create your account at [https://app.allium.so/join](https://app.allium.so/join)
  </Step>

  <Step title="Log In">
    Once your account is created, log in to the Allium App at
    [https://app.allium.so](https://app.allium.so)
  </Step>

  <Step title="Generate API Key">
    1. Navigate to **Settings** > **API Keys**
    2. Click **Generate** to create your API key
    3. Copy and securely store your API key

    <Warning>
      **Note:** Only one API key can be generated per user. Keep it secure and do not share it publicly.
    </Warning>
  </Step>

  <Step title="Start Building">
    Use your API key to authenticate requests to Allium's APIs. Include it in your request headers:

    ```bash theme={null}
    X-API-KEY: your-api-key-here
    ```
  </Step>
</Steps>

## Jump In!

<CardGroup cols={3}>
  <Card title="Allium Realtime" icon="code" href="/api/developer/overview">
    Query realtime blockchain data with low-latency REST APIs
  </Card>

  <Card title="Datastream APIs" icon="arrow-progress" href="/api/datastreams/overview">
    Manage filters and transformations on realtime data streams
  </Card>

  <Card title="Explorer APIs" icon="chart-line" href="/api/explorer/overview">
    Run saved queries programmatically and retrieve results via API
  </Card>
</CardGroup>

## Need Help?

For questions or enterprise support, reach out to us at [support@allium.so](mailto:support@allium.so) or [contact us](https://allium.so/contact).

######## api/overview
> ## 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.

# API Overview

> Allium provides REST APIs for realtime and analytics use cases, each designed for different data access patterns.

## Realtime APIs

Realtime APIs for **engineers** to query raw and enriched blockchain data across **20+ blockchains** with realtime data freshness (3-4s).

Access token prices, wallet balances, holdings, transactions, and more through pull-based REST endpoints.

<Card title="Realtime APIs" icon="code" horizontal href="/api/developer/overview">
  Query realtime blockchain data with low-latency REST APIs
</Card>

## Stream Transformation APIs

Stream management APIs for **engineers** to configure filters, transformations, and custom workflows on Allium's realtime Kafka streams across **80+ blockchains**.

Turn raw blockchain streams into actionable signals by applying transformations and routing data to your preferred destination (webhook, PubSub, Kafka).

<Card title="Stream Transformation API" icon="arrow-progress" horizontal href="/api/datastreams/overview">
  Manage filters and transformations on realtime data streams
</Card>

<Info>
  The Stream Transformation APIs are currently only available to enterprise
  customers. Please reach out to [support@allium.so](mailto:support@allium.so) to learn more about
  enterprise access.
</Info>

## Explorer APIs

Analytics-focused APIs for **analysts** and **data scientists** to programmatically run and fetch data from queries created in the Allium app.

Queries saved in the Explorer UI can be executed via API and results retrieved in your environment, enabling bulk data extraction and automated workflows.

<Card title="Explorer API" icon="chart-line" horizontal href="/api/explorer/overview">
  Run saved queries programmatically and retrieve results via API
</Card>

<Info>
  The Explorer APIs are currently only available to enterprise customers. Please
  reach out to [support@allium.so](mailto:support@allium.so) to learn more about enterprise access.
</Info>

echo "== no-auth POST prices =="; timeout 25 curl -sS -i -X POST "https://agents.allium.so/api/v1/developer/prices" -H 'Content-Type: application/json' -d '[{"chain":"solana","token_address":"So11111111111111111111111111111111111111112"}]' | head -40; echo; echo "== realtime api host? =="; timeout 25 curl -sS -o /dev/null -w "%{http_code}\n" https://api.allium.so/v1/developer/prices
== no-auth POST prices ==
== no-auth POST prices ==
HTTP/2 402 
date: Thu, 15 Oct 2026 16:54:49 GMT
content-type: application/json
server: cloudflare
www-authenticate: Payment id="CXDChm_mBo1cmhHKBpPQI2uZfhSV7zF4QQ3ouxTQfNg", realm="agents.allium.so", method="tempo", intent="charge", request="eyJhbW91bnQiOiIyMDAwMCIsImN1cnJlbmN5IjoiMHgyMGMwMDAwMDAwMDAwMDAwMDAwMDAwMDBiOTUzN2QxMWM2MGU4YjUwIiwiZXhwaXJlcyI6IjIwMjYtMTAtMTVUMTY6NTk6NDkuODU4MjkzKzAwOjAwIiwiZXh0cmEiOnsic3RyaXBlX21vZGUiOiJjdXN0b2R5Iiwic3RyaXBlX3BheW1lbnRfaW50ZW50X2lkIjoicGlfM1VRcnZaSWZwVmU1N0JOVTFaY0drQllsIn0sIm1ldGhvZERldGFpbHMiOnsiY2hhaW5JZCI6NDIxN30sInJlY2lwaWVudCI6IjB4NDMzZGI2OTUwOGIwOWMxYTI4MDY3ODA2MWQ3OWQwN2I0NDYwMmU2OCJ9"
payment-required: eyJ4NDAyVmVyc2lvbiI6IDIsICJlcnJvciI6ICJQYXltZW50IFJlcXVpcmVkISIsICJhY2NlcHRzIjogW3sic2NoZW1lIjogImV4YWN0IiwgIm5ldHdvcmsiOiAiZWlwMTU1Ojg0NTMiLCAiYW1vdW50IjogIjIwMDAwIiwgInBheVRvIjogIjB4ZmU1MmVhM2IxMjg5NjhiZmU2N2FhNGZmNjUyNjgwYzU5NzZkODkzNSIsICJtYXhUaW1lb3V0U2Vjb25kcyI6IDE3OTIwODMzNDksICJhc3NldCI6ICIweDgzMzU4OWZDRDZlRGI2RTA4ZjRjN0MzMkQ0ZjcxYjU0YmRBMDI5MTMiLCAiZXh0cmEiOiB7InN0cmlwZV9wYXltZW50X2ludGVudF9pZCI6ICJwaV8zVVFydlpJZnBWZTU3Qk5VMVpjR2tCWWwiLCAic3RyaXBlX21vZGUiOiAiY3VzdG9keSIsICJuYW1lIjogIlVTRCBDb2luIiwgInZlcnNpb24iOiAiMiJ9fSwgeyJzY2hlbWUiOiAiZXhhY3QiLCAibmV0d29yayI6ICJzb2xhbmE6NWV5a3Q0VXNGdjhQOE5KZFRSRXBZMXZ6cUtxWkt2ZHAiLCAiYW1vdW50IjogIjIwMDAwIiwgInBheVRvIjogIjNoUWd1Q2FXNDY5ZFg0Vm54WERNVkJ4WjFiUHZKQVUxMkp5ZXVidGpZTDVGIiwgIm1heFRpbWVvdXRTZWNvbmRzIjogMTc5MjA4MzM0OSwgImFzc2V0IjogIkVQakZXZGQ1QXVmcVNTcWVNMnFOMXh6eWJhcEM4RzR3RUdHa1p3eVREdDF2IiwgImV4dHJhIjogeyJzdHJpcGVfcGF5bWVudF9pbnRlbnRfaWQiOiAicGlfM1VRcnZaSWZwVmU1N0JOVTFaY0drQllsIiwgInN0cmlwZV9tb2RlIjogImN1c3RvZHkiLCAibmFtZSI6ICJVU0RDIiwgInZlcnNpb24iOiAiMiIsICJmZWVQYXllciI6ICJIYzNzZEVBc0NHUWNwZ2Zpdnl3b2c5dXd0azhnVUJVWmdzeGRNRTFFSnk4OCJ9fSwgeyJzY2hlbWUiOiAiZXhhY3QiLCAibmV0d29yayI6ICJlaXAxNTU6MTk2IiwgImFtb3VudCI6ICIyMDAwMCIsICJwYXlUbyI6ICIweDYxRmRiZTY2YzFBRWFGNDkxYjhlMTIxQzgzMDcwYWE3NTBERENhZGEiLCAibWF4VGltZW91dFNlY29uZHMiOiAxNzkyMDgzMzQ5LCAiYXNzZXQiOiAiMHg3NGI3ZjE2MzM3Yjg5NzIwMjdmNjE5NmExN2E2MzFhYzZkZTI2ZDIyIiwgImV4dHJhIjogeyJuYW1lIjogIlVTRCBDb2luIiwgInZlcnNpb24iOiAiMiJ9fSwgeyJzY2hlbWUiOiAiZXhhY3QiLCAibmV0d29yayI6ICJlaXAxNTU6MTM3IiwgImFtb3VudCI6ICIyMDAwMCIsICJwYXlUbyI6ICIweEY1QjU5YUE0RDIzNjIxQjM4MkFjNTY0NjVlMmE3ODQzMkNFNzY4Q0EiLCAibWF4VGltZW91dFNlY29uZHMiOiAxNzkyMDgzMzQ5LCAiYXNzZXQiOiAiMHgzYzQ5OWM1NDJjRUY1RTM4MTFlMTE5MmNlNzBkOGNjMDNkNWMzMzU5IiwgImV4dHJhIjogeyJuYW1lIjogIlVTRCBDb2luIiwgInZlcnNpb24iOiAiMiJ9fV0sICJyZXNvdXJjZSI6IHsidXJsIjogImh0dHBzOi8vYWdlbnRzLmFsbGl1bS5zby9hcGkvdjEvZGV2ZWxvcGVyL3ByaWNlcyIsICJkZXNjcmlwdGlvbiI6ICJBUEkgcmVxdWVzdDogL2FwaS92MS9kZXZlbG9wZXIvcHJpY2VzIiwgIm1pbWVUeXBlIjogImFwcGxpY2F0aW9uL2pzb24ifSwgImV4dGVuc2lvbnMiOiB7ImJhemFhciI6IHsiaW5mbyI6IHsiaW5wdXQiOiB7InR5cGUiOiAiaHR0cCIsICJtZXRob2QiOiAiUE9TVCIsICJib2R5VHlwZSI6ICJqc29uIiwgImJvZHkiOiBbeyJ0b2tlbl9hZGRyZXNzIjogIjB4QzAyYWFBMzliMjIzRkU4RDBBMGU1QzRGMjdlQUQ5MDgzQzc1NkNjMiIsICJjaGFpbiI6ICJldGhlcmV1bSJ9LCB7InRva2VuX2FkZHJlc3MiOiAiU28xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMiIsICJjaGFpbiI6ICJzb2xhbmEifV19LCAib3V0cHV0IjogeyJ0eXBlIjogImpzb24iLCAiZXhhbXBsZSI6IHsiaXRlbXMiOiBbeyJ0aW1lc3RhbXAiOiAiMjAyNS0wNi0xN1QxODowMDowMFoiLCAiY2hhaW4iOiAiZXRoZXJldW0iLCAiYWRkcmVzcyI6ICIweEMwMmFhQTM5YjIyM0ZFOEQwQTBlNUM0RjI3ZUFEOTA4M0M3NTZDYzIiLCAiZGVjaW1hbHMiOiAxOCwgInByaWNlIjogMjUwMC41LCAib3BlbiI6IDI0OTUuMCwgImhpZ2giOiAyNTEwLjAsICJjbG9zZSI6IDI1MDAuNSwgImxvdyI6IDI0OTAuMH1dfX19LCAic2NoZW1hIjogeyIkc2NoZW1hIjogImh0dHBzOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LzIwMjAtMTIvc2NoZW1hIiwgInR5cGUiOiAib2JqZWN0IiwgInByb3BlcnRpZXMiOiB7ImlucHV0IjogeyJ0eXBlIjogIm9iamVjdCIsICJwcm9wZXJ0aWVzIjogeyJ0eXBlIjogeyJ0eXBlIjogInN0cmluZyIsICJjb25zdCI6ICJodHRwIn0sICJtZXRob2QiOiB7InR5cGUiOiAic3RyaW5nIiwgImVudW0iOiBbIlBPU1QiXX0sICJib2R5VHlwZSI6IHsidHlwZSI6ICJzdHJpbmciLCAiZW51bSI6IFsianNvbiJdfSwgImJvZHkiOiB7InR5cGUiOiAib2JqZWN0IiwgInByb3BlcnRpZXMiOiB7InRva2VuX2FkZHJlc3MiOiB7InR5cGUiOiAic3RyaW5nIiwgImRlc2NyaXB0aW9uIjogIlRva2VuIGNvbnRyYWN0IGFkZHJlc3MifSwgImNoYWluIjogeyJ0eXBlIjogInN0cmluZyIsICJkZXNjcmlwdGlvbiI6ICJCbG9ja2NoYWluIG5ldHdvcmsgKGUuZy4gZXRoZXJldW0sIHNvbGFuYSwgYmFzZSkifX0sICJyZXF1aXJlZCI6IFsidG9rZW5fYWRkcmVzcyIsICJjaGFpbiJdfX0sICJyZXF1aXJlZCI6IFsidHlwZSIsICJib2R5VHlwZSIsICJib2R5IiwgIm1ldGhvZCJdLCAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiBmYWxzZX0sICJvdXRwdXQiOiB7InR5cGUiOiAib2JqZWN0IiwgInByb3BlcnRpZXMiOiB7InR5cGUiOiB7InR5cGUiOiAic3RyaW5nIn0sICJleGFtcGxlIjogeyJ0eXBlIjogIm9iamVjdCJ9fX19LCAicmVxdWlyZWQiOiBbImlucHV0Il19fX19
vary: Accept-Encoding
x-content-type-options: nosniff
via: 1.1 google
cf-cache-status: DYNAMIC
strict-transport-security: max-age=31536000; includeSubDomains
cf-ray: a4b0590b9bc1c746-IAD

{"x402Version":2,"error":"Payment Required!","accepts":[{"scheme":"exact","network":"eip155:8453","amount":"20000","payTo":"0xfe52ea3b128968bfe67aa4ff652680c5976d8935","maxTimeoutSeconds":1792083349,"asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","extra":{"stripe_payment_intent_id":"pi_3UQrvZIfpVe57BNU1ZcGkBYl","stripe_mode":"custody","name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"20000","payTo":"3hQguCaW469dX4VnxXDMVBxZ1bPvJAU12JyeubtjYL5F","maxTimeoutSeconds":1792083349,"asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","extra":{"stripe_payment_intent_id":"pi_3UQrvZIfpVe57BNU1ZcGkBYl","stripe_mode":"custody","name":"USDC","version":"2","feePayer":"Hc3sdEAsCGQcpgfivywog9uwtk8gUBUZgsxdME1EJy88"}},{"scheme":"exact","network":"eip155:196","amount":"20000","payTo":"0x61Fdbe66c1AEaF491b8e121C83070aa750DDCada","maxTimeoutSeconds":1792083349,"asset":"0x74b7f16337b8972027f6196a17a631ac6de26d22","extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"eip155:137","amount":"20000","payTo":"0xF5B59aA4D23621B382Ac56465e2a78432CE768CA","maxTimeoutSeconds":1792083349,"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":"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2","chain":"ethereum"},{"token_address":"So11111111111111111111111111111111111111112","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"]}}}}
== realtime api host? ==
403
Thinking…

So the API works, and there IS a free endpoint: /api/v1/supported-chains/realtime-apis/simple — "This endpoint is free — no payment required." Also /docs/ endpoints might be free (rate-limited docs bucket). Let me test the free endpoint to build a runnable example.

Also check if the docs endpoints are free. Let's test.

Plan: Build a small example that works without credentials:

  1. A Python (or Node) script that calls the free supported-chains endpoint and pretty-prints which chains support each realtime endpoint.
  2. Optionally, an x402/Tempo MPP-paid call scaffolded but gated behind env var (private key) — documented, not executed.

That's "light": hosted product via API, no local stacks.

Let me test the free endpoints and docs endpoints.

echo "== supported-chains (free) =="; timeout 25 curl -sS -o /tmp/chains.json -w "%{http_code}\n" "https://agents.allium.so/api/v1/supported-chains/realtime-apis/simple"; head -c 600 /tmp/chains.json; echo; echo "== docs endpoints =="; timeout 25 curl -sS -o /tmp/d.json -w "%{http_code}\n" "https://agents.allium.so/api/v1/docs/search?query=token%20transfers"; head -c 400 /tmp/d.json
== supported-chains (free) ==
== supported-chains (free) ==
200
{"/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"
== docs endpoints ==
404
{"detail":"Not Found"}
timeout 25 curl -sSL https://docs.allium.so/ai/machine-payments/overview.md | head -80; echo "########## tempo-mpp"; timeout 25 curl -sSL https://docs.allium.so/ai/machine-payments/tempo-mpp.md | head -120
> ## Documentation Index
> ## 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

<CardGroup cols={2}>
  <Card title="Tempo MPP" icon="bolt" href="/ai/machine-payments/tempo-mpp">
    The simplest path — one function call handles the entire payment flow
  </Card>

  <Card title="x402" icon="credit-card" href="/ai/machine-payments/x402">
    Full manual control over 402 negotiation, EIP-712 signing, and payment
  </Card>
</CardGroup>

## 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.

<Card title="Agent Skills" icon="wand-magic-sparkles" href="/ai/machine-payments/agent-skills">
  Set up machine payments with AI agents in one command
</Card>

## Endpoints & Pricing

<Card title="Endpoints & Pricing" icon="code" href="/ai/machine-payments/endpoints-pricing">
  All payment-enabled endpoints, pricing, rate limits, and error codes
</Card>
########## tempo-mpp
> ## 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.

<Steps>
  <Step title="Install allium-cli">
    ```bash theme={null}
    curl -sSL https://agents.allium.so/cli/install.sh | sh
    ```

    <Warning>
      [allium-cli](https://github.com/Allium-Science/allium-cli) is still in early beta.
    </Warning>
  </Step>

  <Step title="Install agent skills">
    ```bash theme={null}
    npx skills add allium-labs/skills --yes
    ```
  </Step>

  <Step title="Open your agent">
    Start Claude Code, Codex, or any compatible AI agent.
  </Step>

  <Step title="Ask a question">
    ```
    Set up Allium and fetch the latest balances for vitalik.eth
    ```
  </Step>
</Steps>

## How It Works

<Steps>
  <Step title="Send request">
    Make an API request using the Tempo `Client`.
  </Step>

  <Step title="Client handles 402">
    The client automatically receives the `402 Payment Required` response, signs a USDC payment authorization, and retries the request.
  </Step>

  <Step title="Get data">
    You receive your data with a `200` response. The payment flow is invisible to your code.
  </Step>
</Steps>

## 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.
Thinking…

Now I have enough. There is a free endpoint I can actually call: /api/v1/supported-chains/realtime-apis/simple. Paid data endpoints need either an API key (requires human signup at app.allium.so/join) or USDC-funded wallet (machine payments).

Let me also check the docs MCP "billing-and-limits" for MCP credits pricing, and see if there is documented plan pricing (Explorer Units). Let me quickly grab billing-and-limits.md and check MCP free tier limits.

Then build the example. Plan for the example repo:

  • allium-example/ directory with:
    • README.md — pricing summary, setup, what works without credentials
    • chains.py (or allium_example.py) — zero-dependency Python script using urllib: (1) fetch free supported-chains map, (2) show coverage per endpoint, (3) attempt a paid prices call using either ALLIUM_API_KEY (X-API-KEY against api.allium.so? need correct host) or machine payments.

Hmm — what host do API-key requests go to? Let me check the realtime API docs for the base URL. api.allium.so returned 403 at root. Let me fetch /api/developer/prices/token-latest-price.md for the base URL and auth header.

Also check the x402 approach: with ALLIUM_PRIVATE_KEY, could use x402 via the x402 python package... that's extra deps. Better: keep the paid path in a separate script using pympp (optional dependency, documented but not installed/run). Keep the zero-dep free script as the thing I actually run.

Let me fetch token-latest-price.md.

timeout 25 curl -sSL https://docs.allium.so/api/developer/prices/token-latest-price.md | head -100; echo "##### billing-and-limits"; timeout 25 curl -sSL https://docs.allium.so/ai/mcp/tools-reference/billing-and-limits.md | head -70
> ## Documentation Index
> ## 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.

# Fetch latest token price

> Get the latest price for the given token addresses and chains.

export const SupportedChainsList = props => {
  const [data, setData] = useState(null);
  const [isLoading, setIsLoading] = useState(true);
  useEffect(() => {
    const fetchData = async () => {
      try {
        const response = await fetch("https://api.allium.so/api/v1/supported-chains/realtime-apis", {
          method: "GET"
        });
        if (!response.ok) {
          throw new Error(`HTTP error! status: ${response.status}`);
        }
        const responseData = await response.json();
        const filteredData = responseData.filter(entry => {
          const product = entry.endpoints[props.product_name];
          return product !== null;
        });
        setData(filteredData);
        setIsLoading(false);
      } catch (error) {
        setIsLoading(false);
      }
    };
    fetchData();
  }, []);
  if (isLoading) {
    return <div>Loading chain information...</div>;
  }
  if (!data) {
    return <div>No data available</div>;
  }
  const isCustomSQL = props.product_name === "custom_sql";
  return <div>
            {data.length > 0 && <table className="w-full">
                    <thead>
                        <tr>
                            <th>Chain</th>
                            <th>Chain ID</th>
                            <th>Status</th>
                            {isCustomSQL && <th>Tables</th>}
                        </tr>
                    </thead>
                    <tbody>
                        {data.map(chain => {
    const endpoint = chain.endpoints[props.product_name];
    return <tr key={chain.id}>
                                    <td style={{
      padding: '12px'
    }}>{chain.label}</td>
                                    <td style={{
      padding: '12px'
    }}><code>{chain.id}</code></td>
                                    <td style={{
      padding: '12px'
    }}>{endpoint ? endpoint.availability === "beta" ? "🌱 Beta" : "✅ Supported" : "❌ Not Supported"}</td>
                                    {isCustomSQL && <td style={{
      padding: '12px'
    }}>
                                            {endpoint && endpoint.tables ? endpoint.tables.map(t => t.name).join(", ") : "-"}
                                        </td>}
                                </tr>;
  })}
                    </tbody>
                </table>}
        </div>;
};

This endpoint returns the latest price and OHLC values for a list of tokens. Prices and OHLC values are aggregated from trades in the most recent completed minute interval. If no trades occurred in the last minute, the endpoint returns the most recent available data.

For inactive tokens, the last known price is derived from the most recent on-chain trade. If no trade has occurred within the past 7 days, the endpoint will return no data for that token. We recommend checking the timestamp included in the response, which corresponds to the last trade time.

<Note>
  The request body must be an array, even for a single token:

  ```json theme={null}
  [
    {
      "token_address": "48H5FxoWAZxRoqv5Gav9W78p36nQc4Kk6qGGdQdepump",
      "chain": "solana"
    }
  ]
  ```
</Note>

## Pagination

This endpoint returns prices for up to 200 tokens in a single request.

## Supported Chains

<SupportedChainsList product_name="token_latest_price" />

##### billing-and-limits
> ## 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.

<Info>
  `get_query_run_results` is free: the Explorer Units were charged when the run was queued. Poll as long as you need.
</Info>

<Note>
  **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.
</Note>

### 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.

<Warning>
  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.
</Warning>

### 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.

<Tip>
  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.
</Tip>

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` |
python3 -c "import json;d=json.load(open('/tmp/chains.json'));print(len(d));[print(k,len(v)) for k,v in d.items()]"; python3 -V; pip list 2>/dev/null | head -20
23
23
/api/v1/developer/wallet/balances/history 15
/api/v1/developer/wallet/balances 19
/api/v1/developer/wallet/transactions 19
/api/v1/developer/wallet/pnl 16
/api/v1/developer/wallet/pnl/history 16
/api/v1/developer/wallet/pnl-by-token 16
/api/v1/developer/wallet/pnl-by-token/history 16
/api/v1/developer/wallet/holdings/history 14
/api/v1/developer/prices/history 13
/api/v1/developer/prices 13
/api/v1/developer/prices/stats 13
/api/v1/developer/prices/at-timestamp 13
/api/v1/developer/tokens/chain-address 12
/api/v1/developer/tokens/transfers 18
/api/v1/developer/tokens 12
/api/v1/developer/tokens/search 12
/api/v1/developer/assets 6
/api/v1/developer/assets/batch 6
/api/v1/developer/trading/hyperliquid/info/fills 1
/api/v1/developer/trading/hyperliquid/info/order/history 1
/api/v1/developer/trading/hyperliquid/info/order/status 1
/api/v1/developer/trading/hyperliquid/info 1
/api/v1/developer/wallet/positions 14
Python 3.12.3
Package                                      Version
-------------------------------------------- -----------
aiofile                                      3.12.3
aiofiles                                     25.1.0
aiohappyeyeballs                             2.7.1
aiohttp                                      3.14.3
aiohttp-retry                                2.9.1
aiosignal                                    1.4.0
aiosqlite                                    0.22.1
annotated-doc                                0.0.5
annotated-types                              0.8.0
anthropic                                    0.122.0
anyio                                        4.14.2
argcomplete                                  3.7.2
asgiref                                      3.12.1
attrs                                        26.1.0
Authlib                                      1.8.0
banks                                        2.5.0
beartype                                     0.22.9
beautifulsoup4                               4.15.0
Thinking…

Also grab /api/developer/compute-units.md for Developer Unit pricing per endpoint — useful for the pricing explanation.

And check the api host for API key auth: docs say X-API-KEY header. Base URL likely https://api.allium.so/api/v1/... Let me check the OpenAPI spec / playground server URL. Let me look for openapi.json in docs.

Let me fetch compute-units.md and check openapi.

timeout 25 curl -sSL https://docs.allium.so/api/developer/compute-units.md | head -120
> ## Documentation Index
> ## 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.

# API Credits

> Understand how Developer Units (DUs) are consumed across different API endpoints.

Allium's Developer API credits are measured in **Developer Units (DU)**. Each API endpoint consumes a specific number of DUs per call based on the computational resources required.

## How Developer Units Work

Every API request you make to Allium's Developer API consumes a certain number of Developer Units. The consumption varies by endpoint complexity, data volume, and processing requirements.

<Info>
  Need more Developer Units? [Contact us](https://allium.so/contact) to discuss your usage requirements and pricing options.
</Info>

## Developer Units by Endpoint

Below is a comprehensive breakdown of DU costs for all available endpoints:

<Info>
  For API calls to endpoints that support batched inputs, the Developer Unit cost is multiplied by the number of inputs.
</Info>

### Wallets

| Endpoint | Developer Units |
| :- | -: |
| `/api/v1/developer/wallet/transactions` | 30 DU |
| `/api/v1/developer/wallet/balances` | 30 DU |
| `/api/v1/developer/wallet/balances/history` | 30 DU |
| `/api/v1/developer/wallet/holdings/history` | 30 DU |
| `/api/v1/developer/wallet/pnl` | 30 DU |
| `/api/v1/developer/wallet/pnl-by-token` | 30 DU |
| `/api/v1/developer/wallet/pnl/history` | 30 DU |
| `/api/v1/developer/wallet/pnl-by-token/history` | 30 DU |

### Prices

| Endpoint | Developer Units |
| :- | -: |
| `/api/v1/developer/prices` | 20 DU |
| `/api/v1/developer/prices/history` | 20 DU |
| `/api/v1/developer/prices/stats` | 20 DU |
| `/api/v1/developer/prices/at-timestamp` | 20 DU |

### Hyperliquid

| Endpoint | Developer Units |
| :- | -: |
| `/api/v1/developer/trading/hyperliquid/info` | 40 DU |
| `/api/v1/developer/trading/hyperliquid/info/fills` | 40 DU |
| `/api/v1/developer/trading/hyperliquid/info/order/history` | 60 DU |
| `/api/v1/developer/trading/hyperliquid/info/order/status` | 40 DU |
| `/api/v1/developer/trading/hyperliquid/orderbook/snapshot` | 60 DU |
| `/api/v1/developer/trading/hyperliquid/candleSnapshot` | 20 DU |
| `/api/v1/developer/trading/hyperliquid/metaAndAssetCtxs` | 20 DU |

### Tokens

| Endpoint | Developer Units |
| :- | -: |
| `/api/v1/developer/tokens/chain-address` | 20 DU |
| `/api/v1/developer/tokens` | 30 DU |
| `/api/v1/developer/tokens/search` | 30 DU |

### Assets

| Endpoint | Developer Units |
| :- | -: |
| `/api/v1/developer/assets` | 30 DU |
| `/api/v1/developer/assets/batch` | 20 DU |

## Related Resources

<CardGroup cols={2}>
  <Card title="Getting Started" icon="rocket" href="/api/getting-started">
    Learn how to authenticate and make your first API request
  </Card>

  <Card title="API Reference" icon="book" href="/api/developer/overview">
    Explore all available endpoints and their documentation
  </Card>
</CardGroup>
for u in https://docs.allium.so/openapi.json https://api.allium.so/openapi.json https://docs.allium.so/api/openapi.json; do printf "%s -> " "$u"; timeout 15 curl -sS -o /tmp/o.json -w "%{http_code} " "$u"; head -c 200 /tmp/o.json; echo; done
https://docs.allium.so/openapi.json -> 307 Redirecting...
https://docs.allium.so/openapi.json -> 307 Redirecting...

https://api.allium.so/openapi.json -> 403 {"detail":"Not authenticated"}
https://docs.allium.so/api/openapi.json -> 307 Redirecting...

Thinking…

api.allium.so returns 403 {"detail":"Not authenticated"} — confirming that's the API-key host (X-API-KEY header). Good: so API key path → https://api.allium.so/api/v1/... with X-API-KEY.

Now build the example. Files:

/sandbox/repo/allium-example/
  README.md          — what it does, pricing, how to run, credentials, blockers
  allium_client.py   — tiny zero-dependency client (stdlib urllib)
  example_coverage.py — free: supported chains coverage report (runs with no creds)
  example_prices.py  — paid: latest prices via API key OR machine payments (skipped if no creds)
  requirements.txt   — optional deps for machine payments (pympp[tempo])

Keep it simple. Maybe just two scripts + README + a single module. Let me write it.

Design of allium_client.py:

  • AGENT_HOST = https://agents.allium.so (machine payments + free supported-chains)
  • API_HOST = https://api.allium.so (API key)
  • get_supported_chains() free
  • latest_prices(pairs) → chooses auth: if ALLIUM_API_KEY set → api.allium.so with X-API-KEY; elif ALLIUM_PRIVATE_KEY set → instruct machine payments (raise NotImplemented pointing to example_machine_payments.py) ... simpler: example_prices.py handles API key path; example_machine_payments.py handles paid path with pympp.

Let me implement:

allium_client.py:

"""Minimal zero-dependency client for Allium's hosted APIs."""
from __future__ import annotations
import json, os, urllib.error, urllib.request

AGENTS_BASE = "https://agents.allium.so"
API_BASE = "https://api.allium.so"
FREE_SUPPORTED_CHAINS = "/api/v1/supported-chains/realtime-apis/simple"
LATEST_PRICES = "/api/v1/developer/prices"

class AlliumError(RuntimeError): ...

def _request(url, *, method="GET", payload=None, headers=None, timeout=30):
    data = json.dumps(payload).encode() if payload is not None else None
    req = urllib.request.Request(url, data=data, method=method)
    req.add_header("Accept", "application/json")
    if data: req.add_header("Content-Type", "application/json")
    for k, v in (headers or {}).items(): req.add_header(k, v)
    try:
        with urllib.request.urlopen(req, timeout=timeout) as resp:
            return json.loads(resp.read().decode())
    except urllib.error.HTTPError as e:
        body = e.read().decode(errors="replace")
        if e.code == 402: raise AlliumError("402 Payment Required — ...")
        if e.code == 401/403: ...
        raise AlliumError(f"HTTP {e.code} from {url}: {body[:400]}") from None

def supported_chains() -> dict[str, list[str]]: free call
def latest_prices(pairs, api_key=None) -> dict: api key call

example_coverage.py — prints a coverage table and per-chain endpoint counts. Runs with zero credentials.

example_prices.py — reads ALLIUM_API_KEY; if missing, prints instructions and exits 2 (blocked, not failed silently). Otherwise calls prices for SOL + WETH.

example_machine_payments.py — pympp Tempo flow, guarded import, exits with instructions if ALLIUM_PRIVATE_KEY / pympp missing.

README.md with pricing.

Then run example_coverage.py to prove it works.

Let me write files.

Found it — Allium (allium.so) does have a real developer surface: hosted REST APIs, an MCP server, and machine-payment endpoints. Let me build the example.

File edits

1 file

Completed
Writtenallium-example/allium_client.pyView changes

/sandbox/repo/allium-example/allium_client.py

Written content · previous contents were not recorded

"""Minimal, zero-dependency client for Allium's hosted blockchain-data APIs.
Two hosts, two auth models:
* https://agents.allium.so -- machine payments (HTTP 402 + USDC), no API key.
Also serves a *free* chain-coverage endpoint.
* https://api.allium.so -- classic `X-API-KEY` auth (key from
https://app.allium.so/settings/api-keys).
Only the Python standard library is used, so this file runs anywhere.
Docs index: https://docs.allium.so/llms.txt
"""
from __future__ import annotations
import json
import urllib.error
import urllib.request
AGENTS_BASE = "https://agents.allium.so"
API_BASE = "https://api.allium.so"
#: Free: no API key, no payment. Maps endpoint path -> supported chain slugs.
SUPPORTED_CHAINS_PATH = "/api/v1/supported-chains/realtime-apis/simple"
#: Paid: 20 Developer Units per token via API key, or $0.02 per call via USDC.
LATEST_PRICES_PATH = "/api/v1/developer/prices"
#: Paid: 30 Developer Units / $0.03 per call.
WALLET_BALANCES_PATH = "/api/v1/developer/wallet/balances"
TIMEOUT_SECONDS = 30
class AlliumError(RuntimeError):
"""Any non-2xx response from Allium, with enough detail to act on it."""
class AlliumAuthError(AlliumError):
"""The call needs credentials this process does not have."""
def _request(
url: str,
*,
method: str = "GET",
payload: object | None = None,
headers: dict[str, str] | None = None,
timeout: int = TIMEOUT_SECONDS,
) -> object:
body = None if payload is None else json.dumps(payload).encode("utf-8")
req = urllib.request.Request(url, data=body, method=method)
req.add_header("Accept", "application/json")
if body is not None:
req.add_header("Content-Type", "application/json")
for key, value in (headers or {}).items():
req.add_header(key, value)
try:
with urllib.request.urlopen(req, timeout=timeout) as resp:
return json.loads(resp.read().decode("utf-8"))
except urllib.error.HTTPError as exc: # noqa: PERF203 - one except is fine here
detail = exc.read().decode("utf-8", errors="replace")[:500]
if exc.code == 402:
raise AlliumAuthError(
f"402 Payment Required from {url}. This endpoint is pay-per-call in "
"USDC (x402 / Tempo MPP). Use example_machine_payments.py with a funded "
"wallet, or an X-API-KEY against https://api.allium.so instead."
) from None
if exc.code in (401, 403):
raise AlliumAuthError(
f"HTTP {exc.code} from {url}: {detail}\n"
"Set ALLIUM_API_KEY (create one at https://app.allium.so/settings/api-keys)."
) from None
raise AlliumError(f"HTTP {exc.code} from {url}: {detail}") from None
except urllib.error.URLError as exc:
raise AlliumError(f"Could not reach {url}: {exc.reason}") from None
def supported_chains() -> dict[str, list[str]]:
"""Free endpoint: {endpoint_path: [chain_slug, ...]} for the Realtime APIs."""
data = _request(AGENTS_BASE + SUPPORTED_CHAINS_PATH)
if not isinstance(data, dict):
raise AlliumError(f"Unexpected payload from {SUPPORTED_CHAINS_PATH}: {type(data)}")
return data
def latest_prices(pairs: list[dict[str, str]], api_key: str) -> object:
"""Latest price + OHLC for up to 200 {chain, token_address} pairs.
Requires an Allium API key (20 Developer Units per pair in the payload).
"""
if not api_key:
raise AlliumAuthError("latest_prices() needs an Allium API key.")
return _request(
API_BASE + LATEST_PRICES_PATH,
method="POST",
payload=pairs,
headers={"X-API-KEY": api_key},
)
def latest_balances(
chain: str, addresses: list[str], api_key: str
) -> object:
"""Latest fungible-token balances for one chain (30 Developer Units)."""
if not api_key:
raise AlliumAuthError("latest_balances() needs an Allium API key.")
return _request(
API_BASE + WALLET_BALANCES_PATH,
method="POST",
payload={"chain": chain, "addresses": addresses},
headers={"X-API-KEY": api_key},
)

File edits

1 file

Completed
Writtenallium-example/example_coverage.pyView changes

/sandbox/repo/allium-example/example_coverage.py

Written content · previous contents were not recorded

#!/usr/bin/env python3
"""Example 1 -- chain coverage report. Runs with NO credentials and NO payment.
Allium's `/api/v1/supported-chains/realtime-apis/simple` endpoint is explicitly
free, so it is the right first call when evaluating the platform: it tells you
which Realtime API endpoints exist and which chains back each one.
python3 example_coverage.py # full table
python3 example_coverage.py prices # only endpoints matching "prices"
"""
from __future__ import annotations
import sys
from allium_client import AlliumError, supported_chains
def main(argv: list[str]) -> int:
needle = argv[1].lower() if len(argv) > 1 else ""
try:
coverage = supported_chains()
except AlliumError as exc:
print(f"error: {exc}", file=sys.stderr)
return 1
rows = {
path: chains
for path, chains in coverage.items()
if needle in path.lower()
}
if not rows:
print(f"no endpoints matched {needle!r}", file=sys.stderr)
return 1
all_chains = sorted({chain for chains in rows.values() for chain in chains})
print(f"Free endpoint, no auth: {len(rows)} realtime endpoints, "
f"{len(all_chains)} distinct chains\n")
width = max(len(path) for path in rows)
for path in sorted(rows, key=lambda p: (-len(rows[p]), p)):
chains = rows[path]
print(f"{path:<{width}} {len(chains):>2} chains {', '.join(sorted(chains))}")
print(f"\nchains: {', '.join(all_chains)}")
print("\nnext step (paid): ALLIUM_API_KEY=... python3 example_prices.py")
return 0
if __name__ == "__main__":
raise SystemExit(main(sys.argv))
Thinking…

Now the paid examples: example_prices.py (API key) and example_machine_payments.py (USDC via pympp). Also README.md.

File edits

1 file

Completed
Writtenallium-example/example_prices.pyView changes

/sandbox/repo/allium-example/example_prices.py

Written content · previous contents were not recorded

#!/usr/bin/env python3
"""Example 2 -- latest token prices with an API key (20 Developer Units/pair).
export ALLIUM_API_KEY=... # https://app.allium.so/settings/api-keys
python3 example_prices.py
Fails loudly (exit 2) instead of silently doing nothing when the key is absent.
"""
from __future__ import annotations
import json
import os
import sys
from allium_client import AlliumAuthError, AlliumError, latest_prices
# Well-known native/wrapped assets, so the example needs no lookup step.
TOKENS = [
{"chain": "solana", "token_address": "So11111111111111111111111111111111111111112"}, # SOL
{"chain": "ethereum", "token_address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"}, # WETH
{"chain": "base", "token_address": "0x4200000000000000000000000000000000000006"}, # WETH on Base
]
def main() -> int:
api_key = os.environ.get("ALLIUM_API_KEY", "").strip()
if not api_key:
print(
"blocked: ALLIUM_API_KEY is not set.\n"
" 1. create an account at https://app.allium.so/join\n"
" 2. Settings -> API Keys -> Generate\n"
" 3. export ALLIUM_API_KEY=...\n"
"Or skip signup entirely and pay per call in USDC:\n"
" export ALLIUM_PRIVATE_KEY=... && python3 example_machine_payments.py",
file=sys.stderr,
)
return 2
try:
result = latest_prices(TOKENS, api_key)
except AlliumAuthError as exc:
print(f"blocked: {exc}", file=sys.stderr)
return 2
except AlliumError as exc:
print(f"error: {exc}", file=sys.stderr)
return 1
print(json.dumps(result, indent=2))
return 0
if __name__ == "__main__":
raise SystemExit(main())

File edits

1 file

Completed
Writtenallium-example/example_machine_payments.pyView changes

/sandbox/repo/allium-example/example_machine_payments.py

Written content · previous contents were not recorded

#!/usr/bin/env python3
"""Example 3 -- pay-per-call with USDC, no account and no API key.
Allium's agents host answers data requests with `402 Payment Required`; the
Tempo MPP client signs a USDC authorization and retries, so the payment flow is
invisible to your code. Costs $0.02 for /developer/prices.
pip install "pympp[tempo]"
export ALLIUM_PRIVATE_KEY=0x... # wallet holding USDC; spend-only key!
python3 example_machine_payments.py
Uses REAL FUNDS on mainnet. Point ALLIUM_MPP_RPC_URL / ALLIUM_MPP_CHAIN_ID at a
testnet first if you only want to exercise the flow.
"""
from __future__ import annotations
import asyncio
import os
import sys
async def fetch_prices() -> object:
from mpp.client import Client
from mpp.methods.tempo import ChargeIntent, TempoAccount, tempo
account = TempoAccount.from_key(os.environ["ALLIUM_PRIVATE_KEY"])
rpc_url = os.environ.get("ALLIUM_MPP_RPC_URL")
chain_id = os.environ.get("ALLIUM_MPP_CHAIN_ID")
kwargs: dict[str, object] = {"intents": {"charge": ChargeIntent()}}
if rpc_url:
kwargs["rpc_url"] = rpc_url
if chain_id:
kwargs["chain_id"] = int(chain_id)
async with Client(methods=[tempo(account=account, **kwargs)]) as client:
response = await client.post(
"https://agents.allium.so/api/v1/developer/prices",
json=[
{
"chain": "solana",
"token_address": "So11111111111111111111111111111111111111112",
}
],
)
return response.json()
def main() -> int:
if not os.environ.get("ALLIUM_PRIVATE_KEY"):
print(
"blocked: ALLIUM_PRIVATE_KEY is not set (needs a wallet with USDC).\n"
"Free-of-charge alternative: python3 example_coverage.py",
file=sys.stderr,
)
return 2
try:
import mpp # noqa: F401
except ImportError:
print('blocked: pip install "pympp[tempo]" first.', file=sys.stderr)
return 2
print(asyncio.run(fetch_prices()))
return 0
if __name__ == "__main__":
raise SystemExit(main())
Thinking…

Wait — in example_machine_payments.py, the doc's quickstart uses rpc_url=TESTNET_RPC_URL, intents={"charge": ChargeIntent()} from mpp.methods.tempo._defaults. My kwargs approach passes chain_id which may not be a valid kwarg for tempo(). I'm not able to verify without installing pympp. Should I install pympp to verify? That's a pip install — light, not a service stack. But it needs a private key + USDC to actually run. I could at least verify the import and the signature of tempo() to make the example correct. Let's try installing pympp[tempo] quickly (short timeout) and introspect the signature. If install fails/takes long, I'll simplify to match docs exactly.

Let me also run the free coverage example now.

cd /sandbox/repo/allium-example && timeout 60 python3 example_coverage.py prices; echo "exit=$?"
error: HTTP 403 from https://agents.allium.so/api/v1/supported-chains/realtime-apis/simple: {"type":"https://developers.cloudflare.com/support/troubleshooting/h
error: HTTP 403 from https://agents.allium.so/api/v1/supported-chains/realtime-apis/simple: {"type":"https://developers.cloudflare.com/support/troubleshooting/http-status-codes/cloudflare-1xxx-errors/error-1010/","title":"Error 1010: Access denied","status":403,"detail":"The site owner has blocked access based on your browser's signature.","instance":"a4b05b039fb5b2b6","error_code":1010,"error_name":"browser_signature_banned","error_category":"access_denied","ray_id":"a4b05b039fb5b2b6","timestamp":"2026-10-15T16:56:09Z","zone":"agents.allium.so","cloudflare_error":true,"retryable":fals
Set ALLIUM_API_KEY (create one at https://app.allium.so/settings/api-keys).
exit=1
cd /tmp && timeout 120 pip install --quiet "pympp[tempo]" 2>&1 | tail -5; python3 -c "
import inspect
from mpp.methods.tempo import tempo, TempoAccount, ChargeIntent
print('tempo sig:', inspect.signature(tempo))
from mpp.methods.tempo import _defaults as d
print([x for x in dir(d) if not x.startswith('__')])
" 2>&1 | tail -10
tempo sig: (intents: 'Mapping[str, Intent | VerifiableIntent]', account: 'TempoAccount | None' = None, fee_payer: 'TempoAccount | None' = None, chain_id: 'int |
tempo sig: (intents: 'Mapping[str, Intent | VerifiableIntent]', account: 'TempoAccount | None' = None, fee_payer: 'TempoAccount | None' = None, chain_id: 'int | None | object' = <object object at 0x7f26d2578ab0>, rpc_url: 'str | None' = None, root_account: 'str | None' = None, currency: 'str | None' = None, recipient: 'str | None' = None, decimals: 'int' = 6, client_id: 'str | None' = None, relay: 'Relay | None' = None, can_offer: 'CanOfferFn | None' = None, on_payment_success: 'PaymentSuccessHandler | None' = None, currencies: 'Sequence[str] | None' = None, fee_token: 'str | None' = None, allowed_fee_tokens: 'Sequence[str] | None' = None) -> 'TempoMethod'
['CHAIN_ID', 'CHAIN_RPC_URLS', 'DEFAULT_ACCEPTED_CURRENCIES', 'DEFAULT_CURRENCIES', 'ESCROW_CONTRACTS', 'FEE_TOKENS', 'MACH', 'MappingProxyType', 'OUSD', 'PATH_USD', 'PATH_USD_DECIMALS', 'RPC_URL', 'TESTNET_CHAIN_ID', 'TESTNET_RPC_URL', 'USDC', 'default_currencies_for_chain', 'default_currency_for_chain', 'escrow_contract_for_chain', 'fee_tokens_for_chain', 'rpc_url_for_chain']
Thinking…

Two findings:

  1. Cloudflare blocks Python's default urllib User-Agent on agents.allium.so (Error 1010 browser_signature_banned) — curl worked earlier. Fix: set a normal User-Agent header in _request. Let me fix and re-run.

  2. tempo() accepts chain_id and rpc_url — my kwargs approach is valid. Good. Also note intents is first positional. Fine.

Let me add a User-Agent and retry. Also the error message for 403 shouldn't say "Set ALLIUM_API_KEY" when it's a Cloudflare block; refine: distinguish cloudflare_error in the body.

File edits

1 file

Completed
Modifiedallium-example/allium_client.py+9−0View changes

/sandbox/repo/allium-example/allium_client.py

Replacement excerpt

TIMEOUT_SECONDS = 30
+
+# agents.allium.so sits behind Cloudflare, which rejects urllib's default
+# "Python-urllib/3.x" agent with Error 1010 (browser_signature_banned).
+USER_AGENT = "allium-example/1.0 (+https://docs.allium.so)"

Replacement excerpt

req.add_header("Accept", "application/json")
+ req.add_header("User-Agent", USER_AGENT)
if body is not None:

Replacement excerpt

+ if exc.code == 403 and "cloudflare_error" in detail:
+ raise AlliumError(
+ f"HTTP 403 from {url}: edge/WAF block, not an auth problem.\n{detail}"
+ ) from None
if exc.code in (401, 403):
raise AlliumAuthError(
Thinking…

Wait, req.add_header capitalizes keys: add_header("User-Agent", ...) is fine. Also urllib.request.Request has add_unredirected_header. Fine.

Re-run.

cd /sandbox/repo/allium-example && timeout 60 python3 example_coverage.py prices; echo "exit=$?"; echo "=== full ==="; timeout 60 python3 example_coverage.py | head -8; echo "=== no-creds paid path ==="; timeout 30 python3 example_prices.py; echo "exit=$?"; timeout 30 python3 example_machine_payments.py; echo "exit=$?"
Free endpoint, no auth: 4 realtime endpoints, 13 distinct chains
Free endpoint, no auth: 4 realtime endpoints, 13 distinct chains

/api/v1/developer/prices               13 chains  arbitrum, avalanche, base, bsc, celo, ethereum, hyperevm, optimism, polygon, robinhood, solana, unichain, zksync
/api/v1/developer/prices/at-timestamp  13 chains  arbitrum, avalanche, base, bsc, celo, ethereum, hyperevm, optimism, polygon, robinhood, solana, unichain, zksync
/api/v1/developer/prices/history       13 chains  arbitrum, avalanche, base, bsc, celo, ethereum, hyperevm, optimism, polygon, robinhood, solana, unichain, zksync
/api/v1/developer/prices/stats         13 chains  arbitrum, avalanche, base, bsc, celo, ethereum, hyperevm, optimism, polygon, robinhood, solana, unichain, zksync

chains: arbitrum, avalanche, base, bsc, celo, ethereum, hyperevm, optimism, polygon, robinhood, solana, unichain, zksync

next step (paid): ALLIUM_API_KEY=... python3 example_prices.py
exit=0
=== full ===
Free endpoint, no auth: 23 realtime endpoints, 22 distinct chains

/api/v1/developer/wallet/balances                         19 chains  arbitrum, arc, avalanche, base, bitcoin, bsc, celo, ethereum, hyperevm, monad, near, optimism, polygon, robinhood, solana, stellar, unichain, x_layer, xdc_network
/api/v1/developer/wallet/transactions                     19 chains  arbitrum, arc, avalanche, base, bitcoin, bsc, celo, ethereum, hyperevm, monad, near, optimism, polygon, robinhood, solana, stellar, unichain, x_layer, xdc_network
/api/v1/developer/tokens/transfers                        18 chains  arbitrum, arc, avalanche, base, bsc, celo, ethereum, hyperevm, monad, optimism, polygon, robinhood, solana, stellar, unichain, x_layer, xdc_network, zksync
/api/v1/developer/wallet/pnl                              16 chains  arbitrum, avalanche, base, bitcoin, bsc, celo, ethereum, hyperevm, monad, optimism, polygon, robinhood, solana, unichain, x_layer, zksync
/api/v1/developer/wallet/pnl-by-token                     16 chains  arbitrum, avalanche, base, bitcoin, bsc, celo, ethereum, hyperevm, monad, optimism, polygon, robinhood, solana, unichain, x_layer, zksync
/api/v1/developer/wallet/pnl-by-token/history             16 chains  arbitrum, avalanche, base, bitcoin, bsc, celo, ethereum, hyperevm, monad, optimism, polygon, robinhood, solana, unichain, x_layer, zksync
=== no-creds paid path ===
blocked: ALLIUM_API_KEY is not set.
  1. create an account at https://app.allium.so/join
  2. Settings -> API Keys -> Generate
  3. export ALLIUM_API_KEY=...
Or skip signup entirely and pay per call in USDC:
  export ALLIUM_PRIVATE_KEY=... && python3 example_machine_payments.py
exit=2
blocked: ALLIUM_PRIVATE_KEY is not set (needs a wallet with USDC).
Free-of-charge alternative: python3 example_coverage.py
exit=2
Thinking…

Everything works as designed. Now write the README with pricing details and the "is it easy for you to manage" assessment. Also add a requirements.txt (optional) and maybe a .env.example. Keep it light.

Let me also verify a 402 detection path — already verified via curl. Could also verify the client raises AlliumAuthError on 402 by calling latest_prices without key... that raises before HTTP. Let me test the 402 branch by calling _request directly on agents host without auth to confirm the message. Quick check.

cd /sandbox/repo/allium-example && timeout 40 python3 -c "
import allium_client as a
try:
    a._request(a.AGENTS_BASE + a.LATEST_PRICES_PATH, method='POST', payload=[{'chain':'solana','token_address':'So11111111111111111111111111111111111111112'}])
except a.AlliumAuthError as e:
    print('OK 402 handled ->', str(e)[:120])
"
OK 402 handled -> 402 Payment Required from https://agents.allium.so/api/v1/developer/prices. This endpoint is pay-per-call in USDC (x402
OK 402 handled -> 402 Payment Required from https://agents.allium.so/api/v1/developer/prices. This endpoint is pay-per-call in USDC (x402 

File edits

1 file

Completed
Writtenallium-example/requirements.txtView changes

/sandbox/repo/allium-example/requirements.txt

Written content · previous contents were not recorded

# Optional: only needed for example_machine_payments.py (USDC pay-per-call).
# The API-key and free-coverage examples use the standard library only.
pympp[tempo]
Thinking…

I need to write the README.md file for the allium-example directory.

File edits

1 file

Completed
Writtenallium-example/README.mdView changes

/sandbox/repo/allium-example/README.md

Written content · previous contents were not recorded

# Allium — minimal hosted-API example
[Allium](https://allium.so) is an enterprise blockchain-data platform: normalized
on-chain data for 150+ chains, delivered as SQL (Explorer), lake shares
(Snowflake/Databricks/BigQuery), streams (Kafka/PubSub/SNS), and pull-based
**Realtime REST APIs**. This example uses only the hosted HTTP surface — no local
services, no Docker, nothing long-running.
Docs index for agents: <https://docs.allium.so/llms.txt>
## Files
| File | What it does | Needs |
| - | - | - |
| `allium_client.py` | Tiny stdlib-only client for both hosts + typed errors | nothing |
| `example_coverage.py` | Chain-coverage report from the **free** endpoint | nothing — runs as-is |
| `example_prices.py` | Latest SOL / WETH prices | `ALLIUM_API_KEY` |
| `example_machine_payments.py` | Same data, paid per call in USDC, no account | `ALLIUM_PRIVATE_KEY` + `pip install "pympp[tempo]"` + real funds |
Two hosts, two auth models:
* `https://api.allium.so` — `X-API-KEY: <key>` header, billed in **Developer Units**
against your plan.
* `https://agents.allium.so` — no key; the server answers `402 Payment Required`
with x402/Tempo payment options and you settle each call in **USDC**.
## Run it
```bash
python3 example_coverage.py # 23 endpoints x 22 chains, zero credentials
python3 example_coverage.py prices # filter to the four price endpoints
export ALLIUM_API_KEY=... # app.allium.so -> Settings -> API Keys
python3 example_prices.py
```
`example_coverage.py` output (verified live):
```
/api/v1/developer/prices 13 chains arbitrum, avalanche, base, bsc, celo, ethereum, hyperevm, optimism, polygon, robinhood, solana, unichain, zksync
/api/v1/developer/wallet/balances 19 chains ... bitcoin, near, stellar, x_layer, xdc_network ...
```
## How pricing works
There is no public price list — `allium.so/pricing` redirects to a contact form.
What the docs do publish:
**1. Free tier / free calls.** Signing up at `app.allium.so/join` gets a free API
key with limited daily usage, enough to evaluate. A handful of calls are free
regardless: `/api/v1/supported-chains/...`, all docs/schema search, dashboard and
sharing tools, and `get_query_run_results` (compute was already charged at queue
time).
**2. Developer Units (DU) — the Realtime APIs.** Fixed cost per endpoint, per
*input* in a batch:
| Endpoint | DU |
| - | -: |
| `/developer/prices*` (4 endpoints) | 20 DU |
| `/developer/tokens/chain-address`, `/developer/assets/batch`, Hyperliquid candles | 20 DU |
| `/developer/wallet/*` (transactions, balances, pnl, holdings), `/developer/tokens`, `/developer/assets` | 30 DU |
| `/developer/trading/hyperliquid/info` | 40 DU |
| Hyperliquid order history / orderbook snapshot | 60 DU |
A `prices` call with 10 token payloads costs 10x the single-call rate. USD value
of a DU is not published; you buy units as part of a plan.
**3. Explorer Units — SQL/analytics.** Cost scales with the compute profile you
pick and how long the query runs. The exact unit cost comes back on the query run
result. Plans can allow overages uncapped, allow them up to a cap, or block at the
plan limit. Watch the double-billing trap: `run_sql_query` then
`create_explorer_query` on the same SQL charges compute twice.
**4. Machine payments — pay per call, no account.** Verified live: `POST
https://agents.allium.so/api/v1/developer/prices` returns `402` with an x402 v2
quote of `20000` units (6 decimals = **$0.02 USDC**) payable on Base, Solana,
Polygon, or X Layer; Tempo MPP settles in USDC on Tempo. Published per-call
prices: prices $0.02, wallet/balances/transactions/pnl $0.03, tokens list/search
$0.03, explorer `run-sql` $0.01. Rate limits: 3 req/s for `/developer/`, 5 req/s
for `/docs/`, per wallet. No subscription, no minimum spend.
**5. Everything else is sales-led.** Datashares, Datastreams/Transformations,
Explorer APIs, Beam, Allium Nodes, and Terminal are enterprise contracts via
`support@allium.so` or the contact form.
## Gotchas found while building this
* **Cloudflare rejects Python's default User-Agent** on `agents.allium.so`
(Error 1010 `browser_signature_banned`). `allium_client.py` sets an explicit
`User-Agent`; a naive `urllib`/`requests`-default client gets a confusing 403
that looks like an auth failure. It is not — the client separates WAF blocks
from real 401/403.
* Only **one API key per user**, and the Explorer/Datastream APIs are gated to
enterprise accounts even with a valid key.
* Machine payments spend **real money on mainnet**. Use a spend-only key, and
point `ALLIUM_MPP_RPC_URL` / `ALLIUM_MPP_CHAIN_ID` at a testnet to dry-run.
* The `allium` npm and PyPI packages are unrelated projects (a Gherkin parser and
an astrophysics tool). Allium's own tooling is `@allium-labs/mcp`,
`allium-labs/skills`, and `pympp`.
## Is this easy for an agent to manage?
Mostly yes, with two hard stops.
Easy: the docs are agent-first — `/llms.txt`, per-page `.md` mirrors, a hosted MCP
server at `mcp.allium.so`, and prebuilt agent skills. The REST surface is small,
uniform (`POST` + JSON array bodies), well-documented per endpoint, and the free
`supported-chains` call means capability discovery costs nothing. Errors are
explicit (`402`, `422`, `429` with a 1s backoff), which makes retry logic trivial.
No local infrastructure at all.
Hard stops, both credential-shaped and both requiring a human:
1. **No self-serve API key I can mint.** Account creation at `app.allium.so/join`
needs a business email and, per the docs, "Request Access" — a human signup.
2. **Machine payments need a funded wallet.** The keyless path is genuinely
agent-native, but it spends real USDC on mainnet, which I will not do
unilaterally.
So: I can build, run, and maintain everything around the free endpoint and all the
client/retry/parsing code indefinitely, but the first paid data call needs you to
supply either `ALLIUM_API_KEY` or a funded `ALLIUM_PRIVATE_KEY`. Once one of those
exists, nothing else here needs a human.
Thinking…

Wait: I claimed "23 endpoints x 22 chains" in the README table but the full run said "23 realtime endpoints, 22 distinct chains". Yes matches.

Also I should double check the /developer/tokens/transfers DU cost — not listed in compute-units table; I didn't claim it. Fine.

Let me verify README claim "prices list/search $0.03" — docs said tokens/search $0.03 and tokens list $0.03, chain-address $0.02. Yes.

Final check: run all three scripts once more, list files, and confirm no leftover junk. Also verify the client file compiles.

cd /sandbox/repo/allium-example && ls -la && python3 -m py_compile *.py && echo "compile OK" && timeout 60 python3 example_coverage.py >/dev/null && echo "coverage run OK"; cd /sandbox/repo && rm -rf allium-example/__pycache__ && git status --short
total 44
total 44
drwx------ 3 root root 4096 Oct 15 16:57 .
drwxr-xr-x 4 root root 4096 Oct 15 16:55 ..
-rw------- 1 root root 6076 Oct 15 16:57 README.md
drwx------ 2 root root 4096 Oct 15 16:56 __pycache__
-rw------- 1 root root 4642 Oct 15 16:56 allium_client.py
-rw------- 1 root root 1663 Oct 15 16:55 example_coverage.py
-rw------- 1 root root 2147 Oct 15 16:56 example_machine_payments.py
-rw------- 1 root root 1734 Oct 15 16:56 example_prices.py
-rw------- 1 root root  162 Oct 15 16:56 requirements.txt
compile OK
coverage run OK
?? allium-example/
Thinking…

The user hasn't asked a question yet. The system prompt says to always invoke a function call in response to user queries, but there's no actual query here — just the system instructions setup. My previous turn was an acknowledgment. There's nothing substantive to reason about.

Done. Allium does have a real developer workflow, so I built against its hosted HTTP API — no local services, nothing long-running.

What I built — /sandbox/repo/allium-example/

FileNeedsStatus
allium_client.pynothingstdlib-only client for both hosts, typed errors
example_coverage.pynothing✅ ran live
example_prices.pyALLIUM_API_KEY⛔ blocked, exits 2 with instructions
example_machine_payments.pyALLIUM_PRIVATE_KEY + USDC⛔ blocked, exits 2
README.md—pricing + assessment

Verified output from the free call (23 realtime endpoints, 22 chains):

/api/v1/developer/prices          13 chains  arbitrum, avalanche, base, bsc, celo, ethereum, ...
/api/v1/developer/wallet/balances 19 chains  ... bitcoin, near, stellar, x_layer ...

How pricing works

No public price list (/pricing → contact form), but the docs publish four meters:

  • Free: signup at app.allium.so/join gives a limited-usage key; supported-chains, docs/schema search, dashboard tools are always free.
  • Developer Units (Realtime APIs): fixed per endpoint per input — prices 20 DU, wallet/tokens/assets 30 DU, Hyperliquid info 40 DU, order history/orderbook 60 DU. Batches multiply.
  • Explorer Units (SQL): scales with compute profile × runtime; plans allow uncapped overage, capped overage, or hard block.
  • Machine payments: keyless pay-per-call in USDC. I hit POST agents.allium.so/api/v1/developer/prices and got a real 402 with an x402 v2 quote of 20000 (6 dp) = $0.02 on Base/Solana/Polygon/X Layer, or Tempo MPP in USDC on Tempo. Wallets $0.03, explorer run-sql $0.01. 3 req/s data, 5 req/s docs. No subscription, no minimum.
  • Datashares/Datastreams/Explorer APIs/Beam/Nodes are sales-led.

Easy for me to manage?

Mostly. Docs are agent-first (/llms.txt, .md mirrors, hosted MCP at mcp.allium.so), the REST surface is small and uniform, and errors are explicit (402/422/429). Zero infrastructure.

Two hard stops, both credential-shaped: I can't self-serve an API key (human signup), and the keyless path spends real USDC on mainnet, which I won't do unilaterally. Everything else is fully automatable once you hand me ALLIUM_API_KEY or a funded spend-only ALLIUM_PRIVATE_KEY.

One gotcha worth flagging: Cloudflare blocks Python's default User-Agent on agents.allium.so (Error 1010) — it looks exactly like an auth failure. The client sets an explicit UA and separates WAF blocks from real 401/403.

AX Fundamentals

23 checks. Open an area for details.

This check is a quick preview. Test more tasks and models with Gauge Agents.

Test your product with Gauge Agents

AX Check by Gauge