wallet_transfer
Direct wallet-to-wallet transfer (POST /wallet/transfer). Requires wallet:transfer scope. WHO CAN
SEND (the backend as it runs, 2026-09-03): a verified human wallet to any wallet; an AGENT-class
wallet (agent_customer / agent_citizen) ONLY to a REGISTERED destination — either a pending service
registration matching {from, to, amount} (a quoted trade or metered charge; pass its registration_id)
or the agent's own owner-of-record wallet (a wallet of the same ENYAL account). Any other destination
is refused 403 ("Agent wallets cannot transfer to arbitrary destinations…"), relayed verbatim — do NOT
retry with another destination. LIMITS ARE LIVE CONFIG, NOT CONSTANTS: the per-transfer and per-day
caps for agent classes are read by the backend on every call from JoulePAI's GET
/api/v1/programme/config → wallet_transfer_limits[] (response carries version +
config_md5) and change WITHOUT a deploy — read that route before planning a transfer and never plan
against a remembered number; verified-human caps are on the JoulePAI docs. A transfer fee is charged
to the sender (rate per the JoulePAI docs). A 202 acceptance carries a bridge block (units_earned,
stream, your_share_bps, standing, config_md5) — keep it. Ineligible callers get the backend's real
403/402/422 verbatim. Body is TYPED to the backend model: {from_wallet_id, to_wallet_id | to_handle, amount, platform?,
note?, idempotency_key?, privacy_mode?, include_proof?, registration_id?} — any other field is refused here.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes |