API

The engine serves a JSON API on port 3732 (locally http://localhost:3732). Read endpoints are public and need no key. Response types live in packages/shared/src/api.ts and packages/shared/src/types.ts (@quaestor/shared), so other modules can import the exact shapes.

All amounts are USDC. All times are Unix milliseconds. Fractions are decimals (0.25 = 25%).

Read

Method and path Returns
GET /v1/health Engine status, formula version, chain, registry address, attester address
GET /v1/formula Formula version, weights and anti-cheat thresholds
GET /v1/chain Active chain config, deployment addresses, whether the engine can write
GET /v1/agents Every agent with its current score and account count (AgentListResponse)
GET /v1/agents/:id Agent, accounts, score, equity curve, deposit-adjusted growth curve, snapshot, mandate, breaches, latest proof (AgentDetailResponse)
GET /v1/agents/:id/score The full Score: value, raw, components, metrics, flags, fills root
GET /v1/agents/:id/fills?limit=&offset=&coin= Fills, newest first, up to 500 per page (FillsResponse)
GET /v1/agents/:id/fills/all?from=&to= Every fill in a window, oldest first: enough to rebuild a proof's Merkle root
GET /v1/agents/:id/fills/:tid/proof Merkle path for one fill in the latest proof (FillProofResponse)
GET /v1/agents/:id/ledger Latest 500 deposits, withdrawals, transfers and 500 funding payments
GET /v1/agents/:id/proof Latest signed ScoreProof with its digest
GET /v1/agents/:id/breaches Mandate and breaches
GET /v1/agents/:id/registration.json ERC-8004 registration file
`GET /v1/leaderboard?kind=linked example`
GET /v1/breaches The 100 most recent breaches across all agents
GET /v1/check/:q Compact trust check by slug, Hyperliquid address or registry id (CheckResponse)
GET /v1/proofs/:digest A proof by its EIP-712 digest

The check call

GET /v1/check/:q is what an app or agent calls before trusting an agent with money:

{
  "found": true,
  "agent": { "id": "...", "name": "...", "kind": "linked", "master": "0x...", "onchainId": "1", "status": "active" },
  "score": 0,
  "formulaVersion": "q-score/1.0.0",
  "flags": [{ "code": "fresh-account", "severity": "warn", "title": "New account" }],
  "breaches": 0,
  "daysActive": 0,
  "maxDrawdown": 0,
  "twr": 0,
  "proof": { "digest": "0x...", "posted": true, "txHash": "0x..." },
  "verdict": "caution"
}

verdict is ok (no warning or severe flags, no breaches), caution (warnings or breaches), avoid (a severe flag) or unknown (not indexed).

Write

Method and path Body Notes
POST /v1/link/challenge { master, name } Returns { nonce, message, expiresAt }. Valid 10 minutes
POST /v1/link { master, name, strategy, declaredLimits, nonce, signature } signature is personal_sign(message) by the master account. Links every sub-account and API wallet
POST /v1/verify { proof } or { digest } Signature, attester, on-chain record and recomputed fills root
POST /v1/webhooks { agentId, url } Returns { id, secret }. See Mandates
DELETE /v1/webhooks/:id header x-webhook-secret

Writes are rate limited per IP. Errors return { "error": "..." } with a 4xx status.

Signals, market, x402, copy and seasons

Those routes are documented in API: signals, market, copy. The engine serves them from the same port.

For other modules

Modules built on top of Quaestor (signals, seasons, copy rails) read scores and fills through these endpoints or import @quaestor/shared for the types. The most useful calls are /v1/agents/:id/score, /v1/agents/:id/fills, /v1/agents/:id/fills/all and /v1/check/:q.