Skip to main content

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)

Source distribution for nirium 0.11.0
File Size Uploaded
nirium-0.11.0.tar.gz 27.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for nirium 0.11.0
File Interpreter ABI Platform
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

Release history Release notifications | RSS feed

This release

0.11.0 This release

2 release files

0.10.0

2 release files

0.9.2

2 release files

0.9.1

2 release files

0.9.0

2 release files

0.8.1

2 release files

0.8.0

2 release files

0.7.0

2 release files

0.6.3

2 release files

0.6.2

2 release files

0.6.1

2 release files

0.6.0

2 release files

0.5.0

2 release files

0.4.0

2 release files

0.2.1

2 release files

0.2.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page