---
title: "Create an EVM transfer wallet action"
method: POST
path: "/vault/{agentId}/actions/transfer"
tags: ["Vault"]
---

# Create an EVM transfer wallet action

`POST /vault/{agentId}/actions/transfer`

Creates and signs/broadcasts a native EVM transfer or selector-gated ERC20 transfer when policy allows. ERC20 transfers sign the token contract with `transfer(address,uint256)` calldata, zero native value, token/recipient/amount action metadata, and a required constrained `contract-allowlist` selector policy. Policy-denied actions return 403 with status `rejected`; manual-approval actions return 202 with status `pending_approval`; RPC failures return 500/502 with the created action ID when available. Broadcast actions require idempotency.

## Headers

- `X-Steward-Request-Timestamp` string
- `X-Steward-Request-Expires-At` string
- `X-Steward-Signature` string
- `X-Steward-Signing-Key-Id` string
- `Idempotency-Key` string

## Request body

- union
  - object
    - `to` string, required
    - `value` string, required
    - `amountWei` string
    - `token` string
    - `chainId` integer
    - `broadcast` boolean
    - `referenceId` string
    - `sponsor` boolean
  - object
    - `to` string, required
    - `value` string
    - `amountWei` string, required
    - `token` string
    - `chainId` integer
    - `broadcast` boolean
    - `referenceId` string
    - `sponsor` boolean

## Response `200`

JSON response

- object
  - `ok` true, required
  - `data` object, required
    - `id` string, required
    - `type` 'transfer', required
    - `status` 'pending_approval' | 'rejected' | 'signed' | 'broadcast' | 'confirmed' | 'failed' | 'outcome_unknown' | 'retired', required
    - `chainId` integer, required
    - `to` string, required
    - `value` string, required
    - `token` string, required
    - `txHash` string
    - `signedTx` string
    - `sponsorship` object
      - `requested` boolean
      - `sponsored` boolean
      - `provider` string
      - `mode` string
      - `estimatedUsd` number, nullable
    - `policyResults` object[]
    - `createdAt` string, date-time
    - `signedAt` string, date-time
    - `confirmedAt` string, date-time

## Other responses

- `202` — JSON response
- `400` — JSON response
- `401` — JSON response
- `403` — JSON response
- `404` — JSON response
- `408` — JSON response
- `409` — JSON response
- `429` — JSON response
- `500` — JSON response
- `501` — JSON response
- `502` — JSON response
- `503` — JSON response

## Changes

- **2026-08-20** `7bcf02be8710` — 2 warning
  - added the new `retired` enum value to the `data/status` response property for the response status `200`
  - added the new `retired` enum value to the `data/status` response property for the response status `202`
- **2026-08-17** `261a7c8070b2` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/steward-fi/apis/steward-api/changes/vault/:agentId/actions/transfer/post.md)

---

[API](https://skmtc.dev/steward-fi/apis/steward-api.md) · [All operations](https://skmtc.dev/steward-fi/apis/steward-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/steward-fi/steward-api/revisions/b88b4b97a664/schema)
