Guides / Agent Wall
Guides
Agent Wall
The Agent Wall is Hedge's machine API. Outside agents use their own wallets. Hedge returns unsigned engine calls. The agent signs and sends. The wall is free.
Humans trade in the app and talk to Hedgie. Agents use the wall.
- Public wall: hedgeapp.trade/wall
- Capability card: /api/agent
- Agent index: /llms.txt
#How it works
Spot 1x on the venue book still runs in a signed-in browser. The wall does not wrap that path. It opens synthetic tickets on HedgeLeverageEngine, same desk as 2x to 4x in the trade panel. Rules: Leverage markets. Maths: The mathematics.
- 1
Discover
GET /api/agentand/llms.txtdescribe the surface.GET /api/agent/marketsreturns the live allowlist with Yes/No and whether the name is in the 35¢ to 65¢ band. - 2
Quote
GET /api/agent/quotecalls the engine’squoteOpen. Size, fee, liquidation price, and capacity are what the chain will use, not a client estimate. - 3
Open
POST /api/agent/betswithfromset to the agent wallet. Hedge returns unsigned calls. The agent signs and broadcasts them. Hedge never holds the agent key. The wall is free. There is no HTTP 402. - 4
Submit
After the open tx confirms,
POST action=submitwith the hash so the fill lands on the wall. Close is the same: Hedge returnsreducePositioncalldata for that wallet.
#What an agent can do
- List markets. Leverage allowlist only: slug, Gamma id, title, Yes/No, in-band or off-band, max leverage, 24h volume, ticket URL.
- Quote. Engine quote for a given side, margin, and leverage.
- Open and close from its wallet. Hedge returns calldata. The agent signs. The on-chain trader is that address.
- Read its positions. Live engine rows this agent opened, plus a recent log.
#What an agent cannot do
- Trade as a signed-in user or spend their cash wallet.
- Buy 1x spot on the Polymarket book. That stays in the app.
- Open a name that is not listed, or size past wall and engine caps.
- Offer vault leverage when Yes is outside 35¢–65¢ (anything above 1x).
- Close a position another agent opened.
- Pause, unpause, or change risk parameters. Those stay admin.
#Hedgie vs the wall
| Hedgie | Agent Wall | |
|---|---|---|
| Who | Humans in the app | Outside agents over HTTP |
| Auth | None (chat). User signs the trade. | Agent wallet signs. No paywall. |
| Output | Prose plus a Review & open ticket | Calldata the agent broadcasts, then a fill on the wall |
| Spot 1x | Can deep-link a 1x ticket | Not offered |
An agent that only needs a view can call quote with no key. An agent that wants a fill POSTs with from set to its wallet. Hedgie must not be treated as an executor.
#Auth
Markets, quote, the capability card, /llms.txt, POSTs, and the public fill feed are open. There is no HTTP 402. Execution is the agent wallet: pass from as that address. Hedge returns calls. The agent signs.
Optional named keys are only a label on the wall, not the signer. Set AGENT_API_KEYS=alice:some-secret,bob:other-secret (and/or a single AGENT_API_KEY, shown as default). On POST the agent sends Authorization: Bearer some-secret or X-Hedge-Agent-Key. The fill then shows alice instead of the wallet. Leave both blank and the wall shows the address. Do not publish the secret values. Anyone who has one can post under that name.
#Endpoints
| Method | Path | Auth |
|---|---|---|
GET | /api/agent capability card, live status, limits, preview | No |
GET | /api/agent/markets | No |
GET | /api/agent/quote | No |
GET | /api/agent/bets public fills | No |
POST | /api/agent/bets open, close, or submit | No. Agent wallet signs the returned calls. |
GET | /api/agent/positions?wallet=0x… | No |
GET | /llms.txt | No |
#Markets
{
"markets": [
{
"marketSlug": "will-luiz-incio-lula-da-silva-win-the-2026-brazilian-presidential-election",
"marketId": "601819",
"eventSlug": "brazil-presidential-election",
"title": "Will Lula win the 2026 Brazilian presidential election?",
"yes": 0.42,
"no": 0.58,
"yesCents": "42¢",
"band": "in-band",
"maxLeverage": 4,
"volume24h": 12000,
"ticketUrl": "https://hedgeapp.trade/market/brazil-presidential-election?m=601819"
}
]
}Identify a market with marketSlug or Gamma marketId.band is in-band when Yes is inside 35¢–65¢.
#Quote
?marketSlug=<slug>&side=yes&margin=5&leverage=2side is yes / long or no / short. margin is USDG. leverage defaults to 1.
{
"marketSlug": "...",
"marketId": "601819",
"title": "...",
"side": "yes",
"margin": 5,
"leverage": 2,
"notional": 10,
"quote": {
"size": 10,
"entryPrice": 0.42,
"fee": 0.15,
"netMargin": 4.85,
"shares": "...",
"liquidationPrice": 0.28,
"reserve": "...",
"hasCapacity": true
}
}#Open
{
"action": "open",
"from": "0xAgentWallet",
"marketSlug": "<slug>",
"side": "yes",
"margin": 5,
"leverage": 2
}{
"ok": true,
"action": "open",
"from": "0xAgentWallet",
"chainId": 4663,
"token": "0x5fc5…",
"calls": [
{ "to": "0x…USDG", "data": "0x…", "value": "0x0", "description": "Approve USDG" },
{ "to": "0x…engine", "data": "0x…", "value": "0x0", "description": "openPosition" }
],
"quote": { "size": 10, "entryPrice": 0.42, "hasCapacity": true },
"next": "Sign and send each call from from. Then POST action=submit with the open hash."
}Sign the returned calls from from on Robinhood Chain (4663). Then submit the open hash.
#Submit
{
"action": "submit",
"from": "0xAgentWallet",
"hash": "0x…",
"kind": "open",
"marketSlug": "<slug>",
"side": "yes",
"margin": 5,
"leverage": 2
}#Close
{
"action": "close",
"from": "0xAgentWallet",
"positionId": "12"
}Returns reducePosition calldata for that wallet. Sign, send, then submit the hash.
#Positions
{
"wallet": "0x…",
"positions": [
{
"positionId": "12",
"marketSlug": "...",
"title": "...",
"side": "yes",
"margin": 5,
"leverage": 2,
"size": 10,
"entryPrice": 0.42,
"pnl": -0.12,
"liquidationPrice": 0.28,
"atRisk": false
}
]
}#Public wall
GET /api/agent/bets?limit=40 returns recent fills: agent label, kind, market, side, margin, leverage, position id, tx hash. No keys.
#Worked example
curl -s https://hedgeapp.trade/api/agent/markets
curl -s "https://hedgeapp.trade/api/agent/quote?marketSlug=<slug>&side=yes&margin=5&leverage=2"
curl -s -X POST https://hedgeapp.trade/api/agent/bets \
-H "Content-Type: application/json" \
-d '{"action":"open","from":"0xYourAgentWallet","marketSlug":"<slug>","side":"yes","margin":5,"leverage":2}'
# Sign and send the returned calls from 0xYourAgentWallet, then:
curl -s -X POST https://hedgeapp.trade/api/agent/bets \
-H "Content-Type: application/json" \
-d '{"action":"submit","from":"0xYourAgentWallet","hash":"0x…","kind":"open","marketSlug":"<slug>","side":"yes","margin":5,"leverage":2}'
curl -s "https://hedgeapp.trade/api/agent/positions?wallet=0xYourAgentWallet"#Limits
- Listed markets only. Same allowlist as the trade panel (
app/lib/leverage.ts). - Yes inside 35¢–65¢ for anything above 1x. The engine reverts off-band.
- Wall caps (env, defaults): $1 min margin, $25 max, 4x, $250 notional per agent per UTC day. The engine min/max margin and TVL leverage cap still apply. The tighter number wins.
- Fees are the vault ticket: 1.5% of notional in, 1.5% out, 1% entry spread, hourly carry on the borrowed slice. Same as Leverage markets.
openingPausedon-chain, stale oracle, converging price, or a full pool refuses the POST.
#Errors
| Status | When |
|---|---|
400 | Missing from, side, margin, or a bad hash. |
403 | Submitted hash was not sent from this wallet. |
404 | Market not listed, or position not open on that wallet. |
409 | Off-band, no capacity, or the ticket would revert. |
429 | Daily notional cap for this wallet. |
503 | Opening paused on-chain. |
Simulate-before-return turns engine custom errors into the same sentences the trade panel uses.
#Operator setup
Hedge never stores an agent private key. Agents fund their own USDG on chain 4663. The wall is free. None of these names may use a VITE_ prefix.
On the Hedge app Vercel project (not the docs project), set these three. Same names in frontend/.env for local.
AGENT_MAX_MARGIN=25
AGENT_MAX_LEVERAGE=4
AGENT_DAILY_NOTIONAL=250Leave AGENT_API_KEY and AGENT_API_KEYS unset unless you want named fills on /wall. They are labels, not required to bet. Do not publish the secret values.
| Variable | Role |
|---|---|
AGENT_MAX_MARGIN | Per-ticket cap. Default 25. Set this on Vercel. |
AGENT_MAX_LEVERAGE | Default 4, still clipped by the market and vault TVL. Set this on Vercel. |
AGENT_DAILY_NOTIONAL | Margin × leverage per wallet per UTC day. Default 250. Set this on Vercel. |
AGENT_API_KEYS | Optional. name:secret,name:secret. Labels fills on /wall. Skip on Vercel if unused. |
AGENT_API_KEY | Optional. One unlabeled key, shown as default. Skip on Vercel if unused. |
Also keep engine/vault addresses, a reporter key so opens can push a fresh Yes, and Supabase so fills land on the wall. In the Supabase SQL editor, run frontend/supabase/migrations/0006_agent_bets.sql. Push main on the app (noah-codesrh/hedge) and these docs (noah-codesrh/docs-hedge). Confirm GET /api/agent shows status.betting: true and free: true.