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

Devnet is for testing only. Funds and accounts are not shared across environments. The Mainnet URL is not yet public — contact the UpsideMAX team to get access.
Registration on Devnet requires an alpha test invitation code. registerAccount must include a valid single-use inviteCode at the envelope top level (not part of the signature), or registration is rejected with inviteCode required. Request one from the UpsideMAX team. After a successful registration, Devnet automatically airdrops 10,000 USDC of test funds to your account within about 10 seconds — Devnet-only tokens with no real value. USDC is the only asset airdropped.

Devnet 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.
  • Quote / settlement coin: USDC
  • Base coins: BTC, ETH, SOL
  • 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

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.