curl --request POST \
--url https://api-nova.tech/v1/bridge/hyperliquid-perps-to-solana \
--header 'Content-Type: application/json' \
--data '
{
"hyperliquidAddress": "0xf3d63166f0ca56c3c1a3508fce03ff0cf3fb691e",
"solanaAddress": "9xQeWvG816bUx9EPfQ5D9b8fRGyJitf8F6f4fH6QJjAo",
"amountUsdc": "25",
"receive": "SOL"
}
'import requests
url = "https://api-nova.tech/v1/bridge/hyperliquid-perps-to-solana"
payload = {
"hyperliquidAddress": "0xf3d63166f0ca56c3c1a3508fce03ff0cf3fb691e",
"solanaAddress": "9xQeWvG816bUx9EPfQ5D9b8fRGyJitf8F6f4fH6QJjAo",
"amountUsdc": "25",
"receive": "SOL"
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
hyperliquidAddress: '0xf3d63166f0ca56c3c1a3508fce03ff0cf3fb691e',
solanaAddress: '9xQeWvG816bUx9EPfQ5D9b8fRGyJitf8F6f4fH6QJjAo',
amountUsdc: '25',
receive: 'SOL'
})
};
fetch('https://api-nova.tech/v1/bridge/hyperliquid-perps-to-solana', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api-nova.tech/v1/bridge/hyperliquid-perps-to-solana",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'hyperliquidAddress' => '0xf3d63166f0ca56c3c1a3508fce03ff0cf3fb691e',
'solanaAddress' => '9xQeWvG816bUx9EPfQ5D9b8fRGyJitf8F6f4fH6QJjAo',
'amountUsdc' => '25',
'receive' => 'SOL'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api-nova.tech/v1/bridge/hyperliquid-perps-to-solana"
payload := strings.NewReader("{\n \"hyperliquidAddress\": \"0xf3d63166f0ca56c3c1a3508fce03ff0cf3fb691e\",\n \"solanaAddress\": \"9xQeWvG816bUx9EPfQ5D9b8fRGyJitf8F6f4fH6QJjAo\",\n \"amountUsdc\": \"25\",\n \"receive\": \"SOL\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api-nova.tech/v1/bridge/hyperliquid-perps-to-solana")
.header("Content-Type", "application/json")
.body("{\n \"hyperliquidAddress\": \"0xf3d63166f0ca56c3c1a3508fce03ff0cf3fb691e\",\n \"solanaAddress\": \"9xQeWvG816bUx9EPfQ5D9b8fRGyJitf8F6f4fH6QJjAo\",\n \"amountUsdc\": \"25\",\n \"receive\": \"SOL\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-nova.tech/v1/bridge/hyperliquid-perps-to-solana")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"hyperliquidAddress\": \"0xf3d63166f0ca56c3c1a3508fce03ff0cf3fb691e\",\n \"solanaAddress\": \"9xQeWvG816bUx9EPfQ5D9b8fRGyJitf8F6f4fH6QJjAo\",\n \"amountUsdc\": \"25\",\n \"receive\": \"SOL\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"service": "nova-bridge",
"route": "Relay Solana to Hyperliquid Perps",
"routePlan": {},
"provider": "relay",
"requestId": "<string>",
"originChain": "<string>",
"destinationChain": "<string>",
"originChainId": 123,
"destinationChainId": 123,
"inputToken": "<string>",
"inputTokenAddress": "<string>",
"inputAmount": "<string>",
"inputAmountAtomic": "<string>",
"outputToken": "<string>",
"outputTokenAddress": "<string>",
"outputAmount": "<string>",
"outputAmountAtomic": "<string>",
"feeUsd": "<string>",
"estimatedTime": "<string>",
"routeSummary": "<string>",
"statusEndpoint": "<string>",
"transaction": {
"kind": "solana",
"chainId": 123,
"chain": "<string>",
"to": "<string>",
"value": "<string>",
"data": "<string>",
"gasLimit": "<string>",
"unsignedTxHex": "<string>",
"unsignedTxBase64": "<string>"
},
"approval": {
"token": "<string>",
"spender": "<string>",
"value": "<string>",
"gasLimit": "<string>"
},
"gaslessRequested": true,
"gaslessExecution": {
"kind": "permit",
"signatureKind": "eip712",
"typedDataJson": "<string>",
"postEndpoint": "<string>",
"postMethod": "POST",
"postBodyJson": "<string>"
},
"routeDetails": {
"id": "<string>",
"from": "<string>",
"to": "<string>",
"name": "<string>",
"provider": "relay",
"inputAsset": "<string>",
"outputAsset": "<string>",
"originChainId": 123,
"destinationChainId": 123,
"originCurrency": "<string>",
"destinationCurrency": "<string>"
},
"appFeePolicy": {
"applied": true,
"feeBps": 1
}
}{
"error": {
"code": "RATE_LIMITED",
"message": "Too many requests. Try again later.",
"requestId": "<string>"
}
}{
"error": {
"code": "RATE_LIMITED",
"message": "Too many requests. Try again later.",
"requestId": "<string>"
}
}{
"error": {
"code": "RATE_LIMITED",
"message": "Too many requests. Try again later.",
"requestId": "<string>"
}
}Withdraw Hyperliquid Perps USDC to Solana
Builds a wallet-ready Nova Bridge route that moves USDC from Hyperliquid Perps back to Solana as SOL or USDC.
curl --request POST \
--url https://api-nova.tech/v1/bridge/hyperliquid-perps-to-solana \
--header 'Content-Type: application/json' \
--data '
{
"hyperliquidAddress": "0xf3d63166f0ca56c3c1a3508fce03ff0cf3fb691e",
"solanaAddress": "9xQeWvG816bUx9EPfQ5D9b8fRGyJitf8F6f4fH6QJjAo",
"amountUsdc": "25",
"receive": "SOL"
}
'import requests
url = "https://api-nova.tech/v1/bridge/hyperliquid-perps-to-solana"
payload = {
"hyperliquidAddress": "0xf3d63166f0ca56c3c1a3508fce03ff0cf3fb691e",
"solanaAddress": "9xQeWvG816bUx9EPfQ5D9b8fRGyJitf8F6f4fH6QJjAo",
"amountUsdc": "25",
"receive": "SOL"
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
hyperliquidAddress: '0xf3d63166f0ca56c3c1a3508fce03ff0cf3fb691e',
solanaAddress: '9xQeWvG816bUx9EPfQ5D9b8fRGyJitf8F6f4fH6QJjAo',
amountUsdc: '25',
receive: 'SOL'
})
};
fetch('https://api-nova.tech/v1/bridge/hyperliquid-perps-to-solana', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api-nova.tech/v1/bridge/hyperliquid-perps-to-solana",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'hyperliquidAddress' => '0xf3d63166f0ca56c3c1a3508fce03ff0cf3fb691e',
'solanaAddress' => '9xQeWvG816bUx9EPfQ5D9b8fRGyJitf8F6f4fH6QJjAo',
'amountUsdc' => '25',
'receive' => 'SOL'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api-nova.tech/v1/bridge/hyperliquid-perps-to-solana"
payload := strings.NewReader("{\n \"hyperliquidAddress\": \"0xf3d63166f0ca56c3c1a3508fce03ff0cf3fb691e\",\n \"solanaAddress\": \"9xQeWvG816bUx9EPfQ5D9b8fRGyJitf8F6f4fH6QJjAo\",\n \"amountUsdc\": \"25\",\n \"receive\": \"SOL\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api-nova.tech/v1/bridge/hyperliquid-perps-to-solana")
.header("Content-Type", "application/json")
.body("{\n \"hyperliquidAddress\": \"0xf3d63166f0ca56c3c1a3508fce03ff0cf3fb691e\",\n \"solanaAddress\": \"9xQeWvG816bUx9EPfQ5D9b8fRGyJitf8F6f4fH6QJjAo\",\n \"amountUsdc\": \"25\",\n \"receive\": \"SOL\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-nova.tech/v1/bridge/hyperliquid-perps-to-solana")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"hyperliquidAddress\": \"0xf3d63166f0ca56c3c1a3508fce03ff0cf3fb691e\",\n \"solanaAddress\": \"9xQeWvG816bUx9EPfQ5D9b8fRGyJitf8F6f4fH6QJjAo\",\n \"amountUsdc\": \"25\",\n \"receive\": \"SOL\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"service": "nova-bridge",
"route": "Relay Solana to Hyperliquid Perps",
"routePlan": {},
"provider": "relay",
"requestId": "<string>",
"originChain": "<string>",
"destinationChain": "<string>",
"originChainId": 123,
"destinationChainId": 123,
"inputToken": "<string>",
"inputTokenAddress": "<string>",
"inputAmount": "<string>",
"inputAmountAtomic": "<string>",
"outputToken": "<string>",
"outputTokenAddress": "<string>",
"outputAmount": "<string>",
"outputAmountAtomic": "<string>",
"feeUsd": "<string>",
"estimatedTime": "<string>",
"routeSummary": "<string>",
"statusEndpoint": "<string>",
"transaction": {
"kind": "solana",
"chainId": 123,
"chain": "<string>",
"to": "<string>",
"value": "<string>",
"data": "<string>",
"gasLimit": "<string>",
"unsignedTxHex": "<string>",
"unsignedTxBase64": "<string>"
},
"approval": {
"token": "<string>",
"spender": "<string>",
"value": "<string>",
"gasLimit": "<string>"
},
"gaslessRequested": true,
"gaslessExecution": {
"kind": "permit",
"signatureKind": "eip712",
"typedDataJson": "<string>",
"postEndpoint": "<string>",
"postMethod": "POST",
"postBodyJson": "<string>"
},
"routeDetails": {
"id": "<string>",
"from": "<string>",
"to": "<string>",
"name": "<string>",
"provider": "relay",
"inputAsset": "<string>",
"outputAsset": "<string>",
"originChainId": 123,
"destinationChainId": 123,
"originCurrency": "<string>",
"destinationCurrency": "<string>"
},
"appFeePolicy": {
"applied": true,
"feeBps": 1
}
}{
"error": {
"code": "RATE_LIMITED",
"message": "Too many requests. Try again later.",
"requestId": "<string>"
}
}{
"error": {
"code": "RATE_LIMITED",
"message": "Too many requests. Try again later.",
"requestId": "<string>"
}
}{
"error": {
"code": "RATE_LIMITED",
"message": "Too many requests. Try again later.",
"requestId": "<string>"
}
}Body
Public Hyperliquid Perps account address sending USDC.
Public Solana wallet address receiving SOL or USDC.
Decimal USDC amount to move from Hyperliquid Perps.
Alias for amountUsdc.
Asset to receive on Solana.
SOL, USDC, sol, usdc Optional Hyperliquid USDC base-unit amount for clients that already handle decimals.
^[0-9]+$Optional slippage tolerance in basis points.
^[0-9]+$Response
Wallet-ready Hyperliquid Perps to Solana route plan.
true
"nova-bridge"
Human-readable route summary kept string-compatible for mobile clients.
"Relay Solana to Hyperliquid Perps"
Relay quote steps and route details for iOS-local approval, signing, and broadcast.
"relay"
Unsigned transaction payload normalized for iOS signing and broadcast.
Show child attributes
Show child attributes
Optional ERC-20 approval required before the Relay bridge transaction.
Show child attributes
Show child attributes
Whether the client requested fail-closed Gasless execution.
Validated client execution artifact for Relay permit or Solana fee-payer sponsorship.
Show child attributes
Show child attributes
Structured Relay route metadata.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Was this page helpful?