perpDexs - HyperCore Info Endpoint
Get all perpetual DEXs deployed on Hyperliquid. Query deployer details, listed assets, open interest caps, funding multipliers, fee configuration, and sub-deployer permissions.
Get all third-party perpetual DEXs deployed on Hyperliquid's infrastructure, including their listed assets, open interest caps, funding parameters, and deployer configuration.
Authenticate by including your Dwellir API key in the URL path: https://api-hyperliquid-mainnet-info.n.dwellir.com/YOUR_API_KEY/info.
When to Use This Endpoint
The perpDexs endpoint is essential for:
- DEX Discovery — Enumerate all perpetual DEXs deployed on Hyperliquid
- Asset Listing — Find which assets are available on each DEX and their open interest caps
- Funding Analysis — Query funding multipliers and interest rates across DEXs
- Deployer Verification — Verify deployer addresses and fee recipients for each DEX
- Permission Auditing — Inspect sub-deployer permissions and capabilities
Common Use Cases
1. List All DEXs and Their Assets
Enumerate all deployed DEXs with their asset counts and total OI capacity:
async function listDexOverview() {
const dexs = await getPerpDexs();
console.log('=== Perpetual DEXs on Hyperliquid ===\n');
dexs.filter(d => d !== null).forEach(dex => {
const totalOiCap = dex.assetToStreamingOiCap.reduce(
(sum, [, cap]) => sum + parseFloat(cap), 0
);
console.log(`${dex.fullName} (${dex.name})`);
console.log(` Deployer: ${dex.deployer}`);
console.log(` Assets: ${dex.assetToStreamingOiCap.length}`);
console.log(` Total OI Cap: $${(totalOiCap / 1e6).toFixed(1)}M`);
console.log(` Fee Scale: ${dex.deployerFeeScale}`);
console.log('');
});
}2. Find a Specific Asset Across DEXs
Search for which DEXs list a specific asset:
async function findAssetAcrossDexs(assetSymbol) {
const dexs = await getPerpDexs();
const results = [];
dexs.filter(d => d !== null).forEach(dex => {
const match = dex.assetToStreamingOiCap.find(
([name]) => name.split(':')[1] === assetSymbol
);
if (match) {
const fundingEntry = dex.assetToFundingMultiplier.find(
([name]) => name === match[0]
);
results.push({
dex: dex.fullName,
dexPrefix: dex.name,
asset: match[0],
oiCap: match[1],
fundingMultiplier: fundingEntry ? fundingEntry[1] : 'N/A'
});
}
});
console.log(`\n=== "${assetSymbol}" across DEXs ===\n`);
results.forEach(r => {
console.log(`${r.dex}: OI Cap $${(parseFloat(r.oiCap) / 1e6).toFixed(1)}M | Funding: ${r.fundingMultiplier}`);
});
return results;
}
// Usage
await findAssetAcrossDexs('GOLD');3. Analyze Funding Parameters
Compare funding configurations across DEXs:
async function analyzeFunding() {
const dexs = await getPerpDexs();
console.log('=== Funding Analysis ===\n');
dexs.filter(d => d !== null).forEach(dex => {
if (dex.assetToFundingMultiplier.length === 0 &&
dex.assetToFundingInterestRate.length === 0) {
console.log(`${dex.fullName}: No custom funding config`);
return;
}
console.log(`${dex.fullName}:`);
if (dex.assetToFundingMultiplier.length > 0) {
const multipliers = dex.assetToFundingMultiplier.map(([, m]) => parseFloat(m));
const avg = multipliers.reduce((a, b) => a + b, 0) / multipliers.length;
console.log(` Funding multipliers: ${multipliers.length} assets, avg ${avg.toFixed(4)}`);
}
if (dex.assetToFundingInterestRate.length > 0) {
console.log(` Interest rates: ${dex.assetToFundingInterestRate.length} assets`);
}
console.log('');
});
}4. Audit Sub-Deployer Permissions
Review which addresses have administrative permissions:
async function auditPermissions(dexName) {
const dexs = await getPerpDexs();
const dex = dexs.find(d => d !== null && d.name === dexName);
if (!dex) {
console.log(`DEX "${dexName}" not found`);
return;
}
console.log(`=== Permission Audit: ${dex.fullName} ===\n`);
console.log(`Deployer: ${dex.deployer}`);
console.log(`Oracle Updater: ${dex.oracleUpdater || 'None'}`);
console.log(`Fee Recipient: ${dex.feeRecipient || 'None'}`);
console.log('\nSub-Deployer Permissions:');
dex.subDeployers.forEach(([permission, addresses]) => {
console.log(` ${permission}:`);
addresses.forEach(addr => console.log(` - ${addr}`));
});
}
// Usage
await auditPermissions('xyz');5. Monitor OI Cap Utilization
Build a dashboard showing available capacity:
async function getOiCapSummary() {
const dexs = await getPerpDexs();
const summary = dexs
.filter(d => d !== null)
.map(dex => {
const assets = dex.assetToStreamingOiCap.map(([name, cap]) => ({
asset: name,
oiCap: parseFloat(cap)
}));
const totalCap = assets.reduce((sum, a) => sum + a.oiCap, 0);
const topAssets = assets
.sort((a, b) => b.oiCap - a.oiCap)
.slice(0, 3);
return {
name: dex.fullName,
assetCount: assets.length,
totalOiCap: totalCap,
topAssets: topAssets
};
})
.sort((a, b) => b.totalOiCap - a.totalOiCap);
console.log('=== OI Cap Summary (by total capacity) ===\n');
summary.forEach(dex => {
console.log(`${dex.name}: $${(dex.totalOiCap / 1e6).toFixed(0)}M total (${dex.assetCount} assets)`);
dex.topAssets.forEach(a => {
console.log(` ${a.asset}: $${(a.oiCap / 1e6).toFixed(0)}M`);
});
console.log('');
});
return summary;
}Best Practices
- Filter null entries — The response array may contain
nullvalues at certain indices - Cache results — DEX configurations change infrequently, cache for 5-15 minutes
- Parse asset names — Asset names use the format
dexName:SYMBOL(e.g.,"xyz:GOLD") - Monitor fee changes — Check
lastDeployerFeeScaleChangeTimefor recent fee updates - Validate deployer addresses — Verify deployer and fee recipient addresses when integrating
Related Endpoints
- meta — Get core Hyperliquid trading pair metadata
- spotMeta — Get spot trading asset metadata
- exchangeStatus — Monitor exchange health and status
- clearinghouseState — Get account state for a specific DEX
- OHLCV REST API — Use
prefix:ASSETsymbols as themarketparameter for candle queries
Discover perpetual DEXs on Hyperliquid with Dwellir's HyperCore Info Endpoint. Get your API key →