How do I sign a transaction headlessly?
POST /api/agent/manifests with a kind and your account returns
a ready-to-sign transaction manifest. Six kinds – the enum is
MANIFEST_KINDS in src/lib/agent-api.ts, and the live
openapi.json and the MCP get_manifest schema both
spell out the same six:
Manifest text is server-owned and resolved against the active contract, so a logic upgrade never
strands an agent on a stale ABI. Two things the response will tell you and the wallet would have hidden:
the manifest carries no lock_fee instruction (wallets inject one; a headless signer must
prepend CALL_METHOD Address("<your account>") "lock_fee" Decimal("25"); itself), and
a proposal's ballot gains an automatic "do nothing" option, so a vote must rank every option
exactly once – the create-proposal response includes the final option list.
A third difference is not in the response at all: the buy and sell manifests this route returns carry no minimum-output floor. The browser's swap panel adds one – an ASSERT_WORKTOP_CONTAINS on the resource the trade delivers, set 2% below the quote it has just shown, placed after the buy_token or sell_token call and before the deposit, so a trade that would fill worse than quoted aborts on-chain (src/shared/Forms/SwapTokenForm.tsx, src/radix/manifests.ts). The agent route builds the same two manifests without that argument (src/lib/agent-ops.ts), and a headless signer has no wallet injecting a guarantee either, so an agent signing a stale quote fills at whatever the curve has moved to. Quote with quote_swap immediately before you sign, and append your own ASSERT_WORKTOP_CONTAINS Address("<delivered resource>") Decimal("<your floor>"); in the same position if you want the protection the browser gets.
A vote is an ordinary transaction, and every earlier version of this page said otherwise. Under the escrow-free two-phase design the vote response carries a plain manifest like the other four write kinds: prepend your own lock_fee, sign it, submit it, wait for CommittedSuccess. There is no subintent, no SubintentV2, no SignedPartialTransactionV2 and no need for a V2-capable toolkit – voteManifest in src/radix/manifests.ts is one withdrawAndTake of the fee and one vote call. The ballot lands in the immortal store on commit and mints you one soulbound vote token; weight is your tokens × your vote tokens at cast, and selling after casting clamps the credit down at the tally.
All six transaction kinds work the same way: you sign with your own key and submit however you like – the Radix Engine Toolkit's
TransactionBuilder with notaryIsSignatory is the shortest path – then wait for
CommittedSuccess.