Skip to main content

Publish XC Results to TFRRS

Use this workflow to build JSON for a TFRRS-XC meet and upload it after scoring. You can preview the payload in the editor before posting.

DirectAthletics account setup (director sign-on, meet creation) is described on the TFRRS director info page — obtain credentials there before using RunScore.


Before you start​

  1. Open the race you are scoring (start from a TFRRS sample race or your own copy).
  2. Set the online system: Tools → Online system → TFRRS.
  3. Log in: Online → TFRRS → Login (RunScore stores the session for posting).
  4. Select the TFRRS meet: Online → TFRRS → Select meet → All meets, or Future meets to limit the list to upcoming meets plus any meet from the past seven days (sorted by date).

Online → TFRRS menu with Select meet submenu showing All meets and Future meets

After you pick a meet, RunScore confirms the selection and shows meet_id:

Meet confirmation dialog with meet name, date, and meet_id

RunScore writes the selected meet to TFRRSMeet.txt in the race folder. You do not type meet_id into the listing — RunScore adds meet_id to the JSON from that file when the listing runs.


Enter / Edit fields​

TFRRS listings expect standard collegiate fields in your database, including:

FieldRole
TFRRSIDDirectAthletics athlete ID (tfrrs_id in JSON)
first name / last nameAthlete name (rename in the listing if your database uses different field names)
schoolTeam name (team in JSON)
YearClass year (year in JSON)
sexGender (gender in JSON)
NO.Bib (bib in JSON)
flagDQ, DNF, or DNS — athletes with a flag stay at the bottom with no place or time but retain the flag text

Include flag in results output so non-finishers appear correctly on TFRRS.

Enter/Edit Names screen with Race, TFRRSID, School, and Flag fields for TFRRS scoring

Team codes (optional)​

Sample races can build a CODE field from school in entries.ini (three to five characters). If two schools could share the same code (for example "Western New Mexico" and "Western State"), score teams on school (Team Place school in the macro), not on CODE, and omit team_code from the listing unless you need it.

Event distances (splits)​

For each split event in Tools → Miscellaneous → Edit list of Events, set Distance (miles, km, or meters). RunScore sends split-point distance and metric flags from those settings when building JSON.


Listing structure​

The usual entry point is @TFRRSComplete.lst in the TFRRS sample races. It includes:

  1. TFRRSHeader.rsm — meet-level JSON (name, dates, venue, host, officials).
  2. One or more TFRRSResults.rsm lines — one JSON race object each (men's, women's, varsity, JV, etc.).

Meet header (TFRRSHeader.rsm)​

Use a Header block with name:value lines. A colon with nothing after it means the field is optional:

No Page Numbers
No Total
No Column Headers
Header
meet_name:Hamilton Invitational
start_date:2015-09-05
end_date:2015-09-05
meet_venue:Hamilton College Cross-Country Course
city:Clinton
state:NY
zip:13323
host:Hamilton College
director:John Smith
timer:Leone Timing
.End Of Header

Per-race macro (TFRRSResults.rsm)​

@TFRRSComplete.lst passes seven parameters into each TFRRSResults.rsm call:

ParameterMeaning
%1race_number — unique integer per race in the meet
%2race_name — display name (for example Hamilton Mens 6K)
%3race_gender — M or F
%4race_distance — numeric distance (for example 6000 for 6K meters, or 3.1 for miles when not metric)
%5metric — 1 if distance is metric, 0 if not
%6score_by_division — 1 to score divisions separately, 0 otherwise
%7Event list or event name — .include target (for example eventlstm, MEN, or a finish event)

Example driver listing:

TFRRSHeader.rsm
TFRRSResults.rsm 1 "Hamilton Mens 6K" M 6000 1 0 eventlstm
TFRRSResults.rsm 2 "Hamilton Womens 4K" F 4000 1 0 eventlstw

Inside TFRRSResults.rsm, a nested Header block maps %1–%6 to race_number, race_name, race_gender, race_distance, metric, and score_by_division. Optional race lines (weather, course conditions, start time) use the same name:value pattern.

Required athlete/team mapping uses Field Header names that become JSON keys — for example tfrrs_id, first_name, last_name, gender, year, team, bib, plus Dq Field flag. Team scoring uses Team Tie Breaker NCAA, Team Place school, and Team Total.

Use Header Case none so keys such as race_distance are not converted to title case.


Splits in the listing​

TFRRS expects, for each athlete, a finish time and optional splits with both lap_time and total_time per split. In the listing, alternate Event lines: even-indexed split events contribute lap time, odd-indexed ones contribute cumulative time. The first split uses the same time for lap and total.

Example pattern (from TFRRSRace women's macro):

* First lap — split and total are the same
Event WOMEN2K
Event WOMEN2K
* Second lap — subtract previous cumulative for lap time
Event WOMEN4K
Minus WOMEN2K
Event WOMEN4K
* Finish
Event %7

Name each split for TFRRS by setting the split event's display name in Edit list of Events (RunScore sends it as the split name in JSON).


Preview JSON (Editor)​

  1. Open the Listings window and select @TFRRSComplete (or your TFRRS listing).
  2. Right-click → TFRRS Results to. → Editor.

Listings window right-click menu with TFRRS Results to submenu expanded to Editor and Online

Menu label in screenshot

The screenshot shows an older submenu title (Export Results to.). Current RunScore labels this TFRRS Results to. when Tools → Online system is TFRRS.

RunScore opens a large JSON document in the text editor. Key properties:

  • Top-level meet fields from TFRRSHeader.rsm plus meet_id from the selected TFRRS meet.
  • races array — one object per TFRRSResults.rsm invocation, each with results (and split_points when splits are configured).

JSON key order in the editor may differ from the live site; that is normal.

Example result object shape:

{
"athlete_place": 1,
"athlete_score": 1,
"bib": 460,
"first_name": "John",
"gender": "M",
"last_name": "Allard",
"team": "Clark (Mass.)",
"team_place": 1,
"team_score": 18,
"tfrrs_id": "288231JOH*ALLA",
"time": "991.8",
"year": "SR"
}

If meet_id is missing, select the meet under Online → TFRRS → Select meet and run the listing again.


Upload to TFRRS (Online)​

  1. Online → TFRRS → Login if you are not already signed in.
  2. Right-click the same listing → TFRRS Results to. → Online.

RunScore POSTs to TFRRS and shows a response dialog (counts such as athletes, results, matched_athletes, and meet_hnd). RunScore also saves the raw response in tfrrs_response.txt in the race folder.

On the Test site, the response includes staging_id instead of meet_hnd:

Upload response JSON showing athletes, matched_athletes, results, and staging_id

No External Report To TFRRS listing command

The External Report To listing command supports Race Roster, RunSignUp, ChronoTrack Live, and related targets — not TFRRS. TFRRS uploads use TFRRS Results to. → Online (or preview with Editor) while Tools → Online system is set to TFRRS.


View results online​

After a successful upload, choose Online → TFRRS → View results online:

Online → TFRRS menu with View results online highlighted

Menu labels in screenshot

This screenshot shows older item names (Select event, Event details). Current builds use Select meet and Meet details.

RunScore reads meet_hnd from tfrrs_response.txt and opens the TFRRS results page in your browser. Published results look similar to this example:

TFRRS website showing team and individual cross-country results after upload

If Test site is enabled in preferences, RunScore uses the staging URL and staging_id from the response instead.


Troubleshooting​

SymptomWhat to check
"Before sending a report to the web you must first sign in"Online → TFRRS → Login
Missing meet_id in JSONOnline → TFRRS → Select meet and confirm TFRRSMeet.txt
Wrong or empty splitsEvent Distance on each split event; alternating Event/Minus pattern in the listing
Duplicate team_code on TFRRSScore on school; drop team_code from the listing
Upload succeeds but browser link failsUpload again so tfrrs_response.txt contains meet_hnd