---
title: "Firma Web3"
description: "Firma mensajes, datos tipados y transacciones con billeteras de Fystack."
url: https://docs.fystack.io/es/web3-sign
last_updated: 2026-11-13
---

> ## Documentation index
> Fetch the complete documentation index at: https://docs.fystack.io/llms.txt
> Use it to discover all available pages before exploring further.

# Firma Web3

Firma mensajes, datos tipados y transacciones en redes EVM y Solana.

**Habilita Web3 Signing en la billetera antes de usar estos endpoints o el SDK.** Está deshabilitado de forma predeterminada; las solicitudes de firma devuelven **403 Forbidden** hasta que se habilite. Consulta [Habilitar la firma Web3](https://docs.fystack.io/product/web3-sign.md#enable-web3-signing).

Las solicitudes de firma requieren aprobación antes de ejecutarse. Revísalas en **Approval → DApp Transaction** en el dashboard. Consulta [Aprobaciones de firma Web3](https://docs.fystack.io/product/web3-sign.md#review-pending-requests).

Las solicitudes devuelven un `transaction_id`. Consulta el endpoint de estado hasta que la firma se complete o falle.

---

## Solicitar una firma

**Endpoint:** `POST /web3/:wallet_id/sign`

Firma un mensaje de EVM o Solana. Consulta [API keys](https://docs.fystack.io/api-keys.md) para la autenticación.

El SDK requiere una billetera y un proveedor RPC para firmar en EVM. Consulta automáticamente hasta obtener la firma.

### Parámetros

- `wallet_id` (string): ID de la billetera en la ruta de la URL.
- `method` (string): `eth_sign`, `eth_signTypedData_v4` o `solana_signMessage`.
- `message` (string): Mensaje que se firmará. Usa un string vacío para datos tipados.
- `chain_id` (number): ID de cadena EVM. Usa `0` para Solana.
- `typed_data` (string): Obligatorio para firmar datos tipados. String JSON que contiene `domain`, `types` y `message`.
- `X-Idempotency-Key` (string, recommended): Reutiliza la misma clave al reintentar una solicitud. Actualmente, el SDK no asigna `options.idempotencyKey` a este header.

### Respuesta

- `transaction_id` (string): ID de la solicitud para consultar el estado de la firma.

**Request** `POST /web3/:wallet_id/sign`

```typescript
import { EtherSigner, Environment } from '@fystack/sdk'
import { JsonRpcProvider } from 'ethers'

const provider = new JsonRpcProvider(process.env.RPC_URL!)
const signer = new EtherSigner(
  {
    apiKey: process.env.API_KEY!,
    apiSecret: process.env.API_SECRET!,
  },
  Environment.Production,
  provider,
)

signer.setWallet('YOUR_WALLET_ID')
const signature = await signer.signMessage('Authorize this session')
```

```typescript
import { EtherSigner, Environment } from '@fystack/sdk'
import { JsonRpcProvider } from 'ethers'

const provider = new JsonRpcProvider(process.env.RPC_URL!)
const signer = new EtherSigner(
  {
    apiKey: process.env.API_KEY!,
    apiSecret: process.env.API_SECRET!,
  },
  Environment.Production,
  provider,
)

signer.setWallet('YOUR_WALLET_ID')
const network = await provider.getNetwork()

const signature = await signer.signTypedData(
  {
    name: 'Example App',
    version: '1',
    chainId: network.chainId,
  },
  {
    Session: [
      { name: 'account', type: 'address' },
      { name: 'nonce', type: 'string' },
    ],
  },
  {
    account: await signer.getAddress(),
    nonce: crypto.randomUUID(),
  },
)

console.log('Typed data signature:', signature)
```

```typescript
import { SolanaSigner, Environment } from '@fystack/sdk'

const solanaSigner = new SolanaSigner(
  {
    apiKey: process.env.API_KEY!,
    apiSecret: process.env.API_SECRET!,
  },
  Environment.Production,
)

solanaSigner.setWallet('YOUR_WALLET_ID')

const signature = await solanaSigner.signMessage('Authorize this session')

console.log('Signature:', signature)
```

```json
{
  "method": "eth_sign",
  "message": "Authorize this session",
  "chain_id": 11155111
}
```

```json
{
  "transaction_id": "0de79230-a820-4bd4-b020-883d395faa87"
}
```

---

## Obtener el estado de la firma

**Endpoint:** `GET /web3/:wallet_id/sign/:transaction_id`

Obtén el estado y la firma de una solicitud de firma.

- `transaction_id` (string): ID de la solicitud de firma.
- `status` (string): `pending_approval`, `pending`, `completed`, `confirmed`, `failed` o `rejected`.
- `signature` (string): Firma, cuando está disponible. Los signers del SDK para EVM esperan el estado `confirmed` con una firma.
- `approvals` (array): Registros con `user_id` y `status`: `pending`, `approved` o `rejected`.
- `created_at` (string): Timestamp de creación.
- `updated_at` (string): Timestamp de la última actualización.

Si se agota el tiempo de consulta, revisa la solicitud existente antes de enviar otra.

**Request** `GET /web3/:wallet_id/sign/:transaction_id`

```typescript
import { APIService, Environment } from '@fystack/sdk'

const api = new APIService(
  { apiKey: process.env.API_KEY!, apiSecret: process.env.API_SECRET! },
  Environment.Production,
)

const status = await api.getSignStatus('YOUR_WALLET_ID', 'TRANSACTION_ID')
console.log(status.signature)
```

```json
{
  "transaction_id": "0de79230-a820-4bd4-b020-883d395faa87",
  "status": "pending_approval",
  "approvals": [],
  "created_at": "2026-10-03T00:00:00Z",
  "updated_at": "2026-10-03T00:00:00Z"
}
```

---

## Firmar una transacción

**Endpoint:** `POST /web3/transaction/:wallet_id/signRaw`

> **Warning: Firma insegura.** No se recomienda la firma raw. Una solicitud maliciosa puede engañarte para que firmes una transacción que roba fondos. Firma solo payloads que hayas verificado.

Envía una transacción para su firma y procesamiento. Devuelve un `transaction_id`.

- **EVM**: `from`, `to`, `nonce`, `gasLimit`, `data`, `value`, `chainId`, `maxFeePerGas`, `maxPriorityFeePerGas` y `accessList`.
- **Solana**: `data` (transacción serializada en base64), `from`, `meta.tx_method` (`solana_signTransaction`) y `chainId` (`"1399811149"`).

El `signTransaction` del SDK para EVM devuelve un hash de transacción. `sendTransaction` completa los campos de la transacción y devuelve una respuesta de transacción.

**Request** `POST /web3/transaction/:wallet_id/signRaw`

```typescript
import { EtherSigner, Environment } from '@fystack/sdk'
import { JsonRpcProvider, parseEther } from 'ethers'

const provider = new JsonRpcProvider(process.env.RPC_URL!)
const signer = new EtherSigner(
  {
    apiKey: process.env.API_KEY!,
    apiSecret: process.env.API_SECRET!,
  },
  Environment.Production,
  provider,
)

signer.setWallet('YOUR_WALLET_ID')
const tx = await signer.sendTransaction({
  to: '0x7c2BbE2e02af09F1cf9aFd4A79EC201DC841675a',
  value: parseEther('0.01'),
})

console.log(tx.hash)
```

```typescript
import { SolanaSigner, Environment } from '@fystack/sdk'

const solanaSigner = new SolanaSigner(
  {
    apiKey: process.env.API_KEY!,
    apiSecret: process.env.API_SECRET!,
  },
  Environment.Production,
)

solanaSigner.setWallet('YOUR_WALLET_ID')

// Base64 serialized transaction from @solana/web3.js.
const signature = await solanaSigner.signTransaction(serializedTransaction)
console.log(signature)
```

```json
{
  "transaction_id": "0de79230-a820-4bd4-b020-883d395faa87"
}
```

---

## Obtener el estado de la transacción

**Endpoint:** `GET /web3/transaction/:wallet_id/:transaction_id`

Devuelve `transaction_id`, `status`, `method`, `approvals`, `created_at` y `updated_at`, con `hash` y `failed_reason` cuando están disponibles.

Los signers de transacciones del SDK esperan `confirmed` o `completed` con un `hash`, y se detienen ante `failed` o `rejected`.

**Request** `GET /web3/transaction/:wallet_id/:transaction_id`

```typescript
import { APIService, Environment } from '@fystack/sdk'

const api = new APIService(
  { apiKey: process.env.API_KEY!, apiSecret: process.env.API_SECRET! },
  Environment.Production,
)

const status = await api.getTransactionStatus('YOUR_WALLET_ID', 'TRANSACTION_ID')
console.log(status.hash)
```

```json
{
  "transaction_id": "0de79230-a820-4bd4-b020-883d395faa87",
  "status": "pending",
  "method": "solana_signTransaction",
  "approvals": [],
  "created_at": "2026-10-03T00:00:00Z",
  "updated_at": "2026-10-03T00:00:00Z"
}
```
