Runner Stats

    Full individual runner profiles covering career, distance, condition, spell, weight, running style, form trends, and more.

    GET
    /v1/stats/runner/{runner_id}
    Pro

    Runner Stats Profile

    Returns a comprehensive stats profile for a runner. Use /stats/runner/search first to find the runner ID.

    Parameters

    runner_idinteger
    required
    Runner ID (path parameter). Obtain via the search endpoint.
    windowinteger
    optional
    Optional rolling window in days (14–365). When provided, a recentStats object is included with stats computed only from races within the window.

    Code Examples

    javascript
    const response = await fetch(
      'https://api.formfav.com/v1/stats/runner/4521?' +
      new URLSearchParams({ window: '90' }),
      {
        headers: { 'X-API-Key': 'your_api_key_here' }
      }
    );
    
    const data = await response.json();

    Response Fields

    runnerobject
    Runner identity
    runner.runnerIdinteger
    Runner ID
    runner.namestring
    Runner name
    runner.raceTypestring
    Race type (R, H, G)
    runner.countrystring | null
    Country code
    runner.sexstring | null
    Sex (e.g. Mare, Gelding)
    runner.sirestring | null
    Sire name
    runner.damstring | null
    Dam name
    runner.ageinteger | null
    Age in years
    runner.daysSinceLastRuninteger | null
    Days since last race
    runner.lastRaceDatestring | null
    Date of most recent race
    careerobject
    Career summary
    career.totalStartsinteger
    Total career starts
    career.winsinteger
    Total wins
    career.secondsinteger
    Total seconds
    career.thirdsinteger
    Total thirds
    career.winRatenumber
    Win rate (0-1)
    career.placeRatenumber
    Place rate (0-1)
    career.firstStartstring | null
    Date of first career start
    career.lastStartstring | null
    Date of last career start
    distanceStatsarray
    Performance by distance
    distanceStats[].distanceMetersinteger
    Distance in meters
    distanceStats[].totalStartsinteger
    Starts at this distance
    distanceStats[].winsinteger
    Wins
    distanceStats[].winRatenumber
    Win rate
    distanceStats[].placeRatenumber
    Place rate
    conditionStatsarray
    Performance by track condition
    conditionStats[].conditionstring
    Track condition (e.g. good, soft, heavy)
    conditionStats[].totalStartsinteger
    Starts in this condition
    conditionStats[].winsinteger
    Wins
    conditionStats[].winRatenumber
    Win rate
    conditionStats[].placeRatenumber
    Place rate
    trackDistanceStatsarray
    Performance by track + distance combination
    trackDistanceStats[].venuestring
    Venue name
    trackDistanceStats[].distanceMetersinteger
    Distance in meters
    trackDistanceStats[].totalStartsinteger
    Starts
    trackDistanceStats[].winsinteger
    Wins
    trackDistanceStats[].winRatenumber
    Win rate
    spellStatsarray
    Performance by runs since spell
    spellStats[].runsSinceSpellinteger
    1 = first-up, 2 = second-up, etc.
    spellStats[].totalStartsinteger
    Starts
    spellStats[].winsinteger
    Wins
    spellStats[].winRatenumber
    Win rate
    spellStats[].placeRatenumber
    Place rate
    boxStatsarray
    Performance by box/barrier (greyhounds)
    boxStats[].boxNumberinteger
    Box number
    boxStats[].totalStartsinteger
    Starts from this box
    boxStats[].winsinteger
    Wins
    boxStats[].winRatenumber
    Win rate
    jockeyStatsarray
    Performance by jockey partnership
    jockeyStats[].jockeyNamestring
    Jockey name
    jockeyStats[].totalStartsinteger
    Starts together
    jockeyStats[].winsinteger
    Wins together
    jockeyStats[].winRatenumber
    Win rate
    classProfileobject | null
    Class level analysis
    classProfile.currentRatinginteger | null
    Most recent class rating (0-100)
    classProfile.peakRatinginteger | null
    Highest class ever competed at
    classProfile.highestClassWoninteger | null
    Highest class where runner won
    classProfile.optimalRangeMininteger | null
    Lower bound of optimal class range
    classProfile.optimalRangeMaxinteger | null
    Upper bound of optimal class range
    classProfile.trendstring | null
    Class trend: rising, stable, dropping
    weightProfileobject | null
    Weight carrying analysis (thoroughbreds)
    weightProfile.avgWeightnumber | null
    Average weight carried
    weightProfile.avgWeightWhenWinningnumber | null
    Average weight when winning
    weightProfile.optimalWeightLownumber | null
    Lower bound of optimal weight range
    weightProfile.optimalWeightHighnumber | null
    Upper bound of optimal weight range
    weightProfile.recentWeightTrendstring | null
    Recent weight trend
    runningStyleobject | null
    Running style profile
    runningStyle.runningStylestring
    L=Leader, P=Presser, M=Midfield, B=Backmarker, X=Unrated. Built per race code as described in Speed Map
    runningStyle.earlySpeedIndexnumber
    Early speed, 0-10 (higher = quicker early). Draw-adjusted for harness: 5 = typical for its draws. 0 when unrated
    runningStyle.finishingStylestring | null
    How the runner finishes. Gallops only
    runningStyle.gateSpeedstring | null
    Speed out of the gates. Gallops only
    runningStyle.isVersatileboolean
    Can race different styles. Gallops only; always false for greyhounds and harness
    formTrendobject | null
    Form trend analysis
    formTrend.trendDirectionstring
    improving, declining, stable, peaking, recovering
    formTrend.trendStrengthnumber
    Strength of trend (0-1)
    formTrend.formMomentumnumber
    Weighted recent form score
    formTrend.last5WinRatenumber
    Win rate from last 5 starts
    formTrend.last10WinRatenumber
    Win rate from last 10 starts
    formTrend.currentWinStreakinteger
    Current consecutive wins
    formTrend.currentPlaceStreakinteger
    Current consecutive placings
    formTrend.currentUnplacedStreakinteger
    Current consecutive unplaced runs
    formTrend.consistencyRatingnumber
    Consistency rating (higher = more consistent)
    formTrend.avgDaysBetweenRunsnumber | null
    Average days between races
    venueStatsarray
    Performance by venue
    venueStats[].venuestring
    Venue name
    venueStats[].totalStartsinteger
    Starts at venue
    venueStats[].winsinteger
    Wins
    venueStats[].winRatenumber
    Win rate
    venueStats[].placeRatenumber
    Place rate
    venueStats[].bestFinishinteger | null
    Best finish position
    trialFormobject | null
    Trial form summary
    trialForm.totalTrialsinteger
    Total trials
    trialForm.trialWinsinteger
    Trial wins
    trialForm.trialWinRatenumber
    Trial win rate
    trialForm.lastTrialDatestring | null
    Date of last trial
    trialForm.improvingTrialFormboolean
    Whether trial form is improving
    railPreferenceobject | null
    Rail position preference
    railPreference.trueRailStartsinteger
    Starts on true rail
    railPreference.trueRailWinRatenumber
    Win rate on true rail
    railPreference.outRailStartsinteger
    Starts on out rail
    railPreference.outRailWinRatenumber
    Win rate on out rail
    railPreference.railPreferencestring
    true, out, neutral, or insufficient_data
    sireProfileobject | null
    Sire statistics
    sireProfile.sireNamestring
    Sire name
    sireProfile.totalProgenyinteger
    Total progeny count
    sireProfile.winRatenumber
    Progeny win rate
    sireProfile.bestDistanceCategorystring | null
    Best distance category
    sireProfile.debutWinRatenumber | null
    Progeny debut win rate
    seasonalStatsarray
    Performance by month
    seasonalStats[].monthinteger
    Month number (1-12)
    seasonalStats[].totalStartsinteger
    Starts in this month
    seasonalStats[].winRatenumber
    Win rate
    seasonalStats[].isPeakPeriodboolean
    Whether this is a peak performance month
    recentStatsobject | null
    Recent-window stats (only when window param provided)
    recentStats.windowDaysinteger
    Window size in days
    recentStats.totalStartsinteger
    Starts in window
    recentStats.winsinteger
    Wins in window
    recentStats.winRatenumber
    Win rate in window
    recentStats.placeRatenumber
    Place rate in window
    recentStats.trackStatsarray
    Per-track breakdown in window
    recentStats.conditionStatsarray
    Per-condition breakdown in window
    recentStats.distanceStatsarray
    Per-distance breakdown in window

    Example Response

    200
    Response
    json
    {
      "runner": {
        "runnerId": 8734,
        "name": "Via Sistina",
        "raceType": "R",
        "country": "AUS",
        "sex": "Mare",
        "sire": "Fastnet Rock",
        "dam": "Viareggio",
        "age": 5,
        "daysSinceLastRun": 14,
        "lastRaceDate": "2025-10-25"
      },
      "career": {
        "totalStarts": 16,
        "wins": 10,
        "seconds": 3,
        "thirds": 1,
        "winRate": 0.625,
        "placeRate": 0.875,
        "firstStart": "2023-08-19",
        "lastStart": "2025-10-25"
      },
      "distanceStats": [
        { "distanceMeters": 1600, "totalStarts": 8, "wins": 6, "seconds": 1, "thirds": 0, "winRate": 0.750, "placeRate": 0.875 },
        { "distanceMeters": 2000, "totalStarts": 5, "wins": 3, "seconds": 1, "thirds": 1, "winRate": 0.600, "placeRate": 1.0 }
      ],
      "conditionStats": [
        { "condition": "good", "totalStarts": 12, "wins": 8, "places": 11, "winRate": 0.667, "placeRate": 0.917 }
      ],
      "formTrend": {
        "trendDirection": "peaking",
        "trendStrength": 0.88,
        "formMomentum": 8.5,
        "last5WinRate": 0.8,
        "last10WinRate": 0.7,
        "currentWinStreak": 4,
        "currentPlaceStreak": 6,
        "currentUnplacedStreak": 0,
        "bestWinStreak": 4,
        "consistencyRating": 0.89,
        "finishStdDev": 0.41,
        "daysSincePeakForm": null,
        "avgDaysBetweenRuns": 28,
        "optimalSpellLength": 21
      },
      "venueStats": [
        { "venue": "Randwick", "totalStarts": 14, "wins": 13, "places": 14, "winRate": 0.929, "placeRate": 1.0, "bestFinish": 1, "firstStart": "2015-04-04", "lastStart": "2019-04-13" }
      ],
      "recentStats": null
    }