PublicBot
The lean, anonymous, allowlisted projection of a LIVE bot — a DELAYED performance badge. This is the ENTIRE public surface of a shared bot. Unlike the frozen projections it is served from a pre-computed BotPublicSnapshot sidecar (>=15-minute compute cutoff), NEVER the live bot.
Structural safety is the whole surface:
- Money is ALWAYS relative — returnPct / winRatePct / maxDrawdownPct percentages and a unitless profitFactor. There is NO absolute balance/stake/equity/profit.
- status is COARSE (active/paused/stopped) — an unhealthy/error bot reads as "paused"; error_message is never exposed.
- openPositionsBucket is a DELAYED, BUCKETED count (0 / 1-3 / 4+) as of the compute cutoff — never a live count, never per-position detail (no pair, entry/exit, size, or unrealized PnL).
- uptimeBucket is a coarse age band — never an exact created_at/now.
- No ids, no owner PII, no config/secret, no runner/infra, no linked entities.
type PublicBot {
projectionLevel: ShareProjectionLevel!
strategyName: String!
exchangeName: String
status: String!
marketType: String
returnPct: Float
winRatePct: Float
maxDrawdownPct: Float
profitFactor: Float
closedTradeCount: Int!
uptimeBucket: String!
openPositionsBucket: String!
sparkline: [Float!]!
}
Fields
PublicBot.projectionLevel ● ShareProjectionLevel! non-null enum
The publisher's chosen projection level (card = teaser without the sparkline, full = all safe fields).
PublicBot.strategyName ● String! non-null scalar
Human display name (the publisher-authored Strategy.name).
PublicBot.exchangeName ● String scalar
Exchange vendor NAME only (e.g. 'binance') — never keys or account data.
PublicBot.status ● String! non-null scalar
Coarse bot status: active / paused / stopped. Never unhealthy/error.
PublicBot.marketType ● String scalar
Market type: SPOT / MARGIN / FUTURES.
PublicBot.returnPct ● Float scalar
Return since start as a percent (de-based, closed-trades-only, delayed). Never an absolute amount.
PublicBot.winRatePct ● Float scalar
Win rate percent over closed trades within the cutoff.
PublicBot.maxDrawdownPct ● Float scalar
Max peak-to-trough drawdown of the de-based %-return series, as a percent.
PublicBot.profitFactor ● Float scalar
Gross-profit / gross-loss ratio (unitless; never an absolute amount).
PublicBot.closedTradeCount ● Int! non-null scalar
Count of closed trades with close time at or before the compute cutoff.
PublicBot.uptimeBucket ● String! non-null scalar
Coarse age band from created_at (<1w / 1-4w / 1-3m / 3-12m / 12m+) — never an exact timestamp.
PublicBot.openPositionsBucket ● String! non-null scalar
Coarse count of positions open AS OF the compute cutoff (0 / 1-3 / 4+) — delayed + bucketed, never live, never exact.
PublicBot.sparkline ● [Float!]! non-null scalar
Cumulative %-return per day, de-based (shape only; no absolute money). Empty at the card tier.
Returned By
publicBot query