General Results Upload (GRU) Format

This page documents the CTLive API support for posting race results in General Results Upload (GRU) format.

A GRU file is a delimited text file with a header row followed by one row per athlete of demographics and results. Our API supports comma-delimited text files, json files and xml files. While you could submit a "GRU" in json or xml, its more efficient to just upload a standard csv.

The Header Row

The header row is very important. It is the only metadata we have about what data each column contains. In order for us to be able to correctly process your results file, you should name your column headers with the following conventions in mind.

Some columns don't exhibit much variation. The country column is an example. Even city only allows for one common alternative (town). However some can vary quite a bit so we have written down patterns and examples in the following table to help you understand how you can name your columns.

The Name Pattern column in the table below identifies one or more tokens that can be combined to make a header name. Each token represents one or more alternative spellings, with the alternatives separated in the pattern by a pipe character. So in the table the token {chrono|ctlive|entry} can be spelled as either chrono, or ctlive, or entry. If a token is optional, it is followed by a question mark in the table. If tokens are surrounded by double braces ({{token}}) then the tokens can be combined in any order, otherwise they must be in the order specified. Tokens can be combined with a space, an underscore, or with no character at all. The case of the letters is irrelevant to our pattern matcher (CTLive = CtLiVe = CTLIvE), so we use all lowercase here.

Several of the timing and scoring column headers may specify an [interval-spec], or an interval specifier that describes which course interval the column data refers to. CTLive scores all the intervals on a race course and ranks all athletes within all their brackets on all of those intervals. To be able to capture that, we need a way to specify times, ranks and paces for arbitrary intervals. The full course interval can be represented with the token {fin|final|finish}. Other intervals should usually be specified by the distance from the start line to the end of the interval. So in a marathon where you've got multiple split points, you might represent the intervals as {5K|13K|21K|32K|fin|final|finish}, for instance. If no interval spec is provided, the full interval is assumed.

Data Column Name Pattern Example Names
Identity & Demographics
ChronoTrack ID {chrono|ctlive|entry} {id} chrono id, chrono_id, chronoid, entry id, entry_id, entryid, ctlive id, ctlive_id, ctliveid
First Name {f|first} {n|name} first, first name, first names, first_name, firstname, fname, fn
Last Name {l|last} {n|name} last, last name, last names, last_name, lastname, lname, ln
Bib Number {bib|race}? {#|no|num|number} bib, bib #, bib num, bib number, bib#, bib_num, bib_number, bibnum, bibnumber, no, no., no_, num, number, race num, race number, race_num, race_number, racenum, racenumber
Tag Number {tag|chip} {#|no|num|number|own|owner} chip num, chip number, chip own, chip owner, chip_num, chip_number, chip_own, chip_owner, chipnum, chipnumber, chipown, chipowner, tag num, tag number, tag own, tag owner, tag_num, tag_number, tag_own, tag_owner, tagnum, tagnumber, tagown, tagowner
USAT Number {usat|usatf} {#|id|no|num|number} usat, usat #, usat id, usat num, usat_id, usat_num, usatid, usatnum, usatf, usatf #, usatf id, usatf num, usatf_id, usatf_num, ustafid, usatfnum
Age {age} age
Date of Birth
{dob|birth|birthday}
{birth} {date}
{date} {of} {birth}
bdate, birth, birthdate, birthday, dob, d.o.b., date of birth, date_of_birth, dateofbirth
Gender {gender|sex} gender, sex
Division {} agdesc, age group, age_group, agegroup, class, div, div name, div_name, division, division name, division_name, divisionname, divname, bracket, primary bracket, primary_bracket, primarybracket
City {city|town} city, town
State {state|province} state, province
Country {country} country
Zip {post|postal|zip} {code}? postal code, postal_code, postalcode, post code, post_code, postcode, zip, zip code, zip_code, zipcode
Timing & Scoring
Chip Time {{chip|tag|net}} {{time}}? {{[interval-spec]}}? chip, chip final, chip time, chip_final, chip_time, chipfinal, chiptime, finish net, finish time net, finish_net, finish_time_net, finishnet, net, net time, net_time, nettime, time net, time_net, timenet, t_time, tag, tag final, tag time, tag_final, tag_time, tagfinal, tag_5K, 5k_tag_time
Chip Pace {{chip|tag|net}} {{pace}} {{[interval-spec]}}? chip_pace, tag_pace_5k, 15K_pace_net
Clock Time {{clock|gun}} {{time}} {{[interval-spec]}}? clock_time, gun_time, gun_time_15k, clock time 5k, 5k gun time
Clock Pace {{clock|gun}} {{pace}}? {{[interval-spec]}}? gun_pace, clock_pace_5k, 15K_pace_clock
Overall Place {o|o all|over all}}? {{pl|plc|rnk|pos|rank|place|position}} {{[interval-spec]}}? o all place, o_all_place, oallplace, oplace, overall place, place_overall, overallrank, place, position, opl_5k
Gender Place {{g|s|gender|sex}} {{pl|plc|rnk|pos|rank|place|position}} {{[interval-spec]}}? sex_place, splace, splc, gender rank, sex position, sex_rnk, gender_plc_5k
Division Place {{div|class|division|bracket}} {{pl|plc|rnk|pos|rank|place|position}} {{[interval-spec]}}? divpl, div_place, classplace, division_plc, bracket rank, class position, div_plc_5k, 15k_place_div

Custom HTTP Headers

The GRU file header does not contain enough metadata to properly display results for an event in CTLive. Some additional information is helpful, like the race type, start time of the race, end time of the race, the pace units for a given interval, the distance from the start of a given interval's end timing point. If you need to provide this data you can do so by using the following custom HTTP headers that you can include with your API request.

HTTP HeaderMeaning
X-Race-Type Type of race ('running','biking','swimming','multisport','other')
X-Race-Start-Time Start time of the race in format M/D/YYYY h:mm:ss.hs am/pm (eg. 3/7/2014 7:32:34.54 am)
X-Race-End-Time End time of the race in format M/D/YYYY h:mm:ss.hs am/pm (eg. 3/7/2014 5:00:00 pm)
X-Pace-Unit-[interval-spec] Pace unit that should be used for interval [interval-spec] (eg. X-Race-Pace-Unit-10k: min/mi). Admissable pace units include:
none
No pace unit
m/s
Meters per second
ft/s
Feet per second
yd/s
Yards per second
mi/hr
Miles per hour
km/hr
Kilometers per hour
min/mi
Minutes per mile
min/km
Minutes per kilometer
min/100yd
Minutes per 100 yards
min/100m
Minutes per 100 meters
X-Interval-Distance-[interval-spec] Distance for interval [interval-spec] (eg. X-Interval-Distance-10k: 10km). Values can be expressed in any of the following units:
  • m, meter, meters
  • k, km, kilometer, kilometers
  • f, ft, feet
  • y, yd, yards
  • mi, mile, miles