import {z} from 'zod' export type GetApiV1MarketsArgs = {limit?: number | undefined, offset?: number | undefined, orderBy?: Array | undefined, orderDirection?: string | undefined, id?: Array | undefined, slug?: Array | undefined, archived?: boolean | undefined, active?: boolean | undefined, closed?: boolean | undefined, volumeNumMin?: number | undefined, volumeNumMax?: number | undefined, startDateMin?: string | undefined, startDateMax?: string | undefined, endDateMin?: string | undefined, endDateMax?: string | undefined, relatedTags?: boolean | undefined, gameId?: string | undefined, sportsMarketTypes?: (Array<'SPORTS_MARKET_TYPE_MONEYLINE' | 'SPORTS_MARKET_TYPE_SPREAD' | 'SPORTS_MARKET_TYPE_TOTAL' | 'SPORTS_MARKET_TYPE_PROP' | 'SPORTS_MARKET_TYPE_FUTURE' | 'SPORTS_MARKET_TYPE_DRAWABLE_OUTCOME'>) | undefined, includeTag?: boolean | undefined, categories?: Array | undefined, marketTypes?: Array | undefined, includeHidden?: boolean | undefined, tagIds?: Array | undefined}; export type GetApiV1MarketsOptions = {baseUrl?: string | undefined, XPMAccessKey?: string | undefined, XPMTimestamp?: string | undefined, XPMSignature?: string | undefined, fetch?: typeof fetch | undefined}; export const gatewayMarketV1MarketSideType = z.enum(["MARKET_SIDE_TYPE_ERC1155", "MARKET_SIDE_TYPE_INSTRUMENT"]); export const gatewayMarketV1Provider = z.enum(["PROVIDER_SPORTSDATAIO", "PROVIDER_SPORTRADAR", "PROVIDER_OPTICODDS", "PROVIDER_PANDASCORE", "PROVIDER_INFRONT", "PROVIDER_ENETPULSE", "PROVIDER_UFC"]); export const gatewayMarketV1SportsTeamProvider = z.object({provider: gatewayMarketV1Provider.optional(), providerId: z.string().optional()}); export const gatewayMarketV1ResolvedColor = z.object({light: z.string().optional(), dark: z.string().optional()}); export const gatewayMarketV1Team = z.object({id: z.number().int().optional(), name: z.string().optional(), abbreviation: z.string().optional(), league: z.string().optional(), record: z.string().optional(), logo: z.string().optional(), alias: z.string().optional(), safeName: z.string().optional(), homeIcon: z.string().nullable().optional(), awayIcon: z.string().nullable().optional(), colorPrimary: z.string().nullable().optional(), providerId: z.number().int().nullable().optional(), ordering: z.string().nullable().optional(), longIcon: z.string().nullable().optional(), shortIcon: z.string().nullable().optional(), displayAbbreviation: z.string().nullable().optional(), ranking: z.string().nullable().optional(), conference: z.string().nullable().optional(), providerIds: z.array(gatewayMarketV1SportsTeamProvider).optional(), longIconDark: z.string().nullable().optional(), shortIconDark: z.string().nullable().optional(), color: gatewayMarketV1ResolvedColor.optional()}); export const gatewayTypesV1Amount = z.object({value: z.string(), currency: z.string()}); export const gatewayMarketV1MarketSide = z.object({id: z.string().optional(), marketSideType: gatewayMarketV1MarketSideType.optional(), identifier: z.string().nullable().optional(), createdAt: z.string().nullable().optional(), updatedAt: z.string().nullable().optional(), description: z.string().nullable().optional(), price: z.string().nullable().optional(), marketId: z.number().int().optional(), long: z.boolean().nullable().optional(), teamId: z.number().int().nullable().optional(), team: gatewayMarketV1Team.optional(), quote: gatewayTypesV1Amount.optional(), tradable: z.boolean().nullable().optional()}); export const gatewayMarketV1SportsMarketType = z.enum(["SPORTS_MARKET_TYPE_MONEYLINE", "SPORTS_MARKET_TYPE_SPREAD", "SPORTS_MARKET_TYPE_TOTAL", "SPORTS_MARKET_TYPE_PROP", "SPORTS_MARKET_TYPE_FUTURE", "SPORTS_MARKET_TYPE_DRAWABLE_OUTCOME"]); export const gatewayTagsV1TagLeague = z.object({id: z.number().int().optional(), name: z.string().optional(), sportId: z.number().int().optional(), tagId: z.number().int().nullable().optional(), image: z.string().nullable().optional(), resolution: z.string().nullable().optional(), ordering: z.string().nullable().optional(), activeSeriesId: z.number().int().nullable().optional(), isOperational: z.boolean().nullable().optional(), automaticResolution: z.boolean().nullable().optional(), createdAt: z.string().nullable().optional(), slug: z.string().optional(), abbreviation: z.string().nullable().optional()}); export const gatewayTagsV1TagSport = z.object({id: z.number().int().optional(), name: z.string().optional(), tagId: z.number().int().nullable().optional(), createdAt: z.string().nullable().optional(), slug: z.string().optional(), image: z.string().nullable().optional()}); export const gatewayTagsV1Tag = z.object({id: z.string().optional(), label: z.string().nullable().optional(), slug: z.string().nullable().optional(), createdAt: z.string().nullable().optional(), updatedAt: z.string().nullable().optional(), image: z.string().nullable().optional(), tradable: z.boolean().nullable().optional(), league: gatewayTagsV1TagLeague.optional(), sport: gatewayTagsV1TagSport.optional(), parentId: z.number().int().nullable().optional(), subtags: z.array(z.object({})).optional()}); export const gatewayMarketV1Subject = z.object({id: z.number().int().optional(), name: z.string().optional(), displayName: z.string().nullable().optional(), description: z.string().nullable().optional(), subjectType: z.string().optional(), image: z.string().nullable().optional(), color: z.string().nullable().optional(), darkColor: z.string().nullable().optional(), createdAt: z.string().nullable().optional(), updatedAt: z.string().nullable().optional(), slug: z.string().nullable().optional()}); export const gatewayMarketV1Market = z.object({id: z.string().optional(), question: z.string().nullable().optional(), slug: z.string().nullable().optional(), endDate: z.string().nullable().optional(), category: z.string().nullable().optional(), startDate: z.string().nullable().optional(), image: z.string().nullable().optional(), description: z.string().nullable().optional(), active: z.boolean().nullable().optional(), marketType: z.string().nullable().optional(), closed: z.boolean().nullable().optional(), createdAt: z.string().nullable().optional(), updatedAt: z.string().nullable().optional(), archived: z.boolean().nullable().optional(), orderPriceMinTickSize: z.number().nullable().optional(), gameStartTime: z.string().nullable().optional(), manualActivation: z.boolean().nullable().optional(), sportsMarketType: z.string().nullable().optional(), line: z.number().nullable().optional(), marketSides: z.array(gatewayMarketV1MarketSide).optional(), outcomes: z.string().nullable().optional(), outcomePrices: z.string().nullable().optional(), ep3Status: z.string().nullable().optional(), sportsMarketTypeV2: gatewayMarketV1SportsMarketType.optional(), hidden: z.boolean().nullable().optional(), tags: z.array(gatewayTagsV1Tag).optional(), title: z.string().nullable().optional(), subtitle: z.string().nullable().optional(), color: z.string().nullable().optional(), darkColor: z.string().nullable().optional(), subjectId: z.number().int().nullable().optional(), subject: gatewayMarketV1Subject.optional(), feeCoefficient: z.number().nullable().optional(), spreadTotalSuffix: z.string().nullable().optional(), sortOrder: z.number().int().nullable().optional(), bestBidQuote: gatewayTypesV1Amount.optional(), bestAskQuote: gatewayTypesV1Amount.optional(), metadata: z.object({}).nullable().optional(), titleShort: z.string().nullable().optional(), ep3SyncedAt: z.string().nullable().optional(), minimumTradeQty: z.number().nullable().optional(), volume: z.number().nullable().optional(), volume24hr: z.number().nullable().optional(), volume1wk: z.number().nullable().optional(), volume1mo: z.number().nullable().optional(), volume1yr: z.number().nullable().optional(), rulesDisclaimer: z.string().nullable().optional()}); export const gatewayMarketV1GetMarketsResponse = z.object({markets: z.array(gatewayMarketV1Market).optional()}); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * Get Markets * * GET /v1/markets */ export const getApiV1Markets = async (args: GetApiV1MarketsArgs, options?: GetApiV1MarketsOptions) => { const {baseUrl = "https://api.polymarket.us", fetch: fetchFn = fetch, XPMAccessKey, XPMTimestamp, XPMSignature} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.limit != null) query.append("limit", String(args.limit)) if (args.offset != null) query.append("offset", String(args.offset)) for (const item of args.orderBy ?? []) query.append("orderBy", String(item)) if (args.orderDirection != null) query.append("orderDirection", String(args.orderDirection)) for (const item of args.id ?? []) query.append("id", String(item)) for (const item of args.slug ?? []) query.append("slug", String(item)) if (args.archived != null) query.append("archived", String(args.archived)) if (args.active != null) query.append("active", String(args.active)) if (args.closed != null) query.append("closed", String(args.closed)) if (args.volumeNumMin != null) query.append("volumeNumMin", String(args.volumeNumMin)) if (args.volumeNumMax != null) query.append("volumeNumMax", String(args.volumeNumMax)) if (args.startDateMin != null) query.append("startDateMin", String(args.startDateMin)) if (args.startDateMax != null) query.append("startDateMax", String(args.startDateMax)) if (args.endDateMin != null) query.append("endDateMin", String(args.endDateMin)) if (args.endDateMax != null) query.append("endDateMax", String(args.endDateMax)) if (args.relatedTags != null) query.append("relatedTags", String(args.relatedTags)) if (args.gameId != null) query.append("gameId", String(args.gameId)) for (const item of args.sportsMarketTypes ?? []) query.append("sportsMarketTypes", String(item)) if (args.includeTag != null) query.append("includeTag", String(args.includeTag)) for (const item of args.categories ?? []) query.append("categories", String(item)) for (const item of args.marketTypes ?? []) query.append("marketTypes", String(item)) if (args.includeHidden != null) query.append("includeHidden", String(args.includeHidden)) for (const item of args.tagIds ?? []) query.append("tagIds", String(item)) if (XPMAccessKey !== undefined) headers.set("X-PM-Access-Key", XPMAccessKey) if (XPMTimestamp !== undefined) headers.set("X-PM-Timestamp", XPMTimestamp) if (XPMSignature !== undefined) headers.set("X-PM-Signature", XPMSignature) const url = `${baseUrl.replace(/\/+$/, '')}/v1/markets${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "GET", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(gatewayMarketV1GetMarketsResponse, await res.json()) };