---
title: "Submit a signed Hyperliquid spot↔perp transfer (step 2 of 2)"
method: POST
path: "/exchanges/hyperliquid/transfer"
tags: ["Hyperliquid"]
---

# Submit a signed Hyperliquid spot↔perp transfer (step 2 of 2)

`POST /exchanges/hyperliquid/transfer`

## Request

- Base URL: `https://execution.kairos.trade`
- URL: `https://execution.kairos.trade/exchanges/hyperliquid/transfer`
- Auth: API key in header `X-Client-Id` and API key in header `X-Api-Key` and API key in header `X-Api-Secret`

Forwards your signed `usdClassTransfer` to Hyperliquid. Because the move is internal to your own account, the blast radius is far smaller than a withdrawal — but the same mechanics apply: no Kairos-side idempotency, `time` doubles as the nonce, and replay protection is Hyperliquid's alone.
The `400 Hyperliquid rejected transfer: …` conflates venue rejection with network failure, exactly as on withdraw.
**Auth & scope.** Requires `trade:execute` for `hyperliquid`, wallet ownership, and the mutation gate. Not rate limited.

## Request body

- OrderHyperliquidTransferRequest
  - `wallet_address` string, required
  - `amount` string, required
  - `time` integer, required
  - `to_perp` boolean, required
  - `signature` string, required: 0x-prefixed 65-byte signature from the MAIN wallet. Hyperliquid forbids agent wallets from class transfers, so a Kairos-held agent key cannot sign this.

## Response `200`

The transfer was submitted.

- OrderHyperliquidActionResponse: Response for `POST /exchanges/hyperliquid/withdraw` and `POST /exchanges/hyperliquid/transfer`.
  - `success` boolean, required
  - `message` string, required: `Withdrawal submitted` or `Transfer submitted`. Submission only — not a confirmation of settlement.

## Other responses

- `400`: `ValidationInvalidOrder` — invalid user id, `Invalid withdraw amount: …`, or `Invalid transfer signature: …`. **Also** `InternalError` with message `Hyperliquid rejected transfer: …` (venue rejection or network failure, indistinguishable).
- `401`: No valid credential presented — missing/invalid API-key headers or an invalid/expired session token.
- `403`: Missing scope, provider access disabled, or wallet not owned by the caller.
- `500`: `DatabaseError`.
- `503`: API-key access to `hyperliquid` could not be checked (fails closed).

---

[API](https://skmtc.dev/kairos/apis/kairos-order-execution-api.md) - [All operations](https://skmtc.dev/kairos/apis/kairos-order-execution-api/llms.txt) - [OpenAPI document](https://skmtc.dev/kairos/apis/kairos-order-execution-api/revisions/9ba7d463d505?raw)
