curl --request GET \
--url https://api.lpagent.io/open-api/v1/pools/{poolId}/positions \
--header 'x-api-key: <api-key>'import requests
url = "https://api.lpagent.io/open-api/v1/pools/{poolId}/positions"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://api.lpagent.io/open-api/v1/pools/{poolId}/positions', 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.lpagent.io/open-api/v1/pools/{poolId}/positions",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"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"
"net/http"
"io"
)
func main() {
url := "https://api.lpagent.io/open-api/v1/pools/{poolId}/positions"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
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.lpagent.io/open-api/v1/pools/{poolId}/positions")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.lpagent.io/open-api/v1/pools/{poolId}/positions")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"status": "success",
"data": {
"pagination": {
"page": 123,
"pageSize": 123,
"total": 123,
"totalPages": 123
},
"positions": [
{}
],
"positionState": [
{
"positionId": "<string>",
"positionData": [
{
"binId": 123,
"price": "<string>",
"pricePerToken": "<string>",
"binXAmount": "<string>",
"binYAmount": "<string>",
"positionXAmount": "<string>",
"positionYAmount": "<string>",
"feeX": "<string>",
"feeY": "<string>"
}
]
}
],
"activeBin": {
"binId": 123,
"price": "<string>",
"pricePerToken": "<string>"
},
"prices": {}
}
}Get positions for a specific pool
Retrieve all positions associated with a specific pool along with position state and pricing info. Works on Solana (Meteora DLMM, DAMM V2) and Robinhood Chain (Uniswap V3, Uniswap V4); pass chain=ROBINHOOD for a Robinhood pool.
On ROBINHOOD, positionState is always an empty array and activeBin is omitted: both are Meteora DLMM bin data.
curl --request GET \
--url https://api.lpagent.io/open-api/v1/pools/{poolId}/positions \
--header 'x-api-key: <api-key>'import requests
url = "https://api.lpagent.io/open-api/v1/pools/{poolId}/positions"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://api.lpagent.io/open-api/v1/pools/{poolId}/positions', 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.lpagent.io/open-api/v1/pools/{poolId}/positions",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"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"
"net/http"
"io"
)
func main() {
url := "https://api.lpagent.io/open-api/v1/pools/{poolId}/positions"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
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.lpagent.io/open-api/v1/pools/{poolId}/positions")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.lpagent.io/open-api/v1/pools/{poolId}/positions")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"status": "success",
"data": {
"pagination": {
"page": 123,
"pageSize": 123,
"total": 123,
"totalPages": 123
},
"positions": [
{}
],
"positionState": [
{
"positionId": "<string>",
"positionData": [
{
"binId": 123,
"price": "<string>",
"pricePerToken": "<string>",
"binXAmount": "<string>",
"binYAmount": "<string>",
"positionXAmount": "<string>",
"positionYAmount": "<string>",
"feeX": "<string>",
"feeY": "<string>"
}
]
}
],
"activeBin": {
"binId": 123,
"price": "<string>",
"pricePerToken": "<string>"
},
"prices": {}
}
}Authorizations
API key for authentication
Path Parameters
The pool ID. On Solana, the Meteora pool address. On Robinhood Chain, the Uniswap V3 pool address or the Uniswap V4 pool ID (32-byte 0x hash), in any letter case.
Query Parameters
Blockchain network the pool lives on. SOL returns Meteora (DLMM / DAMM v2) positions; ROBINHOOD returns Uniswap V3 and V4 positions on Robinhood Chain (EVM, chain id 4663). Unrecognised values fall back to SOL, so a Robinhood pool sent without chain is looked up on Solana and not found.
SOL, ROBINHOOD Filter by position owner
Filter by position status
Open, Close Page number for pagination
x >= 1Number of items per page
1 <= x <= 20Field to order results by
Sort order direction (asc or desc)
Comma-separated protocols to filter by, on SOL only: meteora or meteora_damm_v2. On ROBINHOOD it is ignored, since the pool's own protocol (uniswap_v3 or uniswap_v4) is always used.
Filter by PNL threshold
Filter by native PNL threshold
Was this page helpful?