curl --request GET \
--url https://api.portalhq.io/api/v3/clients/me/integrations/yield-xyz-perps/actions \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.portalhq.io/api/v3/clients/me/integrations/yield-xyz-perps/actions"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.portalhq.io/api/v3/clients/me/integrations/yield-xyz-perps/actions', 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/integrations/yield-xyz-perps/actions",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.portalhq.io/api/v3/clients/me/integrations/yield-xyz-perps/actions"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.portalhq.io/api/v3/clients/me/integrations/yield-xyz-perps/actions")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.portalhq.io/api/v3/clients/me/integrations/yield-xyz-perps/actions")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": {
"total": 150,
"offset": 0,
"limit": 25,
"items": [
{
"id": "550e8400-e29b-41d4-a716-446655440001",
"providerId": "hyperliquid",
"action": "open",
"status": "CREATED",
"summary": {
"type": "Open Position",
"orderType": "market",
"direction": "long",
"asset": "ETH",
"price": 3500,
"size": "0.215",
"leverage": 20,
"collateral": "43.00",
"fee": "0.0005",
"marginMode": "isolated",
"estimatedLiquidationPrice": 4200
},
"transactions": [
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"network": "hyperliquid",
"chainId": "1337",
"type": "OPEN_POSITION",
"status": "CREATED",
"address": "0x1234567890abcdef1234567890abcdef12345678",
"explorerUrls": [
"<string>"
],
"args": {
"marketId": "hyperliquid-eth-usdc",
"side": "long",
"amount": "100",
"size": "1000",
"leverage": 10,
"marginMode": "isolated",
"limitPrice": 3900,
"stopLossPrice": 3600,
"takeProfitPrice": 4400,
"orderId": "12345",
"orderIds": [
"<string>"
],
"assetIndex": 1,
"fromToken": {
"network": "eip155:42161",
"address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831"
},
"agentAddress": "0x1234567890abcdef1234567890abcdef12345678",
"agentName": "my-app",
"validUntil": 1767225600,
"stopLossOrderId": "12346",
"takeProfitOrderId": "12347",
"skipApproval": false,
"fundingMethod": "bridge2",
"enabled": true
},
"signingFormat": "EIP712_TYPED_DATA",
"signablePayload": "<string>",
"rawPayload": "<string>"
}
],
"createdAt": "2026-08-26T10:30:00.000Z",
"completedAt": "2026-08-26T10:30:05.000Z",
"signedMetadata": "<string>"
}
]
}
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "yield-xyz-borrow returned a response for GET /v1/positions that does not match the expected schema",
"id": "INTEGRATION_RESPONSE_SCHEMA_DRIFT",
"details": {
"integration": "yield-xyz-borrow",
"endpoint": "GET /v1/positions",
"issues": [
{
"path": "supplyBalances.0.balanceUsd",
"message": "Expected string, received number",
"code": "invalid_type"
}
]
}
}{
"error": "<string>"
}List actions
Get a paginated list of a wallet’s actions, filterable by venue, market, action type and status.
This is a proxy to the Yield.xyz Perps GET /v1/actions endpoint. Portal validates the upstream response against the schema documented here before returning it under data, and translates funding-chain network values to CAIP-2. If Yield.xyz changes the response shape, Portal returns a 500 with id: INTEGRATION_RESPONSE_SCHEMA_DRIFT instead of a partial response. Upstream reference: Yield.xyz Perps API.
curl --request GET \
--url https://api.portalhq.io/api/v3/clients/me/integrations/yield-xyz-perps/actions \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.portalhq.io/api/v3/clients/me/integrations/yield-xyz-perps/actions"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.portalhq.io/api/v3/clients/me/integrations/yield-xyz-perps/actions', 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/integrations/yield-xyz-perps/actions",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.portalhq.io/api/v3/clients/me/integrations/yield-xyz-perps/actions"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.portalhq.io/api/v3/clients/me/integrations/yield-xyz-perps/actions")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.portalhq.io/api/v3/clients/me/integrations/yield-xyz-perps/actions")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": {
"total": 150,
"offset": 0,
"limit": 25,
"items": [
{
"id": "550e8400-e29b-41d4-a716-446655440001",
"providerId": "hyperliquid",
"action": "open",
"status": "CREATED",
"summary": {
"type": "Open Position",
"orderType": "market",
"direction": "long",
"asset": "ETH",
"price": 3500,
"size": "0.215",
"leverage": 20,
"collateral": "43.00",
"fee": "0.0005",
"marginMode": "isolated",
"estimatedLiquidationPrice": 4200
},
"transactions": [
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"network": "hyperliquid",
"chainId": "1337",
"type": "OPEN_POSITION",
"status": "CREATED",
"address": "0x1234567890abcdef1234567890abcdef12345678",
"explorerUrls": [
"<string>"
],
"args": {
"marketId": "hyperliquid-eth-usdc",
"side": "long",
"amount": "100",
"size": "1000",
"leverage": 10,
"marginMode": "isolated",
"limitPrice": 3900,
"stopLossPrice": 3600,
"takeProfitPrice": 4400,
"orderId": "12345",
"orderIds": [
"<string>"
],
"assetIndex": 1,
"fromToken": {
"network": "eip155:42161",
"address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831"
},
"agentAddress": "0x1234567890abcdef1234567890abcdef12345678",
"agentName": "my-app",
"validUntil": 1767225600,
"stopLossOrderId": "12346",
"takeProfitOrderId": "12347",
"skipApproval": false,
"fundingMethod": "bridge2",
"enabled": true
},
"signingFormat": "EIP712_TYPED_DATA",
"signablePayload": "<string>",
"rawPayload": "<string>"
}
],
"createdAt": "2026-08-26T10:30:00.000Z",
"completedAt": "2026-08-26T10:30:05.000Z",
"signedMetadata": "<string>"
}
]
}
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "yield-xyz-borrow returned a response for GET /v1/positions that does not match the expected schema",
"id": "INTEGRATION_RESPONSE_SCHEMA_DRIFT",
"details": {
"integration": "yield-xyz-borrow",
"endpoint": "GET /v1/positions",
"issues": [
{
"path": "supplyBalances.0.balanceUsd",
"message": "Expected string, received number",
"code": "invalid_type"
}
]
}
}{
"error": "<string>"
}Authorizations
Client API Key or Client Session Token (CST). Pass as a Bearer token in the Authorization header.
Query Parameters
Offset for pagination
x >= 00
Maximum number of items to return
1 <= x <= 10025
Wallet address whose actions to list.
Filter by venue.
Filter by market.
Filter by action type.
open, close, updateLeverage, stopLoss, takeProfit, cancelOrder, editOrder, fund, withdraw, approveAgent, approveBuilderFee, updateMargin, setTpAndSl, setUnifiedAccount Filter by action status.
CANCELED, CREATED, WAITING_FOR_NEXT, PROCESSING, FAILED, SUCCESS, STALE Filter by several statuses (comma-separated, or repeat the parameter).
Response
Paginated list of actions
Show child attributes
Show child attributes
Was this page helpful?