ax-check.com
by Gauge
A
Allium
allium.so
ax-check.com
Checked 15 October 2026
B
81/100
Agents need your login
Docs and quickstart are solid, but plan pricing stays sales-only
16 of 23 checks passed, including a clear Beam quickstart and documented MCP/API/CLI paths. Standard plan prices aren't published on the site.
2 fixes to start with
Concrete changes, backed by what we found.
Recorded coding sessions
Same task, 3 models, no allium.so account. Recorded 15 October 2026 on Pi.
3 recorded · 3m 19s
3m 19s · recorded
Session findings
Select a finding to see it in context.
›Thinking…
Let me understand the request. The user wants help building a simple example using "Allium". They want me to explain how pricing works, and whether this product is easy for me (the AI agent) to manage. I should let them know if I get blocked.
Key instructions:
- If this product has no developer workflow I 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.
First, I need to figure out what "Allium" is. Let me explore the current directory to see if there's any context about Allium.
Let me look around the sandbox/repo directory first.
I'll start by exploring the current directory to understand what Allium is and what context is available.
cd /sandbox/repo && ls -la && echo "---" && pwd
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:56 .. drwxr-xr-x 8 root root 4096 Sep 24 20:05 .git -rw-r--r-- 1 root root 408 Sep 18 08:00 .gitignore --- /sandbox/repo
Recorded tool call
{
"type": "tool_call",
"seq": 4,
"ts": "2026-10-15T16:56:13.947Z",
"name": "bash",
"turn": 1,
"input": {
"command": "cd /sandbox/repo && ls -la && echo \"---\" && pwd"
},
"run_id": "cmv9s5vv804sf0itwcc1tes4s",
"tool_id": "chatcmpl-tool-b1a8768b5f2dfe6b",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 6,
"ts": "2026-10-15T16:56:13.947Z",
"turn": 1,
"output": {
"content": [
{
"text": "total 16\ndrwxr-xr-x 3 root root 4096 Sep 18 08:00 .\ndrwxr-xr-x 7 root root 4096 Oct 15 16:56 ..\ndrwxr-xr-x 8 root root 4096 Sep 24 20:05 .git\n-rw-r--r-- 1 root root 408 Sep 18 08:00 .gitignore\n---\n/sandbox/repo\n",
"type": "text"
}
]
},
"run_id": "cmv9s5vv804sf0itwcc1tes4s",
"tool_id": "chatcmpl-tool-b1a8768b5f2dfe6b",
"is_error": false,
"tool_kind": "shell"
}cd /sandbox/repo && find . -maxdepth 2 -type f 2>/dev/null | head -100
./.gitignore
./.gitignore ./.git/COMMIT_EDITMSG ./.git/config ./.git/index ./.git/HEAD ./.git/description
Recorded tool call
{
"type": "tool_call",
"seq": 5,
"ts": "2026-10-15T16:56:13.947Z",
"name": "bash",
"turn": 1,
"input": {
"command": "cd /sandbox/repo && find . -maxdepth 2 -type f 2>/dev/null | head -100"
},
"run_id": "cmv9s5vv804sf0itwcc1tes4s",
"tool_id": "chatcmpl-tool-981357c1a8c857d4",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 7,
"ts": "2026-10-15T16:56:13.947Z",
"turn": 1,
"output": {
"content": [
{
"text": "./.gitignore\n./.git/COMMIT_EDITMSG\n./.git/config\n./.git/index\n./.git/HEAD\n./.git/description\n",
"type": "text"
}
]
},
"run_id": "cmv9s5vv804sf0itwcc1tes4s",
"tool_id": "chatcmpl-tool-981357c1a8c857d4",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
The repo is essentially empty except for a .gitignore and git metadata. Let me look at the git history and the .gitignore to understand what this repo is about.
The repo is nearly empty. Let me check the git history and config for context about what Allium is.
✓read /sandbox/repo/.gitignore✓└{"content":[{"text":"# Keep generated and vendored files out of source diffs.\n\n# Logs / OS cruft\n*.log\n.DS_Store\n\n# JavaScript / TypeScript\nnode_modules/…ctrl+o
{"content":[{"text":"# Keep generated and vendored files out of source diffs.\n\n# Logs / OS cruft\n*.log\n.DS_Store\n\n# JavaScript / TypeScript\nnode_modules/\n.next/\ndist/\nbuild/\ncoverage/\n\n# Python\n.venv/\nvenv/\n__pycache__/\n*.py[cod]\n.pytest_cache/\n*.egg-info/\n\n# Rust\ntarget/\n\n# Go / PHP / Ruby vendored deps\nvendor/\n.bundle/\n\n# Java / Kotlin / Scala\n.gradle/\n\n# .NET\nbin/\nobj/\n\n# Elixir\n_build/\ndeps/\n\n# Dart / Flutter\n.dart_tool/\n","type":"text"}]}cd /sandbox/repo && git log --oneline -20 2>/dev/null; echo "--- config ---"; cat .git/config 2>/dev/null; echo "--- description ---"; cat .git/description 2>/dev/null
9ebf5fb Initial workspace
9ebf5fb Initial workspace --- config --- [core] repositoryformatversion = 0 filemode = true bare = false logallrefupdates = true --- description --- Unnamed repository; edit this file 'description' to name the repository.
Recorded tool call
{
"type": "tool_call",
"seq": 12,
"ts": "2026-10-15T16:56:16.715Z",
"name": "bash",
"turn": 1,
"input": {
"command": "cd /sandbox/repo && git log --oneline -20 2>/dev/null; echo \"--- config ---\"; cat .git/config 2>/dev/null; echo \"--- description ---\"; cat .git/description 2>/dev/null"
},
"run_id": "cmv9s5vv804sf0itwcc1tes4s",
"tool_id": "chatcmpl-tool-88b827e755cf45a3",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 14,
"ts": "2026-10-15T16:56:16.715Z",
"turn": 1,
"output": {
"content": [
{
"text": "9ebf5fb Initial workspace\n--- config ---\n[core]\n\trepositoryformatversion = 0\n\tfilemode = true\n\tbare = false\n\tlogallrefupdates = true\n--- description ---\nUnnamed repository; edit this file 'description' to name the repository.\n",
"type": "text"
}
]
},
"run_id": "cmv9s5vv804sf0itwcc1tes4s",
"tool_id": "chatcmpl-tool-88b827e755cf45a3",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
The repo has no context about Allium. There's no remote configured, and just a single "Initial workspace" commit. So I need to figure out what "Allium" is on my own.
Allium could refer to several things:
- Allium (allium.so) - a blockchain data platform / data infrastructure company that provides curated blockchain data through APIs and data pipelines. They have a "Allium Explorer" and data APIs.
- Allium - the flower (genus of onions).
- Some other product.
Given the context (a coding agent, SDK/API, hosted product, pricing), Allium is most likely the blockchain data company allium.so. They provide blockchain data infrastructure.
Let me check if there's internet access to look up Allium. Let me try to search or check network access.
Actually, let me first check whether I have network access and whether there's any package manager access (npm, pip) to find Allium SDKs.
Let me think about the instructions carefully:
- "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."
- "If this product has no developer workflow you can act on, say so plainly and stop."
So I need to determine:
- What is Allium?
- Does it have an SDK or API I can use?
- How does pricing work?
- Is it easy for me (an AI agent) to manage?
Let me check network access first.
The repo has no Allium context. Let me research what Allium is and check my network/tooling access.
cd /sandbox/repo && echo "=== Network test ===" && (curl -sS -m 10 -I https://allium.so 2>&1 | head -20 || echo "curl failed"); echo "=== DNS ==="; (nslookup allium.so 2>&1 | head -10 || echo "no nslookup")
=== Network test ===
=== Network test === HTTP/2 301 date: Thu, 15 Oct 2026 16:56:24 GMT location: https://www.allium.so/ strict-transport-security: max-age=31536000; includeSubDomains x-content-type-options: nosniff server: cloudflare cf-ray: a4b05b5efe1f2c74-IAD === DNS === Server: 2606:4700:4700::1111 Address: 2606:4700:4700::1111#53 Non-authoritative answer: Name: allium.so Address: 104.18.12.30 Name: allium.so Address: 104.18.13.30 Name: allium.so Address: 2606:4700::6812:c1e
Recorded tool call
{
"type": "tool_call",
"seq": 18,
"ts": "2026-10-15T16:56:24.218Z",
"name": "bash",
"turn": 1,
"input": {
"command": "cd /sandbox/repo && echo \"=== Network test ===\" && (curl -sS -m 10 -I https://allium.so 2>&1 | head -20 || echo \"curl failed\"); echo \"=== DNS ===\"; (nslookup allium.so 2>&1 | head -10 || echo \"no nslookup\")"
},
"run_id": "cmv9s5vv804sf0itwcc1tes4s",
"tool_id": "chatcmpl-tool-ae2441bdc7976628",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 22,
"ts": "2026-10-15T16:56:24.614Z",
"turn": 1,
"output": {
"content": [
{
"text": "=== Network test ===\nHTTP/2 301 \r\ndate: Thu, 15 Oct 2026 16:56:24 GMT\r\nlocation: https://www.allium.so/\r\nstrict-transport-security: max-age=31536000; includeSubDomains\r\nx-content-type-options: nosniff\r\nserver: cloudflare\r\ncf-ray: a4b05b5efe1f2c74-IAD\r\n\r\n=== DNS ===\nServer:\t\t2606:4700:4700::1111\nAddress:\t2606:4700:4700::1111#53\n\nNon-authoritative answer:\nName:\tallium.so\nAddress: 104.18.12.30\nName:\tallium.so\nAddress: 104.18.13.30\nName:\tallium.so\nAddress: 2606:4700::6812:c1e\n",
"type": "text"
}
]
},
"run_id": "cmv9s5vv804sf0itwcc1tes4s",
"tool_id": "chatcmpl-tool-ae2441bdc7976628",
"is_error": false,
"tool_kind": "shell"
}which node npm python3 pip pip3 go 2>&1; echo "--- versions ---"; node --version 2>&1; npm --version 2>&1; python3 --version 2>&1
/usr/local/bin/node
/usr/local/bin/node /usr/local/bin/npm /usr/local/bin/python3 /usr/local/bin/pip /usr/local/bin/pip3 /usr/local/go/bin/go --- versions --- v22.23.2 10.9.8 Python 3.12.3
Recorded tool call
{
"type": "tool_call",
"seq": 20,
"ts": "2026-10-15T16:56:24.218Z",
"name": "bash",
"turn": 1,
"input": {
"command": "which node npm python3 pip pip3 go 2>&1; echo \"--- versions ---\"; node --version 2>&1; npm --version 2>&1; python3 --version 2>&1"
},
"run_id": "cmv9s5vv804sf0itwcc1tes4s",
"tool_id": "chatcmpl-tool-b8c21adf9e888545",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 21,
"ts": "2026-10-15T16:56:24.614Z",
"turn": 1,
"output": {
"content": [
{
"text": "/usr/local/bin/node\n/usr/local/bin/npm\n/usr/local/bin/python3\n/usr/local/bin/pip\n/usr/local/bin/pip3\n/usr/local/go/bin/go\n--- versions ---\nv22.23.2\n10.9.8\nPython 3.12.3\n",
"type": "text"
}
]
},
"run_id": "cmv9s5vv804sf0itwcc1tes4s",
"tool_id": "chatcmpl-tool-b8c21adf9e888545",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
I have network access. Allium.so is a real product. Let me research what Allium is. It redirects to www.allium.so. Let me fetch the homepage and docs.
I have node, npm, python3, pip, go available. Let me look up Allium's documentation to understand:
- What it does
- Its SDK/API
- Pricing
- Quickstart
Let me fetch the website and docs.
Good — I have network access and Allium.so is a real hosted product. Let me research its docs, SDK/API, and pricing.
cd /sandbox/repo && echo "=== homepage ===" && curl -sSL -m 20 https://www.allium.so/ 2>&1 | sed -e 's/<[^>]*>//g' | tr -s ' \n' ' \n' | grep -iE "allium|blockchain|data|api|enterprise|price|schema|query|sql|explorer" | head -40
=== homepage ===
=== homepage ===
Allium: onchain data platform for institutions!function(o,c){var n=c.documentElement,t=" w-mod-";n.className+=t+"js",("ontouchstart"in o||o.DocumentTouch&&c instanceof DocumentTouch)&&(n.className+=t+"touch")}(window,document);
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
container, so the Allium side has to be swiped to and is easily missed.
Stack to a single column under 768px: Others block, then Allium block. -->
var h = document.querySelector('.section_report_header .report_header_content-top h2');
document.querySelectorAll('.report_meta .report_tag').forEach(function (t) {
:root { --aw-warn: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23B5503F' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20.0429 21H3.95705C2.41902 21 1.45658 19.3364 2.22324 18.0031L10.2662 4.01533C11.0352 2.67792 12.9648 2.67791 13.7338 4.01532L21.7768 18.0031C22.5434 19.3364 21.581 21 20.0429 21Z'/%3E%3Cpath d='M12 9V13'/%3E%3Cpath d='M12 17.01L12.01 16.9989'/%3E%3C/svg%3E"); }
.popup-toast.allium-show { opacity: 1; transform: translateY(0); }
.advantage_table-item-body:has(> .advantage_table-item-outcome)::before { content: "Allium"; display: block; order: -1; font-size: 11px; line-height: 14px; font-weight: 600; letter-spacing: .08em; text-transform: uppercase; color: #c586c0; }
.advantage_table > .advantage_table-col:first-child .advantage_table-item-body:has(> .advantage_table-item-outcome)::before { content: "Without Allium"; color: #B5503F; }
=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. -->
.ut_section .ut_icon{width:9px;height:14px;flex:0 0 9px;background-color:currentColor;-webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3E%3Cpath d='M0 2.8V0H2.8V2.8H5.6V5.6H8.4V8.4H5.6V11.2H2.8V14H0V2.8Z'/%3E%3C/svg%3E") center/contain no-repeat;mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3E%3Cpath d='M0 2.8V0H2.8V2.8H5.6V5.6H8.4V8.4H5.6V11.2H2.8V14H0V2.8Z'/%3E%3C/svg%3E") center/contain no-repeat}
.ut_section .ut_arrow::before{content:"";display:block;width:100%;height:100%;min-width:14px;min-height:14px;background-color:currentColor;-webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 14' fill='none'%3E%3Cpath d='M3.5 11.08L11.08 3.5M3.8 3.5H11.08V10.78' stroke='%23000' stroke-linejoin='round'/%3E%3C/svg%3E") center/contain no-repeat;mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 14' fill='none'%3E%3Cpath d='M3.5 11.08L11.08 3.5M3.8 3.5H11.08V10.78' stroke='%23000' stroke-linejoin='round'/%3E%3C/svg%3E") center/contain no-repeat}
.ut_section[data-ut-bullets="off"] .ut_list{display:none}
.ut_section[data-ut-images="off"] .solution_image-wrapper{display:none}
.ut_section[data-ut-images="off"] .solution_card{grid-template-columns:1fr}
.ut_section[data-ut-images="off"] .solution_image-container{background:transparent}
html:not([data-wf-page="6a19672a3e86bd5aff36e302"]) :is(.section_advantage,.section_impact,.section_value,.section_difference,.section_pipeline,.section_technique,.section_comparison,.section_integration,.section_application,.section_delivery,.section_team,.section_mcp,.section_layout175,.section_layout359,.ut_section) h2,html:not([data-wf-page="6a19672a3e86bd5aff36e302"]) :is(.section_advantage,.section_impact,.section_value,.section_difference,.section_pipeline,.section_technique,.section_comparison,.section_integration,.section_application,.section_delivery,.section_team,.section_mcp,.section_layout175,.section_layout359,.ut_section) :is(.align-center,.text-align-center,[class*="max-width-"],.tin-head,.dwh-head,.header26_rich-text,.impact_title-row,.margin-bottom,.margin-bottom-2,[class*="_title"],[class*="-head"]):has(h2) p,html:not([data-wf-page="6a19672a3e86bd5aff36e302"]) :is(.section_advantage,.section_impact,.section_value,.section_difference,.section_pipeline,.section_technique,.section_comparison,.section_integration,.section_application,.section_delivery,.section_team,.section_mcp,.section_layout175,.section_layout359,.ut_section) :is(.align-center,.text-align-center,[class*="max-width-"],.tin-head,.dwh-head,.header26_rich-text,.impact_title-row,.margin-bottom,.margin-bottom-2,[class*="_title"],[class*="-head"]):has(h2)+p,html:not([data-wf-page="6a19672a3e86bd5aff36e302"]) :is(.section_advantage,.section_impact,.section_value,.section_difference,.section_pipeline,.section_technique,.section_comparison,.section_integration,.section_application,.section_delivery,.section_team,.section_mcp,.section_layout175,.section_layout359,.ut_section) :is(.align-center,.text-align-center,[class*="max-width-"],.tin-head,.dwh-head,.header26_rich-text,.impact_title-row,.margin-bottom,.margin-bottom-2,[class*="_title"],[class*="-head"]):has(h2)+[class*="text-size"],html:not([data-wf-page="6a19672a3e86bd5aff36e302"]) :is(.section_advantage,.section_impact,.section_value,.section_difference,.section_pipeline,.section_technique,.section_comparison,.section_integration,.section_application,.section_delivery,.section_team,.section_mcp,.section_layout175,.section_layout359,.ut_section) :is(.align-center,.text-align-center,[class*="max-width-"],.tin-head,.dwh-head,.header26_rich-text,.impact_title-row,.margin-bottom,.margin-bottom-2,[class*="_title"],[class*="-head"]):has(h2)+[class*="margin-"]>p{text-align:left;margin-left:0}
html:not([data-wf-page="6a19672a3e86bd5aff36e302"]) :is(.section_advantage,.section_impact,.section_value,.section_difference,.section_pipeline,.section_technique,.section_comparison,.section_integration,.section_application,.section_delivery,.section_team,.section_mcp,.section_layout175,.section_layout359,.ut_section) :is(.align-center,.text-align-center,[class*="max-width-"],.tin-head,.dwh-head,.header26_rich-text,.impact_title-row,.margin-bottom,.margin-bottom-2,[class*="_title"],[class*="-head"]):has(h2){text-align:left;margin-left:0;justify-content:flex-start;align-items:flex-start;align-self:flex-start;justify-self:start}
.section_logo .logo_list[data-reveal-group] > *{opacity:1!important;transform:none!important;visibility:visible!important}
html[data-wf-page="6a32be220bb24ca05b48a7b7"] .hs-button.primary{background-color:#93408d!important;border-color:#93408d!important;color:#fff!important}
html .allium-research-label{font-size:14px}
html[data-allium-hero="ready"] .hero_image { display: none; }
background: url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"%3E%3Cpath d="M6 9l6 6 6-6"%3E%3C/path%3E%3C/svg%3E') no-repeat right 16px center;
Our data powers Visa's public stablecoin dashboard.Read our latest report →
var data = JSON.parse(stored);
if (data.closed && Date.now() - data.timestamp < ONE_DAY_MS) {
var banner = document.querySelector('.banner_component');
var banner = document.querySelector('.banner_component');
var closeBtn = document.querySelector('.banner_close-button');
Use CasesBy Use CaseAcademiaFinance & OperationsInvestment ResearchIssuanceMarket OversightPaymentsProduct & EngineeringTrading & InvestmentExploreChain DirectoryCompare SolutionsClientsAccounting & Audit FirmsAsset ManagersBanksExchangesHedge FundsPayment NetworksStablecoin IssuersProductsAnalyticsAllium AIAllium TerminalHistorical DataExplorerDatasharesReal-Time DataDevelopersDatastreamsResearchResourcesInsightsBlogDigital Asset Identifiers (DASID)Trust CenterCompanyAboutCareersPartnersPartner ProgramsSnowflakeDatabricksDocsLog InGet a DemoSign UpSign UpLog InGet a Demo
[data-nav-menu-open]{
The onchain data platform the world's largest institutions run onSee which stablecoin and tokenized asset activity is real, and build on onchain data you can trace to the block. SOC 1 and SOC 2 Type I and II.Explore the TerminalGet a demoVisa, KPMG, Coinbase and more than 30 of the Fortune Crypto 100 run on Allium data$176T in reported stablecoin volume. $17T is real.About 90% of onchain stablecoin volume is not economic activity. Allium removes it so you see what is real.-$100TIntra-entity money movement-$43TPass through routing (DEX, bridges)-$9TBOT / HFT activity-$4TSmart contract internals-$3TWash trading and spam$176TUnadjusted onchain volume$17TAllium adjusted volume$159Tof non-economic activity$300Bof stablecoin supply is actually in circulation. Allium separates live supply from what sits idle in foundation treasuries, protocol reserves and locked addresses.Explore Stablecoins on Allium83%of classified stablecoin volume comes from consumer wallets, not businesses or institutions. Allium classifies sender and receiver type, not just the transfer.Explore Stablecoins on Allium$8Bof stablecoin payments stayed inside APAC last year. Allium resolves sender and receiver geography across every corridor.Explore Payments on AlliumWhat institutions publish on Allium dataSources the ecosystem metrics in its State of Crypto report and live dashboard from Allium, refreshed monthly.ViewPublishes a public stablecoin dashboard on Allium data, separating organic flows from total transfer volume.ViewApplied its behavior-based methodology to Allium data to narrow $62T of 2025 stablecoin transfers to between $350B and $550B in real payments.ViewServes real-time onchain data across chains from Allium APIs, straight into what wallet users see.View
What Visa, BCG, Privy and Ondo say about Allium"At Visa, we seek to both better inform how people and businesses are using stablecoins for transactions. We look forward to continuing with partners like Allium to explore use cases and opportunities for stablecoins in the payment ecosystem."Cuy SheffieldHead of Crypto"It's generated a lot of client traction, both in our active engagements and in client discussions and industry engagement. It's now a foundational piece of our digital assets practice infrastructure."Max ZevinManaging Director and Partner"The marriage of Privy, Allium, and a payment protocol like x402 or MPP is the legs of the stool for enabling autonomous systems that can act on the web in a contextual way."Henri SternCEO & Co-Founder"Allium did a super good job aggregating all tokenized assets and also having a good schema that we use for comparisons, such as competitor volume vs. Ondo volume, so we can generate business insights based on that."Alex ChenData ScientistPick your use case: research, finance or productUnderstandResearch, Strategy & Market IntelligenceResearch teams sizing real stablecoin volume by corridor.Hedge funds and asset managers tracking issuance, holders and flows across chains.Regulators and oversight teams monitoring market activity.See Investment ResearchStart in Allium Terminal: verified onchain data, ready to analyzeOperationalizeFinance & OperationsFinance teams reconciling onchain holdings to the books.Tax and accounting teams producing audit-ready reports from onchain data.Auditors and issuers verifying balances and supply with a reproducible trail.See Finance & OperationsReconcile onchain activity with verified dataBuildProduct & Data InfrastructurePayments and tokenization platforms embedding onchain data in their products.Exchanges and wallets serving real-time balances across every chain.Engineering teams getting decoded data without running indexers.See Product & EngineeringShip production-grade onchain data in your productPick the product that fits how you workAllium TerminalAggregated dashboards tell you how much activity happened. Allium Terminal tells you who, where, and what.Allium AIAsk a question in plain English and get an answer, chart included, no SQL required.ExplorerWrite custom SQL across 10,000+ protocols to answer the one question a dashboard can't.DatasharesQuery production-ready onchain data in your own Snowflake, BigQuery, Databricks, S3 or GCS.DevelopersReal-time APIs at 50 to 100ms across 20+ chains, scaling to 100K+ requests per second.DatastreamsStream blockchain events to your systems in real time. Full chain data or filtered streams, without building infrastructure.
Latest Allium research
Get new Allium research in your inbox
.swiper-navigation.is-research-head #allium-research-cta {
.swiper-navigation.is-research-head #allium-research-cta {
#allium-research-cta .allium-research-label {
Recorded tool call
{
"type": "tool_call",
"seq": 26,
"ts": "2026-10-15T16:56:29.107Z",
"name": "bash",
"turn": 1,
"input": {
"command": "cd /sandbox/repo && echo \"=== homepage ===\" && curl -sSL -m 20 https://www.allium.so/ 2>&1 | sed -e 's/<[^>]*>//g' | tr -s ' \\n' ' \\n' | grep -iE \"allium|blockchain|data|api|enterprise|price|schema|query|sql|explorer\" | head -40"
},
"run_id": "cmv9s5vv804sf0itwcc1tes4s",
"tool_id": "chatcmpl-tool-af9e0ed139d6523c",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 29,
"ts": "2026-10-15T16:56:29.542Z",
"turn": 1,
"output": {
"content": [
{
"text": "=== homepage ===\nAllium: onchain data platform for institutions!function(o,c){var n=c.documentElement,t=\" w-mod-\";n.className+=t+\"js\",(\"ontouchstart\"in o||o.DocumentTouch&&c instanceof DocumentTouch)&&(n.className+=t+\"touch\")}(window,document);\n window.dataLayer = window.dataLayer || [];\n function gtag(){dataLayer.push(arguments);}\n container, so the Allium side has to be swiped to and is easily missed.\n Stack to a single column under 768px: Others block, then Allium block. -->\n var h = document.querySelector('.section_report_header .report_header_content-top h2');\n document.querySelectorAll('.report_meta .report_tag').forEach(function (t) {\n :root { --aw-warn: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23B5503F' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20.0429 21H3.95705C2.41902 21 1.45658 19.3364 2.22324 18.0031L10.2662 4.01533C11.0352 2.67792 12.9648 2.67791 13.7338 4.01532L21.7768 18.0031C22.5434 19.3364 21.581 21 20.0429 21Z'/%3E%3Cpath d='M12 9V13'/%3E%3Cpath d='M12 17.01L12.01 16.9989'/%3E%3C/svg%3E\"); }\n .popup-toast.allium-show { opacity: 1; transform: translateY(0); }\n .advantage_table-item-body:has(> .advantage_table-item-outcome)::before { content: \"Allium\"; display: block; order: -1; font-size: 11px; line-height: 14px; font-weight: 600; letter-spacing: .08em; text-transform: uppercase; color: #c586c0; }\n .advantage_table > .advantage_table-col:first-child .advantage_table-item-body:has(> .advantage_table-item-outcome)::before { content: \"Without Allium\"; color: #B5503F; }\n=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. -->\n .ut_section .ut_icon{width:9px;height:14px;flex:0 0 9px;background-color:currentColor;-webkit-mask:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3E%3Cpath d='M0 2.8V0H2.8V2.8H5.6V5.6H8.4V8.4H5.6V11.2H2.8V14H0V2.8Z'/%3E%3C/svg%3E\") center/contain no-repeat;mask:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 14'%3E%3Cpath d='M0 2.8V0H2.8V2.8H5.6V5.6H8.4V8.4H5.6V11.2H2.8V14H0V2.8Z'/%3E%3C/svg%3E\") center/contain no-repeat}\n .ut_section .ut_arrow::before{content:\"\";display:block;width:100%;height:100%;min-width:14px;min-height:14px;background-color:currentColor;-webkit-mask:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 14' fill='none'%3E%3Cpath d='M3.5 11.08L11.08 3.5M3.8 3.5H11.08V10.78' stroke='%23000' stroke-linejoin='round'/%3E%3C/svg%3E\") center/contain no-repeat;mask:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 14' fill='none'%3E%3Cpath d='M3.5 11.08L11.08 3.5M3.8 3.5H11.08V10.78' stroke='%23000' stroke-linejoin='round'/%3E%3C/svg%3E\") center/contain no-repeat}\n .ut_section[data-ut-bullets=\"off\"] .ut_list{display:none}\n .ut_section[data-ut-images=\"off\"] .solution_image-wrapper{display:none}\n .ut_section[data-ut-images=\"off\"] .solution_card{grid-template-columns:1fr}\n .ut_section[data-ut-images=\"off\"] .solution_image-container{background:transparent}\nhtml:not([data-wf-page=\"6a19672a3e86bd5aff36e302\"]) :is(.section_advantage,.section_impact,.section_value,.section_difference,.section_pipeline,.section_technique,.section_comparison,.section_integration,.section_application,.section_delivery,.section_team,.section_mcp,.section_layout175,.section_layout359,.ut_section) h2,html:not([data-wf-page=\"6a19672a3e86bd5aff36e302\"]) :is(.section_advantage,.section_impact,.section_value,.section_difference,.section_pipeline,.section_technique,.section_comparison,.section_integration,.section_application,.section_delivery,.section_team,.section_mcp,.section_layout175,.section_layout359,.ut_section) :is(.align-center,.text-align-center,[class*=\"max-width-\"],.tin-head,.dwh-head,.header26_rich-text,.impact_title-row,.margin-bottom,.margin-bottom-2,[class*=\"_title\"],[class*=\"-head\"]):has(h2) p,html:not([data-wf-page=\"6a19672a3e86bd5aff36e302\"]) :is(.section_advantage,.section_impact,.section_value,.section_difference,.section_pipeline,.section_technique,.section_comparison,.section_integration,.section_application,.section_delivery,.section_team,.section_mcp,.section_layout175,.section_layout359,.ut_section) :is(.align-center,.text-align-center,[class*=\"max-width-\"],.tin-head,.dwh-head,.header26_rich-text,.impact_title-row,.margin-bottom,.margin-bottom-2,[class*=\"_title\"],[class*=\"-head\"]):has(h2)+p,html:not([data-wf-page=\"6a19672a3e86bd5aff36e302\"]) :is(.section_advantage,.section_impact,.section_value,.section_difference,.section_pipeline,.section_technique,.section_comparison,.section_integration,.section_application,.section_delivery,.section_team,.section_mcp,.section_layout175,.section_layout359,.ut_section) :is(.align-center,.text-align-center,[class*=\"max-width-\"],.tin-head,.dwh-head,.header26_rich-text,.impact_title-row,.margin-bottom,.margin-bottom-2,[class*=\"_title\"],[class*=\"-head\"]):has(h2)+[class*=\"text-size\"],html:not([data-wf-page=\"6a19672a3e86bd5aff36e302\"]) :is(.section_advantage,.section_impact,.section_value,.section_difference,.section_pipeline,.section_technique,.section_comparison,.section_integration,.section_application,.section_delivery,.section_team,.section_mcp,.section_layout175,.section_layout359,.ut_section) :is(.align-center,.text-align-center,[class*=\"max-width-\"],.tin-head,.dwh-head,.header26_rich-text,.impact_title-row,.margin-bottom,.margin-bottom-2,[class*=\"_title\"],[class*=\"-head\"]):has(h2)+[class*=\"margin-\"]>p{text-align:left;margin-left:0}\nhtml:not([data-wf-page=\"6a19672a3e86bd5aff36e302\"]) :is(.section_advantage,.section_impact,.section_value,.section_difference,.section_pipeline,.section_technique,.section_comparison,.section_integration,.section_application,.section_delivery,.section_team,.section_mcp,.section_layout175,.section_layout359,.ut_section) :is(.align-center,.text-align-center,[class*=\"max-width-\"],.tin-head,.dwh-head,.header26_rich-text,.impact_title-row,.margin-bottom,.margin-bottom-2,[class*=\"_title\"],[class*=\"-head\"]):has(h2){text-align:left;margin-left:0;justify-content:flex-start;align-items:flex-start;align-self:flex-start;justify-self:start}\n.section_logo .logo_list[data-reveal-group] > *{opacity:1!important;transform:none!important;visibility:visible!important}\nhtml[data-wf-page=\"6a32be220bb24ca05b48a7b7\"] .hs-button.primary{background-color:#93408d!important;border-color:#93408d!important;color:#fff!important}\nhtml .allium-research-label{font-size:14px}\nhtml[data-allium-hero=\"ready\"] .hero_image { display: none; }\n background: url('data:image/svg+xml,%3Csvg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"black\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"%3E%3Cpath d=\"M6 9l6 6 6-6\"%3E%3C/path%3E%3C/svg%3E') no-repeat right 16px center;\nOur data powers Visa's public stablecoin dashboard.Read our latest report →\n var data = JSON.parse(stored);\n if (data.closed && Date.now() - data.timestamp < ONE_DAY_MS) {\n var banner = document.querySelector('.banner_component');\n var banner = document.querySelector('.banner_component');\n var closeBtn = document.querySelector('.banner_close-button');\nUse CasesBy Use CaseAcademiaFinance & OperationsInvestment ResearchIssuanceMarket OversightPaymentsProduct & EngineeringTrading & InvestmentExploreChain DirectoryCompare SolutionsClientsAccounting & Audit FirmsAsset ManagersBanksExchangesHedge FundsPayment NetworksStablecoin IssuersProductsAnalyticsAllium AIAllium TerminalHistorical DataExplorerDatasharesReal-Time DataDevelopersDatastreamsResearchResourcesInsightsBlogDigital Asset Identifiers (DASID)Trust CenterCompanyAboutCareersPartnersPartner ProgramsSnowflakeDatabricksDocsLog InGet a DemoSign UpSign UpLog InGet a Demo\n [data-nav-menu-open]{\nThe onchain data platform the world's largest institutions run onSee which stablecoin and tokenized asset activity is real, and build on onchain data you can trace to the block. SOC 1 and SOC 2 Type I and II.Explore the TerminalGet a demoVisa, KPMG, Coinbase and more than 30 of the Fortune Crypto 100 run on Allium data$176T in reported stablecoin volume. $17T is real.About 90% of onchain stablecoin volume is not economic activity. Allium removes it so you see what is real.-$100TIntra-entity money movement-$43TPass through routing (DEX, bridges)-$9TBOT / HFT activity-$4TSmart contract internals-$3TWash trading and spam$176TUnadjusted onchain volume$17TAllium adjusted volume$159Tof non-economic activity$300Bof stablecoin supply is actually in circulation. Allium separates live supply from what sits idle in foundation treasuries, protocol reserves and locked addresses.Explore Stablecoins on Allium83%of classified stablecoin volume comes from consumer wallets, not businesses or institutions. Allium classifies sender and receiver type, not just the transfer.Explore Stablecoins on Allium$8Bof stablecoin payments stayed inside APAC last year. Allium resolves sender and receiver geography across every corridor.Explore Payments on AlliumWhat institutions publish on Allium dataSources the ecosystem metrics in its State of Crypto report and live dashboard from Allium, refreshed monthly.ViewPublishes a public stablecoin dashboard on Allium data, separating organic flows from total transfer volume.ViewApplied its behavior-based methodology to Allium data to narrow $62T of 2025 stablecoin transfers to between $350B and $550B in real payments.ViewServes real-time onchain data across chains from Allium APIs, straight into what wallet users see.View\nWhat Visa, BCG, Privy and Ondo say about Allium"At Visa, we seek to both better inform how people and businesses are using stablecoins for transactions. We look forward to continuing with partners like Allium to explore use cases and opportunities for stablecoins in the payment ecosystem."Cuy SheffieldHead of Crypto\"It's generated a lot of client traction, both in our active engagements and in client discussions and industry engagement. It's now a foundational piece of our digital assets practice infrastructure.\"Max ZevinManaging Director and Partner\"The marriage of Privy, Allium, and a payment protocol like x402 or MPP is the legs of the stool for enabling autonomous systems that can act on the web in a contextual way.\"Henri SternCEO & Co-Founder\"Allium did a super good job aggregating all tokenized assets and also having a good schema that we use for comparisons, such as competitor volume vs. Ondo volume, so we can generate business insights based on that.\"Alex ChenData ScientistPick your use case: research, finance or productUnderstandResearch, Strategy & Market IntelligenceResearch teams sizing real stablecoin volume by corridor.Hedge funds and asset managers tracking issuance, holders and flows across chains.Regulators and oversight teams monitoring market activity.See Investment ResearchStart in Allium Terminal: verified onchain data, ready to analyzeOperationalizeFinance & OperationsFinance teams reconciling onchain holdings to the books.Tax and accounting teams producing audit-ready reports from onchain data.Auditors and issuers verifying balances and supply with a reproducible trail.See Finance & OperationsReconcile onchain activity with verified dataBuildProduct & Data InfrastructurePayments and tokenization platforms embedding onchain data in their products.Exchanges and wallets serving real-time balances across every chain.Engineering teams getting decoded data without running indexers.See Product & EngineeringShip production-grade onchain data in your productPick the product that fits how you workAllium TerminalAggregated dashboards tell you how much activity happened. Allium Terminal tells you who, where, and what.Allium AIAsk a question in plain English and get an answer, chart included, no SQL required.ExplorerWrite custom SQL across 10,000+ protocols to answer the one question a dashboard can't.DatasharesQuery production-ready onchain data in your own Snowflake, BigQuery, Databricks, S3 or GCS.DevelopersReal-time APIs at 50 to 100ms across 20+ chains, scaling to 100K+ requests per second.DatastreamsStream blockchain events to your systems in real time. Full chain data or filtered streams, without building infrastructure.\nLatest Allium research\n Get new Allium research in your inbox\n .swiper-navigation.is-research-head #allium-research-cta {\n .swiper-navigation.is-research-head #allium-research-cta {\n #allium-research-cta .allium-research-label {\n",
"type": "text"
}
]
},
"run_id": "cmv9s5vv804sf0itwcc1tes4s",
"tool_id": "chatcmpl-tool-af9e0ed139d6523c",
"is_error": false,
"tool_kind": "shell"
}echo "=== npm search allium ==="; npm view allium 2>&1 | head -30; echo "=== npm search @allium ==="; npm search allium 2>&1 | head -20
=== npm search allium ===
=== npm search allium === allium@0.2.2 | Proprietary | deps: 3 | versions: 4 Simpler Gherkin parsing http://github.com/unnali/allium dist .tarball: https://registry.npmjs.org/allium/-/allium-0.2.2.tgz .shasum: 59d15b74b202dacf694239fd90588f1550ed1836 .integrity: sha512-OIjezTAcO6Mvvgdnorplafn62dOPzIYu+QCsPsEfD6kpKuYI7eJLhvjcuwpfQc20Yh8KO/HFkWNU82TIBvb0aQ== dependencies: mocha: ~1.0.2 underscore.string: ~2.2.0rc underscore: ~1.3.3 maintainers: - unnali <ashe+unnali@kivikakk.ee> - kivikakk <ashe@kivikakk.ee> dist-tags: latest: 0.2.2 published over a year ago by unnali <a@unnali.com> === npm search @allium === @telus-uds/palette-allium Telus(Allium) palette Version 6.3.0 published 2026-10-13 by GitHub Actions Maintainers: pdufault telusdigitaldelivery stv-telus shahzaibkhalid Keywords: allium https://npm.im/@telus-uds/palette-allium @telus-uds/theme-allium Allium theme Version 8.3.0 published 2026-10-13 by GitHub Actions Maintainers: pdufault telusdigitaldelivery stv-telus shahzaibkhalid https://npm.im/@telus-uds/theme-allium allium Simpler Gherkin parsing Version 0.2.2 published 2012-05-16 by unnali Maintainers: unnali kivikakk Keywords: gherkin cucumber bdd parsing https://npm.im/allium
Recorded tool call
{
"type": "tool_call",
"seq": 28,
"ts": "2026-10-15T16:56:29.107Z",
"name": "bash",
"turn": 1,
"input": {
"command": "echo \"=== npm search allium ===\"; npm view allium 2>&1 | head -30; echo \"=== npm search @allium ===\"; npm search allium 2>&1 | head -20"
},
"run_id": "cmv9s5vv804sf0itwcc1tes4s",
"tool_id": "chatcmpl-tool-92099061d8750a9d",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 30,
"ts": "2026-10-15T16:56:31.550Z",
"turn": 1,
"output": {
"content": [
{
"text": "=== npm search allium ===\n\nallium@0.2.2 | Proprietary | deps: 3 | versions: 4\nSimpler Gherkin parsing\nhttp://github.com/unnali/allium\n\ndist\n.tarball: https://registry.npmjs.org/allium/-/allium-0.2.2.tgz\n.shasum: 59d15b74b202dacf694239fd90588f1550ed1836\n.integrity: sha512-OIjezTAcO6Mvvgdnorplafn62dOPzIYu+QCsPsEfD6kpKuYI7eJLhvjcuwpfQc20Yh8KO/HFkWNU82TIBvb0aQ==\n\ndependencies:\nmocha: ~1.0.2\nunderscore.string: ~2.2.0rc\nunderscore: ~1.3.3\n\nmaintainers:\n- unnali <ashe+unnali@kivikakk.ee>\n- kivikakk <ashe@kivikakk.ee>\n\ndist-tags:\nlatest: 0.2.2\n\npublished over a year ago by unnali <a@unnali.com>\n=== npm search @allium ===\n@telus-uds/palette-allium\nTelus(Allium) palette\nVersion 6.3.0 published 2026-10-13 by GitHub Actions\nMaintainers: pdufault telusdigitaldelivery stv-telus shahzaibkhalid\nKeywords: allium\nhttps://npm.im/@telus-uds/palette-allium\n\n@telus-uds/theme-allium\nAllium theme\nVersion 8.3.0 published 2026-10-13 by GitHub Actions\nMaintainers: pdufault telusdigitaldelivery stv-telus shahzaibkhalid\nhttps://npm.im/@telus-uds/theme-allium\n\nallium\nSimpler Gherkin parsing\nVersion 0.2.2 published 2012-05-16 by unnali\nMaintainers: unnali kivikakk\nKeywords: gherkin cucumber bdd parsing\nhttps://npm.im/allium\n\n",
"type": "text"
}
]
},
"run_id": "cmv9s5vv804sf0itwcc1tes4s",
"tool_id": "chatcmpl-tool-92099061d8750a9d",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
Now I understand Allium. It's a blockchain/onchain data platform for institutions. Key products:
- Allium Terminal (dashboards)
- Allium AI (natural language questions)
- Explorer (custom SQL)
- Datashares (Snowflake, BigQuery, Databricks, S3, GCS)
- Developers (Real-time APIs at 50-100ms across 20+ chains)
- Datastreams (stream blockchain events)
The npm "allium" package is unrelated (Gherkin parsing). The @telus ones are unrelated too.
So the "Developers" product with "Real-time APIs" is the developer workflow. Let me look at their docs. There's a "Docs" link. Let me find the docs site.
Let me check the docs and pricing pages. Let me look for the developer docs and API.
Allium is an onchain/blockchain data platform for institutions. It has a "Developers" product (real-time APIs across 20+ chains) and a Docs site. Let me find the developer docs and pricing pages.
cd /sandbox/repo && for u in "https://www.allium.so/pricing" "https://docs.allium.so" "https://developers.allium.so" "https://www.allium.so/developers"; do echo "=== $u ==="; curl -sSL -m 15 -o /dev/null -w "HTTP %{http_code} -> %{url_effective}\n" "$u" 2>&1; done=== https://www.allium.so/pricing ===
=== https://www.allium.so/pricing === HTTP 200 -> https://www.allium.so/contact === https://docs.allium.so === HTTP 200 -> https://docs.allium.so/ === https://developers.allium.so === curl: (6) Could not resolve host: developers.allium.so HTTP 000 -> https://developers.allium.so/ === https://www.allium.so/developers === HTTP 404 -> https://www.allium.so/developers
Recorded tool call
{
"type": "tool_call",
"seq": 34,
"ts": "2026-10-15T16:56:38.806Z",
"name": "bash",
"turn": 1,
"input": {
"command": "cd /sandbox/repo && for u in \"https://www.allium.so/pricing\" \"https://docs.allium.so\" \"https://developers.allium.so\" \"https://www.allium.so/developers\"; do echo \"=== $u ===\"; curl -sSL -m 15 -o /dev/null -w \"HTTP %{http_code} -> %{url_effective}\\n\" \"$u\" 2>&1; done"
},
"run_id": "cmv9s5vv804sf0itwcc1tes4s",
"tool_id": "chatcmpl-tool-8544a365d2352c16",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 38,
"ts": "2026-10-15T16:56:43.234Z",
"turn": 1,
"output": {
"content": [
{
"text": "=== https://www.allium.so/pricing ===\nHTTP 200 -> https://www.allium.so/contact\n=== https://docs.allium.so ===\nHTTP 200 -> https://docs.allium.so/\n=== https://developers.allium.so ===\ncurl: (6) Could not resolve host: developers.allium.so\nHTTP 000 -> https://developers.allium.so/\n=== https://www.allium.so/developers ===\nHTTP 404 -> https://www.allium.so/developers\n",
"type": "text"
}
]
},
"run_id": "cmv9s5vv804sf0itwcc1tes4s",
"tool_id": "chatcmpl-tool-8544a365d2352c16",
"is_error": false,
"tool_kind": "shell"
}cd /sandbox/repo && echo "=== find docs links on homepage ==="; curl -sSL -m 20 https://www.allium.so/ 2>&1 | grep -oiE 'href="[^"]*"' | grep -iE 'docs|pricing|developer|api|api-reference|signup|login|terminal|explorer' | sort -u | head -40
=== find docs links on homepage ===
=== find docs links on homepage === href="/product/allium-developer" href="/product/allium-explorer" href="/product/allium-terminal" href="https://app.allium.so/login" href="https://app.allium.so/terminal/payments/key-metrics?tab=b2bb2cc2bc2c" href="https://app.allium.so/terminal/stablecoins/key-metrics?tab=overview" href="https://docs.allium.so/"
Recorded tool call
{
"type": "tool_call",
"seq": 35,
"ts": "2026-10-15T16:56:38.806Z",
"name": "bash",
"turn": 1,
"input": {
"command": "cd /sandbox/repo && echo \"=== find docs links on homepage ===\"; curl -sSL -m 20 https://www.allium.so/ 2>&1 | grep -oiE 'href=\"[^\"]*\"' | grep -iE 'docs|pricing|developer|api|api-reference|signup|login|terminal|explorer' | sort -u | head -40"
},
"run_id": "cmv9s5vv804sf0itwcc1tes4s",
"tool_id": "chatcmpl-tool-be2c735439cf9854",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 37,
"ts": "2026-10-15T16:56:40.111Z",
"turn": 1,
"output": {
"content": [
{
"text": "=== find docs links on homepage ===\nhref=\"/product/allium-developer\"\nhref=\"/product/allium-explorer\"\nhref=\"/product/allium-terminal\"\nhref=\"https://app.allium.so/login\"\nhref=\"https://app.allium.so/terminal/payments/key-metrics?tab=b2bb2cc2bc2c\"\nhref=\"https://app.allium.so/terminal/stablecoins/key-metrics?tab=overview\"\nhref=\"https://docs.allium.so/\"\n",
"type": "text"
}
]
},
"run_id": "cmv9s5vv804sf0itwcc1tes4s",
"tool_id": "chatcmpl-tool-be2c735439cf9854",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
Interesting findings:
/pricingredirects to/contact— so pricing is not public; you have to contact them. This is a strong signal that this is an enterprise, sales-gated product.docs.allium.soexists (HTTP 200).app.allium.so/loginexists.- There's
/product/allium-developer.
Let me look at the docs site and the developer product page. Let me understand the API and quickstart.
Notable: /pricing redirects to /contact (sales-gated, not public). There's a docs site and an app login. Let me examine the docs and the developer product page.
cd /sandbox/repo && echo "=== docs.allium.so landing ==="; curl -sSL -m 20 https://docs.allium.so/ 2>&1 | sed -e 's/<[^>]*>//g' | tr -s ' \n' ' \n' | grep -vE '^\s*$' | head -80
=== docs.allium.so landing ===
=== docs.allium.so landing ===
(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)));
};
})();
.base-ui-disable-scrollbar{scrollbar-width:none}.base-ui-disable-scrollbar::-webkit-scrollbar{display:none}Introduction - Allium Documentation Hub!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);
}();if((' '+document.cookie).indexOf(' mintlify_end_user_session_hint=1')!==-1)document.documentElement.setAttribute('data-auth-pending','nav user');(() => {
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'],
});
})();!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);
}();!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){}}();(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":"","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){}}
})();(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",
)((a,b,c,d,e,f,g,h)=>{let i=document.documentElement,j=["light","dark"];function k(b){var c;(Array.isArray(a)?a:[a]).forEach(a=>{let c="class"===a,d=c&&f?e.map(a=>f[a]||a):e;c?(i.classList.remove(...d),i.classList.add(f&&f[b]?f[b]:b)):i.setAttribute(a,b)}),c=b,h&&j.includes(c)&&(i.style.colorScheme=c)}if(d)k(d);else try{let a=localStorage.getItem(b)||c,d=g&&"system"===a?window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light":a;k(d)}catch(a){}})("class","isDarkMode","system",null,["dark","light","true","false","system"],{"true":"dark","false":"light","dark":"dark","light":"light"},true,false)(function(){try{var f=null;var v=f||localStorage.getItem("isDarkMode");if(v==='true')v='dark';else if(v==='false')v='light';if(v!=='light'&&v!=='dark'&&v!=='system')v="system";document.documentElement.setAttribute("data-theme-preference",v)}catch(e){}})();Documentation IndexFetch the complete documentation index at: /llms.txtUse this file to discover all available pages before exploring further.:root{--banner-height:0px!important}(function i(a,b,c,d,e){try{let f,g,h=[];try{h=window.location.pathname.split("/").filter(a=>""!==a&&"global"!==a).slice(0,2)}catch{h=[]}let i=h.map(a=>c.find(b=>b.toLowerCase()===a.toLowerCase())).find(a=>void 0!==a),j=[];for(let c of(i?j.push(i):j.push(b),j.push("global"),j)){if(!c)continue;let b=a[c];if(b?.content){f=b.content,g=c;break}}if(!f)return void document.documentElement.setAttribute(d,"hidden");let k=!0,l=0;for(;l<localStorage.length;){let a=localStorage.key(l);if(l++,!a?.endsWith(e))continue;let b=localStorage.getItem(a);if(b&&b===f){k=!1;break}g&&(a.startsWith(`lang:${g}_`)||!a.startsWith("lang:"))&&(localStorage.removeItem(a),l--)}document.documentElement.setAttribute(d,k?"visible":"hidden")}catch(a){console.error(a),document.documentElement.setAttribute(d,"hidden")}})(
{},
"en",
[],
Recorded tool call
{
"type": "tool_call",
"seq": 42,
"ts": "2026-10-15T16:56:48.595Z",
"name": "bash",
"turn": 1,
"input": {
"command": "cd /sandbox/repo && echo \"=== docs.allium.so landing ===\"; curl -sSL -m 20 https://docs.allium.so/ 2>&1 | sed -e 's/<[^>]*>//g' | tr -s ' \\n' ' \\n' | grep -vE '^\\s*$' | head -80"
},
"run_id": "cmv9s5vv804sf0itwcc1tes4s",
"tool_id": "chatcmpl-tool-9b75964b09809e4e",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 44,
"ts": "2026-10-15T16:56:50.434Z",
"turn": 1,
"output": {
"content": [
{
"text": "=== docs.allium.so landing ===\n (function(){\n var RE = /^https?:\\/\\/leaves\\.mintlify\\.com/i;\n var to = location.origin + \"/_leaves\";\n var of = window.fetch;\n window.fetch = function(input, init){\n try {\n if (typeof input === 'string' && RE.test(input)) input = input.replace(RE, to);\n else if (input && input.url && RE.test(input.url)) input = new Request(input.url.replace(RE, to), input);\n } catch(e){}\n return of.call(this, input, init);\n };\n var oo = XMLHttpRequest.prototype.open;\n XMLHttpRequest.prototype.open = function(m, u){\n try { if (typeof u === 'string' && RE.test(u)) u = u.replace(RE, to); } catch(e){}\n return oo.apply(this, [m, u].concat([].slice.call(arguments, 2)));\n };\n })();\n.base-ui-disable-scrollbar{scrollbar-width:none}.base-ui-disable-scrollbar::-webkit-scrollbar{display:none}Introduction - Allium Documentation Hub!function(){var b=\"\";\nfunction a(p){if(p==null)return\"/\";p=\"\"+p;if(\"\"===p)return\"/\";return\"/\"===p.charAt(0)?p:\"/\"+p}\nfunction u(p){if(p==null)return p;p=\"\"+p;if(!p||p.charAt(p.length-1)===\"/\")return p.slice(0,-1);return p}\nfunction 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}\nvar p=(location.pathname||\"\").split(\"?\")[0].split(\"#\")[0]||\"\";\nif(b)if(p===b)p=\"\";else if(0===p.indexOf(b+\"/\"))p=p.substring(b.length);\np=a(p);p=u(p);p=i(p);p=\"\"===p||\"index\"===p?\"/\":a(p);\ndocument.documentElement.setAttribute(\"data-current-path\",p);\n}();if((' '+document.cookie).indexOf(' mintlify_end_user_session_hint=1')!==-1)document.documentElement.setAttribute('data-auth-pending','nav user');(() => {\n const isIOS =\n /iP(hone|ad|od)/.test(navigator.userAgent) ||\n (/Macintosh/.test(navigator.userAgent) && navigator.maxTouchPoints > 1);\n if (!isIOS) return;\n const apply = () => {\n for (const meta of document.querySelectorAll('meta[name=\"viewport\"]')) {\n const content = meta.getAttribute('content') || '';\n if (!content.includes('maximum-scale')) {\n meta.setAttribute('content', content + ', maximum-scale=1');\n }\n }\n };\n apply();\n new MutationObserver(apply).observe(document.head, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['content'],\n });\n})();!function(){\nfunction read(){try{\nvar e=performance.getEntriesByType?performance.getEntriesByType(\"navigation\"):[];\nvar st=(e[0]&&e[0].serverTiming)||[];\nvar g={};\nfor(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){}\nif(n===\"country\")g.country=d;else if(n===\"region\")g.region=d;else if(n===\"continent\")g.continent=d;}\nvar w=window;w.mintlify=w.mintlify||{};w.mintlify.geo=g;\n}catch(x){}}\nread();document.addEventListener(\"DOMContentLoaded\",read);\n}();!function(){try{\nvar w=window;w.mintlify=w.mintlify||{};\nvar q=w.mintlify.__apiPlaygroundInputsQueue;\nif(!Array.isArray(q)){q=[];w.mintlify.__apiPlaygroundInputsQueue=q;}\nw.mintlify.api=w.mintlify.api||{};\nw.mintlify.api.playground=w.mintlify.api.playground||{};\nif(typeof w.mintlify.api.playground.setServerVariables!==\"function\"){\nw.mintlify.api.playground.setServerVariables=function(v){q.push({type:\"set\",variables:v});};\n}\nif(typeof w.mintlify.api.playground.clearServerVariables!==\"function\"){\nw.mintlify.api.playground.clearServerVariables=function(){q.push({type:\"clear\"});};\n}\n}catch(e){}}();(function(){\nif(typeof CSS===\"undefined\"||!(\"registerProperty\" in CSS))return;\nif(CSS.supports&&CSS.supports(\"-webkit-backdrop-filter:none\"))return;\nvar n=[\"--scroll-area-overflow-x-start\",\"--scroll-area-overflow-x-end\",\"--scroll-area-overflow-y-start\",\"--scroll-area-overflow-y-end\"];\nvar d={\"syntax\":\"\",\"inherits\":false,\"initialValue\":\"0px\"};\nfor(var i=0;i<n.length;i++){try{CSS.registerProperty({name:n[i],syntax:d.syntax,inherits:d.inherits,initialValue:d.initialValue})}catch(e){}}\n})();(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\")}})(\n \"bannerDismissed\",\n \"data-banner-state\",\n)((a,b,c,d,e,f,g,h)=>{let i=document.documentElement,j=[\"light\",\"dark\"];function k(b){var c;(Array.isArray(a)?a:[a]).forEach(a=>{let c=\"class\"===a,d=c&&f?e.map(a=>f[a]||a):e;c?(i.classList.remove(...d),i.classList.add(f&&f[b]?f[b]:b)):i.setAttribute(a,b)}),c=b,h&&j.includes(c)&&(i.style.colorScheme=c)}if(d)k(d);else try{let a=localStorage.getItem(b)||c,d=g&&\"system\"===a?window.matchMedia(\"(prefers-color-scheme: dark)\").matches?\"dark\":\"light\":a;k(d)}catch(a){}})(\"class\",\"isDarkMode\",\"system\",null,[\"dark\",\"light\",\"true\",\"false\",\"system\"],{\"true\":\"dark\",\"false\":\"light\",\"dark\":\"dark\",\"light\":\"light\"},true,false)(function(){try{var f=null;var v=f||localStorage.getItem(\"isDarkMode\");if(v==='true')v='dark';else if(v==='false')v='light';if(v!=='light'&&v!=='dark'&&v!=='system')v=\"system\";document.documentElement.setAttribute(\"data-theme-preference\",v)}catch(e){}})();Documentation IndexFetch the complete documentation index at: /llms.txtUse this file to discover all available pages before exploring further.:root{--banner-height:0px!important}(function i(a,b,c,d,e){try{let f,g,h=[];try{h=window.location.pathname.split(\"/\").filter(a=>\"\"!==a&&\"global\"!==a).slice(0,2)}catch{h=[]}let i=h.map(a=>c.find(b=>b.toLowerCase()===a.toLowerCase())).find(a=>void 0!==a),j=[];for(let c of(i?j.push(i):j.push(b),j.push(\"global\"),j)){if(!c)continue;let b=a[c];if(b?.content){f=b.content,g=c;break}}if(!f)return void document.documentElement.setAttribute(d,\"hidden\");let k=!0,l=0;for(;l<localStorage.length;){let a=localStorage.key(l);if(l++,!a?.endsWith(e))continue;let b=localStorage.getItem(a);if(b&&b===f){k=!1;break}g&&(a.startsWith(`lang:${g}_`)||!a.startsWith(\"lang:\"))&&(localStorage.removeItem(a),l--)}document.documentElement.setAttribute(d,k?\"visible\":\"hidden\")}catch(a){console.error(a),document.documentElement.setAttribute(d,\"hidden\")}})(\n {},\n \"en\",\n [],\n",
"type": "text"
}
]
},
"run_id": "cmv9s5vv804sf0itwcc1tes4s",
"tool_id": "chatcmpl-tool-9b75964b09809e4e",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
The docs are hosted on Mintlify. There's an /llms.txt index. This is great — Mintlify docs have an llms.txt that lists all available pages. Let me fetch that to discover all the docs pages, including the developer/API docs.
The docs are on Mintlify with an /llms.txt index. Let me fetch that to discover all doc pages including the API/developer docs.
cd /sandbox/repo && curl -sSL -m 20 https://docs.allium.so/llms.txt 2>&1 | head -120
# Allium Documentation Hub
# 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 ### 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.
Recorded tool call
{
"type": "tool_call",
"seq": 48,
"ts": "2026-10-15T16:56:52.760Z",
"name": "bash",
"turn": 1,
"input": {
"command": "cd /sandbox/repo && curl -sSL -m 20 https://docs.allium.so/llms.txt 2>&1 | head -120"
},
"run_id": "cmv9s5vv804sf0itwcc1tes4s",
"tool_id": "chatcmpl-tool-be5462e89b9d255b",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 50,
"ts": "2026-10-15T16:56:55.148Z",
"turn": 1,
"output": {
"content": [
{
"text": "# Allium Documentation Hub\n\n> Allium provides production-grade blockchain data infrastructure including historical data, realtime APIs, datashares, datastreams, and AI tools across 85+ blockchains.\n\n## Welcome\n\n- [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.\n- [Product Comparison](https://docs.allium.so/product-comparison.md): Allium delivers data via five core products: Explorer, Datashares, Realtime APIs, Datastreams, and Beam.\n- [Allium Realtime APIs](https://docs.allium.so/realtime-apis.md)\n- [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.\n\n### Use Cases\n\n- [Analytics](https://docs.allium.so/use-cases/analytics.md): Query, visualize, and analyze blockchain data with Explorer and Datashares.\n- [Applications](https://docs.allium.so/use-cases/applications.md): Build and scale blockchain applications with Allium Realtime and Datastreams.\n- [Audit and Accounting](https://docs.allium.so/use-cases/accounting.md): Power transaction monitoring, data reconciliation, and financial reporting with Explorer and Datashares.\n\n### Allium App\n\n- [Overview](https://docs.allium.so/app/overview.md): A one-stop destination for all your blockchain analytics needs.\n- [Visualize results](https://docs.allium.so/app/visualisations.md): Chart and present your data through our visualization tools.\n- [Upload your own data](https://docs.allium.so/app/data-upload.md): Join your data with ours.\n\n#### Run Queries\n\n- [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.\n- [Create a parameterized query](https://docs.allium.so/app/run-queries/parameterized-query.md): Build reusable queries with configurable parameters for flexible data analysis.\n- [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.\n\n#### Manage your account\n\n- [Multi-Factor Authentication (MFA)](https://docs.allium.so/app/account-management/mfa.md): Protect your account with an extra verification step.\n\n#### Manage your team\n\n- [IP Whitelisting](https://docs.allium.so/app/organization-management/ip-whitelisting.md): Restrict login to specific IPs.\n- [Secrets](https://docs.allium.so/app/organization-management/secrets.md): Manage organization secrets for Beam pipelines and integrations.\n- [Login Session Timeout](https://docs.allium.so/app/organization-management/session-timeout.md): Limit the duration of an idle login session.\n- [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.\n- [Usage & Billing](https://docs.allium.so/app/organization-management/usage-and-billing.md): Monitor usage, view invoices, and configure overage behavior.\n- [User Management](https://docs.allium.so/app/organization-management/users.md): Manage users and roles in your organization.\n\n#### Manage your query runs\n\n- [Compute Profiles](https://docs.allium.so/app/query-management/compute-profiles.md): Choose the amount of compute resources used to run your queries.\n- [Purge Query Queue](https://docs.allium.so/app/query-management/purge-query-queue.md): Remove pending queries to clear blocked execution.\n\n### Allium Datashares\n\n- [Overview](https://docs.allium.so/datashares/overview.md): Data delivery straight to your data lake for privacy and control.\n- [Databricks](https://docs.allium.so/datashares/databricks.md): Access our blockchain data through secure Databricks Delta Sharing.\n- [Snowflake](https://docs.allium.so/datashares/snowflake.md): Access our blockchain data through secure Snowflake Shares.\n- [BigQuery](https://docs.allium.so/datashares/bigquery.md): Access Allium data in your own native GCP/BigQuery environment.\n- [BI Visualization Tools](https://docs.allium.so/datashares/bi-visualization-tools.md): Connect your preferred BI tool to visualize Allium's blockchain data.\n- [Walrus](https://docs.allium.so/datashares/walrus.md): Fetch Allium blockchain data from Walrus as encrypted quilt patches.\n\n### Allium Datastreams\n\n- [Overview](https://docs.allium.so/datastreams/overview.md): Realtime, low-latency data streaming to your data lake of choice.\n- [Apache Kafka](https://docs.allium.so/datastreams/kafka.md): Integrate Allium's realtime data streams via Apache Kafka.\n- [Google Pub/Sub](https://docs.allium.so/datastreams/pubsub.md): Integrate Allium's realtime data streams via Google Cloud Pub/Sub.\n- [Amazon SNS](https://docs.allium.so/datastreams/sns.md): Integrate Allium's realtime data streams via Amazon Simple Notification Service.\n- [Websockets](https://docs.allium.so/datastreams/websockets.md): Access Allium's APIs and data streams through websockets for real-time data delivery.\n- [Transformations](https://docs.allium.so/datastreams/transformations.md): Turn raw blockchain streams into actionable signals by applying transformations on Allium streams.\n\n### Allium Beam\n\n- [Overview](https://docs.allium.so/beam/overview.md): Build filtered, realtime blockchain data pipelines and deploy them in seconds, with no infrastructure to manage.\n- [Quickstart](https://docs.allium.so/beam/quickstart.md): Create, deploy, and consume your first Beam pipeline in minutes.\n- [Configuration reference](https://docs.allium.so/beam/configuration.md): Configure Beam pipeline sources, transforms, and sinks in the Allium App.\n- [Webhook authentication](https://docs.allium.so/beam/webhook-authentication.md): Verify that incoming webhook requests came from Beam, with replay protection.\n- [Permissions](https://docs.allium.so/beam/permissions.md): Roles and access levels that control who can view, edit, and manage a Beam pipeline.\n- [Examples](https://docs.allium.so/beam/examples.md): Pipeline configuration examples for common Beam use cases.\n\n### Allium Nodes\n\n- [Overview](https://docs.allium.so/nodes/overview.md): Direct peer access to blockchain nodes Allium already runs — no node operations on your side.\n- [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.\n\n## Allium AI\n\n### Updates\n\n- [What's new](https://docs.allium.so/ai/whats-new.md): Releases and improvements to the Allium AI Assistant and Allium MCP, by month.\n\n### Assistant\n\n- [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.\n- [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.\n- [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.\n- [Examples](https://docs.allium.so/ai/assistant/examples.md): End-to-end workflow walkthroughs showing the Assistant's multi-step reasoning.\n- [Organization memory](https://docs.allium.so/ai/assistant/memory.md): Persistent context shared across all users in your organization.\n\n### MCP\n\n- [Overview](https://docs.allium.so/ai/mcp/overview.md): Query blockchain data from Allium Explorer using MCP.\n- [Plugins](https://docs.allium.so/ai/mcp/plugins.md): Install the allium-analyst plugin to give your agent a query methodology for Allium data.\n- [Examples](https://docs.allium.so/ai/mcp/examples.md): See what you can build with Allium's MCP Server.\n\n#### Tools\n\n- [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.\n- [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.\n- [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.\n- [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.\n- [Realtime data](https://docs.allium.so/ai/mcp/tools-reference/realtime.md): Prices, balances, transactions, DeFi positions, holdings PnL, tokens, and assets, without SQL.\n- [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.\n- [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.\n- [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.\n\n### Machine Payments\n\n- [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.\n- [Endpoints & Pricing](https://docs.allium.so/ai/machine-payments/endpoints-pricing.md): All payment-enabled endpoints, pricing, rate limits, and error codes.\n- [x402](https://docs.allium.so/ai/machine-payments/x402.md): Full manual control over 402 payment negotiation, EIP-712 signing, and USDC settlement.\n- [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.\n- [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.\n\n- [Data Catalog (5812 pages)](https://docs.allium.so/_llms/data-catalog.txt): Documentation for Data Catalog.\n\n",
"type": "text"
}
]
},
"run_id": "cmv9s5vv804sf0itwcc1tes4s",
"tool_id": "chatcmpl-tool-be5462e89b9d255b",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
This is very informative. Allium has several products. The most interesting for a developer-friendly, no-signup workflow is "Machine Payments":
Machine Payments: Pay-per-call blockchain data access with USDC — no API key, no registration, no subscription.
This is a pay-per-call blockchain data access with USDC — no API key, no registration, no subscription. This is a machine-to-machine payment protocol (x402 / Tempo MPP) for AI agents and developers.
This is exactly a developer workflow I can act on... except it requires USDC payments (crypto). Let me think about the instructions:
- "Stay light: use the hosted product through its SDK or API."
- "Do not start local service stacks or wait for long-running commands."
- "If this product has no developer workflow you can act on, say so plainly and stop."
The Machine Payments route requires USDC/crypto wallet to actually pay. That's a real barrier — I can't fund a USDC wallet in a sandbox. But let me look deeper. Maybe there's a free tier or the x402 flow. Also there's "Realtime APIs" which needs an API key (registration).
Let me carefully read:
- The Machine Payments overview and endpoints-pricing (this tells pricing!)
- The realtime-apis.md
- product-comparison.md
The user asked: "Tell me how pricing works, and briefly tell me whether this product will be easy for you to manage."
Pricing: There are two pricing models apparently:
- Enterprise (subscription, contact sales) — /pricing redirects to /contact
- Machine Payments: pay-per-call with USDC (x402 protocol)
- Usage & Billing for the App (credits, overage)
Let me read the key docs. Let me fetch the markdown versions (Mintlify serves .md).
Let me get:
- https://docs.allium.so/api/developer/machine-payments.md
- https://docs.allium.so/ai/machine-payments/overview.md
- https://docs.allium.so/ai/machine-payments/endpoints-pricing.md
- https://docs.allium.so/realtime-apis.md
- https://docs.allium.so/product-comparison.md
Let me fetch these.
Excellent — this reveals a developer-friendly path: Machine Payments ("Pay-per-call blockchain data access with USDC — no API key, no registration, no subscription"), built for AI agents via x402/Tempo MPP. Let me read the key docs: pricing, machine payments, and realtime APIs.
cd /sandbox/repo && for p in "api/developer/machine-payments" "ai/machine-payments/overview" "ai/machine-payments/endpoints-pricing"; do echo "======== $p ========"; curl -sSL -m 20 "https://docs.allium.so/$p.md" 2>&1 | head -200; echo; 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>
======== ai/machine-payments/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.
# 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>
======== 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 |
Recorded tool call
{
"type": "tool_call",
"seq": 54,
"ts": "2026-10-15T16:57:02.740Z",
"name": "bash",
"turn": 1,
"input": {
"command": "cd /sandbox/repo && for p in \"api/developer/machine-payments\" \"ai/machine-payments/overview\" \"ai/machine-payments/endpoints-pricing\"; do echo \"======== $p ========\"; curl -sSL -m 20 \"https://docs.allium.so/$p.md\" 2>&1 | head -200; echo; done"
},
"run_id": "cmv9s5vv804sf0itwcc1tes4s",
"tool_id": "chatcmpl-tool-b33924e69f6d6d77",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 55,
"ts": "2026-10-15T16:57:04.519Z",
"turn": 1,
"output": {
"content": [
{
"text": "======== api/developer/machine-payments ========\n> ## Documentation Index\n> Fetch the complete documentation index at: https://docs.allium.so/llms.txt\n> Use this file to discover all available pages before exploring further.\n\n# Machine Payments\n\n> Pay-per-call blockchain data access with USDC — no API key, no registration, no subscription.\n\nMachine 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.\n\n<CardGroup cols={2}>\n <Card title=\"No API Key\" icon=\"key\">\n No registration or key management. Your wallet is your identity.\n </Card>\n\n <Card title=\"Pay Per Call\" icon=\"credit-card\">\n Only pay for what you use. Prices start at \\$0.001 per request.\n </Card>\n\n <Card title=\"Agent-Native\" icon=\"robot\">\n Built for AI agents — autonomous payments with no human in the loop.\n </Card>\n\n <Card title=\"Gasless Payments\" icon=\"coins\">\n Allium handles onchain settlement. Users only need USDC, not ETH.\n </Card>\n</CardGroup>\n\n## How It Works\n\nBoth protocols use HTTP status code `402 Payment Required` to negotiate payments inline with API requests. The difference is how much your client handles automatically.\n\n<Steps>\n <Step title=\"Send request\">\n Make a normal API request to any payment-enabled endpoint.\n </Step>\n\n <Step title=\"Receive 402\">\n The server responds with `402 Payment Required` and payment options.\n </Step>\n\n <Step title=\"Sign and pay\">\n Your client signs a USDC payment authorization and retries the request.\n </Step>\n\n <Step title=\"Get data\">\n Payment confirmed — you receive your data with a `200` response.\n </Step>\n</Steps>\n\n## Tempo MPP\n\nTempo 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.\n\n```python theme={null}\nfrom mpp.client import Client\r\nfrom mpp.methods.tempo import tempo, TempoAccount, ChargeIntent\r\nfrom mpp.methods.tempo._defaults import TESTNET_RPC_URL, TESTNET_CHAIN_ID\r\nimport os\r\n\r\naccount = TempoAccount.from_key(os.getenv(\"YOUR_PRIVATE_KEY\"))\r\n\r\nasync with Client(methods=[\r\n tempo(\r\n account=account,\r\n rpc_url=TESTNET_RPC_URL,\r\n intents={\"charge\": ChargeIntent()},\r\n )\r\n]) as client:\r\n response = await client.post(\r\n \"https://agents.allium.so/api/v1/developer/prices\",\r\n json=[{\"chain\": \"solana\", \"token_address\": \"So11111111111111111111111111111111111111112\"}],\r\n )\r\n print(response.json())\n```\n\n<Card title=\"Tempo MPP\" icon=\"bolt\" href=\"/ai/machine-payments/tempo-mpp\">\n Full setup guide, supported networks, and implementation details\n</Card>\n\n## x402\n\nx402 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.\n\n<Card title=\"x402\" icon=\"credit-card\" href=\"/ai/machine-payments/x402\">\n Full setup guide with Privy wallet integration, EIP-712 signing, and implementation\n</Card>\n\n## Agent Integration\n\nDon't want to write any payment code? Install pre-built agent skills and let your AI agent handle everything:\n\n```bash theme={null}\nnpx skills add allium-labs/skills --yes\n```\n\n<Card title=\"Agent Skills\" icon=\"wand-magic-sparkles\" href=\"/ai/machine-payments/agent-skills\">\n Set up machine payments with AI agents in one command\n</Card>\n\n## All Endpoints & Pricing\n\n<Card title=\"Endpoints & Pricing\" icon=\"code\" href=\"/ai/machine-payments/endpoints-pricing\">\n All payment-enabled endpoints, pricing, rate limits, and error codes\n</Card>\n\n======== ai/machine-payments/overview ========\n> ## Documentation Index\n> Fetch the complete documentation index at: https://docs.allium.so/llms.txt\n> Use this file to discover all available pages before exploring further.\n\n# Overview\n\n> Machine payment protocols for AI agents and developers to access Allium's blockchain data with USDC.\n\nMachine 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.\n\nAllium supports two machine payment protocols:\n\n| | **Tempo MPP** | **x402** |\n| - | - | - |\n| **Complexity** | One function call | Manual 402 flow |\n| **Best for** | Quick integration, agents | Full control, custom signing |\n| **Setup** | Install SDK + private key | Privy wallet + signing logic |\n\n## Protocols\n\n<CardGroup cols={2}>\n <Card title=\"Tempo MPP\" icon=\"bolt\" href=\"/ai/machine-payments/tempo-mpp\">\n The simplest path — one function call handles the entire payment flow\n </Card>\n\n <Card title=\"x402\" icon=\"credit-card\" href=\"/ai/machine-payments/x402\">\n Full manual control over 402 negotiation, EIP-712 signing, and payment\n </Card>\n</CardGroup>\n\n## Agent Skills\n\nDon't want to manage payment code? Install pre-built agent skills and let your AI agent query blockchain data with automatic payment.\n\n<Card title=\"Agent Skills\" icon=\"wand-magic-sparkles\" href=\"/ai/machine-payments/agent-skills\">\n Set up machine payments with AI agents in one command\n</Card>\n\n## Endpoints & Pricing\n\n<Card title=\"Endpoints & Pricing\" icon=\"code\" href=\"/ai/machine-payments/endpoints-pricing\">\n All payment-enabled endpoints, pricing, rate limits, and error codes\n</Card>\n\n======== ai/machine-payments/endpoints-pricing ========\n> ## Documentation Index\n> Fetch the complete documentation index at: https://docs.allium.so/llms.txt\n> Use this file to discover all available pages before exploring further.\n\n# Endpoints & Pricing\n\n> All payment-enabled endpoints, pricing, rate limits, and error codes.\n\nAll 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.\n\n## Install allium-cli\n\nCLI commands require **[allium-cli](https://github.com/Allium-Science/allium-cli)**:\n\n```bash theme={null}\ncurl -sSL https://agents.allium.so/cli/install.sh | sh\n```\n\n## Supported Chains Discovery\n\nCheck which chains each endpoint supports. **This endpoint is free** — no payment required.\n\n```bash theme={null}\ncurl \"https://agents.allium.so/api/v1/supported-chains/realtime-apis/simple\"\n```\n\nReturns a map of endpoint path to supported chain names. Call once per session and cache the result.\n\n***\n\n## Realtime API\n\n### Prices\n\n| CLI Command | Method | Endpoint | Cost | Description |\n| - | - | - | - | - |\n| `allium realtime prices latest` | POST | `/api/v1/developer/prices` | \\$0.02 | Get latest token prices |\n| `allium realtime prices at-timestamp` | POST | `/api/v1/developer/prices/at-timestamp` | \\$0.02 | Get token prices at a specific time |\n| `allium realtime prices history` | POST | `/api/v1/developer/prices/history` | \\$0.02 | Get historical token price series |\n| `allium realtime prices stats` | POST | `/api/v1/developer/prices/stats` | \\$0.02 | Get token price statistics |\n\n### Tokens\n\n| CLI Command | Method | Endpoint | Cost | Description |\n| - | - | - | - | - |\n| `allium realtime tokens search` | GET | `/api/v1/developer/tokens/search` | \\$0.03 | Search tokens by name or symbol |\n| `allium realtime tokens chain-address` | POST | `/api/v1/developer/tokens/chain-address` | \\$0.02 | Look up tokens by chain and address |\n| `allium realtime tokens list` | GET | `/api/v1/developer/tokens` | \\$0.03 | List all supported tokens |\n\n### Wallets\n\n| CLI Command | Method | Endpoint | Cost | Description |\n| - | - | - | - | - |\n| `allium realtime balances latest` | POST | `/api/v1/developer/wallet/balances` | \\$0.03 | Get current wallet token balances |\n| `allium realtime balances history` | POST | `/api/v1/developer/wallet/balances/history` | \\$0.03 | Get historical wallet balances |\n| `allium realtime transactions` | POST | `/api/v1/developer/wallet/transactions` | \\$0.03 | Get wallet transaction history |\n| `allium realtime pnl` | POST | `/api/v1/developer/wallet/pnl` | \\$0.03 | Get wallet profit and loss |\n\n***\n\n## Explorer API\n\nThe 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.\n\n| CLI Command | Method | Endpoint | Cost | Auth | Description |\n| - | - | - | - | - | - |\n| `allium explorer run-sql` | POST | `/api/v1/explorer/queries/run-async` | \\$0.01 | Machine payments | Submit raw SQL for async execution |\n| `allium explorer run` | POST | `/api/v1/explorer/queries/{query_id}/run-async` | \\$0.01 | API key | Run a saved query asynchronously |\n| `allium explorer status` | GET | `/api/v1/explorer/query-runs/{run_id}/status` | \\$0.01 | API key | Check status of a query run |\n| `allium explorer results` | GET | `/api/v1/explorer/query-runs/{run_id}/results` | dynamic | API key | Fetch results of a completed query |\n\n***\n\n## Supported Networks\n\n| Protocol | Network | USDC Address |\n| - | - | - |\n| **Tempo MPP** | Tempo (mainnet) | `0x20c000000000000000000000b9537d11c60e8b50` |\n| **x402** | Base (mainnet) | `0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913` |\n| **x402** | Polygon (mainnet) | `0x3c499c542cEF5E3811e1192ce70d8cc03d5c3359` |\n| **x402** | Solana (mainnet) | `EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v` |\n| **x402** | X Layer (mainnet) | `0x74b7f16337b8972027f6196a17a631ac6de26d22` |\n\n## Rate Limits\n\nTwo independent rate limit buckets per wallet. You can max out both simultaneously.\n\n| Bucket | Endpoints | Limit |\n| - | - | - |\n| **Data** | All `/developer/` endpoints | 3 requests/second |\n| **Docs** | All `/docs/` endpoints | 5 requests/second |\n\nExceeding either limit returns HTTP `429`. Wait 1 second before retrying.\n\n***\n\n## Error Codes\n\n| Status | Meaning | What to Do |\n| - | - | - |\n| 400 | Bad request | Check JSON syntax |\n| 402 | Payment required | Sign the payment and retry (handled automatically by [Tempo MPP](/ai/machine-payments/tempo-mpp)) |\n| 422 | Validation failed | Check request format |\n| 429 | Rate limited | Back off for 1 second |\n| 500 | Server error | Retry with exponential backoff |\n\n",
"type": "text"
}
]
},
"run_id": "cmv9s5vv804sf0itwcc1tes4s",
"tool_id": "chatcmpl-tool-b33924e69f6d6d77",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
Now I have very good pricing info. Let me summarize what I've learned:
Pricing: Two models:
- Enterprise/subscription (the Allium App, Terminal, Explorer, Datashares, Datastreams) — sales-gated (
/pricing→/contact), credits-based with overage behavior (Usage & Billing doc). - Machine Payments (pay-per-call) — this is the developer/agent-friendly path:
- No API key, no registration, no subscription.
- Prices start at $0.001 per request (marketing), specific endpoints:
- Prices: $0.02/request
- Tokens search/list: $0.03; chain-address: $0.02
- Wallet balances/transactions/pnl: $0.03
- Explorer run-sql: $0.01
- Supported-chains discovery endpoint: FREE
- Pay with USDC via Tempo MPP or x402.
- Rate limits: Data 3 req/s, Docs 5 req/s.
- Gasless: Allium handles onchain settlement; you only need USDC, not ETH.
Now, there IS a developer workflow I can act on: the free supported-chains endpoint requires no payment. Let me verify by actually calling it. That's a great way to demonstrate a "simple example" without needing crypto.
But the actual paid endpoints require USDC in a wallet. That's the blocker for a full end-to-end example — I can't fund a wallet with real USDC in this sandbox, and doing crypto payments would be a real-money action I shouldn't take autonomously.
However, I can:
- Call the FREE supported-chains endpoint (no payment) — demonstrates the API works.
- Demonstrate the 402 payment-required flow by making a request to a paid endpoint WITHOUT payment — this shows the negotiation without spending money. This is "staying light."
- Build a small, self-contained example client (Python or Node) that wraps the Tempo MPP flow, ready to run when the user supplies a private key + USDC.
Let me also check the "agent-skills" doc and the tempo-mpp doc, plus the CLI. And let me verify the free endpoint actually works from here.
Let me be careful about the instructions:
- "Do not start local service stacks or wait for long-running commands; if the quickstart requires either, say so plainly and stop." — The quickstart here does NOT require a local service stack. It's a hosted API. Good. The
npx skills addandcurl install.sh | share quick installs, not long-running services. But I should be cautious aboutcurl | sh(piping to shell) — that's a security consideration. I won't run that blindly. - "Stay light: use the hosted product through its SDK or API." — Yes, machine payments API is perfect.
Let me test the free endpoint and the 402 flow (without paying). Let me also read tempo-mpp.md and agent-skills.md.
Let me do these in parallel.
I now have clear pricing info. Let me verify the live API works (the free endpoint needs no payment) and inspect the 402 payment flow, plus read the Tempo MPP and Agent Skills docs.
cd /sandbox/repo && echo "=== FREE supported-chains endpoint (no payment) ==="; curl -sS -m 20 -w "\nHTTP %{http_code}\n" "https://agents.allium.so/api/v1/supported-chains/realtime-apis/simple" 2>&1 | head -40=== FREE supported-chains endpoint (no payment) ===
=== FREE supported-chains endpoint (no payment) ===
{"/api/v1/developer/wallet/balances/history":["arbitrum","avalanche","bsc","base","bitcoin","celo","ethereum","near","optimism","polygon","robinhood","solana","stellar","unichain","x_layer"],"/api/v1/developer/wallet/balances":["arbitrum","arc","avalanche","bsc","base","bitcoin","celo","ethereum","hyperevm","monad","near","optimism","polygon","robinhood","solana","stellar","unichain","x_layer","xdc_network"],"/api/v1/developer/wallet/transactions":["arbitrum","arc","avalanche","bsc","base","bitcoin","celo","ethereum","hyperevm","monad","near","optimism","polygon","robinhood","solana","stellar","unichain","x_layer","xdc_network"],"/api/v1/developer/wallet/pnl":["arbitrum","avalanche","bsc","base","bitcoin","celo","ethereum","hyperevm","monad","optimism","polygon","robinhood","solana","unichain","x_layer","zksync"],"/api/v1/developer/wallet/pnl/history":["arbitrum","avalanche","bsc","base","bitcoin","celo","ethereum","hyperevm","monad","optimism","polygon","robinhood","solana","unichain","x_layer","zksync"],"/api/v1/developer/wallet/pnl-by-token":["arbitrum","avalanche","bsc","base","bitcoin","celo","ethereum","hyperevm","monad","optimism","polygon","robinhood","solana","unichain","x_layer","zksync"],"/api/v1/developer/wallet/pnl-by-token/history":["arbitrum","avalanche","bsc","base","bitcoin","celo","ethereum","hyperevm","monad","optimism","polygon","robinhood","solana","unichain","x_layer","zksync"],"/api/v1/developer/wallet/holdings/history":["arbitrum","avalanche","bsc","base","bitcoin","celo","ethereum","hyperevm","monad","optimism","polygon","solana","unichain","zksync"],"/api/v1/developer/prices/history":["arbitrum","avalanche","bsc","base","celo","ethereum","hyperevm","optimism","polygon","robinhood","solana","unichain","zksync"],"/api/v1/developer/prices":["arbitrum","avalanche","bsc","base","celo","ethereum","hyperevm","optimism","polygon","robinhood","solana","unichain","zksync"],"/api/v1/developer/prices/stats":["arbitrum","avalanche","bsc","base","celo","ethereum","hyperevm","optimism","polygon","robinhood","solana","unichain","zksync"],"/api/v1/developer/prices/at-timestamp":["arbitrum","avalanche","bsc","base","celo","ethereum","hyperevm","optimism","polygon","robinhood","solana","unichain","zksync"],"/api/v1/developer/tokens/chain-address":["arbitrum","bsc","base","bitcoin","dogecoin","ethereum","hyperevm","optimism","polygon","robinhood","solana","stellar"],"/api/v1/developer/tokens/transfers":["arbitrum","arc","avalanche","bsc","base","celo","ethereum","hyperevm","monad","optimism","polygon","robinhood","solana","stellar","unichain","x_layer","xdc_network","zksync"],"/api/v1/developer/tokens":["arbitrum","bsc","base","bitcoin","dogecoin","ethereum","hyperevm","optimism","polygon","robinhood","solana","stellar"],"/api/v1/developer/tokens/search":["arbitrum","bsc","base","bitcoin","dogecoin","ethereum","hyperevm","optimism","polygon","robinhood","solana","stellar"],"/api/v1/developer/assets":["arbitrum","base","ethereum","optimism","polygon","solana"],"/api/v1/developer/assets/batch":["arbitrum","base","ethereum","optimism","polygon","solana"],"/api/v1/developer/trading/hyperliquid/info/fills":["hyperevm"],"/api/v1/developer/trading/hyperliquid/info/order/history":["hyperevm"],"/api/v1/developer/trading/hyperliquid/info/order/status":["hyperevm"],"/api/v1/developer/trading/hyperliquid/info":["hyperevm"],"/api/v1/developer/wallet/positions":["arbitrum","avalanche","bsc","base","celo","ethereum","hyperliquid","hyperevm","monad","optimism","polygon","solana","unichain","x_layer"]}
HTTP 200
Recorded tool call
{
"type": "tool_call",
"seq": 59,
"ts": "2026-10-15T16:57:17.326Z",
"name": "bash",
"turn": 1,
"input": {
"command": "cd /sandbox/repo && echo \"=== FREE supported-chains endpoint (no payment) ===\"; curl -sS -m 20 -w \"\\nHTTP %{http_code}\\n\" \"https://agents.allium.so/api/v1/supported-chains/realtime-apis/simple\" 2>&1 | head -40"
},
"run_id": "cmv9s5vv804sf0itwcc1tes4s",
"tool_id": "chatcmpl-tool-9b0d3d53b668ab67",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 65,
"ts": "2026-10-15T16:57:17.717Z",
"turn": 1,
"output": {
"content": [
{
"text": "=== FREE supported-chains endpoint (no payment) ===\n{\"/api/v1/developer/wallet/balances/history\":[\"arbitrum\",\"avalanche\",\"bsc\",\"base\",\"bitcoin\",\"celo\",\"ethereum\",\"near\",\"optimism\",\"polygon\",\"robinhood\",\"solana\",\"stellar\",\"unichain\",\"x_layer\"],\"/api/v1/developer/wallet/balances\":[\"arbitrum\",\"arc\",\"avalanche\",\"bsc\",\"base\",\"bitcoin\",\"celo\",\"ethereum\",\"hyperevm\",\"monad\",\"near\",\"optimism\",\"polygon\",\"robinhood\",\"solana\",\"stellar\",\"unichain\",\"x_layer\",\"xdc_network\"],\"/api/v1/developer/wallet/transactions\":[\"arbitrum\",\"arc\",\"avalanche\",\"bsc\",\"base\",\"bitcoin\",\"celo\",\"ethereum\",\"hyperevm\",\"monad\",\"near\",\"optimism\",\"polygon\",\"robinhood\",\"solana\",\"stellar\",\"unichain\",\"x_layer\",\"xdc_network\"],\"/api/v1/developer/wallet/pnl\":[\"arbitrum\",\"avalanche\",\"bsc\",\"base\",\"bitcoin\",\"celo\",\"ethereum\",\"hyperevm\",\"monad\",\"optimism\",\"polygon\",\"robinhood\",\"solana\",\"unichain\",\"x_layer\",\"zksync\"],\"/api/v1/developer/wallet/pnl/history\":[\"arbitrum\",\"avalanche\",\"bsc\",\"base\",\"bitcoin\",\"celo\",\"ethereum\",\"hyperevm\",\"monad\",\"optimism\",\"polygon\",\"robinhood\",\"solana\",\"unichain\",\"x_layer\",\"zksync\"],\"/api/v1/developer/wallet/pnl-by-token\":[\"arbitrum\",\"avalanche\",\"bsc\",\"base\",\"bitcoin\",\"celo\",\"ethereum\",\"hyperevm\",\"monad\",\"optimism\",\"polygon\",\"robinhood\",\"solana\",\"unichain\",\"x_layer\",\"zksync\"],\"/api/v1/developer/wallet/pnl-by-token/history\":[\"arbitrum\",\"avalanche\",\"bsc\",\"base\",\"bitcoin\",\"celo\",\"ethereum\",\"hyperevm\",\"monad\",\"optimism\",\"polygon\",\"robinhood\",\"solana\",\"unichain\",\"x_layer\",\"zksync\"],\"/api/v1/developer/wallet/holdings/history\":[\"arbitrum\",\"avalanche\",\"bsc\",\"base\",\"bitcoin\",\"celo\",\"ethereum\",\"hyperevm\",\"monad\",\"optimism\",\"polygon\",\"solana\",\"unichain\",\"zksync\"],\"/api/v1/developer/prices/history\":[\"arbitrum\",\"avalanche\",\"bsc\",\"base\",\"celo\",\"ethereum\",\"hyperevm\",\"optimism\",\"polygon\",\"robinhood\",\"solana\",\"unichain\",\"zksync\"],\"/api/v1/developer/prices\":[\"arbitrum\",\"avalanche\",\"bsc\",\"base\",\"celo\",\"ethereum\",\"hyperevm\",\"optimism\",\"polygon\",\"robinhood\",\"solana\",\"unichain\",\"zksync\"],\"/api/v1/developer/prices/stats\":[\"arbitrum\",\"avalanche\",\"bsc\",\"base\",\"celo\",\"ethereum\",\"hyperevm\",\"optimism\",\"polygon\",\"robinhood\",\"solana\",\"unichain\",\"zksync\"],\"/api/v1/developer/prices/at-timestamp\":[\"arbitrum\",\"avalanche\",\"bsc\",\"base\",\"celo\",\"ethereum\",\"hyperevm\",\"optimism\",\"polygon\",\"robinhood\",\"solana\",\"unichain\",\"zksync\"],\"/api/v1/developer/tokens/chain-address\":[\"arbitrum\",\"bsc\",\"base\",\"bitcoin\",\"dogecoin\",\"ethereum\",\"hyperevm\",\"optimism\",\"polygon\",\"robinhood\",\"solana\",\"stellar\"],\"/api/v1/developer/tokens/transfers\":[\"arbitrum\",\"arc\",\"avalanche\",\"bsc\",\"base\",\"celo\",\"ethereum\",\"hyperevm\",\"monad\",\"optimism\",\"polygon\",\"robinhood\",\"solana\",\"stellar\",\"unichain\",\"x_layer\",\"xdc_network\",\"zksync\"],\"/api/v1/developer/tokens\":[\"arbitrum\",\"bsc\",\"base\",\"bitcoin\",\"dogecoin\",\"ethereum\",\"hyperevm\",\"optimism\",\"polygon\",\"robinhood\",\"solana\",\"stellar\"],\"/api/v1/developer/tokens/search\":[\"arbitrum\",\"bsc\",\"base\",\"bitcoin\",\"dogecoin\",\"ethereum\",\"hyperevm\",\"optimism\",\"polygon\",\"robinhood\",\"solana\",\"stellar\"],\"/api/v1/developer/assets\":[\"arbitrum\",\"base\",\"ethereum\",\"optimism\",\"polygon\",\"solana\"],\"/api/v1/developer/assets/batch\":[\"arbitrum\",\"base\",\"ethereum\",\"optimism\",\"polygon\",\"solana\"],\"/api/v1/developer/trading/hyperliquid/info/fills\":[\"hyperevm\"],\"/api/v1/developer/trading/hyperliquid/info/order/history\":[\"hyperevm\"],\"/api/v1/developer/trading/hyperliquid/info/order/status\":[\"hyperevm\"],\"/api/v1/developer/trading/hyperliquid/info\":[\"hyperevm\"],\"/api/v1/developer/wallet/positions\":[\"arbitrum\",\"avalanche\",\"bsc\",\"base\",\"celo\",\"ethereum\",\"hyperliquid\",\"hyperevm\",\"monad\",\"optimism\",\"polygon\",\"solana\",\"unichain\",\"x_layer\"]}\nHTTP 200\n",
"type": "text"
}
]
},
"run_id": "cmv9s5vv804sf0itwcc1tes4s",
"tool_id": "chatcmpl-tool-9b0d3d53b668ab67",
"is_error": false,
"tool_kind": "shell"
}cd /sandbox/repo && echo "=== Unpaid call to a PAID endpoint (expect 402 negotiation, NO money spent) ==="; curl -sS -m 20 -w "\nHTTP %{http_code}\n" -X POST "https://agents.allium.so/api/v1/developer/prices" -H "Content-Type: application/json" -d '[{"chain":"solana","token_address":"So11111111111111111111111111111111111111112"}]' 2>&1 | head -60=== Unpaid call to a PAID endpoint (expect 402 negotiation, NO money spent) ===
=== Unpaid call to a PAID endpoint (expect 402 negotiation, NO money spent) ===
{"x402Version":2,"error":"Payment Required!","accepts":[{"scheme":"exact","network":"eip155:8453","amount":"20000","payTo":"0xb08fe9f96593ff366771b5feee97ec095a380c95","maxTimeoutSeconds":1792083498,"asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","extra":{"stripe_payment_intent_id":"pi_3UQrxxIfpVe57BNU2eXR0QW2","stripe_mode":"custody","name":"USD Coin","version":"2"}},{"scheme":"exact","network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","amount":"20000","payTo":"AM9C8Rq8ywokWtwZqRySP4cXhbqcArB9zczT2jJn4VRu","maxTimeoutSeconds":1792083498,"asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","extra":{"stripe_payment_intent_id":"pi_3UQrxxIfpVe57BNU2eXR0QW2","stripe_mode":"custody","name":"USDC","version":"2","feePayer":"Hc3sdEAsCGQcpgfivywog9uwtk8gUBUZgsxdME1EJy88"}},{"scheme":"exact","network":"eip155:196","amount":"20000","payTo":"0x61Fdbe66c1AEaF491b8e121C83070aa750DDCada","maxTimeoutSeconds":1792083498,"asset":"0x74b7f16337b8972027f6196a17a631ac6de26d22","extra":{"name":"USD Coin","version":"2"}},{"scheme":"exact","network":"eip155:137","amount":"20000","payTo":"0xF5B59aA4D23621B382Ac56465e2a78432CE768CA","maxTimeoutSeconds":1792083498,"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"]}}}}
HTTP 402
Recorded tool call
{
"type": "tool_call",
"seq": 61,
"ts": "2026-10-15T16:57:17.326Z",
"name": "bash",
"turn": 1,
"input": {
"command": "cd /sandbox/repo && echo \"=== Unpaid call to a PAID endpoint (expect 402 negotiation, NO money spent) ===\"; curl -sS -m 20 -w \"\\nHTTP %{http_code}\\n\" -X POST \"https://agents.allium.so/api/v1/developer/prices\" -H \"Content-Type: application/json\" -d '[{\"chain\":\"solana\",\"token_address\":\"So11111111111111111111111111111111111111112\"}]' 2>&1 | head -60"
},
"run_id": "cmv9s5vv804sf0itwcc1tes4s",
"tool_id": "chatcmpl-tool-908e01fb87d9aadd",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 67,
"ts": "2026-10-15T16:57:19.622Z",
"turn": 1,
"output": {
"content": [
{
"text": "=== Unpaid call to a PAID endpoint (expect 402 negotiation, NO money spent) ===\n{\"x402Version\":2,\"error\":\"Payment Required!\",\"accepts\":[{\"scheme\":\"exact\",\"network\":\"eip155:8453\",\"amount\":\"20000\",\"payTo\":\"0xb08fe9f96593ff366771b5feee97ec095a380c95\",\"maxTimeoutSeconds\":1792083498,\"asset\":\"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\",\"extra\":{\"stripe_payment_intent_id\":\"pi_3UQrxxIfpVe57BNU2eXR0QW2\",\"stripe_mode\":\"custody\",\"name\":\"USD Coin\",\"version\":\"2\"}},{\"scheme\":\"exact\",\"network\":\"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp\",\"amount\":\"20000\",\"payTo\":\"AM9C8Rq8ywokWtwZqRySP4cXhbqcArB9zczT2jJn4VRu\",\"maxTimeoutSeconds\":1792083498,\"asset\":\"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\",\"extra\":{\"stripe_payment_intent_id\":\"pi_3UQrxxIfpVe57BNU2eXR0QW2\",\"stripe_mode\":\"custody\",\"name\":\"USDC\",\"version\":\"2\",\"feePayer\":\"Hc3sdEAsCGQcpgfivywog9uwtk8gUBUZgsxdME1EJy88\"}},{\"scheme\":\"exact\",\"network\":\"eip155:196\",\"amount\":\"20000\",\"payTo\":\"0x61Fdbe66c1AEaF491b8e121C83070aa750DDCada\",\"maxTimeoutSeconds\":1792083498,\"asset\":\"0x74b7f16337b8972027f6196a17a631ac6de26d22\",\"extra\":{\"name\":\"USD Coin\",\"version\":\"2\"}},{\"scheme\":\"exact\",\"network\":\"eip155:137\",\"amount\":\"20000\",\"payTo\":\"0xF5B59aA4D23621B382Ac56465e2a78432CE768CA\",\"maxTimeoutSeconds\":1792083498,\"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\"]}}}}\nHTTP 402\n",
"type": "text"
}
]
},
"run_id": "cmv9s5vv804sf0itwcc1tes4s",
"tool_id": "chatcmpl-tool-908e01fb87d9aadd",
"is_error": false,
"tool_kind": "shell"
}cd /sandbox/repo && echo "==== tempo-mpp.md ===="; curl -sSL -m 20 "https://docs.allium.so/ai/machine-payments/tempo-mpp.md" 2>&1 | head -160
==== tempo-mpp.md ====
==== tempo-mpp.md ====
> ## 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.
Recorded tool call
{
"type": "tool_call",
"seq": 63,
"ts": "2026-10-15T16:57:17.326Z",
"name": "bash",
"turn": 1,
"input": {
"command": "cd /sandbox/repo && echo \"==== tempo-mpp.md ====\"; curl -sSL -m 20 \"https://docs.allium.so/ai/machine-payments/tempo-mpp.md\" 2>&1 | head -160"
},
"run_id": "cmv9s5vv804sf0itwcc1tes4s",
"tool_id": "chatcmpl-tool-a18c5868716204fe",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 66,
"ts": "2026-10-15T16:57:17.717Z",
"turn": 1,
"output": {
"content": [
{
"text": "==== tempo-mpp.md ====\n> ## Documentation Index\n> Fetch the complete documentation index at: https://docs.allium.so/llms.txt\n> Use this file to discover all available pages before exploring further.\n\n# Tempo MPP\n\n> The simplest way to make paid API calls — one function call handles the entire 402 payment flow.\n\nTempo 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.\n\n## Quickstart with Agent\n\nThe fastest way to get started — let your AI agent handle setup and payments for you.\n\n<Steps>\n <Step title=\"Install allium-cli\">\n ```bash theme={null}\n curl -sSL https://agents.allium.so/cli/install.sh | sh\n ```\n\n <Warning>\n [allium-cli](https://github.com/Allium-Science/allium-cli) is still in early beta.\n </Warning>\n </Step>\n\n <Step title=\"Install agent skills\">\n ```bash theme={null}\n npx skills add allium-labs/skills --yes\n ```\n </Step>\n\n <Step title=\"Open your agent\">\n Start Claude Code, Codex, or any compatible AI agent.\n </Step>\n\n <Step title=\"Ask a question\">\n ```\n Set up Allium and fetch the latest balances for vitalik.eth\n ```\n </Step>\n</Steps>\n\n## How It Works\n\n<Steps>\n <Step title=\"Send request\">\n Make an API request using the Tempo `Client`.\n </Step>\n\n <Step title=\"Client handles 402\">\n The client automatically receives the `402 Payment Required` response, signs a USDC payment authorization, and retries the request.\n </Step>\n\n <Step title=\"Get data\">\n You receive your data with a `200` response. The payment flow is invisible to your code.\n </Step>\n</Steps>\n\n## Supported Tokens & Networks\n\nTempo MPP payments use **USDC** on the Tempo network:\n\n| Network | USDC Contract Address |\n| - | - |\n| **Tempo** (mainnet) | `0x20c000000000000000000000b9537d11c60e8b50` |\n\n## Implementation\n\n### Install\n\n```bash theme={null}\npip install \"pympp[tempo]\"\n```\n\n### Set Up Your Account\n\nCreate a `TempoAccount` from your private key. This account will sign payments on your behalf.\n\n```bash theme={null}\nexport YOUR_PRIVATE_KEY=\"your-eth-private-key\"\n```\n\n### Make a Paid API Call\n\n```python theme={null}\nfrom mpp.client import Client\r\nfrom mpp.methods.tempo import tempo, TempoAccount, ChargeIntent\r\nfrom mpp.methods.tempo._defaults import TESTNET_RPC_URL, TESTNET_CHAIN_ID\r\nimport os\r\n\r\naccount = TempoAccount.from_key(os.getenv(\"YOUR_PRIVATE_KEY\"))\r\n\r\nasync with Client(methods=[\r\n tempo(\r\n account=account,\r\n rpc_url=TESTNET_RPC_URL,\r\n intents={\"charge\": ChargeIntent()},\r\n )\r\n]) as client:\r\n response = await client.post(\r\n \"https://agents.allium.so/api/v1/developer/prices\",\r\n json=[{\"chain\": \"solana\", \"token_address\": \"So11111111111111111111111111111111111111112\"}],\r\n )\r\n print(response.json())\n```\n\nThe `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.\n",
"type": "text"
}
]
},
"run_id": "cmv9s5vv804sf0itwcc1tes4s",
"tool_id": "chatcmpl-tool-a18c5868716204fe",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
I have now confirmed a real, working developer workflow that I can act on. Let me summarize what I've verified:
-
Free endpoint works:
GET /api/v1/supported-chains/realtime-apis/simplereturned HTTP 200 with real data (no payment). -
402 flow confirmed: Unpaid POST to
/api/v1/developer/pricesreturned HTTP 402 with x402 v2 payment options. Notice:amount: "20000"— this is USDC in base units. USDC has 6 decimals, so 20000 / 10^6 = $0.02. Matches the $0.02 pricing for prices endpoint.- Payment via Stripe custody (payment_intent_id) on Base, Solana, X Layer, Polygon.
- x402Version 2.
- Interestingly, the endpoint uses Stripe custody mode — so there's a fiat on-ramp path too.
-
The paid call requires a funded USDC wallet + private key signing. That's the one thing I cannot and should not do autonomously (spending real money / handling a private key). But I CAN build the example client and demonstrate everything up to the payment.
Now let me think about what "build a simple example" means and how to deliver value while staying light and not spending money:
Option A: Build a self-contained example that:
- Calls the free supported-chains endpoint (works right now, no payment) → demonstrates live API.
- Demonstrates the 402 negotiation by parsing the payment-required response.
- Provides a ready-to-run Tempo MPP client (Python) that the user can run with their own private key + USDC to complete a paid call.
This is a great "simple example" that respects the constraints: no local service stack, no long-running commands, uses the hosted API. I don't spend money.
Let me verify the pympp package exists on PyPI, so the example I hand over is real. Also check the agents.allium.so docs endpoints and the free /docs/ endpoints maybe. And the x402 flow doc. Let me also confirm the amount decoding ($0.02).
Let me check PyPI for pympp and the x402 doc, plus the agent-skills doc quickly.
Actually, let me be judicious about time. The key deliverables:
- Confirm pympp exists (so the Python example is real and runnable).
- Build the example files.
- Run the free part to prove it works.
Let me check pympp on PyPI and read the x402 doc briefly. Also, let me double check: the example uses TESTNET_RPC_URL for tempo. Let me look at pympp defaults. Actually I'll just check PyPI existence and version.
Let me do a couple parallel checks.
Confirmed a live, working developer workflow. Key facts verified:
- Free endpoint (
supported-chains) → HTTP 200 with real data, no payment. - 402 flow → unpaid
POST /pricesreturnsx402Version:2with payment options;amount:"20000"= 20000/10⁶ USDC = $0.02, matching docs. Payments settle via Stripe custody on Base/Solana/Polygon/X Layer.
Let me verify the pympp SDK is real on PyPI and glance at the x402 doc, so the example I hand over actually runs.
cd /sandbox/repo && echo "=== PyPI pympp ==="; curl -sS -m 20 https://pypi.org/pypi/pympp/json 2>&1 | python3 -c "import sys,json; d=json.load(sys.stdin); print('name:',d['info']['name']); print('version:',d['info']['version']); print('summary:',d['info']['summary']); print('requires_dist:',d['info'].get('requires_dist'))" 2>&1 | head -30=== PyPI pympp ===
=== PyPI pympp === name: pympp version: 0.14.0 summary: Python SDK for the Machine Payments Protocol (MPP) requires_dist: ['httpx>=0.27', 'rfc8785>=0.1.4', 'hypothesis>=6.0; extra == "dev"', 'pytest-asyncio>=0.24; extra == "dev"', 'pytest>=8.0; extra == "dev"', 'ruff==0.16.6; extra == "dev"', 'starlette>=0.37; extra == "dev"', 'anyio>=4.5; extra == "mcp"', 'mcp<2,>=1.1; extra == "mcp"', 'propcache==0.5.2; extra == "mcp"', 'pyjwt==2.15.1; extra == "mcp"', 'uvicorn==0.52.4; extra == "mcp"', 'yarl==1.24.5; extra == "mcp"', 'redis>=5.0; extra == "redis"', 'pydantic>=2.0; extra == "server"', 'aiosqlite>=0.20; extra == "sqlite"', 'attrs>=23.0; extra == "stripe"', 'eth-abi<6,>=5.0; extra == "stripe"', 'eth-account>=0.11; extra == "stripe"', 'eth-hash[pycryptodome]>=0.7; extra == "stripe"', 'propcache==0.5.2; extra == "stripe"', 'pydantic>=2.0; extra == "stripe"', 'pyjwt==2.15.1; extra == "stripe"', 'pytempo>=0.2.1; extra == "stripe"', 'rlp>=4.0; extra == "stripe"', 'stripe>=8.0.0; extra == "stripe"', 'urllib3==2.8.0; extra == "stripe"', 'yarl==1.24.5; extra == "stripe"', 'attrs>=23.0; extra == "tempo"', 'eth-abi<6,>=5.0; extra == "tempo"', 'eth-account>=0.11; extra == "tempo"', 'eth-hash[pycryptodome]>=0.7; extra == "tempo"', 'propcache==0.5.2; extra == "tempo"', 'pydantic>=2.0; extra == "tempo"', 'pyjwt==2.15.1; extra == "tempo"', 'pytempo>=0.2.1; extra == "tempo"', 'rlp>=4.0; extra == "tempo"', 'urllib3==2.8.0; extra == "tempo"', 'yarl==1.24.5; extra == "tempo"']
Recorded tool call
{
"type": "tool_call",
"seq": 71,
"ts": "2026-10-15T16:57:32.858Z",
"name": "bash",
"turn": 1,
"input": {
"command": "cd /sandbox/repo && echo \"=== PyPI pympp ===\"; curl -sS -m 20 https://pypi.org/pypi/pympp/json 2>&1 | python3 -c \"import sys,json; d=json.load(sys.stdin); print('name:',d['info']['name']); print('version:',d['info']['version']); print('summary:',d['info']['summary']); print('requires_dist:',d['info'].get('requires_dist'))\" 2>&1 | head -30"
},
"run_id": "cmv9s5vv804sf0itwcc1tes4s",
"tool_id": "chatcmpl-tool-80dc40fa16b947d3",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 76,
"ts": "2026-10-15T16:57:33.264Z",
"turn": 1,
"output": {
"content": [
{
"text": "=== PyPI pympp ===\nname: pympp\nversion: 0.14.0\nsummary: Python SDK for the Machine Payments Protocol (MPP)\nrequires_dist: ['httpx>=0.27', 'rfc8785>=0.1.4', 'hypothesis>=6.0; extra == \"dev\"', 'pytest-asyncio>=0.24; extra == \"dev\"', 'pytest>=8.0; extra == \"dev\"', 'ruff==0.16.6; extra == \"dev\"', 'starlette>=0.37; extra == \"dev\"', 'anyio>=4.5; extra == \"mcp\"', 'mcp<2,>=1.1; extra == \"mcp\"', 'propcache==0.5.2; extra == \"mcp\"', 'pyjwt==2.15.1; extra == \"mcp\"', 'uvicorn==0.52.4; extra == \"mcp\"', 'yarl==1.24.5; extra == \"mcp\"', 'redis>=5.0; extra == \"redis\"', 'pydantic>=2.0; extra == \"server\"', 'aiosqlite>=0.20; extra == \"sqlite\"', 'attrs>=23.0; extra == \"stripe\"', 'eth-abi<6,>=5.0; extra == \"stripe\"', 'eth-account>=0.11; extra == \"stripe\"', 'eth-hash[pycryptodome]>=0.7; extra == \"stripe\"', 'propcache==0.5.2; extra == \"stripe\"', 'pydantic>=2.0; extra == \"stripe\"', 'pyjwt==2.15.1; extra == \"stripe\"', 'pytempo>=0.2.1; extra == \"stripe\"', 'rlp>=4.0; extra == \"stripe\"', 'stripe>=8.0.0; extra == \"stripe\"', 'urllib3==2.8.0; extra == \"stripe\"', 'yarl==1.24.5; extra == \"stripe\"', 'attrs>=23.0; extra == \"tempo\"', 'eth-abi<6,>=5.0; extra == \"tempo\"', 'eth-account>=0.11; extra == \"tempo\"', 'eth-hash[pycryptodome]>=0.7; extra == \"tempo\"', 'propcache==0.5.2; extra == \"tempo\"', 'pydantic>=2.0; extra == \"tempo\"', 'pyjwt==2.15.1; extra == \"tempo\"', 'pytempo>=0.2.1; extra == \"tempo\"', 'rlp>=4.0; extra == \"tempo\"', 'urllib3==2.8.0; extra == \"tempo\"', 'yarl==1.24.5; extra == \"tempo\"']\n",
"type": "text"
}
]
},
"run_id": "cmv9s5vv804sf0itwcc1tes4s",
"tool_id": "chatcmpl-tool-80dc40fa16b947d3",
"is_error": false,
"tool_kind": "shell"
}cd /sandbox/repo && echo "=== free /docs/ endpoints probe (docs bucket is free-ish? check) ==="; curl -sS -m 20 -w "\nHTTP %{http_code}\n" "https://agents.allium.so/api/v1/supported-chains/realtime-apis/simple" -o /dev/null 2>&1; echo "--- x402.md (head) ---"; curl -sSL -m 20 "https://docs.allium.so/ai/machine-payments/x402.md" 2>&1 | sed -n '1,90p'=== free /docs/ endpoints probe (docs bucket is free-ish? check) ===
=== free /docs/ endpoints probe (docs bucket is free-ish? check) ===
HTTP 200
--- x402.md (head) ---
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.allium.so/llms.txt
> Use this file to discover all available pages before exploring further.
# x402
> Full manual control over 402 payment negotiation, EIP-712 signing, and USDC settlement.
x402 is Allium's micropayment protocol that gives you full control over the payment flow. Your client handles the `402 Payment Required` negotiation, constructs EIP-712 typed data, signs via a wallet provider, and retries the request with a payment signature.
## Quickstart with Agent
The fastest way to get started — let your AI agent handle setup and payments for you.
<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 a normal API request to any payment-enabled endpoint.
</Step>
<Step title="Receive 402">
The server responds with `402 Payment Required` and an `accepts` array of payment options.
</Step>
<Step title="Sign payment">
Your client constructs and signs an EIP-712 payment authorization via [Privy server wallets](https://docs.privy.io/api-reference/wallets/ethereum/eth-signtypeddata-v4) — no private keys or gas needed.
</Step>
<Step title="Retry with signature">
Resend the original request with the payment signature header attached.
</Step>
<Step title="Settlement">
Allium verifies the authorization and settles the USDC payment onchain via the network's x402 facilitator — [Coinbase](https://docs.cdp.coinbase.com/api-reference/v2/rest-api/x402-facilitator/x402-facilitator) for Base, Polygon, and Solana, [OKX](https://www.okx.com/x-layer) for X Layer.
</Step>
<Step title="Get data">
Payment confirmed — you receive your data with a `200` response.
</Step>
</Steps>
## Supported Tokens & Networks
x402 payments use **USDC** on the following networks:
| Network | USDC Contract Address | EIP-712 Domain |
| - | - | - |
| **Base** (mainnet) | `0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913` | name: `USD Coin`, version: `2` |
| **Polygon** (mainnet) | `0x3c499c542cEF5E3811e1192ce70d8cc03d5c3359` | name: `USD Coin`, version: `2` |
| **Solana** (mainnet) | `EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v` | name: `USDC`, version: `2` |
| **X Layer** (mainnet) | `0x74b7f16337b8972027f6196a17a631ac6de26d22` | name: `USD Coin`, version: `2` |
## Implementation
This guide uses **[Privy](https://dashboard.privy.io) server wallets** for signing. Privy handles wallet creation and EIP-712 signing via its API — you never touch private keys or pay gas.
### Prerequisites
* **Python 3.8+**
* **[Privy](https://dashboard.privy.io) account** — free, takes 30 seconds
* **USDC** on Base or Solana (mainnet)
Recorded tool call
{
"type": "tool_call",
"seq": 73,
"ts": "2026-10-15T16:57:32.858Z",
"name": "bash",
"turn": 1,
"input": {
"command": "cd /sandbox/repo && echo \"=== free /docs/ endpoints probe (docs bucket is free-ish? check) ===\"; curl -sS -m 20 -w \"\\nHTTP %{http_code}\\n\" \"https://agents.allium.so/api/v1/supported-chains/realtime-apis/simple\" -o /dev/null 2>&1; echo \"--- x402.md (head) ---\"; curl -sSL -m 20 \"https://docs.allium.so/ai/machine-payments/x402.md\" 2>&1 | sed -n '1,90p'"
},
"run_id": "cmv9s5vv804sf0itwcc1tes4s",
"tool_id": "chatcmpl-tool-b43b5dbf25318c52",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 77,
"ts": "2026-10-15T16:57:33.998Z",
"turn": 1,
"output": {
"content": [
{
"text": "=== free /docs/ endpoints probe (docs bucket is free-ish? check) ===\n\nHTTP 200\n--- x402.md (head) ---\n> ## Documentation Index\n> Fetch the complete documentation index at: https://docs.allium.so/llms.txt\n> Use this file to discover all available pages before exploring further.\n\n# x402\n\n> Full manual control over 402 payment negotiation, EIP-712 signing, and USDC settlement.\n\nx402 is Allium's micropayment protocol that gives you full control over the payment flow. Your client handles the `402 Payment Required` negotiation, constructs EIP-712 typed data, signs via a wallet provider, and retries the request with a payment signature.\n\n## Quickstart with Agent\n\nThe fastest way to get started — let your AI agent handle setup and payments for you.\n\n<Steps>\n <Step title=\"Install allium-cli\">\n ```bash theme={null}\n curl -sSL https://agents.allium.so/cli/install.sh | sh\n ```\n\n <Warning>\n [allium-cli](https://github.com/Allium-Science/allium-cli) is still in early beta.\n </Warning>\n </Step>\n\n <Step title=\"Install agent skills\">\n ```bash theme={null}\n npx skills add allium-labs/skills --yes\n ```\n </Step>\n\n <Step title=\"Open your agent\">\n Start Claude Code, Codex, or any compatible AI agent.\n </Step>\n\n <Step title=\"Ask a question\">\n ```\n Set up Allium and fetch the latest balances for vitalik.eth\n ```\n </Step>\n</Steps>\n\n## How It Works\n\n<Steps>\n <Step title=\"Send request\">\n Make a normal API request to any payment-enabled endpoint.\n </Step>\n\n <Step title=\"Receive 402\">\n The server responds with `402 Payment Required` and an `accepts` array of payment options.\n </Step>\n\n <Step title=\"Sign payment\">\n Your client constructs and signs an EIP-712 payment authorization via [Privy server wallets](https://docs.privy.io/api-reference/wallets/ethereum/eth-signtypeddata-v4) — no private keys or gas needed.\n </Step>\n\n <Step title=\"Retry with signature\">\n Resend the original request with the payment signature header attached.\n </Step>\n\n <Step title=\"Settlement\">\n Allium verifies the authorization and settles the USDC payment onchain via the network's x402 facilitator — [Coinbase](https://docs.cdp.coinbase.com/api-reference/v2/rest-api/x402-facilitator/x402-facilitator) for Base, Polygon, and Solana, [OKX](https://www.okx.com/x-layer) for X Layer.\n </Step>\n\n <Step title=\"Get data\">\n Payment confirmed — you receive your data with a `200` response.\n </Step>\n</Steps>\n\n## Supported Tokens & Networks\n\nx402 payments use **USDC** on the following networks:\n\n| Network | USDC Contract Address | EIP-712 Domain |\n| - | - | - |\n| **Base** (mainnet) | `0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913` | name: `USD Coin`, version: `2` |\n| **Polygon** (mainnet) | `0x3c499c542cEF5E3811e1192ce70d8cc03d5c3359` | name: `USD Coin`, version: `2` |\n| **Solana** (mainnet) | `EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v` | name: `USDC`, version: `2` |\n| **X Layer** (mainnet) | `0x74b7f16337b8972027f6196a17a631ac6de26d22` | name: `USD Coin`, version: `2` |\n\n## Implementation\n\nThis guide uses **[Privy](https://dashboard.privy.io) server wallets** for signing. Privy handles wallet creation and EIP-712 signing via its API — you never touch private keys or pay gas.\n\n### Prerequisites\n\n* **Python 3.8+**\n* **[Privy](https://dashboard.privy.io) account** — free, takes 30 seconds\n* **USDC** on Base or Solana (mainnet)\n",
"type": "text"
}
]
},
"run_id": "cmv9s5vv804sf0itwcc1tes4s",
"tool_id": "chatcmpl-tool-b43b5dbf25318c52",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
Everything checks out. pympp is a real PyPI package (v0.14.0) with a [tempo] extra that pulls in pytempo, eth-account, etc. This confirms the Python example in the docs is runnable.
Now I have all the information I need to:
- Explain how pricing works.
- Assess whether it's easy for me (an AI agent) to manage.
- Build a simple example that I can actually run (the free part) and that the user can complete (the paid part with their own key/USDC).
Let me now build the simple example. I'll create a small project directory with:
- A README explaining pricing + how to run.
- A Python script that:
- Calls the FREE supported-chains endpoint (works now, no payment) — proves connectivity.
- Demonstrates the 402 negotiation on a paid endpoint (parses the payment options, shows the price in USD) WITHOUT paying.
- Provides a ready-to-run Tempo MPP paid call guarded behind an env var (YOUR_PRIVATE_KEY), so it only runs if the user opts in with a funded wallet.
- A requirements.txt.
This respects all constraints:
- Uses hosted API/SDK (pympp + REST). ✓
- No local service stacks. ✓
- No long-running commands. ✓
- Doesn't spend money autonomously (paid call is opt-in via env var). ✓
Let me actually run the free part to prove it works end-to-end from this environment, using plain curl/python stdlib (no install needed), so I don't even need pip installs for the demonstration. Actually, I'll write a pure-stdlib Python script for the free + 402 parts (no dependencies), and a separate optional paid script that uses pympp. That keeps the runnable demo dependency-free and instant.
Let me create the files. I'll put them in an allium-example/ directory.
Let me write:
allium-example/allium_free_demo.py— stdlib only: hits free endpoint, then demonstrates 402 on a paid endpoint and decodes the price. Runs immediately.allium-example/allium_paid_tempo.py— uses pympp[tempo]; opt-in via YOUR_PRIVATE_KEY; makes a real paid $0.02 call.allium-example/requirements.txtallium-example/README.md— pricing + instructions + agent-manageability notes.
Let me write these files, then run the free demo to prove it works.
Let me decode amount correctly: USDC has 6 decimals on Base/EVM. amount "20000" → 20000 / 1e6 = 0.02 USD. Good. For Solana USDC also 6 decimals. Good.
Let me write the free demo script carefully using urllib (stdlib).
For the 402 demo, I'll POST to the prices endpoint without payment and parse the accepts array, computing USD price = int(amount)/1e6.
Let me write it.
All verified: pympp is a real PyPI SDK (v0.14.0) with a [tempo] extra (pulls pytempo, eth-account, stripe). The paid path settles USDC via x402 facilitators (Coinbase/OKX) or Tempo, and can use Privy server wallets so you never touch keys.
I have everything I need. Let me build a small, dependency-free example that runs the free parts live now, and a ready-to-run paid script the user opts into with their own wallet. First the free demo (stdlib only):
File edits
1 file
Writtenallium-example/allium_free_demo.pyView changes
/sandbox/repo/allium-example/allium_free_demo.py
Written content · previous contents were not recorded
#!/usr/bin/env python3"""Allium "Machine Payments" API — dependency-free demo (stdlib only).This script touches ONLY the parts of Allium's agent API that cost nothing:1. A genuinely FREE endpoint (chain discovery) -> HTTP 200, real data.2. An unpaid call to a PAID endpoint -> HTTP 402 "Payment Required",which we parse to show exactly what a call would cost, in USD.It NEVER signs or sends a payment, so it can never spend money.Run it: python3 allium_free_demo.py"""import jsonimport urllib.requestimport urllib.errorBASE = "https://agents.allium.so"# USDC uses 6 decimals on every network Allium settles on (Base, Polygon, Solana, ...).USDC_DECIMALS = 6def _request(method, path, body=None):url = BASE + pathdata = json.dumps(body).encode() if body is not None else Nonereq = urllib.request.Request(url, data=data, method=method)req.add_header("Content-Type", "application/json")try:with urllib.request.urlopen(req, timeout=30) as resp:return resp.status, json.loads(resp.read().decode())except urllib.error.HTTPError as e: # 402 comes through hereraw = e.read().decode()try:return e.code, json.loads(raw)except json.JSONDecodeError:return e.code, {"_raw": raw}def step1_free_chain_discovery():print("=" * 70)print("STEP 1 — FREE endpoint: which chains does /prices support?")print(" GET /api/v1/supported-chains/realtime-apis/simple (no payment)")print("=" * 70)status, data = _request("GET", "/api/v1/supported-chains/realtime-apis/simple")print(f" HTTP {status}")chains = data.get("/api/v1/developer/prices", [])print(f" /api/v1/developer/prices supports {len(chains)} chains:")print(" " + ", ".join(chains))print(f" (map covers {len(data)} endpoints total)\n")return status == 200def step2_show_402_pricing():print("=" * 70)print("STEP 2 — Unpaid call to a PAID endpoint (shows price, spends nothing)")print(" POST /api/v1/developer/prices WITHOUT a payment signature")print("=" * 70)status, data = _request("POST","/api/v1/developer/prices",[{"chain": "solana", "token_address": "So11111111111111111111111111111111111111112"}],)print(f" HTTP {status} -> {data.get('error', '')}")if status != 402:print(" Unexpected status; aborting pricing preview.\n")returnprint(f" x402Version: {data.get('x402Version')}")print(" The server offers these payment options (any one settles the call):\n")for opt in data.get("accepts", []):amount = int(opt["amount"])usd = amount / (10 ** USDC_DECIMALS)network = opt["network"].split(":")[0]print(f" - network={network:<8} scheme={opt['scheme']:<6} "f"amount={amount} units = ${usd:.4f} USDC")print("\n => One 'latest prices' call costs $0.02, exactly as documented.")print(" => No signature was sent, so nothing was charged.\n")if __name__ == "__main__":ok = step1_free_chain_discovery()step2_show_402_pricing()print("=" * 70)print("Done. Free discovery worked:" , ok)print("To make a REAL (paid) call, see allium_paid_tempo.py")print("=" * 70)
Source: write · chatcmpl-tool-91ad7db1137d8804
Recorded tool call
{
"type": "tool_call",
"seq": 81,
"ts": "2026-10-15T16:58:03.263Z",
"name": "write",
"turn": 1,
"input": {
"path": "/sandbox/repo/allium-example/allium_free_demo.py",
"content": "#!/usr/bin/env python3\n\"\"\"\nAllium \"Machine Payments\" API — dependency-free demo (stdlib only).\n\nThis script touches ONLY the parts of Allium's agent API that cost nothing:\n\n 1. A genuinely FREE endpoint (chain discovery) -> HTTP 200, real data.\n 2. An unpaid call to a PAID endpoint -> HTTP 402 \"Payment Required\",\n which we parse to show exactly what a call would cost, in USD.\n\nIt NEVER signs or sends a payment, so it can never spend money.\nRun it: python3 allium_free_demo.py\n\"\"\"\n\nimport json\nimport urllib.request\nimport urllib.error\n\nBASE = \"https://agents.allium.so\"\n\n# USDC uses 6 decimals on every network Allium settles on (Base, Polygon, Solana, ...).\nUSDC_DECIMALS = 6\n\n\ndef _request(method, path, body=None):\n url = BASE + path\n data = json.dumps(body).encode() if body is not None else None\n req = urllib.request.Request(url, data=data, method=method)\n req.add_header(\"Content-Type\", \"application/json\")\n try:\n with urllib.request.urlopen(req, timeout=30) as resp:\n return resp.status, json.loads(resp.read().decode())\n except urllib.error.HTTPError as e: # 402 comes through here\n raw = e.read().decode()\n try:\n return e.code, json.loads(raw)\n except json.JSONDecodeError:\n return e.code, {\"_raw\": raw}\n\n\ndef step1_free_chain_discovery():\n print(\"=\" * 70)\n print(\"STEP 1 — FREE endpoint: which chains does /prices support?\")\n print(\" GET /api/v1/supported-chains/realtime-apis/simple (no payment)\")\n print(\"=\" * 70)\n status, data = _request(\"GET\", \"/api/v1/supported-chains/realtime-apis/simple\")\n print(f\" HTTP {status}\")\n chains = data.get(\"/api/v1/developer/prices\", [])\n print(f\" /api/v1/developer/prices supports {len(chains)} chains:\")\n print(\" \" + \", \".join(chains))\n print(f\" (map covers {len(data)} endpoints total)\\n\")\n return status == 200\n\n\ndef step2_show_402_pricing():\n print(\"=\" * 70)\n print(\"STEP 2 — Unpaid call to a PAID endpoint (shows price, spends nothing)\")\n print(\" POST /api/v1/developer/prices WITHOUT a payment signature\")\n print(\"=\" * 70)\n status, data = _request(\n \"POST\",\n \"/api/v1/developer/prices\",\n [{\"chain\": \"solana\", \"token_address\": \"So11111111111111111111111111111111111111112\"}],\n )\n print(f\" HTTP {status} -> {data.get('error', '')}\")\n if status != 402:\n print(\" Unexpected status; aborting pricing preview.\\n\")\n return\n print(f\" x402Version: {data.get('x402Version')}\")\n print(\" The server offers these payment options (any one settles the call):\\n\")\n for opt in data.get(\"accepts\", []):\n amount = int(opt[\"amount\"])\n usd = amount / (10 ** USDC_DECIMALS)\n network = opt[\"network\"].split(\":\")[0]\n print(f\" - network={network:<8} scheme={opt['scheme']:<6} \"\n f\"amount={amount} units = ${usd:.4f} USDC\")\n print(\"\\n => One 'latest prices' call costs $0.02, exactly as documented.\")\n print(\" => No signature was sent, so nothing was charged.\\n\")\n\n\nif __name__ == \"__main__\":\n ok = step1_free_chain_discovery()\n step2_show_402_pricing()\n print(\"=\" * 70)\n print(\"Done. Free discovery worked:\" , ok)\n print(\"To make a REAL (paid) call, see allium_paid_tempo.py\")\n print(\"=\" * 70)\n"
},
"run_id": "cmv9s5vv804sf0itwcc1tes4s",
"tool_id": "chatcmpl-tool-91ad7db1137d8804",
"tool_kind": "file_edit"
}Recorded tool result
{
"type": "tool_result",
"seq": 84,
"ts": "2026-10-15T16:58:03.263Z",
"turn": 1,
"output": {
"content": [
{
"text": "Successfully wrote 3312 bytes to /sandbox/repo/allium-example/allium_free_demo.py",
"type": "text"
}
]
},
"run_id": "cmv9s5vv804sf0itwcc1tes4s",
"tool_id": "chatcmpl-tool-91ad7db1137d8804",
"is_error": false,
"tool_kind": "file_edit"
}File edits
1 file
Writtenallium-example/allium_paid_tempo.pyView changes
/sandbox/repo/allium-example/allium_paid_tempo.py
Written content · previous contents were not recorded
#!/usr/bin/env python3"""Allium — REAL paid call via Tempo MPP (opt-in; spends ~$0.02 USDC).This uses the official `pympp` SDK. The Client transparently handles the402 negotiation, signs a USDC payment authorization with your key, andretries — so your code just looks like a normal HTTP call.Setup:pip install "pympp[tempo]"export YOUR_PRIVATE_KEY="0x...eth-private-key..." # must hold USDC on TempoRun:python3 allium_paid_tempo.pySAFETY: this script refuses to run unless YOUR_PRIVATE_KEY is set, so it cannever spend money by accident. Never commit a real key; use a fresh, low-balancewallet for experiments."""import asyncioimport osasync def main():key = os.getenv("YOUR_PRIVATE_KEY")if not key:raise SystemExit("Refusing to run: YOUR_PRIVATE_KEY is not set.\n""This script makes a real ~$0.02 USDC payment.\n""Set it explicitly to opt in: export YOUR_PRIVATE_KEY=0x...")# Imports are inside main() so the free demo stays dependency-free.from mpp.client import Clientfrom mpp.methods.tempo import tempo, TempoAccount, ChargeIntentfrom mpp.methods.tempo._defaults import TESTNET_RPC_URLaccount = TempoAccount.from_key(key)async with Client(methods=[tempo(account=account, rpc_url=TESTNET_RPC_URL, intents={"charge": ChargeIntent()})]) as client:resp = await client.post("https://agents.allium.so/api/v1/developer/prices",json=[{"chain": "solana","token_address": "So11111111111111111111111111111111111111112"}],)print("HTTP", resp.status_code)print(resp.json())if __name__ == "__main__":asyncio.run(main())
Source: write · chatcmpl-tool-abad41592da139da
Recorded tool call
{
"type": "tool_call",
"seq": 82,
"ts": "2026-10-15T16:58:03.263Z",
"name": "write",
"turn": 1,
"input": {
"path": "/sandbox/repo/allium-example/allium_paid_tempo.py",
"content": "#!/usr/bin/env python3\n\"\"\"\nAllium — REAL paid call via Tempo MPP (opt-in; spends ~$0.02 USDC).\n\nThis uses the official `pympp` SDK. The Client transparently handles the\n402 negotiation, signs a USDC payment authorization with your key, and\nretries — so your code just looks like a normal HTTP call.\n\nSetup:\n pip install \"pympp[tempo]\"\n export YOUR_PRIVATE_KEY=\"0x...eth-private-key...\" # must hold USDC on Tempo\n\nRun:\n python3 allium_paid_tempo.py\n\nSAFETY: this script refuses to run unless YOUR_PRIVATE_KEY is set, so it can\nnever spend money by accident. Never commit a real key; use a fresh, low-balance\nwallet for experiments.\n\"\"\"\n\nimport asyncio\nimport os\n\n\nasync def main():\n key = os.getenv(\"YOUR_PRIVATE_KEY\")\n if not key:\n raise SystemExit(\n \"Refusing to run: YOUR_PRIVATE_KEY is not set.\\n\"\n \"This script makes a real ~$0.02 USDC payment.\\n\"\n \"Set it explicitly to opt in: export YOUR_PRIVATE_KEY=0x...\"\n )\n\n # Imports are inside main() so the free demo stays dependency-free.\n from mpp.client import Client\n from mpp.methods.tempo import tempo, TempoAccount, ChargeIntent\n from mpp.methods.tempo._defaults import TESTNET_RPC_URL\n\n account = TempoAccount.from_key(key)\n\n async with Client(methods=[\n tempo(account=account, rpc_url=TESTNET_RPC_URL, intents={\"charge\": ChargeIntent()})\n ]) as client:\n resp = await client.post(\n \"https://agents.allium.so/api/v1/developer/prices\",\n json=[{\"chain\": \"solana\",\n \"token_address\": \"So11111111111111111111111111111111111111112\"}],\n )\n print(\"HTTP\", resp.status_code)\n print(resp.json())\n\n\nif __name__ == \"__main__\":\n asyncio.run(main())\n"
},
"run_id": "cmv9s5vv804sf0itwcc1tes4s",
"tool_id": "chatcmpl-tool-abad41592da139da",
"tool_kind": "file_edit"
}Recorded tool result
{
"type": "tool_result",
"seq": 86,
"ts": "2026-10-15T16:58:03.263Z",
"turn": 1,
"output": {
"content": [
{
"text": "Successfully wrote 1753 bytes to /sandbox/repo/allium-example/allium_paid_tempo.py",
"type": "text"
}
]
},
"run_id": "cmv9s5vv804sf0itwcc1tes4s",
"tool_id": "chatcmpl-tool-abad41592da139da",
"is_error": false,
"tool_kind": "file_edit"
}File edits
1 file
Writtenallium-example/requirements.txtView changes
/sandbox/repo/allium-example/requirements.txt
Written content · previous contents were not recorded
# Only needed for the REAL paid call (allium_paid_tempo.py).# The free demo (allium_free_demo.py) uses the Python standard library only.pympp[tempo]>=0.14.0
Source: write · chatcmpl-tool-963c4249f853a44f
Recorded tool call
{
"type": "tool_call",
"seq": 83,
"ts": "2026-10-15T16:58:03.263Z",
"name": "write",
"turn": 1,
"input": {
"path": "/sandbox/repo/allium-example/requirements.txt",
"content": "# Only needed for the REAL paid call (allium_paid_tempo.py).\n# The free demo (allium_free_demo.py) uses the Python standard library only.\npympp[tempo]>=0.14.0\n"
},
"run_id": "cmv9s5vv804sf0itwcc1tes4s",
"tool_id": "chatcmpl-tool-963c4249f853a44f",
"tool_kind": "file_edit"
}Recorded tool result
{
"type": "tool_result",
"seq": 85,
"ts": "2026-10-15T16:58:03.263Z",
"turn": 1,
"output": {
"content": [
{
"text": "Successfully wrote 159 bytes to /sandbox/repo/allium-example/requirements.txt",
"type": "text"
}
]
},
"run_id": "cmv9s5vv804sf0itwcc1tes4s",
"tool_id": "chatcmpl-tool-963c4249f853a44f",
"is_error": false,
"tool_kind": "file_edit"
}›Thinking…
Now let me run the free demo to prove it works live. This is a quick command (network calls with timeout), not long-running.
Now let me run the free demo live to prove it works end-to-end (no dependencies, no payment):
cd /sandbox/repo/allium-example && python3 allium_free_demo.py
======================================================================
======================================================================
STEP 1 — FREE endpoint: which chains does /prices support?
GET /api/v1/supported-chains/realtime-apis/simple (no payment)
======================================================================
HTTP 403
/api/v1/developer/prices supports 0 chains:
(map covers 1 endpoints total)
======================================================================
STEP 2 — Unpaid call to a PAID endpoint (shows price, spends nothing)
POST /api/v1/developer/prices WITHOUT a payment signature
======================================================================
HTTP 403 ->
Unexpected status; aborting pricing preview.
======================================================================
Done. Free discovery worked: False
To make a REAL (paid) call, see allium_paid_tempo.py
======================================================================
Recorded tool call
{
"type": "tool_call",
"seq": 90,
"ts": "2026-10-15T16:58:05.777Z",
"name": "bash",
"turn": 1,
"input": {
"command": "cd /sandbox/repo/allium-example && python3 allium_free_demo.py"
},
"run_id": "cmv9s5vv804sf0itwcc1tes4s",
"tool_id": "chatcmpl-tool-be5ae050fe22304e",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 91,
"ts": "2026-10-15T16:58:07.042Z",
"turn": 1,
"output": {
"content": [
{
"text": "======================================================================\nSTEP 1 — FREE endpoint: which chains does /prices support?\n GET /api/v1/supported-chains/realtime-apis/simple (no payment)\n======================================================================\n HTTP 403\n /api/v1/developer/prices supports 0 chains:\n \n (map covers 1 endpoints total)\n\n======================================================================\nSTEP 2 — Unpaid call to a PAID endpoint (shows price, spends nothing)\n POST /api/v1/developer/prices WITHOUT a payment signature\n======================================================================\n HTTP 403 -> \n Unexpected status; aborting pricing preview.\n\n======================================================================\nDone. Free discovery worked: False\nTo make a REAL (paid) call, see allium_paid_tempo.py\n======================================================================\n",
"type": "text"
}
]
},
"run_id": "cmv9s5vv804sf0itwcc1tes4s",
"tool_id": "chatcmpl-tool-be5ae050fe22304e",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
Interesting — via Python's urllib I got HTTP 403, whereas via curl I got 200 and 402. This is likely a User-Agent or header-based block (Cloudflare bot protection blocking the default Python-urllib User-Agent). Let me check what the 403 body says.
Let me debug: add a User-Agent header. curl worked with its default UA. Let me replicate by setting a normal User-Agent.
Let me quickly test with curl to confirm it still works, and check what Python gets with a browser-like UA.
Got HTTP 403 via Python's default User-Agent (curl worked earlier) — that's bot-protection on the UA header, not a real block. Let me confirm and fix by setting a normal User-Agent.
cd /sandbox/repo/allium-example && echo "=== 403 body via python default UA ==="; python3 - <<'PY'
import urllib.request, urllib.error
req=urllib.request.Request("https://agents.allium.so/api/v1/supported-chains/realtime-apis/simple")
try:
urllib.request.urlopen(req,timeout=20)
except urllib.error.HTTPError as e:
print("HTTP",e.code); print(e.read().decode()[:400])
PY
echo; echo "=== same call WITH a browser User-Agent ==="; python3 - <<'PY'
import urllib.request, urllib.error
req=urllib.request.Request("https://agents.allium.so/api/v1/supported-chains/realtime-apis/simple")
req.add_header("User-Agent","curl/8.5.0")
try:
with urllib.request.urlopen(req,timeout=20) as r:
print("HTTP",r.status); print(r.read().decode()[:200])
except urllib.error.HTTPError as e:
print("HTTP",e.code); print(e.read().decode()[:200])
PY=== 403 body via python default UA ===
=== 403 body via python default UA ===
HTTP 403
error code: 1010
=== same call WITH a browser User-Agent ===
HTTP 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/
Recorded tool call
{
"type": "tool_call",
"seq": 95,
"ts": "2026-10-15T16:58:12.952Z",
"name": "bash",
"turn": 1,
"input": {
"command": "cd /sandbox/repo/allium-example && echo \"=== 403 body via python default UA ===\"; python3 - <<'PY'\nimport urllib.request, urllib.error\nreq=urllib.request.Request(\"https://agents.allium.so/api/v1/supported-chains/realtime-apis/simple\")\ntry:\n urllib.request.urlopen(req,timeout=20)\nexcept urllib.error.HTTPError as e:\n print(\"HTTP\",e.code); print(e.read().decode()[:400])\nPY\necho; echo \"=== same call WITH a browser User-Agent ===\"; python3 - <<'PY'\nimport urllib.request, urllib.error\nreq=urllib.request.Request(\"https://agents.allium.so/api/v1/supported-chains/realtime-apis/simple\")\nreq.add_header(\"User-Agent\",\"curl/8.5.0\")\ntry:\n with urllib.request.urlopen(req,timeout=20) as r:\n print(\"HTTP\",r.status); print(r.read().decode()[:200])\nexcept urllib.error.HTTPError as e:\n print(\"HTTP\",e.code); print(e.read().decode()[:200])\nPY"
},
"run_id": "cmv9s5vv804sf0itwcc1tes4s",
"tool_id": "chatcmpl-tool-9388d70ddb6fcaa2",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 96,
"ts": "2026-10-15T16:58:14.157Z",
"turn": 1,
"output": {
"content": [
{
"text": "=== 403 body via python default UA ===\nHTTP 403\nerror code: 1010\n\n\n=== same call WITH a browser User-Agent ===\nHTTP 200\n{\"/api/v1/developer/wallet/balances/history\":[\"arbitrum\",\"avalanche\",\"bsc\",\"base\",\"bitcoin\",\"celo\",\"ethereum\",\"near\",\"optimism\",\"polygon\",\"robinhood\",\"solana\",\"stellar\",\"unichain\",\"x_layer\"],\"/api/v1/\n",
"type": "text"
}
]
},
"run_id": "cmv9s5vv804sf0itwcc1tes4s",
"tool_id": "chatcmpl-tool-9388d70ddb6fcaa2",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
Confirmed: it's Cloudflare error code 1010 (browser integrity check based on User-Agent). The default Python-urllib/3.12 UA is blocked. Setting a normal UA (curl/8.5.0) returns HTTP 200. This is a simple fix — I'll add a User-Agent header to the demo script.
Let me update allium_free_demo.py to send a User-Agent header. This is an important practical note for the "easy to manage" assessment too.
Let me edit the _request function to add a User-Agent header.
Confirmed — it's Cloudflare error 1010 (browser-integrity check blocking the default Python-urllib User-Agent). Setting a normal UA returns 200. Easy fix — let me add a User-Agent header to the demo:
File edits
1 file
Modifiedallium-example/allium_free_demo.py+3−0View changes
/sandbox/repo/allium-example/allium_free_demo.py
Replacement excerpt
req = urllib.request.Request(url, data=data, method=method)req.add_header("Content-Type", "application/json")+ # Cloudflare in front of agents.allium.so rejects the default "Python-urllib"+ # User-Agent with HTTP 403 (error code 1010). Send a normal UA instead.+ req.add_header("User-Agent", "curl/8.5.0")
Source: edit · chatcmpl-tool-8c5ec7b1e2f401fd
Recorded tool call
{
"type": "tool_call",
"seq": 101,
"ts": "2026-10-15T16:58:20.116Z",
"name": "edit",
"turn": 1,
"input": {
"path": "/sandbox/repo/allium-example/allium_free_demo.py",
"edits": [
{
"newText": " req = urllib.request.Request(url, data=data, method=method)\n req.add_header(\"Content-Type\", \"application/json\")\n # Cloudflare in front of agents.allium.so rejects the default \"Python-urllib\"\n # User-Agent with HTTP 403 (error code 1010). Send a normal UA instead.\n req.add_header(\"User-Agent\", \"curl/8.5.0\")",
"oldText": " req = urllib.request.Request(url, data=data, method=method)\n req.add_header(\"Content-Type\", \"application/json\")"
}
]
},
"run_id": "cmv9s5vv804sf0itwcc1tes4s",
"tool_id": "chatcmpl-tool-8c5ec7b1e2f401fd",
"tool_kind": "file_edit"
}Recorded tool result
{
"type": "tool_result",
"seq": 102,
"ts": "2026-10-15T16:58:20.116Z",
"turn": 1,
"output": {
"content": [
{
"text": "Successfully replaced 1 block(s) in /sandbox/repo/allium-example/allium_free_demo.py.",
"type": "text"
}
],
"details": {
"diff": " ...\n 26 url = BASE + path\n 27 data = json.dumps(body).encode() if body is not None else None\n 28 req = urllib.request.Request(url, data=data, method=method)\n 29 req.add_header(\"Content-Type\", \"application/json\")\n+30 # Cloudflare in front of agents.allium.so rejects the default \"Python-urllib\"\n+31 # User-Agent with HTTP 403 (error code 1010). Send a normal UA instead.\n+32 req.add_header(\"User-Agent\", \"curl/8.5.0\")\n 30 try:\n 31 with urllib.request.urlopen(req, timeout=30) as resp:\n 32 return resp.status, json.loads(resp.read().decode())\n 33 except urllib.error.HTTPError as e: # 402 comes through here\n ...",
"patch": "--- /sandbox/repo/allium-example/allium_free_demo.py\n+++ /sandbox/repo/allium-example/allium_free_demo.py\n@@ -26,8 +26,11 @@\n url = BASE + path\n data = json.dumps(body).encode() if body is not None else None\n req = urllib.request.Request(url, data=data, method=method)\n req.add_header(\"Content-Type\", \"application/json\")\n+ # Cloudflare in front of agents.allium.so rejects the default \"Python-urllib\"\n+ # User-Agent with HTTP 403 (error code 1010). Send a normal UA instead.\n+ req.add_header(\"User-Agent\", \"curl/8.5.0\")\n try:\n with urllib.request.urlopen(req, timeout=30) as resp:\n return resp.status, json.loads(resp.read().decode())\n except urllib.error.HTTPError as e: # 402 comes through here\n",
"firstChangedLine": 30
}
},
"run_id": "cmv9s5vv804sf0itwcc1tes4s",
"tool_id": "chatcmpl-tool-8c5ec7b1e2f401fd",
"is_error": false,
"tool_kind": "file_edit"
}›Thinking…
Let me run the demo again to verify it works.
cd /sandbox/repo/allium-example && python3 allium_free_demo.py
======================================================================
======================================================================
STEP 1 — FREE endpoint: which chains does /prices support?
GET /api/v1/supported-chains/realtime-apis/simple (no payment)
======================================================================
HTTP 200
/api/v1/developer/prices supports 13 chains:
arbitrum, avalanche, bsc, base, celo, ethereum, hyperevm, optimism, polygon, robinhood, solana, unichain, zksync
(map covers 23 endpoints total)
======================================================================
STEP 2 — Unpaid call to a PAID endpoint (shows price, spends nothing)
POST /api/v1/developer/prices WITHOUT a payment signature
======================================================================
HTTP 402 -> Payment Required!
x402Version: 2
The server offers these payment options (any one settles the call):
- network=eip155 scheme=exact amount=20000 units = $0.0200 USDC
- network=solana scheme=exact amount=20000 units = $0.0200 USDC
- network=eip155 scheme=exact amount=20000 units = $0.0200 USDC
- network=eip155 scheme=exact amount=20000 units = $0.0200 USDC
=> One 'latest prices' call costs $0.02, exactly as documented.
=> No signature was sent, so nothing was charged.
======================================================================
Done. Free discovery worked: True
To make a REAL (paid) call, see allium_paid_tempo.py
======================================================================
Recorded tool call
{
"type": "tool_call",
"seq": 105,
"ts": "2026-10-15T16:58:23.774Z",
"name": "bash",
"turn": 1,
"input": {
"command": "cd /sandbox/repo/allium-example && python3 allium_free_demo.py"
},
"run_id": "cmv9s5vv804sf0itwcc1tes4s",
"tool_id": "chatcmpl-tool-bbbc428bef25cf89",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 106,
"ts": "2026-10-15T16:58:23.774Z",
"turn": 1,
"output": {
"content": [
{
"text": "======================================================================\nSTEP 1 — FREE endpoint: which chains does /prices support?\n GET /api/v1/supported-chains/realtime-apis/simple (no payment)\n======================================================================\n HTTP 200\n /api/v1/developer/prices supports 13 chains:\n arbitrum, avalanche, bsc, base, celo, ethereum, hyperevm, optimism, polygon, robinhood, solana, unichain, zksync\n (map covers 23 endpoints total)\n\n======================================================================\nSTEP 2 — Unpaid call to a PAID endpoint (shows price, spends nothing)\n POST /api/v1/developer/prices WITHOUT a payment signature\n======================================================================\n HTTP 402 -> Payment Required!\n x402Version: 2\n The server offers these payment options (any one settles the call):\n\n - network=eip155 scheme=exact amount=20000 units = $0.0200 USDC\n - network=solana scheme=exact amount=20000 units = $0.0200 USDC\n - network=eip155 scheme=exact amount=20000 units = $0.0200 USDC\n - network=eip155 scheme=exact amount=20000 units = $0.0200 USDC\n\n => One 'latest prices' call costs $0.02, exactly as documented.\n => No signature was sent, so nothing was charged.\n\n======================================================================\nDone. Free discovery worked: True\nTo make a REAL (paid) call, see allium_paid_tempo.py\n======================================================================\n",
"type": "text"
}
]
},
"run_id": "cmv9s5vv804sf0itwcc1tes4s",
"tool_id": "chatcmpl-tool-bbbc428bef25cf89",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
The demo now works perfectly:
- Step 1: Free endpoint returns HTTP 200 with 13 chains for /prices, 23 endpoints total.
- Step 2: Paid endpoint returns HTTP 402 with 4 payment options, each $0.02 USDC.
The network label shows "eip155" for three of them (Base, X Layer, Polygon all use eip155 prefix). Let me improve the network label to show the chain ID so it's clearer. Actually, it's minor. The chain IDs: eip155:8453 (Base), eip155:196 (X Layer), eip155:137 (Polygon). Let me map those for clarity. This is a nice touch but let me keep it light — I'll add a small chain-id → name map.
Actually, let me improve it slightly to decode the EVM chain IDs, since showing "eip155" three times is a bit unhelpful. Quick edit.
Works live: free endpoint → 200 (13 chains for /prices), paid endpoint → 402 with four $0.02 USDC options. Let me polish the network labels (three show generic eip155) by decoding the chain IDs:
File edits
1 file
Modifiedallium-example/allium_free_demo.py+7−1View changes
/sandbox/repo/allium-example/allium_free_demo.py
Replacement excerpt
+ # EVM chain ids Allium settles on, for readable labels.+ evm_names = {"8453": "base", "137": "polygon", "196": "x_layer"}for opt in data.get("accepts", []):amount = int(opt["amount"])usd = amount / (10 ** USDC_DECIMALS)- network = opt["network"].split(":")[0]+ parts = opt["network"].split(":")+ if parts[0] == "eip155":+ network = evm_names.get(parts[1], f"eip155:{parts[1]}")+ else:+ network = parts[0]print(f" - network={network:<8} scheme={opt['scheme']:<6} "f"amount={amount} units = ${usd:.4f} USDC")
Source: edit · chatcmpl-tool-b04f6fb3a6213382
Recorded tool call
{
"type": "tool_call",
"seq": 110,
"ts": "2026-10-15T16:58:31.349Z",
"name": "edit",
"turn": 1,
"input": {
"path": "/sandbox/repo/allium-example/allium_free_demo.py",
"edits": [
{
"newText": " # EVM chain ids Allium settles on, for readable labels.\n evm_names = {\"8453\": \"base\", \"137\": \"polygon\", \"196\": \"x_layer\"}\n for opt in data.get(\"accepts\", []):\n amount = int(opt[\"amount\"])\n usd = amount / (10 ** USDC_DECIMALS)\n parts = opt[\"network\"].split(\":\")\n if parts[0] == \"eip155\":\n network = evm_names.get(parts[1], f\"eip155:{parts[1]}\")\n else:\n network = parts[0]\n print(f\" - network={network:<8} scheme={opt['scheme']:<6} \"\n f\"amount={amount} units = ${usd:.4f} USDC\")",
"oldText": " for opt in data.get(\"accepts\", []):\n amount = int(opt[\"amount\"])\n usd = amount / (10 ** USDC_DECIMALS)\n network = opt[\"network\"].split(\":\")[0]\n print(f\" - network={network:<8} scheme={opt['scheme']:<6} \"\n f\"amount={amount} units = ${usd:.4f} USDC\")"
}
]
},
"run_id": "cmv9s5vv804sf0itwcc1tes4s",
"tool_id": "chatcmpl-tool-b04f6fb3a6213382",
"tool_kind": "file_edit"
}Recorded tool result
{
"type": "tool_result",
"seq": 111,
"ts": "2026-10-15T16:58:31.349Z",
"turn": 1,
"output": {
"content": [
{
"text": "Successfully replaced 1 block(s) in /sandbox/repo/allium-example/allium_free_demo.py.",
"type": "text"
}
],
"details": {
"diff": " ...\n 70 print(\" Unexpected status; aborting pricing preview.\\n\")\n 71 return\n 72 print(f\" x402Version: {data.get('x402Version')}\")\n 73 print(\" The server offers these payment options (any one settles the call):\\n\")\n+74 # EVM chain ids Allium settles on, for readable labels.\n+75 evm_names = {\"8453\": \"base\", \"137\": \"polygon\", \"196\": \"x_layer\"}\n 74 for opt in data.get(\"accepts\", []):\n 75 amount = int(opt[\"amount\"])\n 76 usd = amount / (10 ** USDC_DECIMALS)\n-77 network = opt[\"network\"].split(\":\")[0]\n+79 parts = opt[\"network\"].split(\":\")\n+80 if parts[0] == \"eip155\":\n+81 network = evm_names.get(parts[1], f\"eip155:{parts[1]}\")\n+82 else:\n+83 network = parts[0]\n 78 print(f\" - network={network:<8} scheme={opt['scheme']:<6} \"\n 79 f\"amount={amount} units = ${usd:.4f} USDC\")\n 80 print(\"\\n => One 'latest prices' call costs $0.02, exactly as documented.\")\n 81 print(\" => No signature was sent, so nothing was charged.\\n\")\n ...",
"patch": "--- /sandbox/repo/allium-example/allium_free_demo.py\n+++ /sandbox/repo/allium-example/allium_free_demo.py\n@@ -70,12 +70,18 @@\n print(\" Unexpected status; aborting pricing preview.\\n\")\n return\n print(f\" x402Version: {data.get('x402Version')}\")\n print(\" The server offers these payment options (any one settles the call):\\n\")\n+ # EVM chain ids Allium settles on, for readable labels.\n+ evm_names = {\"8453\": \"base\", \"137\": \"polygon\", \"196\": \"x_layer\"}\n for opt in data.get(\"accepts\", []):\n amount = int(opt[\"amount\"])\n usd = amount / (10 ** USDC_DECIMALS)\n- network = opt[\"network\"].split(\":\")[0]\n+ parts = opt[\"network\"].split(\":\")\n+ if parts[0] == \"eip155\":\n+ network = evm_names.get(parts[1], f\"eip155:{parts[1]}\")\n+ else:\n+ network = parts[0]\n print(f\" - network={network:<8} scheme={opt['scheme']:<6} \"\n f\"amount={amount} units = ${usd:.4f} USDC\")\n print(\"\\n => One 'latest prices' call costs $0.02, exactly as documented.\")\n print(\" => No signature was sent, so nothing was charged.\\n\")\n",
"firstChangedLine": 74
}
},
"run_id": "cmv9s5vv804sf0itwcc1tes4s",
"tool_id": "chatcmpl-tool-b04f6fb3a6213382",
"is_error": false,
"tool_kind": "file_edit"
}›Thinking…
Let me run it again to verify the polished output, then write the README.
cd /sandbox/repo/allium-example && python3 allium_free_demo.py 2>&1 | sed -n '13,26p'
======================================================================
======================================================================
HTTP 402 -> Payment Required!
x402Version: 2
The server offers these payment options (any one settles the call):
- network=base scheme=exact amount=20000 units = $0.0200 USDC
- network=solana scheme=exact amount=20000 units = $0.0200 USDC
- network=x_layer scheme=exact amount=20000 units = $0.0200 USDC
- network=polygon scheme=exact amount=20000 units = $0.0200 USDC
=> One 'latest prices' call costs $0.02, exactly as documented.
=> No signature was sent, so nothing was charged.
======================================================================
Recorded tool call
{
"type": "tool_call",
"seq": 114,
"ts": "2026-10-15T16:58:35.110Z",
"name": "bash",
"turn": 1,
"input": {
"command": "cd /sandbox/repo/allium-example && python3 allium_free_demo.py 2>&1 | sed -n '13,26p'"
},
"run_id": "cmv9s5vv804sf0itwcc1tes4s",
"tool_id": "chatcmpl-tool-a55841fb84c9c8fa",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 115,
"ts": "2026-10-15T16:58:37.457Z",
"turn": 1,
"output": {
"content": [
{
"text": "======================================================================\n HTTP 402 -> Payment Required!\n x402Version: 2\n The server offers these payment options (any one settles the call):\n\n - network=base scheme=exact amount=20000 units = $0.0200 USDC\n - network=solana scheme=exact amount=20000 units = $0.0200 USDC\n - network=x_layer scheme=exact amount=20000 units = $0.0200 USDC\n - network=polygon scheme=exact amount=20000 units = $0.0200 USDC\n\n => One 'latest prices' call costs $0.02, exactly as documented.\n => No signature was sent, so nothing was charged.\n\n======================================================================\n",
"type": "text"
}
]
},
"run_id": "cmv9s5vv804sf0itwcc1tes4s",
"tool_id": "chatcmpl-tool-a55841fb84c9c8fa",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
Now the labels are readable: base, solana, x_layer, polygon — all $0.02 USDC.
Now let me write the README that documents pricing and how to run, plus my agent-manageability assessment. Then I'll give the final summary to the user.
Let me write a concise README.md.
Clean output now. Let me write the README documenting pricing, usage, and the agent-manageability assessment:
File edits
1 file
Writtenallium-example/README.mdView changes
/sandbox/repo/allium-example/README.md
Written content · previous contents were not recorded
# Allium — simple example (Machine Payments API)A minimal, working example against **Allium's agent-facing REST API**(`https://agents.allium.so`). Allium is an enterprise onchain-data platform;its **Machine Payments** product is the one path that needs *no account, no APIkey, and no subscription* — you pay per call in USDC over the x402 / Tempo MPPprotocols. That makes it the right (and only) Allium surface an automated agentcan drive end-to-end.## Files| File | Cost to run | Deps | What it does || --- | --- | --- | --- || `allium_free_demo.py` | **$0** | stdlib only | Hits the free chain-discovery endpoint (HTTP 200), then makes an *unpaid* call to a paid endpoint to show the live 402 price. Never signs a payment. || `allium_paid_tempo.py` | **~$0.02 USDC** | `pympp[tempo]` | A real paid call via the official SDK. Refuses to run unless `YOUR_PRIVATE_KEY` is set. || `requirements.txt` | — | — | Pins `pympp[tempo]` for the paid script only. |## Run it```bash# 1) Free, instant, no money, no install:python3 allium_free_demo.py# 2) Optional — a real paid call (spends ~$0.02 USDC):pip install -r requirements.txtexport YOUR_PRIVATE_KEY="0x...key-for-a-wallet-holding-USDC-on-Tempo..."python3 allium_paid_tempo.py```## How pricing worksAllium has **two unrelated pricing models**:1. **Enterprise / subscription** — the Allium App, Terminal, Explorer,Datashares, Datastreams. Sales-gated (`allium.so/pricing` redirects to`/contact`); billed on credits with configurable overage. Not self-serve.2. **Machine Payments** (what this example uses) — pure **pay-per-call** inUSDC. No API key, no registration, no minimum spend. Every call is pricedindividually and negotiated inline via HTTP `402 Payment Required`:| Endpoint | Cost / call || --- | --- || `GET /supported-chains/...` (discovery) | **free** || `POST /developer/prices*` | $0.02 || `POST /developer/tokens/chain-address` | $0.02 || `GET /developer/tokens` , `/tokens/search` | $0.03 || `POST /developer/wallet/{balances,transactions,pnl}` | $0.03 || `POST /explorer/queries/run-async` (raw SQL) | $0.01 |- Settlement is **USDC** (6 decimals) on Base / Polygon / Solana / X Layer(x402, facilitators Coinbase/OKX) or Tempo (Tempo MPP). **Gasless** for thecaller — Allium settles onchain; you only need USDC, not ETH.- **Rate limits:** 3 req/s for `/developer/*`, 5 req/s for `/docs/*` (HTTP 429→ back off 1s).The free demo proves this live: an unpaid `/prices` call returns`x402Version: 2` with four `amount: 20000` offers = 20000 / 10⁶ = **$0.02**each. Nothing is charged because no signature is sent.## Is it easy for an agent to manage? — Short answer: **yes, the MachinePayments path is unusually agent-friendly; the enterprise path is not.****Easy / good for automation**- Self-serve: no signup, no key issuance, no sales call. The wallet *is* theidentity.- Deterministic, machine-readable pricing: the 402 body tells you the exactprice and pay-to before you commit, so spend is fully controllable.- Official SDK (`pympp`) hides the whole 402 sign-and-retry flow behind a normalHTTP call; there are also prebuilt agent skills(`npx skills add allium-labs/skills`).- x402 can use **Privy server wallets**, so an agent never has to hold a rawprivate key or pay gas.**Friction / gotchas to know**- **Real money by design.** Every useful call costs USDC. An agent must have afunded wallet and a spend cap; I deliberately gated the paid script behind anenv var so it can't spend by accident.- **Key custody is the real risk.** `pympp`'s default flow signs with a rawprivate key from the environment. Prefer Privy server wallets or a fresh,low-balance throwaway wallet; never commit a key.- **Cloudflare UA filter:** `agents.allium.so` returns HTTP 403 (error 1010) forthe default `Python-urllib` User-Agent. The demo sets a normal UA to get pastit — a one-line fix, but a genuine "why is this 403?" trap.- **Beta tooling:** `allium-cli` is flagged early-beta; the REST/SDK path usedhere is the stable surface.- Costs are small but not zero, so high-volume loops can add up — cache the freediscovery response per session, as the docs advise.**Bottom line:** for an agent, this is one of the easier paid data APIs to drive— self-serve, per-call priced, SDK-wrapped, and keyless via Privy. The onlythings that need a human are funding the wallet and setting a spend policy.
Source: write · chatcmpl-tool-a69967e446509855
Recorded tool call
{
"type": "tool_call",
"seq": 119,
"ts": "2026-10-15T16:58:55.893Z",
"name": "write",
"turn": 1,
"input": {
"path": "/sandbox/repo/allium-example/README.md",
"content": "# Allium — simple example (Machine Payments API)\n\nA minimal, working example against **Allium's agent-facing REST API**\n(`https://agents.allium.so`). Allium is an enterprise onchain-data platform;\nits **Machine Payments** product is the one path that needs *no account, no API\nkey, and no subscription* — you pay per call in USDC over the x402 / Tempo MPP\nprotocols. That makes it the right (and only) Allium surface an automated agent\ncan drive end-to-end.\n\n## Files\n\n| File | Cost to run | Deps | What it does |\n| --- | --- | --- | --- |\n| `allium_free_demo.py` | **$0** | stdlib only | Hits the free chain-discovery endpoint (HTTP 200), then makes an *unpaid* call to a paid endpoint to show the live 402 price. Never signs a payment. |\n| `allium_paid_tempo.py` | **~$0.02 USDC** | `pympp[tempo]` | A real paid call via the official SDK. Refuses to run unless `YOUR_PRIVATE_KEY` is set. |\n| `requirements.txt` | — | — | Pins `pympp[tempo]` for the paid script only. |\n\n## Run it\n\n```bash\n# 1) Free, instant, no money, no install:\npython3 allium_free_demo.py\n\n# 2) Optional — a real paid call (spends ~$0.02 USDC):\npip install -r requirements.txt\nexport YOUR_PRIVATE_KEY=\"0x...key-for-a-wallet-holding-USDC-on-Tempo...\"\npython3 allium_paid_tempo.py\n```\n\n## How pricing works\n\nAllium has **two unrelated pricing models**:\n\n1. **Enterprise / subscription** — the Allium App, Terminal, Explorer,\n Datashares, Datastreams. Sales-gated (`allium.so/pricing` redirects to\n `/contact`); billed on credits with configurable overage. Not self-serve.\n\n2. **Machine Payments** (what this example uses) — pure **pay-per-call** in\n USDC. No API key, no registration, no minimum spend. Every call is priced\n individually and negotiated inline via HTTP `402 Payment Required`:\n\n | Endpoint | Cost / call |\n | --- | --- |\n | `GET /supported-chains/...` (discovery) | **free** |\n | `POST /developer/prices*` | $0.02 |\n | `POST /developer/tokens/chain-address` | $0.02 |\n | `GET /developer/tokens` , `/tokens/search` | $0.03 |\n | `POST /developer/wallet/{balances,transactions,pnl}` | $0.03 |\n | `POST /explorer/queries/run-async` (raw SQL) | $0.01 |\n\n - Settlement is **USDC** (6 decimals) on Base / Polygon / Solana / X Layer\n (x402, facilitators Coinbase/OKX) or Tempo (Tempo MPP). **Gasless** for the\n caller — Allium settles onchain; you only need USDC, not ETH.\n - **Rate limits:** 3 req/s for `/developer/*`, 5 req/s for `/docs/*` (HTTP 429\n → back off 1s).\n\n The free demo proves this live: an unpaid `/prices` call returns\n `x402Version: 2` with four `amount: 20000` offers = 20000 / 10⁶ = **$0.02**\n each. Nothing is charged because no signature is sent.\n\n## Is it easy for an agent to manage? — Short answer: **yes, the Machine\nPayments path is unusually agent-friendly; the enterprise path is not.**\n\n**Easy / good for automation**\n- Self-serve: no signup, no key issuance, no sales call. The wallet *is* the\n identity.\n- Deterministic, machine-readable pricing: the 402 body tells you the exact\n price and pay-to before you commit, so spend is fully controllable.\n- Official SDK (`pympp`) hides the whole 402 sign-and-retry flow behind a normal\n HTTP call; there are also prebuilt agent skills\n (`npx skills add allium-labs/skills`).\n- x402 can use **Privy server wallets**, so an agent never has to hold a raw\n private key or pay gas.\n\n**Friction / gotchas to know**\n- **Real money by design.** Every useful call costs USDC. An agent must have a\n funded wallet and a spend cap; I deliberately gated the paid script behind an\n env var so it can't spend by accident.\n- **Key custody is the real risk.** `pympp`'s default flow signs with a raw\n private key from the environment. Prefer Privy server wallets or a fresh,\n low-balance throwaway wallet; never commit a key.\n- **Cloudflare UA filter:** `agents.allium.so` returns HTTP 403 (error 1010) for\n the default `Python-urllib` User-Agent. The demo sets a normal UA to get past\n it — a one-line fix, but a genuine \"why is this 403?\" trap.\n- **Beta tooling:** `allium-cli` is flagged early-beta; the REST/SDK path used\n here is the stable surface.\n- Costs are small but not zero, so high-volume loops can add up — cache the free\n discovery response per session, as the docs advise.\n\n**Bottom line:** for an agent, this is one of the easier paid data APIs to drive\n— self-serve, per-call priced, SDK-wrapped, and keyless via Privy. The only\nthings that need a human are funding the wallet and setting a spend policy.\n"
},
"run_id": "cmv9s5vv804sf0itwcc1tes4s",
"tool_id": "chatcmpl-tool-a69967e446509855",
"tool_kind": "file_edit"
}Recorded tool result
{
"type": "tool_result",
"seq": 120,
"ts": "2026-10-15T16:58:55.893Z",
"turn": 1,
"output": {
"content": [
{
"text": "Successfully wrote 4520 bytes to /sandbox/repo/allium-example/README.md",
"type": "text"
}
]
},
"run_id": "cmv9s5vv804sf0itwcc1tes4s",
"tool_id": "chatcmpl-tool-a69967e446509855",
"is_error": false,
"tool_kind": "file_edit"
}›Thinking…
Let me do a final listing of the files and a final run to confirm everything is in place. Then write the summary to the user.
Let me do a final check of the deliverables:
cd /sandbox/repo/allium-example && ls -la && echo "--- syntax check both scripts ---" && python3 -m py_compile allium_free_demo.py allium_paid_tempo.py && echo "OK: both compile" && echo "--- paid script safety gate (no key set) ---" && python3 allium_paid_tempo.py 2>&1 | head -3
total 28
total 28 drwx------ 2 root root 4096 Oct 15 16:58 . drwxr-xr-x 4 root root 4096 Oct 15 16:58 .. -rw------- 1 root root 4548 Oct 15 16:58 README.md -rw------- 1 root root 3793 Oct 15 16:58 allium_free_demo.py -rw------- 1 root root 1757 Oct 15 16:58 allium_paid_tempo.py -rw------- 1 root root 159 Oct 15 16:58 requirements.txt --- syntax check both scripts --- OK: both compile --- paid script safety gate (no key set) --- Refusing to run: YOUR_PRIVATE_KEY is not set. This script makes a real ~$0.02 USDC payment. Set it explicitly to opt in: export YOUR_PRIVATE_KEY=0x...
Recorded tool call
{
"type": "tool_call",
"seq": 124,
"ts": "2026-10-15T16:58:58.905Z",
"name": "bash",
"turn": 1,
"input": {
"command": "cd /sandbox/repo/allium-example && ls -la && echo \"--- syntax check both scripts ---\" && python3 -m py_compile allium_free_demo.py allium_paid_tempo.py && echo \"OK: both compile\" && echo \"--- paid script safety gate (no key set) ---\" && python3 allium_paid_tempo.py 2>&1 | head -3"
},
"run_id": "cmv9s5vv804sf0itwcc1tes4s",
"tool_id": "chatcmpl-tool-bcf463bfcd4f0182",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 125,
"ts": "2026-10-15T16:58:58.905Z",
"turn": 1,
"output": {
"content": [
{
"text": "total 28\ndrwx------ 2 root root 4096 Oct 15 16:58 .\ndrwxr-xr-x 4 root root 4096 Oct 15 16:58 ..\n-rw------- 1 root root 4548 Oct 15 16:58 README.md\n-rw------- 1 root root 3793 Oct 15 16:58 allium_free_demo.py\n-rw------- 1 root root 1757 Oct 15 16:58 allium_paid_tempo.py\n-rw------- 1 root root 159 Oct 15 16:58 requirements.txt\n--- syntax check both scripts ---\nOK: both compile\n--- paid script safety gate (no key set) ---\nRefusing to run: YOUR_PRIVATE_KEY is not set.\nThis script makes a real ~$0.02 USDC payment.\nSet it explicitly to opt in: export YOUR_PRIVATE_KEY=0x...\n",
"type": "text"
}
]
},
"run_id": "cmv9s5vv804sf0itwcc1tes4s",
"tool_id": "chatcmpl-tool-bcf463bfcd4f0182",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
Everything is in place and verified:
allium_free_demo.pyruns live, no money, no deps.allium_paid_tempo.pycompiles and has a working safety gate.README.mddocuments pricing + agent-manageability.requirements.txtpins the SDK.
Now let me write the final summary to the user, answering their three questions:
- Built a simple example ✓
- How pricing works ✓
- Whether it's easy for me to manage ✓
- Whether I got blocked (the 403 UA thing, and the fact that the paid call needs a funded wallet — I'll note I stopped short of spending money).
Let me be concise but complete.
Done. I built and verified a working example against Allium's hosted API — no local stacks, no long-running commands, nothing spent.
What I built (/sandbox/repo/allium-example/)
allium_free_demo.py— dependency-free (stdlib), runs instantly. Calls Allium's free chain-discovery endpoint (HTTP 200, real data), then makes an unpaid call to a paid endpoint to show the live402price. I ran it — it works.allium_paid_tempo.py— a real paid call via the officialpymppSDK; gated behindYOUR_PRIVATE_KEYso it can't spend by accident (verified the gate fires).README.md,requirements.txt.
Allium is an enterprise onchain-data platform. Almost all of it (Terminal, Explorer, Datashares) is sales-gated. The one surface an agent can drive end-to-end is Machine Payments (agents.allium.so): no account, no API key, no subscription — pay per call in USDC over x402/Tempo MPP.
How pricing works
Two unrelated models:
- Enterprise/subscription — sales-gated (
/pricing→/contact), credit-based. Not self-serve. - Machine Payments (what I used) — pure pay-per-call in USDC, negotiated inline via HTTP
402. No minimum spend. Verified live prices:
| Endpoint | Cost/call |
|---|---|
supported-chains discovery | free |
explorer/queries/run-async (SQL) | $0.01 |
developer/prices*, tokens/chain-address | $0.02 |
tokens/search, wallet/{balances,transactions,pnl} | $0.03 |
Settlement is USDC (6 decimals) on Base/Polygon/Solana/X Layer (x402, Coinbase/OKX facilitators) or Tempo — gasless for you. Rate limits: 3 req/s (/developer), 5 req/s (/docs). The free demo proved an unpaid /prices call returns amount:20000 = 20000/10⁶ = $0.02, with nothing charged.
Is it easy for me to manage?
Yes — the Machine Payments path is unusually agent-friendly; the enterprise path is not. Self-serve (wallet = identity), machine-readable per-call pricing you can see before committing, an SDK that hides the sign-and-retry flow, and keyless signing via Privy server wallets. The friction: it costs real money per call, and the default SDK flow signs with a raw private key from the environment — so it needs a funded wallet, a spend cap, and careful key custody (use Privy or a throwaway low-balance wallet). One concrete gotcha I hit and fixed: Cloudflare returns HTTP 403 (error 1010) for the default Python-urllib User-Agent — a normal UA header fixes it.
Where I stopped (not blocked, by choice)
I did not execute a real paid call: that would spend your USDC and require a private key I shouldn't hold or use autonomously. Everything up to the payment is proven working; to complete it, fund a wallet with a little USDC on Tempo, set YOUR_PRIVATE_KEY, and run allium_paid_tempo.py.
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