liquidatable
Check if a user's positions are at risk of liquidation, providing critical risk management information.
When to Use This Endpoint#
The liquidatable endpoint is essential for:
- Risk Monitoring — Check liquidation risk for positions
- Margin Management — Monitor account health and safety
- Liquidation Alerts — Build alert systems for position risk
- Portfolio Safety — Ensure positions are within safe margins
Request#
Endpoint#
POST https://api-hyperliquid-mainnet-info.n.dwellir.com/info
Headers#
| Header | Value | Required |
|---|---|---|
Content-Type | application/json | Yes |
X-Api-Key | Your API key | Yes |
Parameters#
| Parameter | Type | Required | Description |
|---|---|---|---|
type | string | Yes | Must be "liquidatable" |
user | string | Yes | User's Ethereum wallet address |
Example Request#
{
"type": "liquidatable",
"user": "0x420a4ed7b6bb361da586868adec2f2bb9ab75e66"
}
Response#
Success Response#
Returns liquidation status for the user's positions.
{
"liquidatable": false
}
Response Fields#
| Field | Type | Description |
|---|---|---|
liquidatable | boolean | Whether the user's positions are currently liquidatable |
Code Examples#
- cURL
- JavaScript
- Python
- Go
curl -X POST 'https://api-hyperliquid-mainnet-info.n.dwellir.com/info' \
-H 'X-Api-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"type": "liquidatable",
"user": "0x420a4ed7b6bb361da586868adec2f2bb9ab75e66"
}'
const ENDPOINT = 'https://api-hyperliquid-mainnet-info.n.dwellir.com/info';
const API_KEY = 'your-api-key-here';
async function checkLiquidatable(userAddress) {
const response = await fetch(ENDPOINT, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-Api-Key': API_KEY
},
body: JSON.stringify({
type: 'liquidatable',
user: userAddress
})
});
if (!response.ok) {
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
}
return await response.json();
}
// Usage
const status = await checkLiquidatable('0x420a4ed7b6bb361da586868adec2f2bb9ab75e66');
console.log(`Liquidatable: ${status.liquidatable ? 'YES - AT RISK' : 'No'}`);
import requests
from typing import Dict
ENDPOINT = 'https://api-hyperliquid-mainnet-info.n.dwellir.com/info'
API_KEY = 'your-api-key-here'
def check_liquidatable(user_address: str) -> Dict:
"""Check if user positions are liquidatable"""
response = requests.post(
ENDPOINT,
json={
'type': 'liquidatable',
'user': user_address
},
headers={
'Content-Type': 'application/json',
'X-Api-Key': API_KEY
},
timeout=10
)
response.raise_for_status()
return response.json()
# Usage
status = check_liquidatable('0x420a4ed7b6bb361da586868adec2f2bb9ab75e66')
print(f"Liquidatable: {'YES - AT RISK' if status['liquidatable'] else 'No'}")
package main
import (
"bytes"
"encoding/json"
"fmt"
"io"
"net/http"
)
const (
Endpoint = "https://api-hyperliquid-mainnet-info.n.dwellir.com/info"
APIKey = "your-api-key-here"
)
type LiquidatableRequest struct {
Type string `json:"type"`
User string `json:"user"`
}
type LiquidatableResponse struct {
Liquidatable bool `json:"liquidatable"`
}
func checkLiquidatable(userAddress string) (*LiquidatableResponse, error) {
reqBody, _ := json.Marshal(LiquidatableRequest{
Type: "liquidatable",
User: userAddress,
})
req, _ := http.NewRequest("POST", Endpoint, bytes.NewBuffer(reqBody))
req.Header.Set("Content-Type", "application/json")
req.Header.Set("X-Api-Key", APIKey)
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
return nil, err
}
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
var result LiquidatableResponse
if err := json.Unmarshal(body, &result); err != nil {
return nil, err
}
return &result, nil
}
func main() {
status, err := checkLiquidatable("0x420a4ed7b6bb361da586868adec2f2bb9ab75e66")
if err != nil {
fmt.Printf("Error: %v\n", err)
return
}
if status.Liquidatable {
fmt.Println("Liquidatable: YES - AT RISK")
} else {
fmt.Println("Liquidatable: No")
}
}
Common Use Cases#
1. Liquidation Risk Monitor#
Monitor liquidation risk continuously:
async function monitorLiquidationRisk(userAddress) {
const status = await checkLiquidatable(userAddress);
console.log('=== Liquidation Risk Monitor ===\n');
if (status.liquidatable) {
console.error('⚠️ CRITICAL: Positions are liquidatable!');
console.error('Action required: Add margin or reduce position size');
} else {
console.log('✓ Positions are safe from liquidation');
}
return status.liquidatable;
}
// Usage
const atRisk = await monitorLiquidationRisk('0x420a4ed7b6bb361da586868adec2f2bb9ab75e66');
2. Build Liquidation Alert System#
Create automated liquidation alerts:
class LiquidationAlertSystem {
constructor(userAddress, checkIntervalMs = 30000) {
this.userAddress = userAddress;
this.checkIntervalMs = checkIntervalMs;
this.wasLiquidatable = false;
}
async start(onAlert) {
while (true) {
try {
const status = await checkLiquidatable(this.userAddress);
if (status.liquidatable && !this.wasLiquidatable) {
// Just became liquidatable - send alert
onAlert({
severity: 'critical',
message: 'Positions now liquidatable!',
timestamp: new Date().toISOString()
});
} else if (!status.liquidatable && this.wasLiquidatable) {
// No longer liquidatable - send recovery alert
onAlert({
severity: 'info',
message: 'Positions no longer liquidatable',
timestamp: new Date().toISOString()
});
}
this.wasLiquidatable = status.liquidatable;
} catch (error) {
console.error('Alert system error:', error);
}
await new Promise(r => setTimeout(r, this.checkIntervalMs));
}
}
}
// Usage
const alertSystem = new LiquidationAlertSystem('0x420a4ed7b6bb361da586868adec2f2bb9ab75e66');
alertSystem.start((alert) => {
console.log(`[${alert.severity.toUpperCase()}] ${alert.message}`);
// Send notification via email, SMS, etc.
});
3. Risk Dashboard#
Create a risk management dashboard:
async function getRiskDashboard(userAddress) {
try {
const status = await checkLiquidatable(userAddress);
return {
status: 'success',
liquidationRisk: status.liquidatable ? 'HIGH' : 'LOW',
isLiquidatable: status.liquidatable,
recommendation: status.liquidatable
? 'Immediate action required: Add margin or close positions'
: 'Positions are within safe margins',
lastChecked: new Date().toISOString()
};
} catch (error) {
return {
status: 'error',
error: error.message
};
}
}
// Usage
const dashboard = await getRiskDashboard('0x420a4ed7b6bb361da586868adec2f2bb9ab75e66');
console.log('Risk Dashboard:', dashboard);
4. Pre-Trade Risk Check#
Check liquidation risk before opening new positions:
async function preTradeRiskCheck(userAddress) {
const status = await checkLiquidatable(userAddress);
if (status.liquidatable) {
return {
canTrade: false,
reason: 'Existing positions are liquidatable',
recommendation: 'Resolve liquidation risk before opening new positions'
};
}
return {
canTrade: true,
reason: 'Account health is good',
recommendation: 'Safe to proceed with new trades'
};
}
// Usage
const riskCheck = await preTradeRiskCheck('0x420a4ed7b6bb361da586868adec2f2bb9ab75e66');
if (riskCheck.canTrade) {
console.log('✓ Safe to open new positions');
} else {
console.error(`✗ Cannot trade: ${riskCheck.reason}`);
}
5. Continuous Risk Monitoring#
Monitor risk with logging:
async function continuousRiskMonitoring(userAddress, logInterval = 60000) {
const riskLog = [];
const monitor = async () => {
const status = await checkLiquidatable(userAddress);
const logEntry = {
timestamp: new Date().toISOString(),
liquidatable: status.liquidatable,
riskLevel: status.liquidatable ? 'CRITICAL' : 'SAFE'
};
riskLog.push(logEntry);
console.log(`[${logEntry.timestamp}] Risk: ${logEntry.riskLevel}`);
if (status.liquidatable) {
console.error('⚠️ ALERT: Liquidation risk detected!');
}
};
// Run immediately and then at intervals
await monitor();
setInterval(monitor, logInterval);
return riskLog;
}
// Usage
const riskLog = await continuousRiskMonitoring(
'0x420a4ed7b6bb361da586868adec2f2bb9ab75e66',
60000 // Check every minute
);
Error Handling#
Common Errors#
| Error | Cause | Solution |
|---|---|---|
401 Unauthorized | Invalid API key | Verify your API key is correct |
400 Bad Request | Missing or invalid user address | Ensure valid Ethereum address format |
429 Too Many Requests | Rate limit exceeded | Implement request throttling |
500 Internal Server Error | Server issue | Retry with exponential backoff |
Error Response Example#
{
"error": "Missing required parameter: user",
"code": "MISSING_PARAMETER"
}
Robust Error Handling#
async function safeCheckLiquidatable(userAddress, maxRetries = 3) {
for (let i = 0; i < maxRetries; i++) {
try {
return await checkLiquidatable(userAddress);
} catch (error) {
if (error.response?.status === 429) {
await new Promise(r => setTimeout(r, Math.pow(2, i) * 1000));
} else if (error.response?.status === 400) {
throw new Error('Invalid user address');
} else if (i === maxRetries - 1) {
throw error;
}
}
}
}
Best Practices#
- Check frequently — Monitor every 30-60 seconds for active positions
- Set up alerts — Implement immediate notifications for liquidation risk
- Act quickly — Respond immediately when positions become liquidatable
- Combine with margin data — Use with clearinghouseState for full context
- Log history — Track risk over time for pattern analysis
Performance Considerations#
Efficient Risk Monitoring#
class EfficientRiskMonitor {
constructor(userAddress) {
this.userAddress = userAddress;
this.cache = null;
this.cacheTime = 0;
this.cacheDuration = 10000; // 10 seconds
}
async check(forceRefresh = false) {
const now = Date.now();
if (!forceRefresh && this.cache && (now - this.cacheTime) < this.cacheDuration) {
return this.cache;
}
const status = await checkLiquidatable(this.userAddress);
this.cache = status;
this.cacheTime = now;
return status;
}
}
Related Endpoints#
- clearinghouseState — Get detailed margin and position data
- openOrders — View orders that may affect liquidation risk
- userFees — Understand fee impact on margin
- meta — Get liquidation price calculations
Protect your positions with real-time liquidation monitoring via Dwellir's HyperCore Info Endpoint. Get your API key →