Polymarket Schemas - TundraSoft/tundra-connect GitHub Wiki

Polymarket Schemas

The @tundraconnect/polymarket/schemas subpath exports Guardian validators and inferred types.

import { GammaMarketSchemaObject } from '@tundraconnect/polymarket/schemas';

const [error, market] = GammaMarketSchemaObject.safeParse(rawResponse);

Gamma

Schema Endpoint Notes
GammaMarketSchemaObject /markets/*, /markets/slug/{slug} .passthrough() — unmodeled vendor fields survive on the parsed object. outcomes/outcomePrices/clobTokenIds accept either a JSON-encoded string or a native array (Gamma serializes both ways, observed in the wild) and always normalize to string[].
GammaMarketListSchemaObject /markets (legacy) A bare array of GammaMarketSchemaObject entries.
GammaMarketKeysetPageSchemaObject /markets/keyset { markets, nextCursor? } — the keyset endpoint wraps its page in an object, unlike legacy's bare array.
FeeScheduleSchemaObject (nested in GammaMarket.feeSchedule) Only present on markets with a non-default fee schedule.

GammaMarket.active/closed/archived/negRisk all default to false when the vendor omits them (matching the vendor's own documented default), rather than surfacing as undefined — the schema normalizes this upfront via Guardian.preprocess on the whole object, not per-field (a per-field Guardian.preprocess inside Guardian.object() does not correctly run before that field's own type check — verified empirically against @tundralibs/[email protected]; see the comment on normalizeGammaMarket in GammaMarket.ts for the full explanation).

CLOB

Schema Endpoint Notes
ClobVersionSchemaObject GET /version { version }.
ClobTickSizeSchemaObject GET /tick-size Normalizes the wire's minimum_tick_size to minimumTickSize; missing/zero/unparseable values default to 0.01 (matching the vendor SDK's own Number(v ?? 0.01) || 0.01 fallback).
ClobNegRiskSchemaObject GET /neg-risk Normalizes neg_risk to negRisk, coerced through JS truthiness (matches the vendor SDK).
ClobBalanceSchemaObject GET /balance-allowance The vendor sends 6-decimal fixed-point base units ('125500000'); balance is the divided whole-unit number (125.5), balanceRaw the original string.
ClobOrderBookSchemaObject GET /book snake_case → camelCase; every price/size/tick coerced to number; bids/asks keep the vendor ordering (best price last). Missing sides default to [].
ClobOpenOrderSchemaObject one row of GET /data/orders snake_case → camelCase, sizes/price/timestamps coerced to number; side must be BUY/SELL. .passthrough().
ClobOpenOrdersPageSchemaObject GET /data/orders Accepts the { data, next_cursor, count } envelope or a bare array; next_cursor of ''/'LTE=' normalizes to an absent nextCursor.
ClobTradeSchemaObject one row of GET /data/trades Same normalization; traderSide must be TAKER/MAKER; maker_orders rows are kept raw; a null transaction_hash becomes absent.
ClobTradesPageSchemaObject GET /data/trades Same envelope handling as the orders page.
ClobApiCredentialsSchemaObject POST /auth/api-key, GET /auth/derive-api-key The vendor's key field (an alternate name for apiKey) is accepted and normalized.
ClobPostOrderResponseSchemaObject POST /order, each element of POST /orders Normalizes orderID/tradeIDs/retry_after_seconds to orderId/tradeIds/retryAfterSeconds. Every field is optional — the same schema validates a fill, a graceful no-match, and a rejection body (errorMsg-only).
ClobPostOrdersResponseSchemaObject POST /orders A bare array of ClobPostOrderResponseSchemaObject entries, one per submitted order.
ClobCancelResponseSchemaObject DELETE /order, DELETE /orders, DELETE /cancel-market-orders Normalizes not_canceled to notCanceled; both default to empty when the vendor omits them.

Data API

Schema Endpoint Notes
DataPositionSchemaObject one /positions row Already camelCase and numeric on the wire — validated, not normalized. .passthrough() keeps icon, eventId, endDate, ...
DataPositionListSchemaObject GET /positions Bare array; a null body normalizes to [].
DataValueListSchemaObject GET /value [{ user, value }] — one entry per requested wallet.

Relayer

Schema Endpoint Notes
RelayPayloadSchemaObject GET /relay-payload { address, nonce } — the caller's next relay-hub nonce and the relay account that will broadcast the meta-tx.
RelayerSubmitResponseSchemaObject POST /submit Normalizes the vendor's transactionID (capital ID) to transactionId; state is optional (e.g. "STATE_NEW").

Neither Relayer schema carries the on-chain transaction hash — POST /submit only acknowledges that the relay hub accepted the meta-tx for broadcast; polling GET /transaction for confirmation is not implemented by this connect. Polymarket.split()/merge()/redeem() wrap a RelayerSubmitResponse into the same OrderResult shape used by every other trading/collateral action — see API: OrderResult.

All CLOB schemas that rename a snake_case wire field to camelCase (minimum_tick_size → minimumTickSize, neg_risk → negRisk, orderID → orderId, not_canceled → notCanceled) do so because these are small, hand-computed values this connect's own methods consume directly — unlike the Gamma schemas, which pass the vendor's own field names straight through since callers are expected to cross-reference Gamma's own API docs.


← Back to Polymarket