---
title: "Transfer a token from a signer without gas"
method: POST
path: "/contracts/v1/signers/{signer_id}/transfers"
tags: ["Contracts"]
---

# Transfer a token from a signer without gas

`POST /contracts/v1/signers/{signer_id}/transfers`

## Request

- Base URL: `https://api.run402.com`
- URL: `https://api.run402.com/contracts/v1/signers/{signer_id}/transfers`
- Auth: HTTP bearer

The signer is the payer of an x402 `exact` payment: the gateway builds the token's EIP-3009 TransferWithAuthorization for exactly `amount` to `to`, the signer's key signs its EIP-712 digest, and the platform's facilitator verifies and settles it and pays the gas. The signer needs no native balance. One signing fee ($0.000005) is billed; no gas is. Idempotent on an optional Idempotency-Key with request fingerprinting: a matched replay returns the stored transfer, a mismatch answers 409 carrying the stored transfer's id, status and tx_hash, and a transfer that failed before settlement re-executes under the same key while one that died in settlement never does. Answers 200 `settled` with the transaction, or 202 `unknown` when the settle call's outcome never came back (the reconciler finishes it from the token's authorizationState; poll the transfer).

## Path parameters

- `signer_id` string, required

## Headers

- `Idempotency-Key` string

## Request body

- object
  - `chain` string, required: The signer's chain (`base-mainnet` or `base-sepolia`).
  - `asset` string: The token to send; `usdc` today. Refused with TRANSFER_ASSET_UNSUPPORTED when the facilitator does not settle it on the signer's network.
  - `to` string, required: The receiving address.
  - `amount` string, required: The amount in the asset's base units (USDC: 6 decimals), as a decimal string.

## Response `200`

Settled.

- SignerTransfer
  - `transfer_id` string
  - `signer_id` string
  - `status` 'pending' | 'settled' | 'failed' | 'unknown'
  - `tx_hash` string, nullable: The settlement transaction once the facilitator reports it; null for a transfer the reconciler settled from the token's authorization state.
  - `chain` string
  - `network` string: The x402 network id (`eip155:…`).
  - `asset` string
  - `asset_address` string
  - `to` string
  - `amount` string
  - `nonce` string, nullable: The EIP-3009 authorization nonce, so a caller can read `authorizationState(from, nonce)` itself.
  - `failed_phase` 'precheck' | 'sign' | 'verify' | 'settle' | 'null', nullable
  - `facilitator_reason` string, nullable
  - `created_at` string, date-time
  - `updated_at` string, date-time

## Other responses

- `202`: Outcome unknown; poll the transfer.
- `400`: Error envelope
- `403`: Error envelope
- `404`: Error envelope
- `409`: Error envelope
- `422`: Error envelope
- `502`: Error envelope
- `503`: Error envelope

---

[API](https://skmtc.dev/run402/apis/run402-api.md) · [All operations](https://skmtc.dev/run402/apis/run402-api/llms.txt) · [OpenAPI document](https://skmtc.dev/run402/apis/run402-api/revisions/893607557f50?raw)
