Skip to main content

Documentation Index

Fetch the complete documentation index at: https://goldrush.dev/docs/llms.txt

Use this file to discover all available pages before exploring further.

Hyperliquid Info API

Available Types (today)

TypeBodyReturns
metaAndAssetCtxs{type:"metaAndAssetCtxs",dex:""}Tuple [meta, assetCtxs[]]
clearinghouseState{type:"clearinghouseState",user:"0x...",dex:""}Perp account state
spotClearinghouseState{type:"spotClearinghouseState",user:"0x...",dex:""}Spot balances
frontendOpenOrders{type:"frontendOpenOrders",user:"0x...",dex:""}Open orders w/ TP/SL metadata
batchClearinghouseState{type:"batchClearinghouseState",users:["0x...",...],dex:""}Array of clearinghouseState slots, 1-50 wallets. GoldRush-native (no upstream equivalent)
batchSpotClearinghouseState{type:"batchSpotClearinghouseState",users:["0x...",...]}Array of spotClearinghouseState slots, 1-50 wallets. GoldRush-native (no upstream equivalent)
All other types return {"error":"unsupported_type","type":"<the type you sent>"} with HTTP 400. Requests are not forwarded to upstream Hyperliquid.

Migration Pattern

// Before
fetch("https://api.hyperliquid.xyz/info", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify(body),
});

// After -same body, no rate limits
fetch("https://hypercore.goldrushdata.com/info", {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${process.env.GOLDRUSH_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify(body),
});

The GoldRush Hyperliquid Info API is a drop-in replacement for POST https://api.hyperliquid.xyz/info. The request body, the response shape, and the JSON keys are byte-for-byte identical to the public Hyperliquid API. The only differences are the URL and the authentication header.

Endpoint

POST https://hypercore.goldrushdata.com/info
Authorization: Bearer 
Content-Type: application/json

What’s different from the public Hyperliquid API

Public api.hyperliquid.xyz/infoGoldRush hypercore.goldrushdata.com/info
AuthNoneAuthorization: Bearer
Rate limit1200 weight/min/IPNone
Orderbook latency target~280 ms p50Sub-150 ms p50
Wire compatibilityn/a (it’s the source)Byte-for-byte
Types not in public APIn/aBatched user state, builder fills, liquidation feed, composites - see Roadmap
Unsupported typesn/aReturn {"error":"unsupported_type","type":""} instead of being forwarded

Available types

The Info API ships today with six types: four wire-compatible drop-ins covering the core “show me the market and my account” UX, plus two GoldRush-native batch endpoints with no upstream Hyperliquid equivalent.
TypeBodyReturns
metaAndAssetCtxs{"type": "metaAndAssetCtxs", "dex": ""}Tuple [meta, assetCtxs[]] - perp universe + per-asset live mark price, funding, OI, day volume.
clearinghouseState{"type": "clearinghouseState", "user": "0x…", "dex": ""}Perp account: positions, margin summary, account value, withdrawable.
spotClearinghouseState{"type": "spotClearinghouseState", "user": "0x…", "dex": ""}Spot balances per token, total USD value.
frontendOpenOrders{"type": "frontendOpenOrders", "user": "0x…", "dex": ""}Open orders + trigger metadata (TP/SL, isPositionTpsl, reduceOnly, orderType).
batchClearinghouseState{"type": "batchClearinghouseState", "users": ["0x…", …], "dex": ""}Array of clearinghouseState slots. GoldRush-native, 1 to 50 wallets per call.
batchSpotClearinghouseState{"type": "batchSpotClearinghouseState", "users": ["0x…", …]}Array of spotClearinghouseState slots. GoldRush-native, 1 to 50 wallets per call.
If you send a type that isn’t in the table above, the response body is {"error":"unsupported_type","type":""}. Requests are not forwarded to upstream Hyperliquid. Type expansion is tracked on the Roadmap. See the Roadmap for what’s shipping next.

How clients see it

Existing Hyperliquid SDKs work unchanged after a baseUrl override. See SDK compatibility for nomeida/hyperliquid (JS) and hyperliquid-dex/hyperliquid-python-sdk setup snippets.

Errors

StatusBodyCause
400{"error":"invalid request"}Malformed body.
400{"error":"unsupported_type","type":""}The type field isn’t one of the natively-supported types.
401{"error":"unauthorized"}Missing or invalid Authorization header.
5xxServer errorInternal server error.

Networks

Mainnet only. Testnet support is deferred.

Next

Migration guide

Side-by-side examples - change one URL and one header.

SDK compatibility

Drop-in setup for nomeida/hyperliquid and hyperliquid-python-sdk.

Limits and caching

No rate limits - what to know about caching and recommended polling cadences.

API reference

Per-endpoint request and response schemas.
Moving from the public Hyperliquid /info API to GoldRush is two changes:
  1. URL - replace api.hyperliquid.xyz/info with hypercore.goldrushdata.com/info.
  2. Header - add Authorization: Bearer .
That’s it. The request body and response shape are byte-for-byte identical.

Side-by-side

cURL

Public Hyperliquid
curl -X POST https://api.hyperliquid.xyz/info \
  -H "Content-Type: application/json" \
  -d '{
    "type": "clearinghouseState",
    "user": "0xecb63caa47c7c4e77f60f1ce858cf28dc2b82b00",
    "dex": ""
  }'
GoldRush
curl -X POST https://hypercore.goldrushdata.com/info \
  -H "Authorization: Bearer $GOLDRUSH_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "type": "clearinghouseState",
    "user": "0xecb63caa47c7c4e77f60f1ce858cf28dc2b82b00",
    "dex": ""
  }'

JavaScript / TypeScript

Public Hyperliquid
const response = await fetch("https://api.hyperliquid.xyz/info", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({
    type: "metaAndAssetCtxs",
    dex: "",
  }),
});

const data = await response.json();
GoldRush
const response = await fetch("https://hypercore.goldrushdata.com/info", {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${process.env.GOLDRUSH_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    type: "metaAndAssetCtxs",
    dex: "",
  }),
});

const data = await response.json();

Python

Public Hyperliquid
import requests

response = requests.post(
    "https://api.hyperliquid.xyz/info",
    json={
        "type": "spotClearinghouseState",
        "user": "0xecb63caa47c7c4e77f60f1ce858cf28dc2b82b00",
        "dex": "",
    },
)

print(response.json())
GoldRush
import os
import requests

response = requests.post(
    "https://hypercore.goldrushdata.com/info",
    headers={"Authorization": f"Bearer {os.environ['GOLDRUSH_API_KEY']}"},
    json={
        "type": "spotClearinghouseState",
        "user": "0xecb63caa47c7c4e77f60f1ce858cf28dc2b82b00",
        "dex": "",
    },
)

print(response.json())

Behavioral notes

Things to be aware of when you cut over.

Response is byte-equal, modulo live drift

For implemented types, the response body matches Hyperliquid byte-for-byte - same keys, same nesting, same value types. Numeric fields update independently on each side, so a market-price field will diverge by tens of milliseconds, but the schema is identical.

Unsupported types return a JSON error

Types that GoldRush doesn’t natively serve return {"error":"unsupported_type","type":""} with HTTP 400. They are not forwarded to upstream Hyperliquid. See the Info API overview for the current list of supported types and the Roadmap for what’s shipping next.

Auth errors return JSON

A missing or invalid key returns 401 with body {"error":"unauthorized"}. Public Hyperliquid has no auth and never returns 401.

Existing SDKs work after a baseUrl override

The two most-used SDKs work unchanged:
  • nomeida/hyperliquid (JavaScript)
  • hyperliquid-dex/hyperliquid-python-sdk (Python)
See SDK compatibility for the override snippets.

Authentication

The Info API uses your standard GoldRush API key. The same key works against the Foundational API, the Streaming API, and the Pipeline API. If you don’t have one yet, sign up here. Never hardcode keys in source. Use environment variables or a secrets manager.

What you gain

  • No rate limits. No 1200 weight/min cap, no per-address throttling, no IP buckets.
  • Faster reads. Sub-150 ms p50 target for warm responses; orderbook reads driven from a live WebSocket-fed cache.
  • More types. Batched user state, builder-attribution data, liquidation feed, and composites are on the Roadmap.
  • HIP-3 and HIP-4 first-class. Deployer-prefix syntax (xyz:GOLD-USDC) is supported across meta and metaAndAssetCtxs when a dex is provided.
  • One key for everything Hyperliquid. The same API key unlocks Streaming, Pipeline, and HyperEVM via the Foundational API.

The most popular Hyperliquid SDKs work against GoldRush after a one-line baseUrl override and adding an Authorization header.

JavaScript / TypeScript: nomeida/hyperliquid

Install

npm
npm install hyperliquid
yarn
yarn add hyperliquid

Configure

import { Hyperliquid } from "hyperliquid";

const sdk = new Hyperliquid({
  // Point at GoldRush
  baseUrl: "https://hypercore.goldrushdata.com",
  // Inject the Authorization header on every request
  headers: {
    Authorization: `Bearer ${process.env.GOLDRUSH_API_KEY}`,
  },
});

// Existing methods work unchanged
const ctxs = await sdk.info.metaAndAssetCtxs();
const account = await sdk.info.clearinghouseState({
  user: "0xecb63caa47c7c4e77f60f1ce858cf28dc2b82b00",
});
const spot = await sdk.info.spotClearinghouseState({
  user: "0xecb63caa47c7c4e77f60f1ce858cf28dc2b82b00",
});
const orders = await sdk.info.frontendOpenOrders({
  user: "0xecb63caa47c7c4e77f60f1ce858cf28dc2b82b00",
});
Note: If your SDK version doesn’t expose a headers option, wrap fetch to inject the header globally before instantiating the SDK. See the patch pattern below.

Header injection fallback

const originalFetch = globalThis.fetch;
globalThis.fetch = (input, init = {}) => {
  const headers = new Headers(init.headers);
  if (typeof input === "string" && input.startsWith("https://hypercore.goldrushdata.com")) {
    headers.set("Authorization", `Bearer ${process.env.GOLDRUSH_API_KEY}`);
  }
  return originalFetch(input, { ...init, headers });
};

Python: hyperliquid-dex/hyperliquid-python-sdk

Install

pip install hyperliquid-python-sdk

Configure

import os
from hyperliquid.info import Info

# Point Info at GoldRush
info = Info(base_url="https://hypercore.goldrushdata.com", skip_ws=True)

# Inject the Authorization header on the underlying session
info.session.headers.update({
    "Authorization": f"Bearer {os.environ['GOLDRUSH_API_KEY']}"
})

# Existing methods work unchanged
ctxs = info.meta_and_asset_ctxs()
account = info.user_state("0xecb63caa47c7c4e77f60f1ce858cf28dc2b82b00")
spot = info.spot_user_state("0xecb63caa47c7c4e77f60f1ce858cf28dc2b82b00")
orders = info.frontend_open_orders("0xecb63caa47c7c4e77f60f1ce858cf28dc2b82b00")
Tip: skip_ws=True is recommended when using the Info API only - it skips the WebSocket connection that the SDK opens by default to upstream Hyperliquid. For real-time event streams, use the GoldRush Streaming API instead.

Verification

After cutover, confirm everything is wired correctly:
  1. Diff a known wallet - call clearinghouseState for the same wallet against both endpoints; the JSON shape (keys, nesting, types) should match exactly.
  2. Confirm auth - remove the API key and confirm you get a 401 with body {"error":"unauthorized"}. If you get any other response, your request isn’t reaching GoldRush.

Other SDKs

The pattern is the same for any HTTP client: override the base URL to https://hypercore.goldrushdata.com and attach Authorization: Bearer . If you run into a specific SDK that doesn’t expose either knob, email us - we’ll publish a recipe.

No rate limits

The GoldRush Hyperliquid Info API has no per-IP, per-key, or per-address rate limits. The 1200 weight/min cap on the public Hyperliquid /info API does not apply. You can:
  • Poll any user-state endpoint as fast as your code wants.
  • Open as many concurrent connections as your client supports.
  • Pull state for thousands of wallets in tight loops.
For wallet-level real-time updates without polling at all, use the Streaming API walletTxs subscription instead - push-based, also no rate limits.

How caching works

Responses are served from a real-time cache that’s kept fresh by direct ingestion from Hyperliquid. The cache is transparent to your client code - same JSON in, same JSON out.
Cache layerTypical freshness
User-state types (clearinghouseState, spotClearinghouseState, frontendOpenOrders)Sub-second after each user event.
Market types (metaAndAssetCtxs)Sub-second on every mark-price tick.
You’re not rate-limited, but polling smartly saves your own bandwidth.
EndpointRecommended intervalNotes
metaAndAssetCtxs1 secondMark prices update on every tick - for sub-second freshness, use the Streaming API.
clearinghouseState1 second per user, OR push via walletTxsAccount state only changes on a user event; push is far more efficient than polling.
spotClearinghouseState5 secondsSpot balances change less frequently than perp positions.
frontendOpenOrders1 second per user, OR push via walletTxsSame as clearinghouseState.

Watch out for client-side limits

GoldRush has no rate limits, but the rest of your stack might:
  • Browser fetch concurrency - most browsers cap at ~6 concurrent requests per host. Use connection pooling on the server side or batch requests.
  • HTTP/2 stream limits - most clients allow 100+ concurrent streams per connection by default. Bump if you’re saturating.
  • OS file descriptor limits - if you’re opening thousands of connections, raise ulimit -n.
For multi-wallet fan-out, use the batchClearinghouseState and batchSpotClearinghouseState endpoints, which accept up to 50 wallets per call. For more than 50 wallets, issue multiple calls.

Network and TLS

  • HTTP/2 keep-alive is supported and recommended.
  • TLS 1.2+ required.
  • Accept-Encoding: gzip is honored. zstd support is on the roadmap.

Need higher guarantees?

Enterprise SLA, dedicated capacity, regional pinning, and on-prem options are all available. Email sales.