Approve a token delegation
curl --request POST \
--url https://api.portalhq.io/api/v3/clients/me/chains/{chain}/assets/{token}/approvals \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"delegateAddress": "0xdFd8302f44727A6348F702fF7B594f127dE3A902",
"amount": "100"
}
'import requests
url = "https://api.portalhq.io/api/v3/clients/me/chains/{chain}/assets/{token}/approvals"
payload = {
"delegateAddress": "0xdFd8302f44727A6348F702fF7B594f127dE3A902",
"amount": "100"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({delegateAddress: '0xdFd8302f44727A6348F702fF7B594f127dE3A902', amount: '100'})
};
fetch('https://api.portalhq.io/api/v3/clients/me/chains/{chain}/assets/{token}/approvals', 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.portalhq.io/api/v3/clients/me/chains/{chain}/assets/{token}/approvals",
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([
'delegateAddress' => '0xdFd8302f44727A6348F702fF7B594f127dE3A902',
'amount' => '100'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"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.portalhq.io/api/v3/clients/me/chains/{chain}/assets/{token}/approvals"
payload := strings.NewReader("{\n \"delegateAddress\": \"0xdFd8302f44727A6348F702fF7B594f127dE3A902\",\n \"amount\": \"100\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.portalhq.io/api/v3/clients/me/chains/{chain}/assets/{token}/approvals")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"delegateAddress\": \"0xdFd8302f44727A6348F702fF7B594f127dE3A902\",\n \"amount\": \"100\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.portalhq.io/api/v3/clients/me/chains/{chain}/assets/{token}/approvals")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"delegateAddress\": \"0xdFd8302f44727A6348F702fF7B594f127dE3A902\",\n \"amount\": \"100\"\n}"
response = http.request(request)
puts response.read_body{
"transactions": [
{
"from": "0x54968898742c08da211a1cd355447cd1f37f0649",
"to": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
"data": "0x095ea7b3000000000000000000000000..."
}
],
"metadata": {
"chainId": "eip155:1",
"delegateAmount": "100",
"delegateAmountRaw": "100000000",
"delegateAddress": "0xdFd8302f44727A6348F702fF7B594f127dE3A902",
"tokenSymbol": "USDC",
"tokenAddress": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
"ownerAddress": "0x54968898742c08da211a1cd355447cd1f37f0649",
"tokenDecimals": 6
}
}Delegations
Approve a token delegation
Builds a transaction to approve a delegate address to spend a specified amount of the given token on behalf of the client. The response format differs between EVM and Solana chains.
For EVM chains, returns unsigned transaction objects. For Solana, returns base58/base64-encoded transactions.
POST
/
clients
/
me
/
chains
/
{chain}
/
assets
/
{token}
/
approvals
Approve a token delegation
curl --request POST \
--url https://api.portalhq.io/api/v3/clients/me/chains/{chain}/assets/{token}/approvals \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"delegateAddress": "0xdFd8302f44727A6348F702fF7B594f127dE3A902",
"amount": "100"
}
'import requests
url = "https://api.portalhq.io/api/v3/clients/me/chains/{chain}/assets/{token}/approvals"
payload = {
"delegateAddress": "0xdFd8302f44727A6348F702fF7B594f127dE3A902",
"amount": "100"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({delegateAddress: '0xdFd8302f44727A6348F702fF7B594f127dE3A902', amount: '100'})
};
fetch('https://api.portalhq.io/api/v3/clients/me/chains/{chain}/assets/{token}/approvals', 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.portalhq.io/api/v3/clients/me/chains/{chain}/assets/{token}/approvals",
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([
'delegateAddress' => '0xdFd8302f44727A6348F702fF7B594f127dE3A902',
'amount' => '100'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"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.portalhq.io/api/v3/clients/me/chains/{chain}/assets/{token}/approvals"
payload := strings.NewReader("{\n \"delegateAddress\": \"0xdFd8302f44727A6348F702fF7B594f127dE3A902\",\n \"amount\": \"100\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.portalhq.io/api/v3/clients/me/chains/{chain}/assets/{token}/approvals")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"delegateAddress\": \"0xdFd8302f44727A6348F702fF7B594f127dE3A902\",\n \"amount\": \"100\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.portalhq.io/api/v3/clients/me/chains/{chain}/assets/{token}/approvals")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"delegateAddress\": \"0xdFd8302f44727A6348F702fF7B594f127dE3A902\",\n \"amount\": \"100\"\n}"
response = http.request(request)
puts response.read_body{
"transactions": [
{
"from": "0x54968898742c08da211a1cd355447cd1f37f0649",
"to": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
"data": "0x095ea7b3000000000000000000000000..."
}
],
"metadata": {
"chainId": "eip155:1",
"delegateAmount": "100",
"delegateAmountRaw": "100000000",
"delegateAddress": "0xdFd8302f44727A6348F702fF7B594f127dE3A902",
"tokenSymbol": "USDC",
"tokenAddress": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
"ownerAddress": "0x54968898742c08da211a1cd355447cd1f37f0649",
"tokenDecimals": 6
}
}Authorizations
Client API Key or Client Session Token (CST). Pass as a Bearer token in the Authorization header.
Path Parameters
The blockchain chain identifier. Use either a friendly name or CAIP-2 format.
When using CAIP-2 format in URLs, ensure the colon (:) is URI-encoded as %3A.
Supported chains:
ethereum(eip155:1)sepolia(eip155:11155111)base(eip155:8453)base-sepolia(eip155:84532)polygon(eip155:137)polygon-mumbai(eip155:80001)celo(eip155:42220)celo-alfajores(eip155:44787)monad(eip155:143)monad-testnet(eip155:10143)solana(solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp)solana-devnet(solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1)tron(tron:mainnet)tron-nile(tron:nile)tron-shasta(tron:shasta)stellar(stellar:pubnet)stellar-testnet(stellar:testnet)bitcoin-segwit(bip122:000000000019d6689c085ae165831e93-p2wpkh)bitcoin-segwit-testnet(bip122:000000000933ea01ad0ee984209779ba-p2wpkh)bitcoin-p2wpkh(bip122:000000000019d6689c085ae165831e93-p2wpkh)bitcoin-p2wpkh-testnet(bip122:000000000933ea01ad0ee984209779ba-p2wpkh)
The token symbol (e.g. USDC, ETH) or contract/mint address on the specified chain.
Body
application/json
Response
Approval transaction built successfully. Response format depends on the chain type.
Was this page helpful?