curl --request POST \
--url https://api-nova.tech/v1/bridge/solana-to-hyperliquid-perps \
--header 'Content-Type: application/json' \
--data '
{
"solanaAddress": "9xQeWvG816bUx9EPfQ5D9b8fRGyJitf8F6f4fH6QJjAo",
"hyperliquidAddress": "0xf3d63166f0ca56c3c1a3508fce03ff0cf3fb691e",
"amount": "0.1",
"asset": "SOL"
}
'import requests
url = "https://api-nova.tech/v1/bridge/solana-to-hyperliquid-perps"
payload = {
"solanaAddress": "9xQeWvG816bUx9EPfQ5D9b8fRGyJitf8F6f4fH6QJjAo",
"hyperliquidAddress": "0xf3d63166f0ca56c3c1a3508fce03ff0cf3fb691e",
"amount": "0.1",
"asset": "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({
solanaAddress: '9xQeWvG816bUx9EPfQ5D9b8fRGyJitf8F6f4fH6QJjAo',
hyperliquidAddress: '0xf3d63166f0ca56c3c1a3508fce03ff0cf3fb691e',
amount: '0.1',
asset: 'SOL'
})
};
fetch('https://api-nova.tech/v1/bridge/solana-to-hyperliquid-perps', 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/solana-to-hyperliquid-perps",
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([
'solanaAddress' => '9xQeWvG816bUx9EPfQ5D9b8fRGyJitf8F6f4fH6QJjAo',
'hyperliquidAddress' => '0xf3d63166f0ca56c3c1a3508fce03ff0cf3fb691e',
'amount' => '0.1',
'asset' => '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/solana-to-hyperliquid-perps"
payload := strings.NewReader("{\n \"solanaAddress\": \"9xQeWvG816bUx9EPfQ5D9b8fRGyJitf8F6f4fH6QJjAo\",\n \"hyperliquidAddress\": \"0xf3d63166f0ca56c3c1a3508fce03ff0cf3fb691e\",\n \"amount\": \"0.1\",\n \"asset\": \"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/solana-to-hyperliquid-perps")
.header("Content-Type", "application/json")
.body("{\n \"solanaAddress\": \"9xQeWvG816bUx9EPfQ5D9b8fRGyJitf8F6f4fH6QJjAo\",\n \"hyperliquidAddress\": \"0xf3d63166f0ca56c3c1a3508fce03ff0cf3fb691e\",\n \"amount\": \"0.1\",\n \"asset\": \"SOL\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-nova.tech/v1/bridge/solana-to-hyperliquid-perps")
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 \"solanaAddress\": \"9xQeWvG816bUx9EPfQ5D9b8fRGyJitf8F6f4fH6QJjAo\",\n \"hyperliquidAddress\": \"0xf3d63166f0ca56c3c1a3508fce03ff0cf3fb691e\",\n \"amount\": \"0.1\",\n \"asset\": \"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>"
}
}Send Solana assets to Hyperliquid Perps
Builds a wallet-ready Nova Bridge route that moves SOL or USDC from Solana into Hyperliquid Perps as USDC.
curl --request POST \
--url https://api-nova.tech/v1/bridge/solana-to-hyperliquid-perps \
--header 'Content-Type: application/json' \
--data '
{
"solanaAddress": "9xQeWvG816bUx9EPfQ5D9b8fRGyJitf8F6f4fH6QJjAo",
"hyperliquidAddress": "0xf3d63166f0ca56c3c1a3508fce03ff0cf3fb691e",
"amount": "0.1",
"asset": "SOL"
}
'import requests
url = "https://api-nova.tech/v1/bridge/solana-to-hyperliquid-perps"
payload = {
"solanaAddress": "9xQeWvG816bUx9EPfQ5D9b8fRGyJitf8F6f4fH6QJjAo",
"hyperliquidAddress": "0xf3d63166f0ca56c3c1a3508fce03ff0cf3fb691e",
"amount": "0.1",
"asset": "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({
solanaAddress: '9xQeWvG816bUx9EPfQ5D9b8fRGyJitf8F6f4fH6QJjAo',
hyperliquidAddress: '0xf3d63166f0ca56c3c1a3508fce03ff0cf3fb691e',
amount: '0.1',
asset: 'SOL'
})
};
fetch('https://api-nova.tech/v1/bridge/solana-to-hyperliquid-perps', 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/solana-to-hyperliquid-perps",
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([
'solanaAddress' => '9xQeWvG816bUx9EPfQ5D9b8fRGyJitf8F6f4fH6QJjAo',
'hyperliquidAddress' => '0xf3d63166f0ca56c3c1a3508fce03ff0cf3fb691e',
'amount' => '0.1',
'asset' => '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/solana-to-hyperliquid-perps"
payload := strings.NewReader("{\n \"solanaAddress\": \"9xQeWvG816bUx9EPfQ5D9b8fRGyJitf8F6f4fH6QJjAo\",\n \"hyperliquidAddress\": \"0xf3d63166f0ca56c3c1a3508fce03ff0cf3fb691e\",\n \"amount\": \"0.1\",\n \"asset\": \"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/solana-to-hyperliquid-perps")
.header("Content-Type", "application/json")
.body("{\n \"solanaAddress\": \"9xQeWvG816bUx9EPfQ5D9b8fRGyJitf8F6f4fH6QJjAo\",\n \"hyperliquidAddress\": \"0xf3d63166f0ca56c3c1a3508fce03ff0cf3fb691e\",\n \"amount\": \"0.1\",\n \"asset\": \"SOL\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-nova.tech/v1/bridge/solana-to-hyperliquid-perps")
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 \"solanaAddress\": \"9xQeWvG816bUx9EPfQ5D9b8fRGyJitf8F6f4fH6QJjAo\",\n \"hyperliquidAddress\": \"0xf3d63166f0ca56c3c1a3508fce03ff0cf3fb691e\",\n \"amount\": \"0.1\",\n \"asset\": \"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 Solana wallet address sending SOL or USDC.
Public Hyperliquid Perps account address receiving USDC.
Decimal amount to send, for example 0.1 when asset is SOL or 25 when asset is USDC.
"0.1"
Solana asset to send into Hyperliquid Perps. The route outputs USDC on Hyperliquid Perps.
SOL, USDC, sol, usdc Optional base-unit amount for clients that already handle decimals.
^[0-9]+$Optional slippage tolerance in basis points.
^[0-9]+$Response
Wallet-ready Solana to Hyperliquid Perps 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?