nirium
Autonomous treasury and agentic-payments infrastructure for Nirium Protocol on Stellar/Soroban — Python client.
Nirium agents rebalance USDC ↔ CETES (tokenized Mexican T-bills via Etherfuse) 24/7 without human intervention. Built for developers who want to integrate autonomous treasury management, agentic payments (x402 + MPP), and real-time market signals into their applications.
Install
pip install nirium
Quick Start
import asyncio
from nirium import Agent
agent = Agent(
api_url="https://nirium-agent.fly.dev",
api_key="sk_inst_your_key_here",
)
async def main():
# Health check
alive = await agent.ping()
print(f"Agent alive: {alive}")
# Real market data from Stellar Horizon
market = await agent.get_market()
print(f"XLM Price: ${market['xlmPrice']:.4f}")
# Trigger a demo strategy on Nirium's own shared testnet vault — a real,
# working transaction, not a simulation, but it moves Nirium's testnet
# funds, not yours. To rebalance YOUR OWN vault, see Treasury Rebalance below.
result = await agent.execute("blend-yield", "USDC", {"amount": 5000})
print(f"Success: {result['success']} | TX: {result.get('txHash')}")
asyncio.run(main())
Real-Time Signals (WebSocket)
agent = Agent(api_url="https://nirium-agent.fly.dev", api_key="sk_inst_...", token="eyJhbG...")
@agent.on("signal")
async def on_signal(data):
print(f"Signal: {data['signal_type']} — {data['data']['details']}")
asyncio.run(agent.subscribe())
Authentication
# API Key for REST endpoints
agent = Agent(api_url="https://nirium-agent.fly.dev", api_key="sk_inst_...")
# With JWT token for WebSocket
agent = Agent(api_url="https://nirium-agent.fly.dev", api_key="sk_inst_...", token="eyJhbG...")
Payment Protocols
x402 — Pay-Per-Request
agent.init_x402(
secret_key="S...", # Stellar secret key
network="stellar:testnet"
)
response = await agent.x402_fetch("https://nirium-agent.fly.dev/api/v1/premium/signals")
MPP — Session-Based Budget Delegation
agent.init_mpp(
secret_key="S...",
network="stellar:testnet",
)
response = await agent.mpp_fetch("https://nirium-agent.fly.dev/api/v1/mpp/signals")
Endpoint Access Model
| Access | Endpoints |
|---|---|
| Public (no key) | health, loop/status, execute-demo, signals/recent, skills list |
| Protected (API key) | execute, market, loop/start|stop|scan, subscriptions, skills/install, webhooks |
| WebSocket (JWT) | /ws/signals — real-time signal stream |
| x402 Premium | /api/v1/premium/signals ($0.02 USDC), /api/v1/premium/market ($0.05 USDC) |
| MPP | /api/v1/mpp/signals, /api/v1/mpp/market |
Payouts
Batch disbursement, non-custodial: the node builds an unsigned transaction, you sign it with your own wallet and broadcast it. Nirium never holds funds and never sees your keys.
run = await agent.create_payout_run(
recipients=[{"wallet": "GABC...", "amount": "250.00"}],
acknowledge_terms=True, # required on every network — 403 without it
)
signed_xdr = sign_with_your_wallet(run["xdr"])
settled = await agent.submit_payout(run["runId"], signed_xdr)
print(settled["txHash"], settled["cid"]) # on-chain hash + IPFS receipt
Licensed for independent service payments only — contractors, freelancers, B2B. Not for subordinate-employee salary. Read get_payout_terms() before integrating; classifying recipients and meeting tax and labor obligations is the client's responsibility.
Mainnet is invite-only during early access and additionally requires client_info.
Treasury Rebalance
Two ways to rebalance a DeFindex vault between idle cash and an invested strategy. Neither is a swap — the contract's rebalance() exposes exactly two instructions, Unwind and Invest, and neither accepts a destination address, so withdrawing anywhere but back into the vault itself is not expressible.
Propose — you review and sign, available to everyone today
The agent decides what it would do, using the same decision logic as the autonomous signer below, but it never signs. Public, no allowlist, no invite required — works for any vault where you're already the on-chain rebalance manager.
proposal = await agent.propose_treasury_rebalance(
vault="CABC...",
caller="GABC...", # must already be this vault's rebalanceManager on-chain
enter_at=2.5, # your own mandate — Nirium never supplies a default here
exit_at=2.0,
)
if proposal["instructions"]:
signed_xdr = sign_with_your_wallet(proposal["xdr"])
await agent.submit_treasury_tx(signed_xdr)
else:
print("Nothing to propose:", proposal["reason"])
Autonomous — Nirium signs, invite-only during legal review
execute_treasury_rebalance() has Nirium sign and submit with its own RebalanceManager key — full autonomy, no per-cycle approval. This is invite-only while a specific legal question stays open: whether executing on a client's behalf without taking custody still counts as regulated facilitation under Mexican law. It only runs against vaults explicitly allowlisted server-side; calling it against any other vault returns 403, and Nirium's mainnet infrastructure returns 501 for it entirely, since that box holds no signing key by design. Ask if you want autonomous execution today — otherwise, propose_treasury_rebalance() above gives you the same decision-making with you as the one who signs.
Audit Trail
Anchor evidence to IPFS and get back a CID — an integrity seal, not notarization.
anchor = await agent.anchor_audit_record(
hash="sha-256:9f86d081...", # hash of your own file or event
tag="invoice-batch-jul",
)
print(anchor["cid"])
Anchor a hash rather than the data itself: IPFS content cannot be deleted, so raw personal data would outlive any erasure request.
API Coverage
| Category | Methods |
|---|---|
| Health | ping(), health(), system_health() |
| Execution | execute(), execute_demo() |
| Market | get_tickers(), get_market(), get_stats(), get_loop_status(), start_loop(), stop_loop(), trigger_scan() |
| Signals | create_subscription(), get_subscriptions(), delete_subscription(), get_subscription_stats(), get_recent_signals() |
| Skills | get_skills(), install_skill(), uninstall_skill(), get_skill_marketplace(), execute_skill_action() |
| Strategies | get_strategies() |
| Webhooks | register_webhook(), get_webhooks(), delete_webhook(), test_webhook() |
| Auth | get_auth_token(), create_auth_key(), get_auth_keys(), revoke_auth_key() |
| Revenue | get_revenue(), get_info() |
| Nodes | get_nodes() |
| Payouts | create_payout_run(), submit_payout(), onboard_payout_recipient(), submit_payout_onboard(), get_payout_runs(), get_payout_terms(), get_payout_info() |
| Treasury | get_treasury_info(), get_treasury_vault(), get_treasury_vaults(), get_treasury_strategy_asset(), deploy_treasury_vault(), deposit_to_treasury_vault(), withdraw_from_treasury_vault(), set_treasury_rebalance_manager(), build_treasury_rebalance(), propose_treasury_rebalance(), execute_treasury_rebalance(), submit_treasury_tx() |
| Audit Trail | anchor_audit_record(), get_audit_info() |
| Reporting | get_reporting_summary(), get_reporting_export() |
| Admin | configure_llm() |
| WebSocket | subscribe(), on() decorator |
| x402 Payments | init_x402(), x402_fetch() |
| MPP Payments | init_mpp(), mpp_fetch() |
Requirements
- Python >= 3.10
- aiohttp >= 3.9.0
- websockets >= 13.0
Links
License
Apache 2.0 — Nirium Protocol
Release files for nirium 0.11.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| nirium-0.11.0.tar.gz | 27.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| nirium-0.11.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size:48.7 kB
Release files / nirium-0.11.0.tar.gz
| Download URL | nirium-0.11.0.tar.gz |
|---|---|
| Size | 27.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
7de9f659a746b9924e66645ee8939b3d6c680e5ad95f9e475ae4d6f792e0736b
|
|
BLAKE2b-256 checksum How to use checksums |
3afd98cd3d17ed843e1ec96a4637cf53c6e0f5b4bd2bd0303a8a1252b86bbcf6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.3
|
Release files / nirium-0.11.0-py3-none-any.whl
| Download URL | nirium-0.11.0-py3-none-any.whl |
|---|---|
| Size | 20.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
8e3e410fff60be619c475e79e61656338617012c43218f980799c4542666ef69
|
|
BLAKE2b-256 checksum How to use checksums |
616d88de1e44be9d3bddb3f2b87de565fa2aec01aae6d30ee8fa7ebe2e7e785f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.3
|