curl --request POST \
--url https://api.beta.getpara.com/v1/wallets/{walletId}/estimate-fee \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"to": "0x742d35Cc6634C0532925a3b844Bc9e7595f...",
"value": "1000000000000000",
"chainId": "1",
"tokenAddress": "<string>"
}
'import requests
url = "https://api.beta.getpara.com/v1/wallets/{walletId}/estimate-fee"
payload = {
"to": "0x742d35Cc6634C0532925a3b844Bc9e7595f...",
"value": "1000000000000000",
"chainId": "1",
"tokenAddress": "<string>"
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
to: '0x742d35Cc6634C0532925a3b844Bc9e7595f...',
value: '1000000000000000',
chainId: '1',
tokenAddress: '<string>'
})
};
fetch('https://api.beta.getpara.com/v1/wallets/{walletId}/estimate-fee', 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.beta.getpara.com/v1/wallets/{walletId}/estimate-fee",
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([
'to' => '0x742d35Cc6634C0532925a3b844Bc9e7595f...',
'value' => '1000000000000000',
'chainId' => '1',
'tokenAddress' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$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.beta.getpara.com/v1/wallets/{walletId}/estimate-fee"
payload := strings.NewReader("{\n \"to\": \"0x742d35Cc6634C0532925a3b844Bc9e7595f...\",\n \"value\": \"1000000000000000\",\n \"chainId\": \"1\",\n \"tokenAddress\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
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.beta.getpara.com/v1/wallets/{walletId}/estimate-fee")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"to\": \"0x742d35Cc6634C0532925a3b844Bc9e7595f...\",\n \"value\": \"1000000000000000\",\n \"chainId\": \"1\",\n \"tokenAddress\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.beta.getpara.com/v1/wallets/{walletId}/estimate-fee")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"to\": \"0x742d35Cc6634C0532925a3b844Bc9e7595f...\",\n \"value\": \"1000000000000000\",\n \"chainId\": \"1\",\n \"tokenAddress\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"estimatedFee": "0.000756",
"transferAmount": "0.001",
"currency": "ETH",
"gasLimit": "25200",
"maxFeePerGas": "30000000000",
"maxPriorityFeePerGas": "2000000000",
"gasPrice": "30000000000",
"warning": "<string>"
}{
"code": "INVALID_REQUEST",
"message": "type must be one of EVM, SOLANA, COSMOS, STELLAR, SUI"
}{
"code": "UNAUTHORIZED",
"message": "secret api key not provided"
}{
"code": "FORBIDDEN",
"message": "REST API fee estimation is only supported for API-created wallets"
}{
"code": "NOT_FOUND",
"message": "wallet not found"
}{
"code": "RATE_LIMITED",
"message": "Rate limit exceeded, try again shortly."
}{
"code": "INTERNAL_ERROR",
"message": "Internal Server Error"
}Estimate Transfer Fee
Estimate the fee for a transfer without signing or broadcasting. Accepts the same core parameters as the transfer endpoint. Fees are advisory and subject to network conditions.
EVM: Returns estimatedFee, transferAmount, and the native currency
symbol, plus gasLimit and either maxFeePerGas with maxPriorityFeePerGas
for EIP-1559 transactions or gasPrice for legacy transactions.
Solana: Returns estimatedFee, transferAmount, and currency (SOL).
A non-fatal estimation warning is returned in warning when available.
curl --request POST \
--url https://api.beta.getpara.com/v1/wallets/{walletId}/estimate-fee \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"to": "0x742d35Cc6634C0532925a3b844Bc9e7595f...",
"value": "1000000000000000",
"chainId": "1",
"tokenAddress": "<string>"
}
'import requests
url = "https://api.beta.getpara.com/v1/wallets/{walletId}/estimate-fee"
payload = {
"to": "0x742d35Cc6634C0532925a3b844Bc9e7595f...",
"value": "1000000000000000",
"chainId": "1",
"tokenAddress": "<string>"
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
to: '0x742d35Cc6634C0532925a3b844Bc9e7595f...',
value: '1000000000000000',
chainId: '1',
tokenAddress: '<string>'
})
};
fetch('https://api.beta.getpara.com/v1/wallets/{walletId}/estimate-fee', 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.beta.getpara.com/v1/wallets/{walletId}/estimate-fee",
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([
'to' => '0x742d35Cc6634C0532925a3b844Bc9e7595f...',
'value' => '1000000000000000',
'chainId' => '1',
'tokenAddress' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$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.beta.getpara.com/v1/wallets/{walletId}/estimate-fee"
payload := strings.NewReader("{\n \"to\": \"0x742d35Cc6634C0532925a3b844Bc9e7595f...\",\n \"value\": \"1000000000000000\",\n \"chainId\": \"1\",\n \"tokenAddress\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
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.beta.getpara.com/v1/wallets/{walletId}/estimate-fee")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"to\": \"0x742d35Cc6634C0532925a3b844Bc9e7595f...\",\n \"value\": \"1000000000000000\",\n \"chainId\": \"1\",\n \"tokenAddress\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.beta.getpara.com/v1/wallets/{walletId}/estimate-fee")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"to\": \"0x742d35Cc6634C0532925a3b844Bc9e7595f...\",\n \"value\": \"1000000000000000\",\n \"chainId\": \"1\",\n \"tokenAddress\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"estimatedFee": "0.000756",
"transferAmount": "0.001",
"currency": "ETH",
"gasLimit": "25200",
"maxFeePerGas": "30000000000",
"maxPriorityFeePerGas": "2000000000",
"gasPrice": "30000000000",
"warning": "<string>"
}{
"code": "INVALID_REQUEST",
"message": "type must be one of EVM, SOLANA, COSMOS, STELLAR, SUI"
}{
"code": "UNAUTHORIZED",
"message": "secret api key not provided"
}{
"code": "FORBIDDEN",
"message": "REST API fee estimation is only supported for API-created wallets"
}{
"code": "NOT_FOUND",
"message": "wallet not found"
}{
"code": "RATE_LIMITED",
"message": "Rate limit exceeded, try again shortly."
}{
"code": "INTERNAL_ERROR",
"message": "Internal Server Error"
}Authorizations
Your partner secret key (server-side only)
Headers
UUID for request tracing. Para returns one if omitted.
For sponsored transfers, use the durable behavior documented on POST /transfer.
Other POST endpoints use this key for safe retries. If a request with the same key
is received within 24 hours, the original response is returned without re-executing.
Recommended format: UUID v4. Max length 256 characters.
Returns 422 if the same key is reused with a different request body.
Returns 409 if a request with the same key is still being processed.
Replays return the original response, not the latest chain outcome. For a persisted broadcast,
use the returned transactionId with GET transaction history to track its current status.
256Path Parameters
Wallet UUID. A malformed or inaccessible wallet ID returns 404.
"0a1b2c3d-4e5f-6789-abcd-ef0123456789"
Body
Destination address
"0x742d35Cc6634C0532925a3b844Bc9e7595f..."
Transfer amount in smallest unit (wei for ETH, lamports for SOL)
"1000000000000000"
Chain ID. Required for EVM wallets, ignored for Solana.
"1"
Token contract address. EVM: ERC-20 contract. Solana: SPL mint address.
Solana network. In production, defaults to SOLANA. In beta, only SOLANA_DEVNET is allowed (and is the default).
SOLANA, SOLANA_DEVNET Response
Fee estimate
Estimated fee in standard units of the native currency (e.g. ETH, SOL)
"0.000756"
Requested transfer amount in standard units. Token transfers use the token's decimals.
"0.001"
Native currency symbol (e.g. ETH, SOL). It remains the native symbol for token transfers.
"ETH"
Estimated gas limit. EVM only.
"25200"
EIP-1559 max fee per gas (in wei). EVM only.
"30000000000"
EIP-1559 max priority fee per gas (in wei). EVM only.
"2000000000"
Legacy gas price (in wei). EVM legacy transactions only.
"30000000000"
Present when estimation returns a fallback warning.