import {z} from 'zod' export type GetApiV1EventsArgs = {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, liquidityMin?: number | undefined, liquidityMax?: number | undefined, volumeMin?: number | undefined, volumeMax?: number | undefined, startDateMin?: string | undefined, startDateMax?: string | undefined, endDateMin?: string | undefined, endDateMax?: string | undefined, relatedTags?: boolean | undefined, tagSlug?: string | undefined, userId?: string | undefined, featured?: boolean | undefined, seriesId?: Array | undefined, eventDate?: string | undefined, startTimeMin?: string | undefined, startTimeMax?: string | undefined, excludeTagId?: Array | undefined, featuredOrder?: boolean | undefined, includeTemplate?: boolean | undefined, recurrence?: string | undefined, gameId?: number | undefined, rescheduledFromGameId?: number | undefined, period?: string | undefined, finishedTimestampMin?: string | undefined, finishedTimestampMax?: string | undefined, ended?: boolean | undefined, sportradarGameId?: string | undefined, excludeSeriesId?: Array | undefined, resolution?: boolean | undefined, categories?: Array | undefined, marketTypes?: Array | undefined, live?: boolean | undefined, excludeEventId?: Array | undefined, includeHidden?: boolean | undefined, tagIds?: Array | undefined, sportsMarketTypes?: Array | undefined}; export type GetApiV1EventsOptions = {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 gatewayMarketV1FootballState = z.object({down: z.number().int().nullable().optional(), yard: z.number().int().nullable().optional(), possessionProviderId: z.string().nullable().optional()}); export const gatewayMarketV1UFCState = z.object({weightClass: z.string().nullable().optional(), cardSegment: z.string().nullable().optional(), eventLogo: z.string().nullable().optional(), rounds: z.number().int().nullable().optional(), order: z.number().int().nullable().optional()}); export const gatewayMarketV1TennisState = z.object({tournamentName: z.string().nullable().optional(), round: z.string().nullable().optional()}); export const gatewayMarketV1BaseballState = z.object({balls: z.number().int().nullable().optional(), strikes: z.number().int().nullable().optional(), outs: z.number().int().nullable().optional(), onFirst: z.boolean().nullable().optional(), onSecond: z.boolean().nullable().optional(), onThird: z.boolean().nullable().optional(), inningHalf: z.string().nullable().optional()}); export const gatewayMarketV1CricketInnings = z.object({number: z.number().int().nullable().optional(), battingTeamId: z.string().nullable().optional(), runs: z.number().int().nullable().optional(), wickets: z.number().int().nullable().optional(), oversCompleted: z.number().int().nullable().optional(), complete: z.boolean().nullable().optional(), ballsIntoOver: z.number().int().nullable().optional()}); export const gatewayMarketV1CricketChase = z.object({target: z.number().int().nullable().optional(), runsNeeded: z.number().int().nullable().optional(), ballsRemaining: z.number().int().nullable().optional(), currentRunRate: z.number().nullable().optional(), requiredRunRate: z.number().nullable().optional()}); export const gatewayMarketV1CricketState = z.object({innings: z.array(gatewayMarketV1CricketInnings).optional(), currentInnings: z.number().int().nullable().optional(), totalOvers: z.number().int().nullable().optional(), phase: z.string().nullable().optional(), chase: gatewayMarketV1CricketChase.optional()}); export const gatewayMarketV1SoccerPenaltyShootoutAttemptStatus = z.enum(["SOCCER_PENALTY_SHOOTOUT_ATTEMPT_STATUS_NOT_TAKEN_YET", "SOCCER_PENALTY_SHOOTOUT_ATTEMPT_STATUS_SCORED", "SOCCER_PENALTY_SHOOTOUT_ATTEMPT_STATUS_MISSED"]); export const gatewayMarketV1SoccerPenaltyShootoutAttempt = z.object({competitorId: z.string().optional(), status: gatewayMarketV1SoccerPenaltyShootoutAttemptStatus.optional(), playerId: z.string().optional(), playerName: z.string().optional()}); export const gatewayMarketV1SoccerState = z.object({shootoutAttempts: z.array(gatewayMarketV1SoccerPenaltyShootoutAttempt).optional()}); export const gatewayMarketV1MarketGroupStat = z.object({marketGroupId: z.string().optional(), line: z.number().nullable().optional(), current: z.number().nullable().optional()}); export const gatewayMarketV1EventState = z.object({id: z.number().int().optional(), gameId: z.number().int().nullable().optional(), sportradarGameId: z.string().nullable().optional(), type: z.string().optional(), createdAt: z.string().nullable().optional(), updatedAt: z.string().nullable().optional(), score: z.string().nullable().optional(), elapsed: z.string().nullable().optional(), period: z.string().nullable().optional(), live: z.boolean().nullable().optional(), ended: z.boolean().nullable().optional(), finishedTimestamp: z.string().nullable().optional(), footballState: gatewayMarketV1FootballState.optional(), ufcState: gatewayMarketV1UFCState.optional(), tennisState: gatewayMarketV1TennisState.optional(), baseballState: gatewayMarketV1BaseballState.optional(), cricketState: gatewayMarketV1CricketState.optional(), soccerState: gatewayMarketV1SoccerState.optional(), mainSpreadLine: z.number().nullable().optional(), mainTotalLine: z.number().nullable().optional(), marketGroupStats: z.array(gatewayMarketV1MarketGroupStat).optional()}); export const gatewayMarketV1GameUpdate = z.object({id: z.number().int().optional(), eventId: z.number().int().optional(), sportradarGameId: z.string().optional(), type: z.string().optional(), title: z.string().optional(), subtitle: z.string().nullable().optional(), subject: z.string().nullable().optional(), team: z.string().nullable().optional(), period: z.string().nullable().optional(), clock: z.string().nullable().optional(), highlightAt: z.string().nullable().optional(), createdAt: z.string().nullable().optional()}); export const gatewayMarketV1EventMetadata = z.object({gameState: gatewayMarketV1EventState.optional(), latestGameUpdate: gatewayMarketV1GameUpdate.optional()}); export const gatewayMarketV1EventMarketGroup = z.object({id: z.string().optional(), title: z.string().optional(), subtitle: z.string().nullable().optional(), parentId: z.string().nullable().optional(), order: z.number().int().optional(), marketIds: z.array(z.string()).optional(), line: z.number().nullable().optional(), current: z.number().nullable().optional(), searchable: z.boolean().nullable().optional(), showAllThreshold: z.number().int().nullable().optional(), showMarketImages: z.boolean().nullable().optional()}); export const gatewayMarketV1EventFeatureAvailability = z.object({lineups: z.boolean().optional(), timeline: z.boolean().optional()}); export const gatewayMarketV1Event = z.object({id: z.string().optional(), ticker: z.string().nullable().optional(), slug: z.string().nullable().optional(), title: z.string().nullable().optional(), subtitle: z.string().nullable().optional(), description: z.string().nullable().optional(), resolutionSource: z.string().nullable().optional(), startDate: z.string().nullable().optional(), creationDate: z.string().nullable().optional(), endDate: z.string().nullable().optional(), image: z.string().nullable().optional(), active: z.boolean().nullable().optional(), closed: z.boolean().nullable().optional(), archived: z.boolean().nullable().optional(), liquidity: z.number().nullable().optional(), volume: z.number().nullable().optional(), openInterest: z.number().nullable().optional(), category: z.string().nullable().optional(), subcategory: z.string().nullable().optional(), createdAt: z.string().nullable().optional(), updatedAt: z.string().nullable().optional(), volume24hr: z.number().nullable().optional(), volume1wk: z.number().nullable().optional(), volume1mo: z.number().nullable().optional(), volume1yr: z.number().nullable().optional(), closedTime: z.string().nullable().optional(), eventDate: z.string().nullable().optional(), startTime: z.string().nullable().optional(), seriesSlug: z.string().nullable().optional(), score: z.string().nullable().optional(), elapsed: z.string().nullable().optional(), period: z.string().nullable().optional(), live: z.boolean().nullable().optional(), ended: z.boolean().nullable().optional(), finishedTimestamp: z.string().nullable().optional(), featuredOrder: z.number().int().nullable().optional(), markets: z.array(gatewayMarketV1Market).optional(), gameId: z.number().int().nullable().optional(), rescheduledFromGameId: z.number().int().nullable().optional(), sportradarGameId: z.string().nullable().optional(), eventState: gatewayMarketV1EventState.optional(), hidden: z.boolean().nullable().optional(), tags: z.array(gatewayTagsV1Tag).optional(), teams: z.array(gatewayMarketV1Team).optional(), metadata: gatewayMarketV1EventMetadata.optional(), sortType: z.string().nullable().optional(), marketGroups: z.array(gatewayMarketV1EventMarketGroup).optional(), primaryTag: gatewayTagsV1Tag.optional(), secondaryTag: gatewayTagsV1Tag.optional(), primaryTagSlug: z.string().nullable().optional(), secondaryTagSlug: z.string().nullable().optional(), livestreamUrl: z.string().nullable().optional(), featureAvailability: gatewayMarketV1EventFeatureAvailability.optional()}); export const gatewayEventsV1GetEventsResponse = z.object({events: z.array(gatewayMarketV1Event).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 Events * * GET /v1/events */ export const getApiV1Events = async (args: GetApiV1EventsArgs, options?: GetApiV1EventsOptions) => { 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.liquidityMin != null) query.append("liquidityMin", String(args.liquidityMin)) if (args.liquidityMax != null) query.append("liquidityMax", String(args.liquidityMax)) if (args.volumeMin != null) query.append("volumeMin", String(args.volumeMin)) if (args.volumeMax != null) query.append("volumeMax", String(args.volumeMax)) 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.tagSlug != null) query.append("tagSlug", String(args.tagSlug)) if (args.userId != null) query.append("userId", String(args.userId)) if (args.featured != null) query.append("featured", String(args.featured)) for (const item of args.seriesId ?? []) query.append("seriesId", String(item)) if (args.eventDate != null) query.append("eventDate", String(args.eventDate)) if (args.startTimeMin != null) query.append("startTimeMin", String(args.startTimeMin)) if (args.startTimeMax != null) query.append("startTimeMax", String(args.startTimeMax)) for (const item of args.excludeTagId ?? []) query.append("excludeTagId", String(item)) if (args.featuredOrder != null) query.append("featuredOrder", String(args.featuredOrder)) if (args.includeTemplate != null) query.append("includeTemplate", String(args.includeTemplate)) if (args.recurrence != null) query.append("recurrence", String(args.recurrence)) if (args.gameId != null) query.append("gameId", String(args.gameId)) if (args.rescheduledFromGameId != null) query.append("rescheduledFromGameId", String(args.rescheduledFromGameId)) if (args.period != null) query.append("period", String(args.period)) if (args.finishedTimestampMin != null) query.append("finishedTimestampMin", String(args.finishedTimestampMin)) if (args.finishedTimestampMax != null) query.append("finishedTimestampMax", String(args.finishedTimestampMax)) if (args.ended != null) query.append("ended", String(args.ended)) if (args.sportradarGameId != null) query.append("sportradarGameId", String(args.sportradarGameId)) for (const item of args.excludeSeriesId ?? []) query.append("excludeSeriesId", String(item)) if (args.resolution != null) query.append("resolution", String(args.resolution)) for (const item of args.categories ?? []) query.append("categories", String(item)) for (const item of args.marketTypes ?? []) query.append("marketTypes", String(item)) if (args.live != null) query.append("live", String(args.live)) for (const item of args.excludeEventId ?? []) query.append("excludeEventId", String(item)) if (args.includeHidden != null) query.append("includeHidden", String(args.includeHidden)) for (const item of args.tagIds ?? []) query.append("tagIds", String(item)) for (const item of args.sportsMarketTypes ?? []) query.append("sportsMarketTypes", 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/events${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(gatewayEventsV1GetEventsResponse, await res.json()) };