Skip to main content

agents-u-cash (Python)

Zero-dependency Python client for the agents.u.cash API - the 402 Online Protocol for non-custodial agent payments. Works for both sides of the network: an agent selling (manage resources, watch settlements) and a buyer (fetch a 402 door, pay, and settle - automatically via on-chain detection, or instantly by submitting the tx hash). Supports ~40 native coins (Bitcoin + Lightning, Ethereum + 15 EVM L2s, Solana, Tron, XRP, USDT/USDC, USDC-on-Base gasless, UCASH) plus custom tokens on 20 chains (ERC-20 / TRC-20 / SPL / ...) - see agents.u.cash for the full live list.

Uses only the standard library (urllib). No dependencies. Python 3.7+.

Install

pip install agents-u-cash

Or copy agents_u_cash.py - it has no dependencies.

Sell (as an agent)

from agents_u_cash import AgentsUCash

# Get an API key once (wallet-first; works at $0 immediately - verify email optionally for free credit):
# key = AgentsUCash().signup(email="me@agent.dev", password="longpass")["api_key"]

agent = AgentsUCash(api_key="...")
agent.set_wallet("btc", "bc1q…")
agent.set_webhook("https://my.bot/webhook")

res = agent.create_resource(amount=0.05)               # priced resource
acc = agent.create_challenge(res["res_id"])             # what a buyer pays
# Share the payable link: https://agents.u.cash/r/{res_id}

settled = agent.get_settlements()                       # your earnings log

Buy (as a buyer)

from agents_u_cash import AgentsUCash

buyer = AgentsUCash()                                   # no key needed to buy
door = buyer.view_door(res_id)                          # the 402 door (JSON)
# 1. pick an entry, pay entry["payTo"] exactly entry["amount"] from your wallet (out of band)
# 2. the platform auto-detects the on-chain payment and settles it.
#    Optionally POST the tx hash to settle instantly instead:
result = buyer.verify(door["accepts"][0]["challengeId"], tx_hash)
# -> {"settled": True} | {"status": "pending", "confirmations": n, "required": m}

A human-friendly payable page is also available: buyer.view_door(res_id, html=True) returns the HTML.

UCP checkout sessions (buyer)

Multi-item, mixed-currency carts over the Universal Commerce Protocol. The merchant is resolved from the custom-domain base_url, or from a cloud merchant token on the shared host. No API key.

buyer = AgentsUCash()   # base_url = the merchant's domain (or the platform host + cloud)
cart = buyer.create_checkout(
    line_items=[{"item": {"id": res_id_a}, "quantity": 1}, {"item": {"id": res_id_b}, "quantity": 2}],
    currency="USD",            # optional: cart currency for mixed-currency carts
    cloud="<merchant-token>",  # only on the shared platform host
)
# -> {"id": ..., "status": "incomplete", "currency", "line_items", "totals", "ap2": {"merchant_authorization", "nonce"}}
ready = buyer.complete_checkout(cart["id"], cloud="<merchant-token>")
# -> ready_for_complete + payment_handlers[] (pay each challenge on-chain)
order = buyer.get_order(cart["id"], cloud="<merchant-token>")   # per-item fulfillment status

Optional AP2 (dev.ucp.shopping.ap2_mandate): pass complete_checkout(id, ap2={"checkout_mandate": ...}, cloud=...) with a buyer-signed SD-JWT-VC for holder-proof authorization. Responses are RFC 9421-signed (ES256) with the merchant key.

Manage your store (full merchant surface)

Beyond priced 402 resources, an agent is a first-class merchant over its own account: full transaction history + actions, multi-store, shop products, landers, payout-info/OTC, discount codes, checkout custom fields, and billing. All key-authenticated; tenant-scoped to the agent.

# Transactions: full history, CSV export, + actions
txs = agent.get_transactions(status="C", limit=50)
csv = agent.download_transactions(date_from="2026-01-01")     # raw CSV text
agent.refund_transaction(tx_id)        # self-guarding: only if you connected a refund-capable node/coinbase
agent.resend_webhook(tx_id)
agent.submit_hash(tx_id, "0xabc...")

# Stores (sub-merchants)
store = agent.create_store(label="Store B")  # api_key+cloud_token+webhook_secret returned once
agent.rotate_store_credential(store["store"]["id"], "cloud_token")

# Shop products, landers, payout-info/OTC
agent.create_shop_product(title="Ebook", price=9.99, currency="USD")
agent.create_lander(checkout_id=flag_id)
agent.create_payout_info(amount=50, currency="USD", email="payee@x.dev")  # emails the payee a link

# Discount codes (amount = price multiplier: 0.9 = 10% off) + checkout custom fields
agent.add_discount_code(code="LAUNCH", amount=0.9, checkout_ids="all")
agent.add_custom_field(type="select", label="Size", options=["S", "M", "L"])

# Billing: balances + capacity
bill = agent.get_billing()             # {credit_balance, ucash_points, lander_slots:{...}}
agent.buy_lander_pack(10)              # debits credit_balance, grows slots
agent.redeem_ucash(1000)               # UCASH points -> fee credit

Subagents (scoped RBAC keys)

Delegate a LIMITED credential to another automated principal. A subagent is a scoped sa_ API key with a staff role: it authenticates against your tenant, but the existing RBAC (uxc_can) enforces a limited capability set on every endpoint, so it can only do what the role allows. Owner-only (you create them; a subagent cannot create subagents). Reuses the merchant staff model + seat billing (a subagent with no free slot debits credit_balance).

# Built-in role: a clerk can create resources + read, but not edit settings, refund, or manage stores
sub = agent.create_subagent(role="clerk", display_name="Fulfillment bot")
# sub["api_key"] is the sa_ key, returned ONCE. The key works on every /v1/* endpoint; writes its role
# lacks return 403, and managing stores stays owner-only.

# Or a custom permission set (slugs: transactions.view, checkouts.edit, payment-links.create, ...).
# store_scope (store ids) restricts it to those stores (empty = all stores).
ro = agent.create_subagent(
    role="custom", permissions=["transactions.view", "checkouts.view"], store_scope=[store_id]
)

agent.get_subagents()                                  # list (never returns the api_key)
agent.update_subagent(sub["subagent"]["id"], role="manager", status="suspended")
fresh = agent.rotate_subagent_key(sub["subagent"]["id"])   # old key stops working; new key ONCE
agent.delete_subagent(sub["subagent"]["id"])           # key stops working; seat slot frees

Spend caps (per-caller limits)

Cap how much a single payer can spend on a resource in a rolling window. A payer whose settled spend in the window reaches amount is refused new authorization (x402 before-charge; on detect the platform refuses to credit an over-cap payment). Caller identity is the payer wallet. Optional; off by default.

res = agent.create_resource(amount=0.05, currency="USD", max_per_caller={"amount": 1.00, "window_hours": 24})
agent.set_resource_cap(res["res_id"], {"amount": 0.50, "window_hours": 6})  # change it
agent.set_resource_cap(res["res_id"], None)                                  # clear it
callers = agent.get_resource_callers(res["res_id"])                          # [{caller, spend, payments}]

API

Method Auth Description
signup(email, password, primary_wallet=None) - Register; returns api_key
top_up(amount) key Create a ≥$1 top-up checkout (adds platform credit; activates if not yet)
get_agent() key Account snapshot (balance, wallets, webhook, earnings summary)
set_webhook(url) key Set the settlement webhook
set_wallet(asset, address) key Set your receive address for an asset
set_stripe(secret_key, product_id, webhook_secret, publishable_key=None) key Connect your Stripe account (card rail); verifies the key + product
get_stripe() key Masked Stripe config + the webhook endpoint to register
clear_stripe() key Disconnect your Stripe account
set_custom_token(type, code, contract_address, decimals, name, rate=None, rate_url=None) key Add a custom token (ERC-20/TRC-20/SPL); then set_wallet(asset=code, address=...) to set its receive address
get_custom_tokens() key List your custom tokens
delete_custom_token(code) key Remove a custom token
get_settings() key Read safe settings (confirmations, webhook url+secret, currency, payment prefs, notifications, branding)
set_settings(partial) key Partially update safe settings
get_integrations() key Read stored third-party integration credentials (Discord, Telegram, BigCommerce, Ecwid, Wix)
set_integrations(integrations) key Store third-party integration credentials
create_resource(amount, currency=None, accepted_assets=None, webhook_url=None) key Create a priced resource
get_resources(res_id=None) key List resources, or fetch one
create_challenge(res_id) key Build the multi-coin accepts[]
verify(challenge_id, hash) key optional Verify + settle (buyer-push: no key needed)
get_settlements() key Earnings log
view_door(res_id, html=False) - The public 402 door (JSON, or HTML)
create_checkout(line_items, currency=None, buyer=None, context=None, cloud=None) - UCP checkout session (multi-item, mixed-currency cart)
get_checkout(id, cloud=None) - Fetch a checkout session
complete_checkout(id, ap2=None, cloud=None) - Mint challenges -> ready_for_complete (optional AP2 mandate)
cancel_checkout(id, cloud=None) - Cancel a checkout session
get_order(id, cloud=None) - A checkout session as a UCP order (per-item fulfillment)
search_catalog(query=None, filters=None, pagination=None, cloud=None) - Search the merchant catalog
get_product(id, cloud=None) - Fetch a single catalog product by id
lookup_products(ids, cloud=None) - Batch catalog lookup by ids
get_transactions(...) / get_transaction(id, webhook_log=False) / download_transactions(...) key Full history, one detail, CSV export
refund_transaction(id) / resend_webhook(id) / submit_hash(id, hash) key Refund (guarded), re-deliver webhook, attach hash
get_stores() / create_store(...) / update_store(id, ...) / delete_store(id) key Multi-store CRUD
rotate_store_credential(id, which) / test_store_webhook(id) key Rotate a store credential; send a test webhook
get_shop_products(id=None) / create_shop_product(**fields) / update_shop_product(id, **fields) / delete_shop_product(id) key Shop products (/v1/checkouts)
get_landers(...) / create_lander(checkout_id, tpl=None) / update_lander(...) / delete_lander(id) key Landers + offer status
create_payout_info(...) / get_payout_info(id) / complete_payout(id) key Payout-info / OTC requests
get_discount_codes() / add_discount_code(code, amount, checkout_ids="all") / set_discount_codes([...]) / delete_discount_code(code) key Discount codes (amount = multiplier)
get_custom_fields() / add_custom_field(**field) / set_custom_fields(custom_fields, title=None) / delete_custom_field(index) key Checkout custom fields
get_billing() / buy_lander_pack(qty) / redeem_ucash(amount) key Balances + capacity (lander pack, UCASH redeem)

All calls return the parsed response dict and raise AgentsUCashError on API errors (which carries .code and .status).

Error handling

from agents_u_cash import AgentsUCash, AgentsUCashError

try:
    agent.create_resource(amount=0.05)
except AgentsUCashError as e:
    print(e.code, e.status, e)   # e.g. 'uxc_agent_not_activated' 402 ...

Non-custodial: the platform never holds funds - every payTo is the seller's own wallet, and this client never sees your wallet keys.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

agents_u_cash-0.6.0.tar.gz (12.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

agents_u_cash-0.6.0-py3-none-any.whl (13.1 kB view details)

Uploaded Python 3

File details

Details for the file agents_u_cash-0.6.0.tar.gz.

File metadata

  • Download URL: agents_u_cash-0.6.0.tar.gz
  • Upload date:
  • Size: 12.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.9.25

File hashes

Hashes for agents_u_cash-0.6.0.tar.gz
Algorithm Hash digest
SHA256 605a3e96d656b52cb70693fc373e860678d1fc4ffac82060ba16c1b90a6bd500
MD5 8300ff0e917dd7cbca7b4a02134775fb
BLAKE2b-256 d6f234ac8b29ace50277290e97e3ff02950cb8975a9e665ff3be9b41c613c191

See more details on using hashes here.

File details

Details for the file agents_u_cash-0.6.0-py3-none-any.whl.

File metadata

  • Download URL: agents_u_cash-0.6.0-py3-none-any.whl
  • Upload date:
  • Size: 13.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.9.25

File hashes

Hashes for agents_u_cash-0.6.0-py3-none-any.whl
Algorithm Hash digest
SHA256 abf74f34dfd7505e2dca93415cc63223cc305bee2b325413010ccb961d96c68a
MD5 aa0bdde49075809d71c05c6e0c565eb7
BLAKE2b-256 d237fa955ec271f5bcf460a755756ca9377e8af121912ed9e6c7de30ea87b063

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page