---
title: "Sign a transaction without broadcasting"
method: POST
path: "/v1/agents/{agent_id}/transactions/sign"
tags: ["Transactions"]
---

# Sign a transaction without broadcasting

`POST /v1/agents/{agent_id}/transactions/sign`

## Request

- Base URL: `https://api.1claw.co`
- URL: `https://api.1claw.co/v1/agents/{agent_id}/transactions/sign`
- Auth: HTTP bearer

Signs a transaction inside the server (or TEE when using Shroud) but does
**not** broadcast it. The caller receives the raw `signed_tx` hex and
`tx_hash` so it can submit to any RPC of its choosing.

All agent guardrails (allowlists, value caps, daily limits) are enforced
exactly as for the submit endpoint. The signed transaction is recorded for
audit and daily-limit tracking with `status: "sign_only"`.

## Path parameters

- `agent_id` string, uuid, required

## Request body

- SignTransactionRequest
  - `to` string, required: Destination address (0x-prefixed)
  - `value` string, required: Value in ETH
  - `chain` string, required: Chain name or numeric ID
  - `data` string: Hex-encoded calldata
  - `signing_key_path` string: Vault path to signing key. Auto-resolves per-chain signing key if provisioned, otherwise keys/{chain}-signer.
  - `nonce` integer
  - `gas_price` string
  - `gas_limit` integer
  - `max_fee_per_gas` string
  - `max_priority_fee_per_gas` string
  - `simulate_first` boolean
  - `destination_tag` integer: Non-EVM (XRP): destination tag for exchange deposits
  - `memo` string: Non-EVM (XRP, Solana): optional memo
  - `fee_rate_sat_per_vbyte` integer: Non-EVM (Bitcoin): override the fetched fee rate (sat/vByte)
  - `fee_limit_sun` integer: Non-EVM (Tron): TRC-20 energy fee limit in sun
  - `token_mint` string: Non-EVM (Solana SPL / Tron TRC-20): token mint or contract address; omit for native transfer
  - `token_decimals` integer: Non-EVM (Solana, Tron): token decimals (default 6)
  - `ttl` integer: Non-EVM (Cardano): transaction time-to-live (absolute slot)
  - `xrpl_tx_json` object: Raw XRPL transaction JSON for full transaction type coverage. When present (and chain is XRP), the handler uses the xrpl-rust binary codec to encode and sign the transaction as-is. Supports all XRPL transaction types: Payment, TrustSet, OfferCreate, OfferCancel, AccountSet, EscrowCreate, NFTokenMint, AMMCreate, and 20+ more. Account, Sequence, Fee, LastLedgerSequence, and SigningPubKey are auto-filled when absent.

## Response `200`

Transaction signed successfully (not broadcast)

- SignTransactionResponse
  - `signed_tx` string: Raw signed transaction hex (always included)
  - `tx_hash` string
  - `from` string: Derived sender address
  - `to` string
  - `chain` string
  - `chain_id` integer
  - `nonce` integer
  - `value_wei` string
  - `status` 'sign_only'
  - `simulation_id` string
  - `simulation_status` string
  - `max_fee_per_gas` string
  - `max_priority_fee_per_gas` string

## Other responses

- `400`: Invalid request
- `402`: x402 payment required
- `403`: Insufficient permissions

---

[API](https://skmtc.dev/1claw/apis/1claw-api.md) · [All operations](https://skmtc.dev/1claw/apis/1claw-api/llms.txt) · [OpenAPI document](https://skmtc.dev/1claw/apis/1claw-api/revisions/5fa0918f3b41?raw)
