info (userRole)
curl --request POST \
--url https://hyperliquid-mainnet.core.chainstack.com/4f8d8f4040bdacd1577bff8058438274/info \
--header 'Content-Type: application/json' \
--data '
{
"type": "userRole",
"user": "0x31ca8395cf837de08b24da3f660e77761dfb974b"
}
'import requests
url = "https://hyperliquid-mainnet.core.chainstack.com/4f8d8f4040bdacd1577bff8058438274/info"
payload = {
"type": "userRole",
"user": "0x31ca8395cf837de08b24da3f660e77761dfb974b"
}
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: 'userRole', user: '0x31ca8395cf837de08b24da3f660e77761dfb974b'})
};
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' => 'userRole',
'user' => '0x31ca8395cf837de08b24da3f660e77761dfb974b'
]),
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\": \"userRole\",\n \"user\": \"0x31ca8395cf837de08b24da3f660e77761dfb974b\"\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\": \"userRole\",\n \"user\": \"0x31ca8395cf837de08b24da3f660e77761dfb974b\"\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\": \"userRole\",\n \"user\": \"0x31ca8395cf837de08b24da3f660e77761dfb974b\"\n}"
response = http.request(request)
puts response.read_body{
"role": "user"
}Hyperliquid node API
userRole | Hyperliquid info
The info endpoint with type: “userRole” retrieves the role and account type information for a specific user on the Hyperliquid network.
POST
/
4f8d8f4040bdacd1577bff8058438274
/
info
info (userRole)
curl --request POST \
--url https://hyperliquid-mainnet.core.chainstack.com/4f8d8f4040bdacd1577bff8058438274/info \
--header 'Content-Type: application/json' \
--data '
{
"type": "userRole",
"user": "0x31ca8395cf837de08b24da3f660e77761dfb974b"
}
'import requests
url = "https://hyperliquid-mainnet.core.chainstack.com/4f8d8f4040bdacd1577bff8058438274/info"
payload = {
"type": "userRole",
"user": "0x31ca8395cf837de08b24da3f660e77761dfb974b"
}
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: 'userRole', user: '0x31ca8395cf837de08b24da3f660e77761dfb974b'})
};
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' => 'userRole',
'user' => '0x31ca8395cf837de08b24da3f660e77761dfb974b'
]),
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\": \"userRole\",\n \"user\": \"0x31ca8395cf837de08b24da3f660e77761dfb974b\"\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\": \"userRole\",\n \"user\": \"0x31ca8395cf837de08b24da3f660e77761dfb974b\"\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\": \"userRole\",\n \"user\": \"0x31ca8395cf837de08b24da3f660e77761dfb974b\"\n}"
response = http.request(request)
puts response.read_body{
"role": "user"
}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.
info endpoint with type: "userRole" retrieves the role and account type information for a specific user on the Hyperliquid network. This endpoint is essential for understanding the account structure, permissions, and relationships within the Hyperliquid ecosystem.
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"userRole"to retrieve user role information.user(string, required) — User address in 42-character hexadecimal format (e.g.,0x31ca8395cf837de08b24da3f660e77761dfb974b).
Response
The response varies based on the user’s role type. All responses include arole field, with additional data for certain role types:
Role types
User
{"role": "user"}
- role (string) — Standard user account with full trading capabilities
Agent
{"role": "agent", "data": {"user": "0x..."}}
- role (string) — Agent account that acts on behalf of another user
- data.user (string) — Address of the user this agent represents
Vault
{"role": "vault"}
- role (string) — Vault account for collective asset management
Sub-account
{"role": "subAccount", "data": {"master": "0x..."}}
- role (string) — Sub-account linked to a master account
- data.master (string) — Address of the master account
Missing
{"role": "missing"}
- role (string) — Unrecognized or non-existent account
Understanding user roles
User accounts:- Standard individual or institutional trading accounts
- Full access to trading, staking, and governance features
- Independent account management and permissions
- Authorized to act on behalf of other users
- Used for automated trading, portfolio management, or custody services
- Maintains connection to the principal user account
- Collective investment vehicles or fund structures
- May have multiple participants or beneficiaries
- Often used for institutional asset management
- Linked to a master account for organizational purposes
- Useful for separating trading strategies or risk management
- Master account typically maintains oversight and control
- Address exists but has no recognized role or activity
- May indicate new, inactive, or invalid addresses
- Useful for validation and error handling
Example request
curl -X POST \
-H "Content-Type: application/json" \
-d '{"type": "userRole", "user": "0x31ca8395cf837de08b24da3f660e77761dfb974b"}' \
https://hyperliquid-mainnet.core.chainstack.com/4f8d8f4040bdacd1577bff8058438274/info
from hyperliquid.info import Info
# Pass your full Chainstack endpoint as the base URL.
info = Info("YOUR_CHAINSTACK_ENDPOINT", skip_ws=True)
result = info.user_role(user="0x31ca8395cf837de08b24da3f660e77761dfb974b")
print(result)
import { HttpTransport, InfoClient } from "@nktkas/hyperliquid";
// apiUrl points the transport at your full Chainstack endpoint.
const transport = new HttpTransport({ apiUrl: "YOUR_CHAINSTACK_ENDPOINT" });
const info = new InfoClient({ transport });
const result = await info.userRole({
user: "0x31ca8395cf837de08b24da3f660e77761dfb974b",
});
console.log(result);
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
{"role": "user"}
Use case
Theinfo endpoint with type: "userRole" is essential for applications that need to:
- Access control: Determine appropriate permissions and features for different account types
- User interface: Customize UI elements based on account role and capabilities
- Compliance monitoring: Track different account types for regulatory requirements
- Risk management: Apply role-specific risk controls and limits
- Agent verification: Validate agent relationships and authorization
- Sub-account management: Display master-sub account hierarchies
- Vault operations: Identify collective investment accounts and structures
- Account validation: Verify account existence and type before operations
- Automated systems: Route operations based on account role and permissions
- Reporting systems: Categorize accounts for analytics and compliance
- Customer support: Understand account structure for troubleshooting
- Onboarding flows: Guide users through role-specific setup processes
- API integration: Implement role-based API access and functionality
- Audit trails: Track activities across different account types
Body
application/json
Response
200 - application/json
User's role information and associated data
- Option 1
- Option 2
- Option 3
- Option 4
- Option 5
Regular user role
User role type
Available options:
user Last modified on June 24, 2026
Was this page helpful?