Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | /**
* Line Movement Detection and Analytics Types
*/
export type MovementType = 'steam' | 'reverse' | 'gradual' | 'injury' | 'normal';
export type MarketType = 'h2h' | 'spreads' | 'totals';
export interface LineMovement {
id: string;
gameId: string;
marketType: MarketType;
detectedAt: string; // ISO datetime
movementType: MovementType;
linesBefore: Record<string, any>;
linesAfter: Record<string, any>;
bookmakerCount: number;
averageMovement: number | string; // Can be string from API (Prisma Decimal)
timeToMove: number; // seconds
maxMovement?: number | string;
suspectedCause?: string | null;
game?: {
id: string;
homeTeamName: string;
awayTeamName: string;
commenceTime: string;
status: string;
sportKey?: string;
sportName?: string;
};
}
export interface MovementStats {
byType: {
steam: number;
reverse: number;
gradual: number;
injury: number;
normal: number;
};
byMarket: {
h2h: number;
spreads: number;
totals: number;
};
}
export interface MovementResponse {
status: 'success' | 'error';
data: {
movements: LineMovement[];
total: number;
hoursBack?: number;
movementType?: string;
statistics?: MovementStats;
steamMovesCount?: number;
totalMovements?: number;
period?: string;
byDate?: Record<string, LineMovement[]>;
game?: {
id: string;
matchup: string;
sport: string;
commenceTime: string;
};
impactStats?: {
totalMovements: number;
steamMoves: number;
avgMovementSize: string;
};
recentMovements?: LineMovement[];
bookmaker?: string;
} | null;
error?: string;
}
export interface MovementFilters {
movementType?: MovementType | 'all';
hoursBack?: number;
marketType?: MarketType;
limit?: number;
}
export interface SteamMoveAlert {
movement: LineMovement;
severity: 'high' | 'medium' | 'low';
icon: string;
}
|