For the complete documentation index, see llms.txt. This page is also available as Markdown.

GET /account/fees

Account fee schedule

Account fee schedule.

operationId: fetchTradingFees · CCXT method: fetchTradingFees

Declared server: https://api.testnet.nexus.xyz/v1. See Networks.

Authentication: agentAuth, hmacAuth.

Account fee schedule

get
/account/fees

The authenticated account's effective fee schedule — maker/taker rate (bps), fee tier, rolling 30-day traded volume, and active discounts — for parity with Hyperliquid userFees. This is the forward-looking schedule rate, not a realized average: the venue charges a per-fill fee but does not emit a realized per-fill rate. The reported rate's scope is given by schedule (see the schema); the account id is taken from the authenticated credentials, not a parameter. Pass market_id to request the exact current mirrored schedule for one intended market before the account has traded there. A selected market never falls back to a venue-modal or unrelated market rate: an unavailable or stale target returns schedule: unknown, zero sentinels, and an empty markets array.

Authorizations
X-API-KeystringRequired

HMAC API key authentication. Send three headers:

  • X-API-Key: your key ID (e.g. nx_a1b2c3...)
  • X-Timestamp: current time in unix milliseconds
  • X-Signature: hex(hmac_sha256(secret, timestamp + "\n" + METHOD + "\n" + path + "\n" + query + "\n" + sha256_hex(body)))

Timestamp must be within 30 seconds of server time.

The key is network-scoped; the signature is not. The canonical string above has no network component, so the same signed request is byte-identical on every host. What stops a testnet key from authenticating against mainnet is that the key does not exist in that host's key store — sign only for the host that minted the key, and never replay a signed payload against another network. Presented to the wrong host, a key is refused with the same opaque 401 as an unknown key and must not be retried there. See “API keys are bound to one network” in the API description.

Query parameters
market_idstring · max: 64Optional

Optional exact target for an account fee preflight. When present and currently mirrored, the response contains exactly this market in markets and uses its maker/taker pair as the headline. A well-formed target whose fee parameters are unavailable or stale returns HTTP 200 with schedule: unknown, zero headline sentinels, and no rows; it never falls back to an unrelated venue reference. A malformed value, including supplying the scalar parameter more than once, is rejected with 400 (INVALID_MARKET_ID). The raw query string is part of the HMAC canonical request and must be signed exactly as sent.

Example: BTC-USDX-PERPPattern: ^[A-Z0-9]+(-[A-Z0-9]+)*$
Responses
200

Account fee schedule. With market_id, a known target is the sole markets row and supplies the headline pair; an unavailable or stale target fails closed as unknown rather than substituting another market's rate.

application/json

The authenticated account's most recently mirrored fee schedule, mirroring Hyperliquid userFees. Reports the forward-looking schedule rate, not a realized per-fill average. There are no per-account fee tiers or discounts today, so tier is base and discounts is empty. Without a selector, markets is the per-market breakdown available from the current mirror for currently listed markets represented in the currently retained fill buffer and the top-level bps pair is only its modal summary. With market_id, markets contains only that exact target when currently listed and available, and the headline is its pair. Absence from an unfiltered markets list is not evidence that the account never traded a market; absence for a selected target means the exact target is unavailable, delisted, or the mirror is stale and the response fails closed as unknown. This response carries no source timestamp; consumers must not infer freshness from a successful read.

maker_fee_bpsintegerRequired

Headline maker fee in basis points. Negative means the maker is paid a rebate. When schedule is per_market, inspect markets for each available per-market rate; when it is unknown, zero is a sentinel rather than a known fee.

taker_fee_bpsintegerRequired

Headline taker fee in basis points. When schedule is per_market, inspect markets for each available per-market rate; when it is unknown, zero is a sentinel rather than a known fee.

tierstring · min: 1Required

Fee tier for the account. Currently always base: there are no per-account fee tiers yet (distinct from rate-limit tiers). New values may appear when the fee model lands, so treat this as an open string.

Pattern: \S
schedulestring · min: 1Required

Scope of the top-level bps pair. With market_id, per_market means the exact target is currently listed and mirrored: markets contains its sole row and the headline is that row's pair; unknown means that target is unavailable, delisted, or the mirror is stale, so zero headline values are sentinels and markets is empty. Without a selector, per_market means the currently retained account-fill buffer represents at least one currently listed market with mirrored fee parameters: markets contains those rows and the headline is their deterministic modal pair. reference is unfiltered-only: the retained buffer contains no currently listed market with a mirrored schedule, so the headline is the deterministic modal pair across all available currently listed venue markets and markets is empty; it does not prove the account never traded a market. For both unfiltered modal calculations, the pair with the highest occurrence count wins and a tie chooses the lexicographically smallest (maker_fee_bps, taker_fee_bps) pair. Unfiltered unknown means no currently listed market fee parameters are available yet. Treat this as an open string because new scopes may appear.

Pattern: \S
volume_30dstringRequired

Arbitrary-precision decimal serialized as a string (lossless). Parse with a decimal type, never a float.

volume_30d_estimatedbooleanRequired

false means volume_30d is not known to undercount. What that is worth depends on which source answered, and this field deliberately does not say which — a client needing a completeness guarantee should assume the weaker of the two readings below.

Durable projection: false is a statement about backfill coverage, not a real-time guarantee — it means the ingest has caught up to within a few minutes of now, which implies the 30-day window is covered back to its start. It does not promise the most recent few minutes are included: the ingest advances in ticks, so a false figure can still exclude fills from just before the request. A client polling for a value to change the instant a trade lands should expect a short delay on this path.

In-memory fallback: true when the source fill buffer was at capacity, so older in-window fills were evicted. false means no eviction was detected — it is not a guarantee that the full 30-day window is covered. A buffer that started empty or partial (a service instance with no history to hydrate from) undercounts too, and from the server's side that is indistinguishable from an account that simply traded little. Read the flag as a floor on the doubt, not a completeness certificate — the same semantics total_realized_pnl_30d_estimated carries on GET /account/summary.

get/account/fees
GET /v1/account/fees HTTP/1.1
Host: api.testnet.nexus.xyz
X-API-Key: YOUR_API_KEY
Accept: */*
{
  "maker_fee_bps": -2,
  "taker_fee_bps": 5,
  "tier": "base",
  "schedule": "per_market",
  "markets": [
    {
      "symbol": "BTC-USDX-PERP",
      "maker_fee_bps": -2,
      "taker_fee_bps": 5
    },
    {
      "symbol": "ETH-USDX-PERP",
      "maker_fee_bps": -2,
      "taker_fee_bps": 5
    }
  ],
  "volume_30d": "101005.00",
  "volume_30d_estimated": false,
  "discounts": []
}

Test it cannot sign this request. X-Signature is an HMAC computed per call: see Authentication, or use an SDK.


API version 0.9.131

Last updated