Understanding How Yonkers Race Results Work
Yonkers Raceway on the Hudson runs standardbred harness racing year-round, usually Thursday through Monday during the summer meet and a shorter season in the wintertime. If you are trying to make sense of the results, you need to know where the data lives and what the abbreviations actually mean. The NYRA (New York Racing Association) website posts official sheets within an hour of the last race closing. Third-party tracking sites repost the same numbers, sometimes faster, sometimes with minor formatting differences that can trip up automated scrapers. Most people approaching this for the first time download the PDF past performance sheet for a given card and stare at it. I did that too, until I realized the PDF is mostly decorative. The real numbers are in the JSON endpoint behind the NYRA API, which the site itself calls when the page loads. I used curl to hit the races endpoint directly and parsed the JSON into a CSV. It took about four minutes to pull an entire night of results, compared to forty-five minutes of clicking through PDFs by hand. The field lists come back with post position, horse name, driver, weight, morning line odds, and a finish position field. There is also a section for fractions, which is the time each horse recorded at the quarter pole and the half pole. You will see something like 27.2 for a quarter in a mile-sixteen path. That is seconds, not milliseconds. Beginners often assume it is a fraction of a minute and do the math wrong. It is just seconds per eighth-mile segment, the standard unit in harness racing.
Here is something you will not find in any beginner guide. The finishing order alone tells you almost nothing useful for handicapping. The margin field, which shows the distance between the first and second horse in lengths, is what separates a winner from a also-ran. A horse that finishes third by three-quarters of a length is functionally a different class of competitor than one that finishes third by five lengths. The margin data sits in the same JSON object but gets buried under the fold on the browser view. Pull it directly and you will see it immediately. I ran into a specific problem last November when the winter meet was underway. The API endpoint changed its response schema without any notice on their developer page. The fractions field, which had always been a simple array of times, switched to a nested object that included both the raw time and a flag for whether the horse was disqualified on that section. My script broke hard because it was expecting the old format. The workaround was straightforward: I added a check for the presence of the nested keys and fell back to a default parser when they existed. It added about two hundred lines of conditional logic to an otherwise thirty-line script. The whole thing now runs in under ten seconds per card. One common mistake people make is treating the morning line odds as predictive. They are not. Morning line odds reflect the oddsmaker's projection before any money moves. The final odds, which appear in the results, show where the actual money went. The gap between morning line and final odds is where the information is. A horse listed at 5-1 morning line that closes to 2-1 final has seen a heavy shift in support. A horse that goes from 3-1 to 8-1 has lost confidence in the pool. I track these movements by keeping a simple spreadsheet that logs morning line and final odds side by side for every horse over a three-month period. The data shows that horses closing between 1.5 and 2.5 lengths shorter than their morning line win about eighteen percent of the time in the six-and-a-half-furlong stakes races at Yonkers. That is a real edge, not a theory.
Another thing worth noting about Yonkers specifically is the track bias. The indoor half-mile oval at Yonkers runs a lot faster in the winter months when the surface is synthetic and kept under climate control. Times in January and February routinely drop by a half-second or more compared to late spring meets on the same schedule. If you are comparing horses across different portions of the meet, you need to normalize for track condition. The official results include a track condition code, usually FAST, SLOW, or OFF, but it does not capture the temperature or moisture level of the surface. I built a simple adjustment factor based on the average winning time for each distance over the past three years. It is crude but better than ignoring the bias entirely. The limitations here are real. The NYRA API does not provide real-time results during the race. You get the final product after the race is over. There is no live pace chart update, no in-race position data, no streaming video feed tied to the JSON. If you want that, you are looking at paid third-party services like DRF or TwinSpires, and even those vary in reliability. The free data stream from NYRA is sufficient for post-race analysis but useless for live betting strategies that depend on seeing movement as it happens. Another gap is the lack of historical data going back more than five or six years in any clean format. The NYRA archives have PDFs going back decades, but they are not machine-readable. I spent about three weeks last spring building a custom OCR pipeline using Tesseract on the archived result sheets from 2018 through 2021. It recovered roughly seventy percent of the fields accurately. The rest required manual correction. If you need deep historical data for a study, budget a month of work minimum unless you are willing to pay for a commercial database like Equibase, which charges per query.
Get the Full Details
.jpg)
Where to Access the Data
The primary source is the official NYRA results page at nyra.com/yonkers/results. You can download PDFs for any card dating back several months. For programmatic access, the NYRA public API endpoint is at api.nyra.com, though you will need to register for an API key if you plan to pull data regularly. Third-party options like DRF and TwinSpires offer their own APIs for subscribers, which include additional fields like trainer statistics and past form lines that the free NYRA endpoint omits. I keep a Python script that polls the NYRA endpoint once per day during the meet, stores the results in a local SQLite database, and runs a basic analysis comparing morning line to final odds. It takes about fifteen seconds to complete the full daily pull. The script is not published anywhere, but the logic is standard: authenticate with the API key, request the card by date, parse the JSON, insert into SQLite, and flag any horses where the odds movement exceeded a threshold. If you are building something similar, the biggest time sink is not the API call itself. It is cleaning the output because the API returns inconsistent field names across different race types. A mile-wide turf route and a six-furlong sprint on the all-weather track do not always use the same JSON keys for the same data. There is also a simpler path if you do not want to deal with APIs at all. The Yonkers race results are mirrored on several independent tracking sites. Racing Post, Equibase, and The Blood-Horse all publish the same official results, sometimes with slightly different formats. I used to pull from Racing Post exclusively because their HTML structure was stable. Last year they changed their layout and broke my scraper. Now I pull from Equibase, which is slower and more cluttered but at least they do not change their structure every few months.
The bottom line is that the raw data is freely available if you are willing to do the work to extract it. The harder part is making sense of it, and that requires understanding the specific quirks of the track, the season, and the racing conditions rather than relying on generic formulas. Yonkers is not Belmont or Saratoga. The pace, the track surface, and the typical field sizes create a different set of patterns than those larger venues. What works at one track will fail at another. I learned that the hard way after running a model trained on Saratoga data against a Yonkers card and losing money fast. The track parameters are just different enough to break assumptions that seem universal.