List the caller's invite codes
Returns the caller’s earned invite codes with redemption status.
$1M of lifetime perps trading volume (INVITE_VOLUME_PER_CODE_QUANTUMS); codes are generated automatically and appear here as volume milestones are crossed.
Signed, unlike the other affiliate reads. An invite code is a bearer secret that grants perps trading access, and X-API-Key alone proves nothing (API keys are Ed25519 public keys, listable by anyone via GET /v1/apiKeys). The Ed25519 request signature proves possession of the private key, and the key must be registered to address. With no request body the signing message is timestamp + action (action inviteCodes — the path segment verbatim, casing included).
The response is returned with Cache-Control: no-store.Authorizations
Hex-encoded Ed25519 public key (64 chars). The public key IS the API key — register it via POST /createApiKey. Required on every authenticated request, both read-only and signed.
Unix time in nanoseconds as a decimal string (e.g. "1713825891591000000"). Millisecond or second epochs are rejected with 401 Unauthorized. Must be within ±30,000 ms (MaxTimestampDriftMs, the drift window stays configured in milliseconds) of server wall-clock, or the request is rejected with 401 Unauthorized. Required on all mutating / credential-creating endpoints. This same value must appear as the ct field in the ordersign typed canonical payload (single-order endpoints) or in each element's ct field (batch endpoints).
Lowercase hex-encoded Ed25519 signature (128 chars).
Single-order endpoints (placeOrder, cancelOrder, modifyOrder, and other non-batch mutating routes) sign over the ordersign typed canonical payload — a compact, key-sorted JSON object built from parsed request fields using engine-native integer values:
ct must equal the X-Timestamp header value. Keys in brackets are conditional (omitted when empty). op values: 1=place, 2=cancel, 3=modify. See the ordersign package for field definitions and reference signing code.
Other signed routes (e.g. createApiKey, tokens, userPreferences) still use the legacy scheme: signing_message = X-Timestamp + ACTION + canonicalJSON(body), where ACTION is the camelCase final path segment.
Batch endpoints (batchPlaceOrders, batchCancelOrders) do NOT use this header. They authenticate with per-element typed ordersign signatures embedded in the request body (see the global auth description and the per-field signature descriptions on OrderRequest / CancelOrderRequest).
Read endpoints are authenticated by ?address= (and optionally X-API-Key) only — no signature is required. The one exception is GET /v1/affiliate/inviteCodes, which returns bearer secrets and therefore requires the full header triple; with no body its signing message is X-Timestamp + ACTION. canonicalJSON(body) is the JSON body with object keys sorted lexicographically at every level and no whitespace; the server canonicalizes the received body before verifying, so only the bytes signed over must be canonical. Required on all mutating / credential-creating endpoints.
Query Parameters
Ethereum address to list invite codes for (must match signer).
Return only codes in this state. Omit for both. The counts in the response stay account-wide either way, so the two states can be paged independently without losing the totals.
available, used Page size. Values above the maximum are clamped rather than rejected.
1 <= x <= 500Number of matching codes to skip.
x >= 0Response
The caller's invite codes and earn progress.
Owner's Ethereum address.
Lifetime perps volume in quote quantums (1e9 = $1).
Total invite codes earned (one per volume milestone).
Codes that exist and are therefore redeemable. Equals inviteCodesEarned except while a large batch of newly earned codes is still being written — see materializationPending.
Materialized codes not yet redeemed. Account-wide, independent of the page or status filter.
Materialized codes already redeemed. Account-wide, independent of the page or status filter.
Additional volume (quote quantums) until the next invite code is earned.
True when earned codes remain to be written. Codes are created lazily and one request writes a bounded number of them, so a trader who earned hundreds at once should call again to see the rest.
The requested page, ordered oldest code first.
Codes matching the status filter across the whole account — the pagination denominator. Not the length of codes.
Page size actually applied, after clamping.
Offset actually applied.
True when more codes match the filter beyond this page.