Developer API & LLM integration
Bring your own model. We bring the simulator.
WICK FUNDED exposes a documented REST API and a streaming MCP endpoint so a trader can wire their own LLM agent — Claude, ChatGPT, Gemini, a custom model, anything — to their own simulated account. We supply the tools; you supply the strategy and the brain. Same simulator, same rules, same execution engine as the web UI.
- Read your own account, positions, journal, candles
- Open / close / modify trades on your own account
- Wire Claude / ChatGPT / Gemini / your custom agent to your account
- Build your own dashboard, mobile app, notification bot, journal
- Share your API key, or trade other people's accounts with one key
- Group signal-mirroring across multiple accounts you don't own
- Pure-HFT or latency-arbitrage patterns (>50 ord/min sustained)
- Selling, renting, or syndicating access to your account
Full policy: Terms §8 — Personal Automation · /rules for breach detection details.
Quickstart
- 1. Go to Dashboard → Developer → API keys and create a token. It looks like
wk_live_…and is shown once. - 2. Pick a scope:
readfor data only,executeto place / close / modify trades. - 3. Authenticate every request with a Bearer header. That's the entire auth model.
- 4. Drop the OpenAPI URL (/api/v1/openapi) into Postman, Cursor, or Claude and you have full tool definitions for free.
curl — open a position
curl -X POST https://wickfunded.com/api/v1/trade/open \
-H "Authorization: Bearer wk_live_xxxxxxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"account_id": "your-account-uuid",
"symbol": "EURUSD",
"side": "buy",
"lot_size": 0.10,
"sl_price": 1.0820,
"tp_price": 1.0900
}'Python — full read-then-execute loop
import os, requests
WK = os.environ["WICK_API_KEY"]
BASE = "https://wickfunded.com/api/v1"
H = {"Authorization": f"Bearer {WK}"}
# 1. find the active funded account
acct = requests.get(f"{BASE}/account", headers=H).json()["accounts"][0]
# 2. pull 200 candles of EURUSD M5
candles = requests.get(
f"{BASE}/candles",
headers=H,
params={"symbol": "EURUSD", "tf": "M5", "limit": 200},
).json()
# 3. (your strategy here)
# decision = my_llm_or_strategy(candles)
# 4. execute
r = requests.post(
f"{BASE}/trade/open",
headers=H,
json={
"account_id": acct["id"],
"symbol": "EURUSD",
"side": "buy",
"lot_size": 0.10,
"sl_price": 1.0820,
"tp_price": 1.0900,
},
)
print(r.status_code, r.json())TypeScript — expose WICK as an LLM tool
Same pattern works with Anthropic tool_use, OpenAI tools, or any tool-calling model.
import OpenAI from "openai"; // or @anthropic-ai/sdk
const openai = new OpenAI();
const WK = process.env.WICK_API_KEY!;
const BASE = "https://wickfunded.com/api/v1";
// Expose WICK actions as OpenAI tools — same pattern works with Claude tool_use
const tools = [{
type: "function" as const,
function: {
name: "wick_trade_open",
description: "Open a market position on the user's WICK FUNDED simulator",
parameters: {
type: "object",
required: ["symbol", "side", "lot_size"],
properties: {
symbol: { type: "string", example: "EURUSD" },
side: { type: "string", enum: ["buy", "sell"] },
lot_size: { type: "number", minimum: 0.01, maximum: 50 },
sl_price: { type: "number" },
tp_price: { type: "number" },
},
},
},
}];
const chat = await openai.chat.completions.create({
model: "gpt-4o",
tools,
messages: [
{ role: "system", content: "You are a discretionary trader. Use the WICK simulator tool when ready." },
{ role: "user", content: "EURUSD is bouncing off the 1H demand zone — go long 0.10 lot, SL 1.0820, TP 1.0900." },
],
});
// When the model calls the tool, forward the args to WICK
for (const call of chat.choices[0].message.tool_calls ?? []) {
const args = JSON.parse(call.function.arguments);
const account_id = "your-account-uuid";
const res = await fetch(`${BASE}/trade/open`, {
method: "POST",
headers: { Authorization: `Bearer ${WK}`, "Content-Type": "application/json" },
body: JSON.stringify({ ...args, account_id }),
});
console.log(await res.json());
}MCP — one-click Claude / Cursor integration
If your client speaks the Model Context Protocol, point it at https://wickfunded.com/api/mcp and the tools auto-register. Claude Desktop / claude.ai connect with a single OAuth click — no key to paste; you log into WICK and approve. Prefer an API key (Claude Code CLI, Cursor, scripts)? Use a Bearer token instead. Both below.
# ── Option A — One click (Claude Desktop / claude.ai) ──
# Settings → Connectors → Add custom connector. Paste ONLY the URL:
#
# https://wickfunded.com/api/mcp
#
# Click "Connect" → you'll be sent to WICK, you log in, approve the scope
# (read, or read + execute), and you're done. No API key to paste, no JSON.
# Leave the OAuth Client ID / Secret fields BLANK — registration is automatic.
# ── Option B — API key (Claude Code CLI / Cursor / scripts) ──
# Create a key at Dashboard → Developer, then:
#
# claude mcp add wick --transport http https://wickfunded.com/api/mcp \
# --header "Authorization: Bearer wk_live_xxxxxxxxxxxx"
#
# or in a config file:
# { "mcpServers": { "wick": {
# "url": "https://wickfunded.com/api/mcp",
# "headers": { "Authorization": "Bearer wk_live_xxxxxxxxxxxx" } } } }
# Tools exposed automatically: wick_account, wick_positions, wick_pending,
# wick_journal, wick_consistency, wick_symbols, wick_candles, wick_trade_open,
# wick_trade_close, wick_trade_pending, wick_trade_cancel, wick_trade_modify.
#
# Same rate limits + audit log as the REST API. Say things like:
# "Check my WICK account and tell me my risk on the open EURUSD trade."
# "Close half my GBPUSD position."Endpoint reference
Live machine-readable spec: /api/v1/openapi.
| Method | Path | Scope | Description |
|---|---|---|---|
| GET | /api/v1/account | read | List your trading accounts (balance, equity, DD, phase, program) |
| GET | /api/v1/positions | read | List currently open positions |
| GET | /api/v1/pending | read | List pending limit / stop orders |
| GET | /api/v1/journal | read | Trade history with tags + AI coach annotations |
| GET | /api/v1/symbols | read | Tradable symbols, pip values, margin tiers |
| GET | /api/v1/candles | read | OHLC candles M1 → D1 |
| POST | /api/v1/trade/open | execute | Open a market position with SL / TP / trailing |
| POST | /api/v1/trade/close | execute | Close a position (full or partial) |
| POST | /api/v1/trade/pending | execute | Place a pending limit or stop order |
| POST | /api/v1/trade/cancel | execute | Cancel a pending order that has not filled yet |
| POST | /api/v1/trade/modify | execute | Modify SL / TP / trigger on an open trade or pending |
| GET | /api/v1/openapi | public | OpenAPI 3.1 spec (no auth) — drop this URL into Cursor / Claude / Postman |
Rate limits
Per API key, applied as a dual token bucket (per-second + per-hour). The same budget is shared whether you call the REST API or the MCP endpoint:
10requests / second by default100requests / hour by default- Every response carries
X-RateLimit-Limit,X-RateLimit-Remaining,X-RateLimit-Reset - Burst over the cap → HTTP
429withRetry-After - Need more? Open a key with a higher cap from Settings (we approve larger budgets manually)
Audit log
Every call carrying the execute scope is permanently logged: timestamp, IP, key ID, request body, response status, latency, and (when supplied) the User-Agent or agent provider hint. You can browse your own log in Dashboard → Developer → API keys → Audit.
We do not use these logs to second-guess your strategy — they exist for anti-abuse, KYC/AML, and to give you a forensic timeline if a trade misbehaves.