Past Performances Exported File Format
This document specifies the PTD Comma-Delimited File Standard (revision 1.20) as of August 1, 2024. It defines five comma-delimited files that comprise a racing card at any racetrack.
Critical Programming Notes
String Field Handling
- Embedded quotation marks are converted to percent characters (%) during export
- Empty strings may be space-filled or appear as empty quotes; trim functions recommended
- Do not assume fixed-width padding for empty fields
File Processing
- No assumptions about entrant ordering (may be post position, saddle cloth, or other)
- Advance notification provided for format changes
- Do not hardcode version checking; convert to number and verify version ≥ required number
Pacelines
Do not assume that there will be only up to ten pacelines per horse. Field 7 of the ENT file indicates actual count.
Date Format Migration
| Format | Pattern | Length |
|---|---|---|
| Old | MM/DD/YY | 8 characters |
| New | MM/DD/YYYY | 10 characters |
Determine format by checking field length.
File Naming Convention
ETTTMMDD.RYY where:
| Component | Description |
|---|---|
| E | Constant prefix |
| TTT | Track code (2-3 characters; underscore used if 2 characters) |
| MM/DD | Month/day |
| YY | Two-digit year |
File extensions:
| Extension | Content |
|---|---|
| .Rxx | Races |
| .Cxx | Class |
| .Exx | Entries |
| .Wxx | Workouts |
| .Hxx | Horses/Pacelines |
FILE 1: Race Records (.Rxx)
| Field | Type | Description |
|---|---|---|
| 1 | string(4) | Schema version (currently "1.20") |
| 2 | date | Race date (MM/dd/yy) |
| 3 | string(3) | Track ID |
| 4 | number | Race number |
| 5 | string(3) | Simulcast track ID or blank |
| 6 | number | Simulcast race number or 0 |
| 7 | number | Race distance in feet |
| 8 | number | Inner track: 0=No, 1=Yes |
| 9 | number | Turf: 0=No, 1=Yes |
| 10 | number | About distance: 0=No, 1=Yes |
| 11 | number | Race class (0-5: Maiden Claiming through Handicap) |
| 12 | number | Maximum claiming price |
| 13 | number | Minimum claiming price |
| 14 | number | Purse |
| 15 | string(3) | Age restrictions |
| 16 | number | Sex (0=Male, 1=Female, 2=Mixed) |
| 17 | number | Statebred: 0=No, 1=Yes |
| 18 | number | Restricted: 0=No, 1=Yes |
| 19 | number | Graded Stakes (0=Not graded, 1-3=Grade levels) |
| 20 | string(21) | Short class description |
| 21 | string(5) | Local post time (h:mm) |
| 22 | string(1) | Time zone (E/C/M/P) |
| 23 | string(5) | UTC adjustment |
| 24 | string(25) | Track name |
| 25 | number | Track record in seconds |
| 26 | string(5) | 24-hour post time (HH:mm) |
| 27 | string | Reserved |
| 28 | number | Course type (0-97 values) |
| 29 | number | Reserved |
FILE 2: Class Strings (.Cxx)
| Field | Type | Description |
|---|---|---|
| 1 | date | Race date (MM/dd/yy) |
| 2 | string(3) | Track ID |
| 3 | number | Race number |
| 4 | string(4100) | Full race description and wagers (contains carriage return separating description from wagers) |
Unique key: Fields 1-3 (one-to-one relationship with .RAC file)
FILE 3: Entry Records (.Exx)
| Field | Type | Description |
|---|---|---|
| 1 | date | Race date (MM/dd/yy) |
| 2 | string(3) | Track ID |
| 3 | number | Race number |
| 4 | string(22) | Runner's name |
| 5 | string(4) | Saddlecloth/Program number |
| 6 | string(5) | Morning line odds |
| 7 | number | Number of pacelines |
| 8 | string(1) | Entry letter (blank if not coupled) |
| 9 | number | Scratched: 0=No, 1=Yes |
| 10 | number | Current year displayed |
| 11 | number | Starts (current year) |
| 12 | number | Wins (current year) |
| 13 | number | Places (current year) |
| 14 | number | Shows (current year) |
| 15 | number | Earnings (current year) |
| 16 | number | Previous year displayed |
| 17 | number | Starts (previous year) |
| 18 | number | Wins (previous year) |
| 19 | number | Places (previous year) |
| 20 | number | Shows (previous year) |
| 21 | number | Earnings (previous year) |
| 22 | string(40) | Owner's name |
| 23 | string(5) | Color |
| 24 | number | Year foaled |
| 25 | number | Month foaled |
| 26 | string(5) | Breeding location |
| 27 | number | Age |
| 28 | string(1) | Sex (c/h/g/r/f/m/b) |
| 29 | string(22) | Sire's name |
| 30 | string(22) | Sire's sire name |
| 31 | string(22) | Dam's name |
| 32 | string(22) | Dam's sire name |
| 33 | string(22) | Trainer's name |
| 34 | string(58) | Breeder's name |
| 35 | number | Trainer starts (current meet) |
| 36 | number | Trainer wins (current meet) |
| 37 | number | Trainer places (current meet) |
| 38 | number | Trainer shows (current meet) |
| 39 | number | Trainer win percentage |
| 40 | number | Lasix: 0=No, 1=Yes |
| 41 | number | Bute: 0=No, 1=Yes |
| 42 | number | Assigned weight |
| 43 | number | Apprentice allowance |
| 44 | string(22) | Jockey's name |
| 45 | number | Jockey starts (current meet) |
| 46 | number | Jockey wins (current meet) |
| 47 | number | Jockey places (current meet) |
| 48 | number | Jockey shows (current meet) |
| 49 | number | Jockey win percentage |
| 50 | number | Claiming price |
| 51 | number | Lifetime starts |
| 52 | number | Lifetime wins |
| 53 | number | Lifetime places |
| 54 | number | Lifetime shows |
| 55 | number | Lifetime earnings |
| 56 | number | Today's track starts |
| 57 | number | Today's track wins |
| 58 | number | Today's track places |
| 59 | number | Today's track shows |
| 60 | number | Today's track earnings |
| 61 | number | Turf starts |
| 62 | number | Turf wins |
| 63 | number | Turf places |
| 64 | number | Turf shows |
| 65 | number | Turf earnings |
| 66 | number | Wet track starts |
| 67 | number | Wet track wins |
| 68 | number | Wet track places |
| 69 | number | Wet track shows |
| 70 | number | Wet track earnings |
| 71 | number | Today's distance starts |
| 72 | number | Today's distance wins |
| 73 | number | Today's distance places |
| 74 | number | Today's distance shows |
| 75 | number | Today's distance earnings |
| 76 | number | Also-eligible: 0=No, 1=Yes |
| 77 | number | Part-of-field: 0=No, 1=Yes |
| 78 | number | Blinkers (0=No change, 1=On, 2=Off) |
| 79 | number | Bandages: 0=No, 1=Yes |
| 80 | string(40) | Jockey stats string (YTD) |
| 81 | string(40) | Trainer stats string (YTD) |
| 82 | date | Date of sex change |
| 83 | string(1) | Previous sex before change |
| 84 | number | Post position |
| 85 | number | Off-track breeding rating |
| 86 | number | Turf breeding rating |
| 87 | number | First-time Lasix: 0=No, 1=Yes |
Unique key: Fields 1-4 (one-to-many relationship with .HOR file)
Unused fields: 76, 77, 79
FILE 4: Workout Records (.Wxx)
| Field | Type | Description |
|---|---|---|
| 1 | date | Today's race date (MM/dd/yy) |
| 2 | string(3) | Today's track ID |
| 3 | number | Today's race number |
| 4 | string(22) | Runner's name |
| 5 | date | Workout date (MM/dd/yy) |
| 6 | string(3) | Workout track ID |
| 7 | number | Workout distance in feet |
| 8 | number | Inner track: 0=No, 1=Yes |
| 9 | number | Turf: 0=No, 1=Yes |
| 10 | number | Training track: 0=No, 1=Yes |
| 11 | string(3) | Track condition (e.g., "fst", "fm") |
| 12 | number | Workout time in seconds |
| 13 | number | Breezing: 0=No, 1=Yes |
| 14 | number | Handily: 0=No, 1=Yes |
| 15 | number | Bullet workout: 0=No, 1=Yes |
| 16 | number | Dogs up: 0=No, 1=Yes |
| 17 | number | Gate workout: 0=No, 1=Yes |
| 18 | number | Workout rank |
| 19 | number | Total workouts at distance/course type |
| 20 | string | Reserved |
| 21 | string | Reserved |
| 22 | number | Course type (0-97 values) |
| 23 | number | Reserved |
Unique key: Fields 1-5
Note: Currently up to 12 workouts; future increases possible.
FILE 5: Paceline Records (.Hxx)
| Field | Type | Description |
|---|---|---|
| 1 | date | Today's race date (MM/dd/yy) |
| 2 | string(3) | Today's track ID |
| 3 | number | Today's race number |
| 4 | string(22) | Runner's name |
| 5 | date | Paceline date (MM/dd/yy) |
| 6 | string(3) | Paceline track ID |
| 7 | number | Paceline race number |
| 8 | number | Distance in feet |
| 9 | number | Inner track: 0=No, 1=Yes |
| 10 | number | Turf: 0=No, 1=Yes |
| 11 | number | About distance: 0=No, 1=Yes |
| 12 | number | Off-the-turf: 0=No, 1=Yes |
| 13 | string(3) | Track condition |
| 14 | number | Three-and-up: 0=No, 1=Yes |
| 15 | number | Females-only: 0=No, 1=Yes |
| 16 | number | Statebreds-only: 0=No, 1=Yes |
| 17 | number | Restricted: 0=No, 1=Yes |
| 18 | string(3) | Age restrictions |
| 19 | number | Sex restrictions (0=Male, 1=Female, 2=Mixed) |
| 20 | string(21) | Short class description |
| 21 | string(45) | Extended class info |
| 22 | number | Purse |
| 23 | number | Claiming price (entry price) |
| 24 | number | Race class (0-5) |
| 25 | number | Graded Stakes (0=Not graded, 1-3) |
| 26 | number | Claimed: 0=No, 1=Yes |
| 27 | number | First call time (seconds) |
| 28 | number | Second call time (seconds) |
| 29 | number | Final time (seconds) |
| 30 | number | Additional fractional time (seconds) |
| 31 | number | Post position |
| 32 | number | Start call position |
| 33 | number | First call position |
| 34 | number | Second call position |
| 35 | number | Stretch call position |
| 36 | number | Finish position |
| 37 | number | First call beaten/leading lengths |
| 38 | number | Second call beaten/leading lengths |
| 39 | number | Stretch call beaten/leading lengths |
| 40 | number | Finish beaten/leading lengths |
| 41 | string(22) | Jockey's name |
| 42 | number | Lasix: 0=No, 1=Yes |
| 43 | number | Bute: 0=No, 1=Yes |
| 44 | number | Weight carried |
| 45 | number | Blinkers: 0=No, 1=Yes |
| 46 | number | Front wraps: 0=No, 1=Yes |
| 47 | number | Favorite: 0=No, 1=Yes |
| 48 | number | Tote odds |
| 49 | number | Odds ranking |
| 50 | number | Coupled: 0=No, 1=Yes |
| 51 | number | Dead heat: 0=No, 1=Yes |
| 52 | number | Disqualified: 0=No, 1=Yes |
| 53 | number | Official position |
| 54 | number | Speed rating |
| 55 | number | Track variant |
| 56 | number | Advanced Speed Figure (ASF) |
| 57 | number | PTD Early Pace Rating |
| 58 | number | PTD Late Pace Rating |
| 59 | number | PTD True Pace Rating |
| 60 | number | PTD Speed Rating |
| 61 | number | PTD Early Pace Variant (1st fraction) |
| 62 | number | PTD Early Pace Variant (2nd fraction) |
| 63 | number | PTD Final Time Variant (1st fraction) |
| 64 | number | PTD Additional Fraction Variant (1st fraction) |
| 65 | string(22) | Winning horse's name |
| 66 | number | Winning horse's weight |
| 67 | number | Winning margin over next runner (lengths) |
| 68 | string(22) | Second-place horse's name |
| 69 | number | Second-place weight |
| 70 | number | Second-place margin (lengths) |
| 71 | string(22) | Third-place horse's name |
| 72 | number | Third-place weight |
| 73 | number | Third-place margin (lengths) |
| 74 | string(22) | Trouble line details |
| 75 | number | Number of runners in race |
| 76 | string(22) | Original trainer name (if claimed) |
| 77 | string(35) | Original owner name (if claimed) |
| 78 | string(72) | Extended trouble line details |
| 79 | string(10) | Disqualification comments |
| 80 | string | Foreign track description |
| 81 | string | Foreign track direction |
| 82 | string | Trainer's name |
| 83 | string | Owner's name |
| 84 | number | Race type (0=Thoroughbred, 4=Foreign) |
| 85 | number | Apprentice allowance |
| 86 | number | Course type (0-97 values) |
| 87 | number | Reserved |
Unique key: Fields 1-5
Unused fields: 21, 60-64, 80-81
Fractional Time Specifications
Sprint Distances
Short sprints (≤4.5f):
| Field | Content |
|---|---|
| firstCallTime (field 27) | 2f time |
| secondCallTime (field 28) | 4f time |
| finalTime (field 29) | Final time |
| additionalFractionalTime (field 30) | Stretch call time |
Sprints 5.5f-6f:
- additionalFractionalTime: 5/8 time
Sprints 6.5f-7.5f:
- additionalFractionalTime: 6f time
Route Distances
All routes:
| Field | Content |
|---|---|
| firstCallTime (field 27) | 4f time |
| secondCallTime (field 28) | 6f time |
| finalTime (field 29) | Final time |
Routes 8f-8.5f:
- additionalFractionalTime: 2f time
Routes >8.5f:
- additionalFractionalTime: 8f time
Note: Zero values indicate unavailable/unrecorded times at particular distances.
Position Call and Beaten Lengths Rules
- All beaten lengths expressed in decimals (3.25 = 3-1/4, 0.15 = head, 0.20 = neck, 0.10 = nose)
- Zero in beaten lengths field: Indicates missing data; never valid for non-lead horses
- 99.75 or higher: Horse was eased (check for ≥99)
- Positive values for leading horses: Represent margin of lead at that position
- Position call of zero with beaten lengths zero: No data available (e.g., foreign horse internals)
Advanced Speed Figure (ASF) Values
| Value | Meaning |
|---|---|
| -1 | Insufficient information (foreign paceline) |
| 998 | Otherwise negative figure (displays as "-0" in PPs) |
| 999 | Incalculable figure (displays as "-" in PPs) |
Course Type Classification
| Code | Description |
|---|---|
| 0 | Dirt |
| 1 | Turf |
| 2 | Inner Dirt |
| 3 | Inner Turf |
| 5 | Outer Turf |
| 7 | Downhill Turf |
| 8 | All Weather |
| 33 | Hurdle |
| 65 | Steeplechase |
| 97 | Jumps (or, other) |
Unused/Reserved Fields
| File | Unused Fields |
|---|---|
| RAC | None |
| CLS | None |
| ENT | 76, 77, 79 |
| WOR | None (up to 12 workouts expected in future) |
| HOR | 21, 60, 61-64, 80, 81 (some hoped to return shortly) |
Important Developer Notes
- PLEASE MAKE SURE that your program can handle space filled strings and empty strings
- Do not hardcode version numbers; programmatically verify minimum required version
- Trim all string fields before checking length
- Always reference field position (e.g., field 7 of ENT) rather than assuming fixed counts
- Advance notice provided before breaking changes
Last updated: August 1, 2024
Copyright 2025 by Scratchsoft, Inc.