What you need
- One language runtime: Node.js 18+, or Python 3.10+, or Go 1.21+. Pick the one you’re most comfortable with. Every snippet in the academy has a tab for all three.
- A terminal you’re comfortable running commands in (Terminal.app, iTerm2, GNOME Terminal, Windows Terminal, PowerShell).
- Git for cloning examples and version-controlling your bot.
- An external wallet (MetaMask, Rabby, Coinbase Wallet, or similar). Limitless authenticates individual traders with an external wallet plus HMAC-signed API key, no email-only flow. Connect it at limitless.exchange; see the full handshake in the MCP & auth docs.
- A small USDC + ETH balance on Base in that wallet. USDC funds your trades; ETH covers gas. A few dollars of each is plenty for the academy.
- A code editor, VS Code, Cursor, Neovim, JetBrains, whatever you already use.
Section 01
Install your language runtime.
Pick one language. The TypeScript tab on every code widget across this academy uses Node.js; Python uses CPython 3.10+; Go uses any supported Go 1.21+ toolchain. Install the one that matches the tab you plan to read, then verify with the version command at the bottom of each block.
# ───────────────────────────────────────────
# macOS (Homebrew)
# ───────────────────────────────────────────
brew install node
# ───────────────────────────────────────────
# Ubuntu / Debian
# ───────────────────────────────────────────
# NodeSource gives you the LTS line instead of the older distro package.
curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash -
sudo apt-get install -y nodejs
# ───────────────────────────────────────────
# Windows (winget, PowerShell or cmd)
# ───────────────────────────────────────────
winget install OpenJS.NodeJS.LTS
# ───────────────────────────────────────────
# Verify, same on every OS
# ───────────────────────────────────────────
node --version # v20.x or newer
npm --version # 10.x or newer
npx --version # 10.x or newer
# ───────────────────────────────────────────
# macOS (Homebrew)
# ───────────────────────────────────────────
brew install python@3.12
# ───────────────────────────────────────────
# Ubuntu / Debian
# ───────────────────────────────────────────
sudo apt update
sudo apt install -y python3 python3-pip python3-venv
# ───────────────────────────────────────────
# Windows (winget, PowerShell or cmd)
# ───────────────────────────────────────────
winget install Python.Python.3.12
# ───────────────────────────────────────────
# Verify, same on every OS
# ───────────────────────────────────────────
python3 --version # 3.10 or newer (macOS/Linux)
python --version # 3.10 or newer (Windows)
pip3 --version # 23.x or newer
# ───────────────────────────────────────────
# macOS (Homebrew)
# ───────────────────────────────────────────
brew install go
# ───────────────────────────────────────────
# Ubuntu / Debian
# ───────────────────────────────────────────
# The distro package is usually old. Fetch the official tarball instead.
wget https://go.dev/dl/go1.22.0.linux-amd64.tar.gz
sudo rm -rf /usr/local/go
sudo tar -C /usr/local -xzf go1.22.0.linux-amd64.tar.gz
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc
source ~/.bashrc
# ───────────────────────────────────────────
# Windows (winget, PowerShell or cmd)
# ───────────────────────────────────────────
winget install GoLang.Go
# ───────────────────────────────────────────
# Verify, same on every OS
# ───────────────────────────────────────────
go version # go1.21 or newer
Don’t install everything.
Pick one language to start. Switching tabs is cheap when you’re reading; installing three toolchains you never use is clutter you’ll have to maintain.
Windows + Python: python --version says “Python was not found”
Common on Windows even after a successful winget install Python.Python.3.12. The Microsoft Store hijacks the python alias and Windows doesn’t pick up new PATH entries until your terminal restarts. Try in this order:
- Use the launcher: py --version. The Python launcher is installed alongside Python on Windows and works even when the python alias doesn’t.
- Disable the Microsoft Store aliases: Settings → Apps → Advanced app settings → App execution aliases. Turn off the toggles for python.exe and python3.exe so they stop redirecting to the Store.
- Verify Python is on your PATH: open Environment Variables (Start menu → “Environment Variables” → Edit the system environment variables), edit your user or system Path, and confirm both of these are present, adding them if not:
C:\Users\<you>\AppData\Local\Programs\Python\Python312\ C:\Users\<you>\AppData\Local\Programs\Python\Python312\Scripts\ - Close and reopen every terminal (Command Prompt, PowerShell, Windows Terminal, your editor’s integrated terminal). PATH changes don’t apply to already-open shells, this is the fix more often than people expect.
Still stuck? Run the full path directly to confirm the install itself is fine: C:\Users\<you>\AppData\Local\Programs\Python\Python312\python.exe --version. If that works, the issue is the alias / PATH; loop back to step 2 or 3.
Section 02
Set up an external wallet.
The wallet comes before the API key, not after. Limitless authenticates individual traders with HMAC requests signed by an external wallet, so the key you mint in the next section is bound to whichever wallet you connect now. Use a dedicated burner, fund it with a few dollars of USDC for trades and a little ETH for gas, all on Base, and never commit the private key.
Pick a wallet, then burner-account
Any EVM browser wallet works. Inside it, create a fresh account just for the academy and treat it as disposable, never develop against your daily-driver wallet.
- MetaMask, Rabby, or Coinbase Wallet. Use whichever you already trust.
- In that wallet, “Create new account” (do not reuse your main one).
- Export the private key → paste into PRIVATE_KEY in your .env (Section 04).
Fund it on Base
Limitless settles on the Base network. Your burner needs two assets there:
- USDC on Base, what your trades are denominated in. A few dollars covers the academy.
- A small amount of ETH on Base, pays gas for orders and approvals. A dollar or two of ETH lasts a long time on Base.
Bridge from another chain via Base’s official bridge, or buy USDC + ETH on Base directly through your wallet’s on-ramp.
Generating a key in code (advanced)
If you’re comfortable with ethers/eth_account, you can mint a one-off key locally and write it to your .env, no browser extension required. You’ll still need to fund the resulting address on Base before HMAC requests are useful.
# Node / TypeScript
node -e "console.log(require('ethers').Wallet.createRandom().privateKey)"
# Python
python3 -c "from eth_account import Account; print(Account.create().key.hex())"
The private key unlocks everything.
Anyone with your PRIVATE_KEY can move every asset in that wallet. Keep it in .env (gitignored), a secrets manager, or a hardware wallet, never in code, never in a screenshot, never in a commit.
Section 03
Mint your HMAC API key.
Limitless authenticates individual traders with an HMAC-signed key tied to your external wallet, not a static bearer token. You mint the key once with the wallet from Section 02 connected, then every request your code makes signs a payload with that secret. The full handshake (request signing, headers, replay protection) is documented at docs.limitless.exchange/developers/authentication.
Where to create it
- Go to limitless.exchange and connect the external wallet you set up in Section 02. Wallet connect is the auth handshake; HMAC keys are scoped to that address.
- Open your profile menu → API keys.
- Click Create key, give it a name (“local-dev”, “laptop”, etc.), sign the wallet prompt, and submit.
- Copy the secret right away, it’s shown once. This is the secret half of the HMAC pair you’ll use to sign every request.
Where to store it
- A local .env file in your project folder (see Section 04).
- A shell config (~/.zshrc, ~/.bashrc, Windows user env vars).
- A secrets manager (1Password, Bitwarden, Doppler, AWS Secrets Manager).
- Never paste the secret into source code, Slack, screenshots, or public gists.
The HMAC secret is shown exactly once.
If you lose it, there’s no “view secret” button, delete that key and mint a new one. Rotate any key that ever touches a public repository or chat message. Refer to docs.limitless.exchange/developers/authentication for the canonical signing example in your language.
Section 04
The .env pattern.
Every code example in this academy reads credentials from environment variables. The simplest way to supply them locally is a .env file that sits next to your script and is git-ignored. Create it once per project.
Example .env
# Token id (apiKey), public half. Goes in the lmts-api-key header.
LIMITLESS_API_KEY=token_id_replace_me
# HMAC secret (base64), shown exactly once at token creation.
# Decode from base64, then HMAC-SHA256 the canonical request string per
# docs.limitless.exchange/developers/authentication. Treat like a password.
LIMITLESS_API_SECRET=base64_secret_replace_me
# Wallet private key, signs on-chain orders (EIP-712) from Module 03 onwards.
# Separate from the API token; both come from the same external wallet.
PRIVATE_KEY=0xabc123...
# Optional, only used in certain modules
BASE_URL=https://api.limitless.exchange
LIMITLESS_WSS_URL=wss://api.limitless.exchange
Save as plain text in your project root. No quotes around values.
.gitignore it
# In your project's .gitignore
.env
.env.local
.env.*.local
*.pem
private_key.txt
Commit a .env.example with dummy values instead so teammates know which vars to set.
New to editing text files?
You don’t need a heavy IDE to edit a .env. Right-click the file, choose “Open with”, and pick a plain-text editor: Notepad++ on Windows (free download), BBEdit or TextEdit (Format → Make Plain Text) on macOS, gedit or nano on Linux. Do not use Word or Google Docs, they insert formatting that breaks the file.
Loading the .env file at runtime
- TypeScriptUse node --env-file=.env script.ts (Node 20.6+) or npm install dotenv and import 'dotenv/config' at the top of each entry point.
- Pythonpip install python-dotenv, then from dotenv import load_dotenv; load_dotenv() before reading os.environ.
- Gogo get github.com/joho/godotenv, then _ = godotenv.Load() at the top of main().
Section 05
Editor & extensions.
Any editor works. These are the extensions we’d install first if we were starting a new machine today. If you’ve already got a setup you’re happy with, skip this section.
Four tiers below, from “I just need to paste a key” to “I live in the shell.” Pick whichever matches where you are, you can always add more later.
Plain text
For quick .env / config edits with no setup. Perfect if you’re new.
- WinNotepad++ (free)
- MacBBEdit, TextEdit (plain text mode)
- Lingedit, Kate, nano
VS Code
Free, universal, huge ecosystem. Our default for the academy.
- ESLint + Prettier
- Python + Pylance
- Go, DotENV, GitLens
Cursor
VS Code fork with an LLM chat + agent built in. Good for pair-programming.
- Inherits VS Code extensions
- Ctrl+K to edit in place
Terminal editors
If you live in the shell, Neovim + LazyVim or Helix keep you in tmux.
- LazyVim ships LSPs preconfigured
- Helix: zero-config LSP
Setup complete
You’re ready to build.
A language runtime, an external wallet funded with USDC + ETH on Base, an HMAC API key, and a .env file. That’s the entire floor, every module from here on assumes those four are in place.