@polyedge/resolver
v0.1.0
Published
Turn Polymarket and Kalshi identifiers into canonical PolyEdge event, market and outcome ids. Offline, no account, no network.
Maintainers
Readme
@polyedge/resolver
Turn a Polymarket or Kalshi identifier into a canonical event, market and outcome id. Offline. No account, no network, no API key.
npm i @polyedge/resolverimport { kalshi } from '@polyedge/resolver';
kalshi.resolveKalshi({
league: 'nfl',
eventTicker: 'KXNFLGAME-26SEP21NYGLAR',
knownAbbrevs: new Set(['NYG', 'LAR', /* ... */]),
marketType: 'moneyline',
selection: 'LAR'
});
// { eventId: 'pe:evt:nfl:2026-09-21:nyg-lar',
// outcomeId: 'pe:evt:nfl:2026-09-21:nyg-lar:moneyline:full_game:lar', ... }Why this is harder than it looks
Ticker team blocks are ambiguous. NYGLAR could be NY+GLAR, NYG+LAR or
NYGL+AR. It is only resolvable against the set of abbreviations that actually
exist in that league, and when two splits are valid this returns null rather
than picking one. An unmatched market is recoverable; a market matched to the
wrong game is not.
Some tickers embed a start time. KXMLBGAME-26SEP042005TBTEX carries 2005
between the date and the teams, on leagues that play several games a day.
Treating it as part of the team block makes every MLB ticker unparseable.
A trailing G2 is a doubleheader ordinal, not a team code. Left attached,
DETCLEG2 matches no pair of abbreviations.
Sources spell teams differently. ESPN says NJ, the NHL says NJD; ESPN
says CHW, MLB says CWS. Seven divergences across 62 teams. Since team slugs
are part of the event id, an unfolded abbreviation does not produce a different
string, it produces a second canonical event for the same game, with its own
markets and its own history, and nothing throws. canonicalAbbrev() is the fold.
Never trust a date in a venue slug. Verified 2026-09-01: the Polymarket event
mlb-tb-nyy-2026-05-23 carried a start time of 2026-09-22. The slug holds the
originally scheduled date, four months stale. resolvePolymarket requires you to
pass the real local date rather than reading one out of a slug.
Id format
pe:evt:{league}:{localDate}:{away}-{home}[:g{n}]
pe:evt:...:{marketType}:{period}[:{line}][:{spreadTeam}]
pe:evt:...:{marketType}:{period}:{selection}The local date is frozen at first anchor and never moves, so a postponement changes the start time without orphaning anything that references the event.
MIT. Part of PolyEdge.
