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

# Resgate

> Do pedido ao USDC na carteira da empresa, com exemplo completo em TypeScript

<Warning>
  Rascunho: especificação em definição. Endpoints e campos podem mudar.
</Warning>

O resgate devolve USDC para uma carteira vinculada da própria empresa. Depois da assinatura no custodiante, o saldo chega em segundos.

## Estados

| Status | Significado |
| - | - |
| `pendente` | Criado, aguardando aprovação |
| `aprovado` | Aprovado, transações sendo preparadas |
| `aguardando_assinatura` | Transações não assinadas disponíveis para o custodiante |
| `concluido` | USDC confirmado on-chain na carteira de destino |
| `falhou` | A transação falhou ou expirou. Um novo resgate pode ser criado |

## Exemplo completo

Valores ilustrativos. O envio ao custodiante depende da API de cada custodiante e aparece aqui como uma função da própria integração.

```typescript TypeScript theme={null}
const BASE = "https://api.t3sa.com/v1"; // URL proposta
const auth = { Authorization: `Bearer ${process.env.TESA_API_KEY}` };

async function tesa(path: string, init: RequestInit = {}) {
  const res = await fetch(`${BASE}${path}`, {
    ...init,
    headers: { ...auth, "Content-Type": "application/json", ...init.headers },
  });
  const body = await res.json();
  if (!res.ok) throw new Error(`${body.erro.codigo}: ${body.erro.mensagem}`);
  return body;
}

// 1. Solicitar (escopo propose)
const resgate = await tesa("/resgates", {
  method: "POST",
  headers: { "Idempotency-Key": crypto.randomUUID() },
  body: JSON.stringify({
    valor: "150000.00",
    carteira_destino_id: "cart_3k9d",
    referencia_interna: "folha-2026-09",
  }),
});

// 2. Aprovar (escopo admin, em ambiente restrito)
const aprovado = await tesa(`/resgates/${resgate.id}/aprovar`, {
  method: "POST",
  headers: { "Idempotency-Key": crypto.randomUUID() },
  body: JSON.stringify({ comentario: "Folha de setembro" }),
});

// 3. Enviar cada transação não assinada ao custodiante
for (const tx of aprovado.transacoes) {
  await enviarAoCustodiante(tx.rede, tx.payload_nao_assinado);
}

// 4. Aguardar o webhook resgate.concluido, ou consultar GET /resgates/{id}
```

## Erros comuns

| HTTP | Código | O que fazer |
| - | - | - |
| `422` | `saldo_insuficiente` | O valor excede o saldo disponível para resgate. Consulte `GET /posicoes` |
| `422` | `carteira_nao_vinculada` | O destino não é uma carteira vinculada da empresa |
| `409` | `conflito_idempotencia` | A mesma `Idempotency-Key` foi usada com outro corpo |
| `503` | `servico_indisponivel` | Dependência externa indisponível, como pausa no CCTP. Repita com a mesma `Idempotency-Key` |

Lista completa em [Erros e limites](/docs/api/erros-e-limites).
