Skip to main content
POST
/
4f8d8f4040bdacd1577bff8058438274
/
info
info (perpCategories)
curl --request POST \
  --url https://hyperliquid-mainnet.core.chainstack.com/4f8d8f4040bdacd1577bff8058438274/info \
  --header 'Content-Type: application/json' \
  --data '
{
  "type": "perpCategories"
}
'
import requests

url = "https://hyperliquid-mainnet.core.chainstack.com/4f8d8f4040bdacd1577bff8058438274/info"

payload = { "type": "perpCategories" }
headers = {"Content-Type": "application/json"}

response = requests.post(url, json=payload, headers=headers)

print(response.text)
const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({type: 'perpCategories'})
};

fetch('https://hyperliquid-mainnet.core.chainstack.com/4f8d8f4040bdacd1577bff8058438274/info', 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://hyperliquid-mainnet.core.chainstack.com/4f8d8f4040bdacd1577bff8058438274/info",
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([
'type' => 'perpCategories'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);

$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://hyperliquid-mainnet.core.chainstack.com/4f8d8f4040bdacd1577bff8058438274/info"

payload := strings.NewReader("{\n \"type\": \"perpCategories\"\n}")

req, _ := http.NewRequest("POST", url, payload)

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://hyperliquid-mainnet.core.chainstack.com/4f8d8f4040bdacd1577bff8058438274/info")
.header("Content-Type", "application/json")
.body("{\n \"type\": \"perpCategories\"\n}")
.asString();
require 'uri'
require 'net/http'

url = URI("https://hyperliquid-mainnet.core.chainstack.com/4f8d8f4040bdacd1577bff8058438274/info")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"type\": \"perpCategories\"\n}"

response = http.request(request)
puts response.read_body
[
  [
    "<string>"
  ]
]
This method is available on Chainstack. Not all Hyperliquid methods are available on Chainstack, as the open-source node implementation does not support them yet — see Hyperliquid methods for the full availability breakdown.
The info endpoint with type: "perpCategories" retrieves all HIP-3 perpetual assets that have a category set via setPerpAnnotation. Returns an array of [coin, category] tuples, or an empty array if no deployers have set categories.
Get your own node endpoint todayStart for free and get your app to production levels immediately. No credit card required.You can sign up with your GitHub, X, Google, or Microsoft account.

Parameters

Request body

  • type (string, required) — The request type. Must be "perpCategories".

Response

An array of two-element arrays, where each entry contains:
  • Index 0 (string) — HIP-3 asset symbol in deployer:TICKER format.
  • Index 1 (string) — Category label assigned by the deployer.
Returns an empty array if no deployers have set categories. Only HIP-3 deployed assets appear — native Hyperliquid perps (BTC, ETH, etc.) are never included. The official Hyperliquid UI only displays categories from a predefined set in lowercase with no special characters (e.g., "indices", "commodities", "ai", "meme", "defi", "gaming", "layer1", "layer2", "stocks", "forex").

Example request

curl -X POST \
  -H "Content-Type: application/json" \
  -d '{"type": "perpCategories"}' \
  https://hyperliquid-mainnet.core.chainstack.com/4f8d8f4040bdacd1577bff8058438274/info
from hyperliquid.info import Info

# The hyperliquid-python-sdk has no dedicated perpCategories method,
# so post the request type directly with the generic post helper.
info = Info("YOUR_CHAINSTACK_ENDPOINT", skip_ws=True)

categories = info.post("/info", {"type": "perpCategories"})
print(categories)
import * as hl from "@nktkas/hyperliquid";

const transport = new hl.HttpTransport({ apiUrl: "YOUR_CHAINSTACK_ENDPOINT" });
const client = new hl.InfoClient({ transport });

const categories = await client.perpCategories();
console.log(categories);
Use your own endpoint in your code. The code examples use a placeholder Chainstack endpoint (YOUR_CHAINSTACK_ENDPOINT) — replace it with your own Hyperliquid node endpoint from the Chainstack console. The curl above uses a shared public endpoint for quick checks only; do not use it in production.

Example response

When categories exist:
[
  ["xyz:GOLD", "commodities"],
  ["xyz:SPX", "indices"],
  ["abc:AGENT", "ai"]
]
When no deployers have set categories:
[]

Use case

The info endpoint with type: "perpCategories" is useful for:
  • Organizing HIP-3 perpetual assets into categories for trading interfaces
  • Building category-based navigation and filtering for asset discovery
  • Displaying a categorized catalog of deployer-created perpetual contracts

Body

application/json
type
enum<string>
default:perpCategories
required

Request type

Available options:
perpCategories

Response

200 - application/json

Array of perpetual category classifications

Last modified on July 7, 2026