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

# Construir y enviar swaps Solana con Raptor

> Obtén una cotización, construye y firma un swap Solana, envíalo con Raptor y consulta su estado.

Raptor busca la ruta y construye la transacción. La aplicación gestiona la firma, el envío y la consulta del resultado. Separa cotización y construcción si el usuario debe revisar el precio.

<Info>
  **URL base HTTP:** `https://raptor.solanatracker.io`\
  **URL base WebSocket:** `wss://raptor.solanatracker.io`
</Info>

## Enrutamiento soportado

Raptor enruta a través de varios venues y tipos de pool, incluidos Raydium, Meteora, Orca Whirlpool, Pump.fun, Pumpswap, MoonIt, Boopfun, FluxBeam, PancakeSwap V3 y más.

Usa `dexes` cuando quieras restringir el enrutamiento a un subconjunto de venues soportados.

## 1. Obtén una cotización

Usa [Get swap quote](/es/raptor/http/get-swap-quote) para obtener la mejor ruta. Raptor espera:

* `inputMint`
* `outputMint`
* `amount` en unidades mínimas (cantidades enteras de la blockchain sin decimales)
* `slippageBps` opcional en puntos básicos (`50` significa 0,5%)
* controles de ruta opcionales como `dexes`, `pools` y `maxHops`

<CodeGroup>
  ```bash cURL theme={null}
  curl "https://raptor.solanatracker.io/quote?inputMint=So11111111111111111111111111111111111111112&outputMint=EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v&amount=100000000&slippageBps=50"
  ```

  ```javascript JavaScript theme={null}
  const params = new URLSearchParams({
    inputMint: "So11111111111111111111111111111111111111112",
    outputMint: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
    amount: "100000000",
    slippageBps: "50"
  });

  const quote = await fetch(
    `https://raptor.solanatracker.io/quote?${params}`
  ).then(r => r.json());

  console.log(`Amount in: ${quote.amountIn}`);
  console.log(`Expected out: ${quote.amountOut}`);
  console.log(`Min out: ${quote.minAmountOut}`);
  console.log(`Price impact: ${(quote.priceImpact * 100).toFixed(4)}%`);
  console.log(`Route steps: ${quote.routePlan.length}`);

  for (const step of quote.routePlan) {
    console.log(`${step.dex} via ${step.pool}`);
  }
  ```

  ```python Python theme={null}
  import requests

  quote = requests.get(
      "https://raptor.solanatracker.io/quote",
      params={
          "inputMint": "So11111111111111111111111111111111111111112",
          "outputMint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
          "amount": 100000000,
          "slippageBps": "50"
      }
  ).json()

  print("Expected out:", quote["amountOut"])
  print("Min out:", quote["minAmountOut"])
  print("Route count:", len(quote["routePlan"]))
  ```
</CodeGroup>

### Restringe rutas

```bash theme={null}
curl "https://raptor.solanatracker.io/quote?inputMint=So11111111111111111111111111111111111111112&outputMint=EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v&amount=100000000&slippageBps=dynamic&dexes=raydium,meteora,pumpfun&maxHops=2"
```

## 2. Construye una transacción de swap

Usa [Build swap transaction](/es/raptor/http/build-swap-transaction) para crear una transacción serializada.

Envía este cuerpo de solicitud:

* `userPublicKey`
* `quoteResponse` de `/quote`
* ajuste de transacción opcional como `priorityFee`, `txVersion`, `computeUnitLimit`, `tipLamports` y campos de platform fee

<CodeGroup>
  ```javascript JavaScript theme={null}
  const quote = await fetch(
    "https://raptor.solanatracker.io/quote?inputMint=So11111111111111111111111111111111111111112&outputMint=EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v&amount=100000000&slippageBps=50"
  ).then(r => r.json());

  const swap = await fetch("https://raptor.solanatracker.io/swap", {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({
      userPublicKey: "YOUR_WALLET_ADDRESS",
      wrapUnwrapSol: true,
      txVersion: "V0",
      priorityFee: "medium",
      maxPriorityFee: 1000000,
      quoteResponse: quote
    })
  }).then(r => r.json());

  console.log(`Swap tx: ${swap.swapTransaction}`);
  console.log(`Last valid block height: ${swap.lastValidBlockHeight}`);
  console.log(`Priority fee: ${swap.prioritizationFeeLamports}`);
  ```

  ```bash cURL theme={null}
  curl -X POST "https://raptor.solanatracker.io/swap" \
    -H "Content-Type: application/json" \
    -d '{
      "userPublicKey": "YOUR_WALLET_ADDRESS",
      "wrapUnwrapSol": true,
      "txVersion": "V0",
      "priorityFee": "medium",
      "quoteResponse": {
        "inputMint": "So11111111111111111111111111111111111111112",
        "outputMint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
        "amountIn": "100000000",
        "amountOut": "14321000",
        "minAmountOut": "14249400",
        "feeAmount": "25000",
        "priceImpact": 0.0008,
        "slippageBps": 50,
        "routePlan": [],
        "contextSlot": 314159265,
        "timeTaken": 0.012
      }
    }'
  ```
</CodeGroup>

### Controles de la transacción

| Campo | Propósito |
| - | - |
| `txVersion` | `legacy` o `v0` |
| `priorityFee` | nivel de prioridad como `medium`, `high`, `veryHigh` o microlamports exactos |
| `maxPriorityFee` | tope de fees de prioridad dinámicos |
| `computeUnitPriceMicroLamports` | Priority fee: anula directamente el precio por compute unit |
| `computeUnitLimit` | anula el límite de CU |
| `tipAccount` / `tipLamports` | añade una propina opcional en SOL |
| `feeAccount` / `feeBps` / `feeFromInput` / `chargeBps` | controles de platform fee |

## 3. Cotización y construcción en una sola solicitud

Usa [Quote and swap in one request](/es/raptor/http/quote-and-swap-in-one-request) si quieres una sola solicitud en lugar de llamadas separadas a `/quote` y `/swap`.

```javascript theme={null}
const result = await fetch("https://raptor.solanatracker.io/quote-and-swap", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({
    userPublicKey: "YOUR_WALLET_ADDRESS",
    inputMint: "So11111111111111111111111111111111111111112",
    outputMint: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
    amount: 100000000,
    slippageBps: "dynamic",
    txVersion: "V0",
    priorityFee: "high",
    maxHops: 2,
    dexes: "raydium,meteora,whirlpool"
  })
}).then(r => r.json());

console.log(result.quote.amountOut);
console.log(result.swapTransaction);
```

## 4. Firma en el cliente

Raptor devuelve `swapTransaction` como base64. Fírmala en la wallet y envía la transacción firmada en base64.

```javascript theme={null}
import { VersionedTransaction } from "@solana/web3.js";

const txBytes = Uint8Array.from(atob(swap.swapTransaction), c => c.charCodeAt(0));
const tx = VersionedTransaction.deserialize(txBytes);

const signed = await wallet.signTransaction(tx);
const signedBase64 = btoa(String.fromCharCode(...signed.serialize()));
```

## 5. Envía la transacción firmada

Envía transacciones firmadas con [raptor/transactions](/es/raptor/transactions): `POST /send-transaction`.

```javascript theme={null}
const sendResult = await fetch("https://raptor.solanatracker.io/send-transaction", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({ transaction: signedBase64 })
}).then(r => r.json());

console.log(`Signature: ${sendResult.signature}`);
console.log(`Accepted: ${sendResult.success}`);
```

Raptor envía a través de Yellowstone Jet TPU y reintenta en segundo plano hasta que la transacción se confirma o expira.

### Sigue el estado

```javascript theme={null}
const status = await fetch(
  `https://raptor.solanatracker.io/transaction/${sendResult.signature}`
).then(r => r.json());

console.log(`Status: ${status.status}`);
console.log(`Latency: ${status.latency_ms}ms`);
console.log(`Slot: ${status.slot}`);
```

Los estados válidos son `pending`, `confirmed`, `failed` y `expired`.

## 6. Solo construir instrucciones

Usa [Build swap instructions](/es/raptor/http/build-swap-instructions) cuando quieras instrucciones sin un wrapper de transacción.

```javascript theme={null}
const instructions = await fetch("https://raptor.solanatracker.io/swap-instructions", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({
    userPublicKey: "YOUR_WALLET_ADDRESS",
    quoteResponse: quote,
    txVersion: "V0"
  })
}).then(r => r.json());

console.log(instructions.swapInstruction.programId);
console.log(instructions.addressLookupTableAddresses);
```

## 7. Transmite cotizaciones en vivo

Usa el endpoint WebSocket de Raptor `/stream` para actualizaciones de cotización.

```javascript theme={null}
const ws = new WebSocket("wss://raptor.solanatracker.io/stream");

ws.onopen = () => {
  ws.send(JSON.stringify({
    type: "subscribe",
    id: "sol-usdc-quote",
    inputMint: "So11111111111111111111111111111111111111112",
    outputMint: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
    amount: 100000000,
    slippageBps: "50",
    maxHops: 2,
    dexes: "raydium,meteora,whirlpool"
  }));
};

ws.onmessage = (event) => {
  const msg = JSON.parse(event.data);

  if (msg.type === "subscribed") {
    console.log(`Subscribed: ${msg.id}`);
  }

  if (msg.type === "quote") {
    console.log(`Quote update: ${msg.data.amountOut}`);
  }
};
```

## 8. Transmite transacciones de swap listas para firmar

Usa `/stream/swap` cuando quieras actualizaciones de cotización en vivo junto con una nueva transacción preconstruida.

Este stream requiere `userPublicKey` porque Raptor construye la transacción para esa wallet.

```javascript theme={null}
const ws = new WebSocket("wss://raptor.solanatracker.io/stream/swap");

ws.onopen = () => {
  ws.send(JSON.stringify({
    type: "subscribe",
    id: "sol-usdc-swap",
    inputMint: "So11111111111111111111111111111111111111112",
    outputMint: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
    amount: 100000000,
    userPublicKey: "YOUR_WALLET_ADDRESS",
    slippageBps: "50",
    txVersion: "V0",
    priorityFee: "medium",
    wrapUnwrapSol: true,
    maxHops: 2
  }));
};

ws.onmessage = (event) => {
  const msg = JSON.parse(event.data);

  if (msg.type === "swap") {
    console.log(`Updated quote: ${msg.quote.amountOut}`);
    console.log(`Swap tx: ${msg.swapTransaction}`);
    console.log(`Last valid block height: ${msg.lastValidBlockHeight}`);
  }
};
```

`/stream/swap` reenvía la última transacción tras 10 slots sin actualización para ayudar a evitar la expiración de la transacción.

## Flujo end-to-end

1. Llama a `/quote` con `inputMint`, `outputMint`, `amount` y controles de ruta opcionales.
2. Pasa el `quoteResponse` devuelto a `/swap` con `userPublicKey`.
3. Firma el `swapTransaction` devuelto en la wallet.
4. Envía la transacción firmada en base64 a `/send-transaction`.
5. Haz polling de `/transaction/{signature}` para el estado.

Si quieres menos round-trips, usa `/quote-and-swap` en lugar de llamadas separadas a `/quote` y `/swap`.

<CardGroup cols={2}>
  <Card title="Resumen de Raptor" href="/es/raptor/overview">
    Referencia completa de endpoints, DEXs soportados, controles de routing y detalles de WebSocket.
  </Card>

  <Card title="Transacciones de Raptor" href="/es/raptor/transactions">
    Envía transacciones firmadas y sigue el estado de confirmación a través de Raptor.
  </Card>
</CardGroup>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.