curl --request POST \
--url https://core-api-dev.vanish.trade/borrow/positions \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"user_address": "<string>",
"timestamp": "<string>",
"user_signature": "<string>"
}
'import requests
url = "https://core-api-dev.vanish.trade/borrow/positions"
payload = {
"user_address": "<string>",
"timestamp": "<string>",
"user_signature": "<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({user_address: '<string>', timestamp: '<string>', user_signature: '<string>'})
};
fetch('https://core-api-dev.vanish.trade/borrow/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://core-api-dev.vanish.trade/borrow/positions",
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([
'user_address' => '<string>',
'timestamp' => '<string>',
'user_signature' => '<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://core-api-dev.vanish.trade/borrow/positions"
payload := strings.NewReader("{\n \"user_address\": \"<string>\",\n \"timestamp\": \"<string>\",\n \"user_signature\": \"<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://core-api-dev.vanish.trade/borrow/positions")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"user_address\": \"<string>\",\n \"timestamp\": \"<string>\",\n \"user_signature\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://core-api-dev.vanish.trade/borrow/positions")
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 \"user_address\": \"<string>\",\n \"timestamp\": \"<string>\",\n \"user_signature\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body[
{
"smart_wallet_id": 4821,
"address": "<string>",
"protocol_label": "kamino-lend-v2",
"status": "open",
"created_at": "<string>",
"balances": [
{
"token_address": "<string>",
"balance": "<string>",
"program_id": "<string>"
}
],
"has_active_balance": true,
"external_ref": "<string>",
"closed_at": "<string>"
}
]{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}Get Positions
Retrieves the user’s lending positions, each with token balances read live from chain.
curl --request POST \
--url https://core-api-dev.vanish.trade/borrow/positions \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"user_address": "<string>",
"timestamp": "<string>",
"user_signature": "<string>"
}
'import requests
url = "https://core-api-dev.vanish.trade/borrow/positions"
payload = {
"user_address": "<string>",
"timestamp": "<string>",
"user_signature": "<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({user_address: '<string>', timestamp: '<string>', user_signature: '<string>'})
};
fetch('https://core-api-dev.vanish.trade/borrow/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://core-api-dev.vanish.trade/borrow/positions",
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([
'user_address' => '<string>',
'timestamp' => '<string>',
'user_signature' => '<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://core-api-dev.vanish.trade/borrow/positions"
payload := strings.NewReader("{\n \"user_address\": \"<string>\",\n \"timestamp\": \"<string>\",\n \"user_signature\": \"<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://core-api-dev.vanish.trade/borrow/positions")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"user_address\": \"<string>\",\n \"timestamp\": \"<string>\",\n \"user_signature\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://core-api-dev.vanish.trade/borrow/positions")
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 \"user_address\": \"<string>\",\n \"timestamp\": \"<string>\",\n \"user_signature\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body[
{
"smart_wallet_id": 4821,
"address": "<string>",
"protocol_label": "kamino-lend-v2",
"status": "open",
"created_at": "<string>",
"balances": [
{
"token_address": "<string>",
"balance": "<string>",
"program_id": "<string>"
}
],
"has_active_balance": true,
"external_ref": "<string>",
"closed_at": "<string>"
}
]{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}Authorizations
Body
Request payload for querying lending positions.
The Solana wallet address of the user.
The current timestamp in milliseconds used for signature verification. Read-scoped: accepted within 24 hours. Can be provided as a string or a number
^[0-9]+$Signature of the 'By signing, I hereby agree to Vanish's Terms of Service and agree to be bound by them (docs.vanish.trade/legal/TOS)
Details: read:{timestamp}' string signed using the user's wallet.
Response
A successful response containing the user's lending positions.
Identifier of the position's one-time wallet.
4821
The one-time wallet's Solana address.
The label set when the one-time wallet was created.
"kamino-lend-v2"
Current status of the position. It is closed once a settle with cleanup_leftover_sol has been committed.
open, closed Timestamp (ISO 8601 format) indicating when the one-time wallet was created.
Live token balances read from chain for this one-time wallet. An empty array means the balance lookup did not return - treat it as unknown rather than a confirmed zero.
Show child attributes
Show child attributes
True only when balances holds a non-SOL token with a positive balance. Leftover SOL dust alone does not count - filter on this field instead of applying your own dust threshold.
The value passed at wallet creation, or null if none was supplied.
Timestamp (ISO 8601 format) indicating when the position was closed; null while it is open.
