Skip to main content
UpsideMAX is a perpetuals exchange built for programmatic trading. Instead of a traditional REST API with per-resource URLs, every write operation flows through a single POST /exchange endpoint — routed by the action.type field in the request body. Reads flow through POST /info, routed by the type field. Real-time market and account updates are delivered over WebSocket. This action-based design keeps the interface minimal and consistent across all trading operations.

API Channels

The UpsideMAX API exposes three channels:

Action-Based Routing

Unlike REST APIs that use distinct URLs per resource, UpsideMAX routes all requests by a type field in the JSON body:
  • POST /exchange — All state-changing operations (place order, cancel, register account, etc.) share this single URL. The server dispatches by action.type.
  • POST /info — All read queries share this URL. The server dispatches by the top-level type field.
This means you always POST to the same URL and change only the JSON payload to perform different operations.

Environments

Mainnet is the production environment and trades real funds; Devnet is a separate environment for integration testing. Accounts and funds are not shared between them, and each signs over its own chain ID — see Requests.
Registration requires an invitation code. registerAccount must include a valid single-use inviteCode at the top level of the request envelope (alongside action, signature, and nonce — it is not part of the signature). A missing code is rejected with inviteCode required (400); an invalid or already-used one returns INVITE_CODE_INVALID (403). Request a code from the UpsideMAX team. See registerAccount. A newly registered account has no balance: on Mainnet, deposit funds before trading; for Devnet funds, contact the UpsideMAX team.

Constraints

  • Contracts: discover them at runtime from configs. Filter to status: "Active" first — the response also returns delisted contracts, with complete parameters and no other marker — then match on name, never on contractId. The listed set is small and changes; do not build against a fixed list.
  • Coins: each contract names its own baseCoinId and quoteCoinId, resolved against the coins array in the same response. Read the quote coin per contract rather than assuming one settlement asset.
  • Prices & sizes (p, s): Raw integer strings. Scale each with that contract’s own priceScale / qtyScale from configs, and snap to its tickSize / stepSize.
Never hardcode a scale, and never reuse one contract’s scale for another. priceScale and qtyScale differ per contract and are routinely 0 — a contract with priceScale: 0 takes the display price unchanged. Applying a wrong scale silently misprices an order by a factor of ten or more. Read both values from configs for the exact contract you are trading, on every session.
Contract and coin IDs are assigned by the server — always enumerate them from the configs endpoint rather than hardcoding. configs is the authoritative source for tick sizes, scales, and leverage tiers per contract.

Explore the API

Python SDK

The fastest way in: a typed client that signs for you. pip install upside-python-sdk.

Quickstart

Register an account, place a limit order, and cancel it — all in under 50 lines of Python.

Authentication

Learn how to sign POST /exchange requests using ECDSA secp256k1.

Exchange API Overview

Explore all write actions: orders, cancels, account registration, and more.

Info API Overview

Query orders, balances, market data, and configuration via POST /info.

WebSocket Overview

Subscribe to real-time order book updates, trades, and account events.

Error Codes

Reference for HTTP-level and business-level error codes with troubleshooting tips.