> For the complete documentation index, see [llms.txt](https://movemint.gitbook.io/movemint-developer-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://movemint.gitbook.io/movemint-developer-docs/open-api-specification/core-resources/results/race-result-mappings.md).

# Race Result Mappings

Configure result tables sourced from a connected Race Result timing event. Discover the available contests, lists, and columns, then create, edit, and delete the mappings that turn a contest + list into an event result with divisions and synced finishers. Requires the event to have a Race Result event connected in the admin UI first.

## List Race Result contests

> Returns the contests on the event's connected Race Result timing event.\
> Use a \`contest\_id\` when creating a mapping. Requires a connected Race\
> Result event (otherwise returns a \`race\_result\_not\_connected\` 422).<br>

````json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"tags":[{"name":"Race Result Mappings","description":"Configure result tables sourced from a connected Race Result timing\nevent. Discover the available contests, lists, and columns, then create,\nedit, and delete the mappings that turn a contest + list into an event\nresult with divisions and synced finishers. Requires the event to have a\nRace Result event connected in the admin UI first.\n"}],"servers":[{"url":"https://www.movemint.cc","description":"Production"}],"security":[{"bearerAuth":[]},{"oauth2":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Pass the access token in the `Authorization` header:\n```\nAuthorization: Bearer YOUR_ACCESS_TOKEN\n```\n"},"oauth2":{"type":"oauth2","description":"OAuth 2.0 authentication using the Authorization Code or Client\nCredentials grant flow.\n","flows":{"authorizationCode":{"authorizationUrl":"https://www.movemint.cc/oauth/authorize","tokenUrl":"https://www.movemint.cc/oauth/token","refreshUrl":"https://www.movemint.cc/oauth/token","scopes":{}},"clientCredentials":{"tokenUrl":"https://www.movemint.cc/oauth/token","scopes":{}}}}},"parameters":{"EventHandle":{"name":"handle","in":"path","required":true,"description":"The unique handle (slug) of the event","schema":{"type":"string"}}},"schemas":{"RaceResultContest":{"type":"object","description":"A contest on the connected Race Result timing event.","required":["contest_id","contest_name"],"properties":{"contest_id":{"type":"integer","description":"Race Result contest id."},"contest_name":{"type":"string"}}},"OAuthError":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Machine-readable error code"},"error_description":{"type":"string","description":"Human-readable description of the error"}}},"Error":{"type":"object","description":"A generic error response","required":["error"],"properties":{"error":{"type":"string","description":"Human-readable error message"}}}},"responses":{"Unauthorized":{"description":"Unauthorized - invalid or missing token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthError"}}}},"Forbidden":{"description":"Forbidden - user is not an admin of this event","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"EventNotFound":{"description":"Event not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"RaceResultNotConnected":{"description":"The event has no connected Race Result timing event. Connect one in the\nadmin Results page before configuring mappings.\n","content":{"application/json":{"schema":{"type":"object","required":["error","message","connect_path"],"properties":{"error":{"type":"string"},"message":{"type":"string"},"connect_path":{"type":"string","description":"Admin path where the organizer can connect a Race Result event."}}}}}}}},"paths":{"/api/v1/events/{handle}/race_result/contests":{"get":{"tags":["Race Result Mappings"],"summary":"List Race Result contests","description":"Returns the contests on the event's connected Race Result timing event.\nUse a `contest_id` when creating a mapping. Requires a connected Race\nResult event (otherwise returns a `race_result_not_connected` 422).\n","operationId":"listRaceResultContests","parameters":[{"$ref":"#/components/parameters/EventHandle"}],"responses":{"200":{"description":"List of Race Result contests","content":{"application/json":{"schema":{"type":"object","required":["contests"],"properties":{"contests":{"type":"array","items":{"$ref":"#/components/schemas/RaceResultContest"}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/EventNotFound"},"422":{"$ref":"#/components/responses/RaceResultNotConnected"}}}}}}
````

## List Race Result result-lists

> Returns the available Race Result result-lists for the connected event.\
> A list name backs a mapping's divisions and place/split columns.<br>

````json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"tags":[{"name":"Race Result Mappings","description":"Configure result tables sourced from a connected Race Result timing\nevent. Discover the available contests, lists, and columns, then create,\nedit, and delete the mappings that turn a contest + list into an event\nresult with divisions and synced finishers. Requires the event to have a\nRace Result event connected in the admin UI first.\n"}],"servers":[{"url":"https://www.movemint.cc","description":"Production"}],"security":[{"bearerAuth":[]},{"oauth2":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Pass the access token in the `Authorization` header:\n```\nAuthorization: Bearer YOUR_ACCESS_TOKEN\n```\n"},"oauth2":{"type":"oauth2","description":"OAuth 2.0 authentication using the Authorization Code or Client\nCredentials grant flow.\n","flows":{"authorizationCode":{"authorizationUrl":"https://www.movemint.cc/oauth/authorize","tokenUrl":"https://www.movemint.cc/oauth/token","refreshUrl":"https://www.movemint.cc/oauth/token","scopes":{}},"clientCredentials":{"tokenUrl":"https://www.movemint.cc/oauth/token","scopes":{}}}}},"parameters":{"EventHandle":{"name":"handle","in":"path","required":true,"description":"The unique handle (slug) of the event","schema":{"type":"string"}}},"schemas":{"RaceResultList":{"type":"object","description":"A Race Result result-list.","required":["name"],"properties":{"name":{"type":"string"}}},"OAuthError":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Machine-readable error code"},"error_description":{"type":"string","description":"Human-readable description of the error"}}},"Error":{"type":"object","description":"A generic error response","required":["error"],"properties":{"error":{"type":"string","description":"Human-readable error message"}}}},"responses":{"Unauthorized":{"description":"Unauthorized - invalid or missing token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthError"}}}},"Forbidden":{"description":"Forbidden - user is not an admin of this event","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"EventNotFound":{"description":"Event not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"RaceResultNotConnected":{"description":"The event has no connected Race Result timing event. Connect one in the\nadmin Results page before configuring mappings.\n","content":{"application/json":{"schema":{"type":"object","required":["error","message","connect_path"],"properties":{"error":{"type":"string"},"message":{"type":"string"},"connect_path":{"type":"string","description":"Admin path where the organizer can connect a Race Result event."}}}}}}}},"paths":{"/api/v1/events/{handle}/race_result/lists":{"get":{"tags":["Race Result Mappings"],"summary":"List Race Result result-lists","description":"Returns the available Race Result result-lists for the connected event.\nA list name backs a mapping's divisions and place/split columns.\n","operationId":"listRaceResultLists","parameters":[{"$ref":"#/components/parameters/EventHandle"}],"responses":{"200":{"description":"List of Race Result lists","content":{"application/json":{"schema":{"type":"object","required":["lists"],"properties":{"lists":{"type":"array","items":{"$ref":"#/components/schemas/RaceResultList"}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/EventNotFound"},"422":{"$ref":"#/components/responses/RaceResultNotConnected"}}}}}}
````

## List columns on a Race Result list

> Returns every column on a Race Result list (\`columns\`) — the options for\
> the place column and split time columns. Reads only the list definition,\
> so it is fast and reliable. To find columns that produce divisions, use\
> the division\_options endpoint instead.<br>

````json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"tags":[{"name":"Race Result Mappings","description":"Configure result tables sourced from a connected Race Result timing\nevent. Discover the available contests, lists, and columns, then create,\nedit, and delete the mappings that turn a contest + list into an event\nresult with divisions and synced finishers. Requires the event to have a\nRace Result event connected in the admin UI first.\n"}],"servers":[{"url":"https://www.movemint.cc","description":"Production"}],"security":[{"bearerAuth":[]},{"oauth2":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Pass the access token in the `Authorization` header:\n```\nAuthorization: Bearer YOUR_ACCESS_TOKEN\n```\n"},"oauth2":{"type":"oauth2","description":"OAuth 2.0 authentication using the Authorization Code or Client\nCredentials grant flow.\n","flows":{"authorizationCode":{"authorizationUrl":"https://www.movemint.cc/oauth/authorize","tokenUrl":"https://www.movemint.cc/oauth/token","refreshUrl":"https://www.movemint.cc/oauth/token","scopes":{}},"clientCredentials":{"tokenUrl":"https://www.movemint.cc/oauth/token","scopes":{}}}}},"parameters":{"EventHandle":{"name":"handle","in":"path","required":true,"description":"The unique handle (slug) of the event","schema":{"type":"string"}}},"schemas":{"RaceResultColumns":{"type":"object","required":["columns"],"properties":{"columns":{"type":"array","description":"Every column on the list (options for place + split time columns).","items":{"$ref":"#/components/schemas/RaceResultColumn"}}}},"RaceResultColumn":{"type":"object","description":"A column on a Race Result list.","required":["heading","expression"],"properties":{"heading":{"type":"string","description":"Display heading of the column."},"expression":{"type":"string","description":"Race Result expression used to read the value at sync time."}}},"OAuthError":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Machine-readable error code"},"error_description":{"type":"string","description":"Human-readable description of the error"}}},"Error":{"type":"object","description":"A generic error response","required":["error"],"properties":{"error":{"type":"string","description":"Human-readable error message"}}},"ValidationError":{"type":"object","description":"A validation error response with a list of error messages","required":["errors"],"properties":{"errors":{"type":"array","items":{"type":"string"},"description":"List of validation error messages"}}}},"responses":{"Unauthorized":{"description":"Unauthorized - invalid or missing token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthError"}}}},"Forbidden":{"description":"Forbidden - user is not an admin of this event","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"EventNotFound":{"description":"Event not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"paths":{"/api/v1/events/{handle}/race_result/columns":{"get":{"tags":["Race Result Mappings"],"summary":"List columns on a Race Result list","description":"Returns every column on a Race Result list (`columns`) — the options for\nthe place column and split time columns. Reads only the list definition,\nso it is fast and reliable. To find columns that produce divisions, use\nthe division_options endpoint instead.\n","operationId":"listRaceResultColumns","parameters":[{"$ref":"#/components/parameters/EventHandle"},{"name":"list","in":"query","required":true,"description":"The Race Result list name (the `name` from the lists endpoint).","schema":{"type":"string"}}],"responses":{"200":{"description":"Columns for the list","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RaceResultColumns"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/EventNotFound"},"422":{"description":"The list parameter is missing, or no Race Result event is connected.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}}}}}}}
````

## List division-column options for a Race Result list

> Probes the list data for columns that would produce divisions\
> (\`division\_column\_candidates\`, with distinct-value counts). This live\
> probe is slower than the columns endpoint and can fail on a bad Race\
> Result column expression — in which case it returns an empty list plus\
> \`division\_column\_candidates\_error\` rather than erroring, so the caller\
> can fall back to Movemint default divisions. Call it only when the\
> organizer wants to divide results by a specific column.<br>

````json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"tags":[{"name":"Race Result Mappings","description":"Configure result tables sourced from a connected Race Result timing\nevent. Discover the available contests, lists, and columns, then create,\nedit, and delete the mappings that turn a contest + list into an event\nresult with divisions and synced finishers. Requires the event to have a\nRace Result event connected in the admin UI first.\n"}],"servers":[{"url":"https://www.movemint.cc","description":"Production"}],"security":[{"bearerAuth":[]},{"oauth2":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Pass the access token in the `Authorization` header:\n```\nAuthorization: Bearer YOUR_ACCESS_TOKEN\n```\n"},"oauth2":{"type":"oauth2","description":"OAuth 2.0 authentication using the Authorization Code or Client\nCredentials grant flow.\n","flows":{"authorizationCode":{"authorizationUrl":"https://www.movemint.cc/oauth/authorize","tokenUrl":"https://www.movemint.cc/oauth/token","refreshUrl":"https://www.movemint.cc/oauth/token","scopes":{}},"clientCredentials":{"tokenUrl":"https://www.movemint.cc/oauth/token","scopes":{}}}}},"parameters":{"EventHandle":{"name":"handle","in":"path","required":true,"description":"The unique handle (slug) of the event","schema":{"type":"string"}}},"schemas":{"RaceResultDivisionOptions":{"type":"object","required":["division_column_candidates"],"properties":{"division_column_candidates":{"type":"array","description":"Columns that would produce divisions, best candidates first. Empty\nwhen the probe could not be evaluated (see\ndivision_column_candidates_error).\n","items":{"$ref":"#/components/schemas/RaceResultDivisionColumnCandidate"}},"division_column_candidates_error":{"type":"string","description":"Present only when the division candidate probe failed or timed out.\nCreate the mapping without a division_column to use Movemint's\ndefault divisions.\n"}}},"RaceResultDivisionColumnCandidate":{"type":"object","description":"A column that can produce divisions, with a distinct-value probe.","required":["expression","label","distinct_values","sample"],"properties":{"expression":{"type":"string"},"label":{"type":"string"},"distinct_values":{"type":"integer","description":"Number of distinct non-empty values found in the list data."},"sample":{"type":"array","items":{"type":"string"}}}},"OAuthError":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Machine-readable error code"},"error_description":{"type":"string","description":"Human-readable description of the error"}}},"Error":{"type":"object","description":"A generic error response","required":["error"],"properties":{"error":{"type":"string","description":"Human-readable error message"}}},"ValidationError":{"type":"object","description":"A validation error response with a list of error messages","required":["errors"],"properties":{"errors":{"type":"array","items":{"type":"string"},"description":"List of validation error messages"}}}},"responses":{"Unauthorized":{"description":"Unauthorized - invalid or missing token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthError"}}}},"Forbidden":{"description":"Forbidden - user is not an admin of this event","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"EventNotFound":{"description":"Event not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"paths":{"/api/v1/events/{handle}/race_result/division_options":{"get":{"tags":["Race Result Mappings"],"summary":"List division-column options for a Race Result list","description":"Probes the list data for columns that would produce divisions\n(`division_column_candidates`, with distinct-value counts). This live\nprobe is slower than the columns endpoint and can fail on a bad Race\nResult column expression — in which case it returns an empty list plus\n`division_column_candidates_error` rather than erroring, so the caller\ncan fall back to Movemint default divisions. Call it only when the\norganizer wants to divide results by a specific column.\n","operationId":"listRaceResultDivisionOptions","parameters":[{"$ref":"#/components/parameters/EventHandle"},{"name":"list","in":"query","required":true,"description":"The Race Result list name (the `name` from the lists endpoint).","schema":{"type":"string"}}],"responses":{"200":{"description":"Division-column candidates for the list","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RaceResultDivisionOptions"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/EventNotFound"},"422":{"description":"The list parameter is missing, or no Race Result event is connected.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}}}}}}}
````

## List Race Result mappings

> Returns the event's existing Race Result mappings (each is one result\
> row on the admin Results page), newest first.<br>

````json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"tags":[{"name":"Race Result Mappings","description":"Configure result tables sourced from a connected Race Result timing\nevent. Discover the available contests, lists, and columns, then create,\nedit, and delete the mappings that turn a contest + list into an event\nresult with divisions and synced finishers. Requires the event to have a\nRace Result event connected in the admin UI first.\n"}],"servers":[{"url":"https://www.movemint.cc","description":"Production"}],"security":[{"bearerAuth":[]},{"oauth2":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Pass the access token in the `Authorization` header:\n```\nAuthorization: Bearer YOUR_ACCESS_TOKEN\n```\n"},"oauth2":{"type":"oauth2","description":"OAuth 2.0 authentication using the Authorization Code or Client\nCredentials grant flow.\n","flows":{"authorizationCode":{"authorizationUrl":"https://www.movemint.cc/oauth/authorize","tokenUrl":"https://www.movemint.cc/oauth/token","refreshUrl":"https://www.movemint.cc/oauth/token","scopes":{}},"clientCredentials":{"tokenUrl":"https://www.movemint.cc/oauth/token","scopes":{}}}}},"parameters":{"EventHandle":{"name":"handle","in":"path","required":true,"description":"The unique handle (slug) of the event","schema":{"type":"string"}}},"schemas":{"RaceResultMapping":{"type":"object","description":"An existing Race Result mapping — one result row on the admin Results\npage (a race_result_result EventResult plus its category mapping).\n","required":["id","name","result_type","race_result_contest_id","finisher_count","distance","distance_unit","pace_type","pace_unit","effective_pace_unit","time_precision","split_time_basis","show_pace","last_place_celebration","divisions_label","mapping","splits","custom_fields","team_mappings","created_at","updated_at"],"properties":{"id":{"type":"integer","format":"int64","description":"The event result id. Use it to update or delete the mapping."},"name":{"type":"string"},"result_type":{"type":"string"},"race_result_contest_id":{"type":"integer","nullable":true},"finisher_count":{"type":"integer"},"distance":{"type":"number","nullable":true},"distance_unit":{"type":"string","nullable":true,"enum":["miles","kilometers","meters","yards",null]},"pace_type":{"type":"string","nullable":true,"enum":["pace","speed",null]},"pace_unit":{"type":"string","nullable":true,"description":"The rate results display in. Null derives one from pace_type +\ndistance_unit — see effective_pace_unit for what that resolves to.\n","enum":["min_per_mile","min_per_kilometer","min_per_100_meters","min_per_100_yards","min_per_500_meters","miles_per_hour","kilometers_per_hour","meters_per_second",null]},"effective_pace_unit":{"type":"string","description":"The rate unit actually rendered, after the derivation above.","enum":["min_per_mile","min_per_kilometer","min_per_100_meters","min_per_100_yards","min_per_500_meters","miles_per_hour","kilometers_per_hour","meters_per_second"]},"time_precision":{"type":"string","nullable":true,"enum":["full_second","tenth_of_second","hundredth_of_second",null]},"split_time_basis":{"type":"string","description":"How the Race Result list reports intermediate splits — both their\ntimes and their distances: `cumulative` (measured from the start) or\n`per_leg` (each value covers that leg alone). `per_leg` times are\nconverted to elapsed-from-start when the contest is read, never\nstored raw; `per_leg` distances are stored as entered.\n","enum":["cumulative","per_leg"]},"show_pace":{"type":"boolean","description":"Whether a pace/speed is displayed for the overall result. Defaults\nto true. Set false where a combined rate is meaningless (a\nmultisport result whose legs don't average into one number); each\nsplit keeps its own `show_pace`.\n"},"last_place_celebration":{"type":"string","nullable":true,"enum":["lanterne_rouge","dfl",null]},"divisions_label":{"type":"string","description":"Human description of the divisions (e.g. \"Online • Lap Detail • Gender\")."},"mapping":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/RaceResultCategoryMapping"}]},"splits":{"type":"array","items":{"$ref":"#/components/schemas/RaceResultMappingSplit"}},"custom_fields":{"type":"array","description":"Race Result list columns imported as custom data on this result.","items":{"$ref":"#/components/schemas/RaceResultCustomFieldInput"}},"team_mappings":{"allOf":[{"$ref":"#/components/schemas/RaceResultTeamMappings"}],"description":"Empty object when the result is not a team/relay ingest."},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}}},"RaceResultCategoryMapping":{"type":"object","description":"The saved contest/list/column mapping for a race result.","required":["rr_list_name","rr_column_name","split_by_gender","rr_place_column_name"],"properties":{"rr_list_name":{"type":"string","description":"Race Result list name backing this result."},"rr_column_name":{"type":"string","nullable":true,"description":"Division column expression. Null = Movemint default divisions."},"split_by_gender":{"type":"boolean","description":"Whether each division is also split by gender."},"rr_place_column_name":{"type":"string","nullable":true,"description":"Column expression to rank by. Null = Race Result overall finish."}}},"RaceResultMappingSplit":{"type":"object","description":"A split on a race result mapping, with its unit overrides resolved.","required":["id","name","position","distance","is_finish","pace_unit","distance_unit","effective_pace_unit","effective_distance_unit","show_pace"],"properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string","nullable":true},"position":{"type":"integer"},"distance":{"type":"number","nullable":true,"description":"This split's distance, in `effective_distance_unit`. Measured from\nthe start under a `cumulative` split_time_basis, or covering this\nleg alone under `per_leg`.\n"},"is_finish":{"type":"boolean"},"pace_unit":{"type":"string","nullable":true,"description":"This split's own override. Null = inherits the result's.","enum":["min_per_mile","min_per_kilometer","min_per_100_meters","min_per_100_yards","min_per_500_meters","miles_per_hour","kilometers_per_hour","meters_per_second",null]},"distance_unit":{"type":"string","nullable":true,"description":"This split's own override. Null = inherits the result's.","enum":["miles","kilometers","meters","yards",null]},"effective_pace_unit":{"type":"string","description":"The rate unit this split actually displays in, after inheritance.","enum":["min_per_mile","min_per_kilometer","min_per_100_meters","min_per_100_yards","min_per_500_meters","miles_per_hour","kilometers_per_hour","meters_per_second"]},"effective_distance_unit":{"type":"string","nullable":true,"description":"The unit `distance` is actually in, after inheritance.","enum":["miles","kilometers","meters","yards",null]},"show_pace":{"type":"boolean","description":"Whether a pace/speed is displayed for this split."}}},"RaceResultCustomFieldInput":{"type":"object","description":"A Race Result list column to import as custom data on the result. Each\nbecomes a result-scoped custom question, answered per finisher at sync\ntime.\n","required":["rr_list_column_heading","rr_list_column_expression"],"properties":{"rr_list_column_heading":{"type":"string","description":"RR list column heading to import. This is the stable key — renaming\nthe display name never orphans the answers already recorded.\n"},"rr_list_column_expression":{"type":"string","description":"RR column expression read at sync time."},"column_display_name":{"type":"string","description":"Label shown on the result. Defaults to the column heading."}}},"RaceResultTeamMappings":{"type":"object","description":"Turns a result into a relay/team ingest. `team_name` is required either\nway; what accompanies it says which of the two shapes the RR list\npublishes.\n\nONE ROW PER LEG — send `role` alongside `team_name`: each RR row is one\nathlete's leg, rows sharing a team name are grouped, and each team\nbecomes one ranked entry whose members are its legs. `team_bib` is\noptional and names the bib the team races under.\n\nONE ROW PER TEAM — send `members` alongside `team_name`: each RR row is\nalready a whole team, with the athletes as columns across it, and each\nmember slot names the columns and the leg its athlete covers.\n\nSend `{}` to clear the mapping and go back to ingesting one finisher\nper row.\n","properties":{"team_name":{"$ref":"#/components/schemas/RaceResultTeamMappingColumn"},"role":{"$ref":"#/components/schemas/RaceResultTeamMappingColumn"},"team_bib":{"$ref":"#/components/schemas/RaceResultTeamMappingColumn"},"members":{"type":"array","items":{"$ref":"#/components/schemas/RaceResultTeamMappingMember"}}}},"RaceResultTeamMappingColumn":{"type":"object","description":"A Race Result list column carrying one part of a team entry.","required":["rr_list_column_heading","rr_list_column_expression"],"properties":{"rr_list_column_heading":{"type":"string","description":"RR list column heading to read."},"rr_list_column_expression":{"type":"string","description":"The column's RR expression."}}},"RaceResultTeamMappingMember":{"type":"object","description":"One seat on a team whose whole entry is a single RR row. Names the\ncolumn its athlete's name is read from, the label the seat renders\nunder, and the split whose time it covers. Two seats may name the same\nsplit, which is what a tandem's second paddler is. A seat with neither\nname column is discarded.\n","properties":{"first_name":{"$ref":"#/components/schemas/RaceResultTeamMappingColumn"},"last_name":{"$ref":"#/components/schemas/RaceResultTeamMappingColumn"},"role_label":{"type":"string","description":"What this seat renders under, e.g. \"Runner\"."},"split_rr_list_column_heading":{"type":"string","description":"The `rr_list_column_heading` of the split mapping whose time this\nseat's athlete ran for.\n"}}},"OAuthError":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Machine-readable error code"},"error_description":{"type":"string","description":"Human-readable description of the error"}}},"Error":{"type":"object","description":"A generic error response","required":["error"],"properties":{"error":{"type":"string","description":"Human-readable error message"}}}},"responses":{"Unauthorized":{"description":"Unauthorized - invalid or missing token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthError"}}}},"Forbidden":{"description":"Forbidden - user is not an admin of this event","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"EventNotFound":{"description":"Event not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"paths":{"/api/v1/events/{handle}/race_result_mappings":{"get":{"tags":["Race Result Mappings"],"summary":"List Race Result mappings","description":"Returns the event's existing Race Result mappings (each is one result\nrow on the admin Results page), newest first.\n","operationId":"listRaceResultMappings","parameters":[{"$ref":"#/components/parameters/EventHandle"}],"responses":{"200":{"description":"List of Race Result mappings","content":{"application/json":{"schema":{"type":"object","required":["race_result_mappings"],"properties":{"race_result_mappings":{"type":"array","items":{"$ref":"#/components/schemas/RaceResultMapping"}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/EventNotFound"}}}}}}
````

## Create a Race Result mapping

> Build a results table from a Race Result contest + list, with divisions\
> and synced finishers. Discover valid values first via the contests,\
> lists, and columns endpoints. Omit \`division\_column\` to keep Movemint's\
> default age/gender divisions; \`split\_by\_gender\` only applies when a\
> \`division\_column\` is set. Omit \`place\_column\` to rank by Race Result's\
> overall finish. Requires a connected Race Result event.<br>

````json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"tags":[{"name":"Race Result Mappings","description":"Configure result tables sourced from a connected Race Result timing\nevent. Discover the available contests, lists, and columns, then create,\nedit, and delete the mappings that turn a contest + list into an event\nresult with divisions and synced finishers. Requires the event to have a\nRace Result event connected in the admin UI first.\n"}],"servers":[{"url":"https://www.movemint.cc","description":"Production"}],"security":[{"bearerAuth":[]},{"oauth2":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Pass the access token in the `Authorization` header:\n```\nAuthorization: Bearer YOUR_ACCESS_TOKEN\n```\n"},"oauth2":{"type":"oauth2","description":"OAuth 2.0 authentication using the Authorization Code or Client\nCredentials grant flow.\n","flows":{"authorizationCode":{"authorizationUrl":"https://www.movemint.cc/oauth/authorize","tokenUrl":"https://www.movemint.cc/oauth/token","refreshUrl":"https://www.movemint.cc/oauth/token","scopes":{}},"clientCredentials":{"tokenUrl":"https://www.movemint.cc/oauth/token","scopes":{}}}}},"parameters":{"EventHandle":{"name":"handle","in":"path","required":true,"description":"The unique handle (slug) of the event","schema":{"type":"string"}}},"schemas":{"CreateRaceResultMappingRequest":{"allOf":[{"type":"object","required":["contest_id","list_name"],"properties":{"contest_id":{"type":"integer","description":"Race Result contest id (from the contests endpoint)."}}},{"$ref":"#/components/schemas/RaceResultMappingWritableFields"}]},"RaceResultMappingWritableFields":{"type":"object","description":"Fields shared by the create and update mapping requests.","properties":{"team_mappings":{"$ref":"#/components/schemas/RaceResultTeamMappings"},"list_name":{"type":"string","description":"Race Result list name (from the lists endpoint)."},"division_column":{"type":"string","description":"Column expression for divisions (from division_column_candidates).\nEmpty string = Movemint default age/gender divisions.\n"},"split_by_gender":{"type":"boolean","description":"Also split each division by gender (only applies with a division_column)."},"place_column":{"type":"string","description":"Column expression to rank finishers by. Empty string = Race Result\noverall finish.\n"},"name":{"type":"string"},"distance":{"type":"number"},"distance_unit":{"type":"string","enum":["miles","kilometers","meters","yards"]},"pace_type":{"type":"string","description":"Superseded by pace_unit when that is set.","enum":["pace","speed"]},"pace_unit":{"type":"string","description":"The rate results display in. Pace units read time-per-distance\n(min_per_100_meters for pool swims, min_per_500_meters for rowing);\nspeed units read distance-per-time. Omit to derive one from\npace_type + distance_unit. An unrecognized value is treated as\nomitted rather than rejected.\n","enum":["min_per_mile","min_per_kilometer","min_per_100_meters","min_per_100_yards","min_per_500_meters","miles_per_hour","kilometers_per_hour","meters_per_second"]},"time_precision":{"type":"string","enum":["full_second","tenth_of_second","hundredth_of_second"]},"split_time_basis":{"type":"string","description":"How the Race Result list reports intermediate splits, times and\ndistances alike. Changing it re-reads the contest from Race Result\nso the stored split times are re-normalized — finisher times take a\nmoment to catch up.\n","enum":["cumulative","per_leg"]},"show_pace":{"type":"boolean","description":"Whether a pace/speed is displayed for the overall result. Defaults\nto true. Set false where a combined rate is meaningless (a\nmultisport result whose legs don't average into one number); each\nsplit keeps its own `show_pace`.\n"},"last_place_celebration":{"type":"string","enum":["lanterne_rouge","dfl"]},"splits":{"type":"array","description":"Replaces the result's split columns.","items":{"$ref":"#/components/schemas/RaceResultSplitInput"}},"custom_fields":{"type":"array","description":"Replaces the set of Race Result list columns imported as custom\ndata on the result. Send an empty array to import none.\n","items":{"$ref":"#/components/schemas/RaceResultCustomFieldInput"}}}},"RaceResultTeamMappings":{"type":"object","description":"Turns a result into a relay/team ingest. `team_name` is required either\nway; what accompanies it says which of the two shapes the RR list\npublishes.\n\nONE ROW PER LEG — send `role` alongside `team_name`: each RR row is one\nathlete's leg, rows sharing a team name are grouped, and each team\nbecomes one ranked entry whose members are its legs. `team_bib` is\noptional and names the bib the team races under.\n\nONE ROW PER TEAM — send `members` alongside `team_name`: each RR row is\nalready a whole team, with the athletes as columns across it, and each\nmember slot names the columns and the leg its athlete covers.\n\nSend `{}` to clear the mapping and go back to ingesting one finisher\nper row.\n","properties":{"team_name":{"$ref":"#/components/schemas/RaceResultTeamMappingColumn"},"role":{"$ref":"#/components/schemas/RaceResultTeamMappingColumn"},"team_bib":{"$ref":"#/components/schemas/RaceResultTeamMappingColumn"},"members":{"type":"array","items":{"$ref":"#/components/schemas/RaceResultTeamMappingMember"}}}},"RaceResultTeamMappingColumn":{"type":"object","description":"A Race Result list column carrying one part of a team entry.","required":["rr_list_column_heading","rr_list_column_expression"],"properties":{"rr_list_column_heading":{"type":"string","description":"RR list column heading to read."},"rr_list_column_expression":{"type":"string","description":"The column's RR expression."}}},"RaceResultTeamMappingMember":{"type":"object","description":"One seat on a team whose whole entry is a single RR row. Names the\ncolumn its athlete's name is read from, the label the seat renders\nunder, and the split whose time it covers. Two seats may name the same\nsplit, which is what a tandem's second paddler is. A seat with neither\nname column is discarded.\n","properties":{"first_name":{"$ref":"#/components/schemas/RaceResultTeamMappingColumn"},"last_name":{"$ref":"#/components/schemas/RaceResultTeamMappingColumn"},"role_label":{"type":"string","description":"What this seat renders under, e.g. \"Runner\"."},"split_rr_list_column_heading":{"type":"string","description":"The `rr_list_column_heading` of the split mapping whose time this\nseat's athlete ran for.\n"}}},"RaceResultSplitInput":{"type":"object","description":"A lap/split time column to bring back as a split.","required":["rr_list_column_heading","rr_list_column_expression","name","position"],"properties":{"rr_list_column_heading":{"type":"string","description":"RR list column heading carrying this split's time."},"role":{"type":"string","description":"Team results only: the value of the mapped role column whose rows\ncarry this leg's time (e.g. \"Cyclist\").\n"},"rr_list_column_expression":{"type":"string","description":"RR column expression read at sync time."},"name":{"type":"string","description":"Display name for the split (e.g. \"Mile 1\", \"Finish\")."},"distance":{"type":"number","nullable":true,"description":"This split's distance, in its own `distance_unit` (the result's,\nunless overridden below). How it is measured depends on the\nresult's `split_time_basis`: distance from the start under\n`cumulative`, this leg alone under `per_leg`.\n"},"position":{"type":"integer","description":"1-based ordering of the split."},"pace_unit":{"type":"string","nullable":true,"description":"Rate unit for this split only, overriding the result's. Null (or\nomitted) inherits. A multisport result needs this per split — the\nbike leg reads in miles_per_hour while the swim leg reads in\nmin_per_100_meters.\n","enum":["min_per_mile","min_per_kilometer","min_per_100_meters","min_per_100_yards","min_per_500_meters","miles_per_hour","kilometers_per_hour","meters_per_second",null]},"distance_unit":{"type":"string","nullable":true,"description":"Unit this split's `distance` is expressed in, overriding the\nresult's. Null (or omitted) inherits.\n","enum":["miles","kilometers","meters","yards",null]},"show_pace":{"type":"boolean","description":"Whether to display a pace/speed for this split. Defaults to true;\nset false for a transition or an untimed leg. Unlike the unit\noverrides above this does not inherit.\n"}}},"RaceResultCustomFieldInput":{"type":"object","description":"A Race Result list column to import as custom data on the result. Each\nbecomes a result-scoped custom question, answered per finisher at sync\ntime.\n","required":["rr_list_column_heading","rr_list_column_expression"],"properties":{"rr_list_column_heading":{"type":"string","description":"RR list column heading to import. This is the stable key — renaming\nthe display name never orphans the answers already recorded.\n"},"rr_list_column_expression":{"type":"string","description":"RR column expression read at sync time."},"column_display_name":{"type":"string","description":"Label shown on the result. Defaults to the column heading."}}},"RaceResultMapping":{"type":"object","description":"An existing Race Result mapping — one result row on the admin Results\npage (a race_result_result EventResult plus its category mapping).\n","required":["id","name","result_type","race_result_contest_id","finisher_count","distance","distance_unit","pace_type","pace_unit","effective_pace_unit","time_precision","split_time_basis","show_pace","last_place_celebration","divisions_label","mapping","splits","custom_fields","team_mappings","created_at","updated_at"],"properties":{"id":{"type":"integer","format":"int64","description":"The event result id. Use it to update or delete the mapping."},"name":{"type":"string"},"result_type":{"type":"string"},"race_result_contest_id":{"type":"integer","nullable":true},"finisher_count":{"type":"integer"},"distance":{"type":"number","nullable":true},"distance_unit":{"type":"string","nullable":true,"enum":["miles","kilometers","meters","yards",null]},"pace_type":{"type":"string","nullable":true,"enum":["pace","speed",null]},"pace_unit":{"type":"string","nullable":true,"description":"The rate results display in. Null derives one from pace_type +\ndistance_unit — see effective_pace_unit for what that resolves to.\n","enum":["min_per_mile","min_per_kilometer","min_per_100_meters","min_per_100_yards","min_per_500_meters","miles_per_hour","kilometers_per_hour","meters_per_second",null]},"effective_pace_unit":{"type":"string","description":"The rate unit actually rendered, after the derivation above.","enum":["min_per_mile","min_per_kilometer","min_per_100_meters","min_per_100_yards","min_per_500_meters","miles_per_hour","kilometers_per_hour","meters_per_second"]},"time_precision":{"type":"string","nullable":true,"enum":["full_second","tenth_of_second","hundredth_of_second",null]},"split_time_basis":{"type":"string","description":"How the Race Result list reports intermediate splits — both their\ntimes and their distances: `cumulative` (measured from the start) or\n`per_leg` (each value covers that leg alone). `per_leg` times are\nconverted to elapsed-from-start when the contest is read, never\nstored raw; `per_leg` distances are stored as entered.\n","enum":["cumulative","per_leg"]},"show_pace":{"type":"boolean","description":"Whether a pace/speed is displayed for the overall result. Defaults\nto true. Set false where a combined rate is meaningless (a\nmultisport result whose legs don't average into one number); each\nsplit keeps its own `show_pace`.\n"},"last_place_celebration":{"type":"string","nullable":true,"enum":["lanterne_rouge","dfl",null]},"divisions_label":{"type":"string","description":"Human description of the divisions (e.g. \"Online • Lap Detail • Gender\")."},"mapping":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/RaceResultCategoryMapping"}]},"splits":{"type":"array","items":{"$ref":"#/components/schemas/RaceResultMappingSplit"}},"custom_fields":{"type":"array","description":"Race Result list columns imported as custom data on this result.","items":{"$ref":"#/components/schemas/RaceResultCustomFieldInput"}},"team_mappings":{"allOf":[{"$ref":"#/components/schemas/RaceResultTeamMappings"}],"description":"Empty object when the result is not a team/relay ingest."},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}}},"RaceResultCategoryMapping":{"type":"object","description":"The saved contest/list/column mapping for a race result.","required":["rr_list_name","rr_column_name","split_by_gender","rr_place_column_name"],"properties":{"rr_list_name":{"type":"string","description":"Race Result list name backing this result."},"rr_column_name":{"type":"string","nullable":true,"description":"Division column expression. Null = Movemint default divisions."},"split_by_gender":{"type":"boolean","description":"Whether each division is also split by gender."},"rr_place_column_name":{"type":"string","nullable":true,"description":"Column expression to rank by. Null = Race Result overall finish."}}},"RaceResultMappingSplit":{"type":"object","description":"A split on a race result mapping, with its unit overrides resolved.","required":["id","name","position","distance","is_finish","pace_unit","distance_unit","effective_pace_unit","effective_distance_unit","show_pace"],"properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string","nullable":true},"position":{"type":"integer"},"distance":{"type":"number","nullable":true,"description":"This split's distance, in `effective_distance_unit`. Measured from\nthe start under a `cumulative` split_time_basis, or covering this\nleg alone under `per_leg`.\n"},"is_finish":{"type":"boolean"},"pace_unit":{"type":"string","nullable":true,"description":"This split's own override. Null = inherits the result's.","enum":["min_per_mile","min_per_kilometer","min_per_100_meters","min_per_100_yards","min_per_500_meters","miles_per_hour","kilometers_per_hour","meters_per_second",null]},"distance_unit":{"type":"string","nullable":true,"description":"This split's own override. Null = inherits the result's.","enum":["miles","kilometers","meters","yards",null]},"effective_pace_unit":{"type":"string","description":"The rate unit this split actually displays in, after inheritance.","enum":["min_per_mile","min_per_kilometer","min_per_100_meters","min_per_100_yards","min_per_500_meters","miles_per_hour","kilometers_per_hour","meters_per_second"]},"effective_distance_unit":{"type":"string","nullable":true,"description":"The unit `distance` is actually in, after inheritance.","enum":["miles","kilometers","meters","yards",null]},"show_pace":{"type":"boolean","description":"Whether a pace/speed is displayed for this split."}}},"OAuthError":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Machine-readable error code"},"error_description":{"type":"string","description":"Human-readable description of the error"}}},"Error":{"type":"object","description":"A generic error response","required":["error"],"properties":{"error":{"type":"string","description":"Human-readable error message"}}},"ValidationError":{"type":"object","description":"A validation error response with a list of error messages","required":["errors"],"properties":{"errors":{"type":"array","items":{"type":"string"},"description":"List of validation error messages"}}}},"responses":{"Unauthorized":{"description":"Unauthorized - invalid or missing token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthError"}}}},"Forbidden":{"description":"Forbidden - user is not an admin of this event","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"EventNotFound":{"description":"Event not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"paths":{"/api/v1/events/{handle}/race_result_mappings":{"post":{"tags":["Race Result Mappings"],"summary":"Create a Race Result mapping","description":"Build a results table from a Race Result contest + list, with divisions\nand synced finishers. Discover valid values first via the contests,\nlists, and columns endpoints. Omit `division_column` to keep Movemint's\ndefault age/gender divisions; `split_by_gender` only applies when a\n`division_column` is set. Omit `place_column` to rank by Race Result's\noverall finish. Requires a connected Race Result event.\n","operationId":"createRaceResultMapping","parameters":[{"$ref":"#/components/parameters/EventHandle"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRaceResultMappingRequest"}}}},"responses":{"201":{"description":"Mapping created","content":{"application/json":{"schema":{"type":"object","required":["race_result_mapping"],"properties":{"race_result_mapping":{"$ref":"#/components/schemas/RaceResultMapping"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/EventNotFound"},"422":{"description":"Validation error, or no Race Result event is connected.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}}}}}}}
````

## Delete a Race Result mapping

> Delete a mapping and its result, removing all of that result's finishers\
> and splits. Does not disconnect the Race Result event. \`id\` is the event\
> result id.<br>

````json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"tags":[{"name":"Race Result Mappings","description":"Configure result tables sourced from a connected Race Result timing\nevent. Discover the available contests, lists, and columns, then create,\nedit, and delete the mappings that turn a contest + list into an event\nresult with divisions and synced finishers. Requires the event to have a\nRace Result event connected in the admin UI first.\n"}],"servers":[{"url":"https://www.movemint.cc","description":"Production"}],"security":[{"bearerAuth":[]},{"oauth2":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Pass the access token in the `Authorization` header:\n```\nAuthorization: Bearer YOUR_ACCESS_TOKEN\n```\n"},"oauth2":{"type":"oauth2","description":"OAuth 2.0 authentication using the Authorization Code or Client\nCredentials grant flow.\n","flows":{"authorizationCode":{"authorizationUrl":"https://www.movemint.cc/oauth/authorize","tokenUrl":"https://www.movemint.cc/oauth/token","refreshUrl":"https://www.movemint.cc/oauth/token","scopes":{}},"clientCredentials":{"tokenUrl":"https://www.movemint.cc/oauth/token","scopes":{}}}}},"parameters":{"EventHandle":{"name":"handle","in":"path","required":true,"description":"The unique handle (slug) of the event","schema":{"type":"string"}},"ResourceId":{"name":"id","in":"path","required":true,"description":"The ID of the resource","schema":{"type":"integer","format":"int64"}}},"responses":{"Unauthorized":{"description":"Unauthorized - invalid or missing token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthError"}}}},"Forbidden":{"description":"Forbidden - user is not an admin of this event","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"EventNotFound":{"description":"Event not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"schemas":{"OAuthError":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Machine-readable error code"},"error_description":{"type":"string","description":"Human-readable description of the error"}}},"Error":{"type":"object","description":"A generic error response","required":["error"],"properties":{"error":{"type":"string","description":"Human-readable error message"}}}}},"paths":{"/api/v1/events/{handle}/race_result_mappings/{id}":{"delete":{"tags":["Race Result Mappings"],"summary":"Delete a Race Result mapping","description":"Delete a mapping and its result, removing all of that result's finishers\nand splits. Does not disconnect the Race Result event. `id` is the event\nresult id.\n","operationId":"deleteRaceResultMapping","parameters":[{"$ref":"#/components/parameters/EventHandle"},{"$ref":"#/components/parameters/ResourceId"}],"responses":{"200":{"description":"Mapping deleted","content":{"application/json":{"schema":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/EventNotFound"}}}}}}
````

## Update a Race Result mapping

> Edit an existing mapping. Only the fields you send change. Pass an empty\
> string for \`division\_column\` to revert to Movemint default divisions, or\
> for \`place\_column\` to revert to overall finish. Re-syncs finishers when\
> the mapping changes, and also when \`split\_time\_basis\` changes — split\
> times are normalized to elapsed-from-start as the contest is read, so a\
> new basis only takes effect on the next read. \`id\` is the event result\
> id.<br>

````json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"tags":[{"name":"Race Result Mappings","description":"Configure result tables sourced from a connected Race Result timing\nevent. Discover the available contests, lists, and columns, then create,\nedit, and delete the mappings that turn a contest + list into an event\nresult with divisions and synced finishers. Requires the event to have a\nRace Result event connected in the admin UI first.\n"}],"servers":[{"url":"https://www.movemint.cc","description":"Production"}],"security":[{"bearerAuth":[]},{"oauth2":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Pass the access token in the `Authorization` header:\n```\nAuthorization: Bearer YOUR_ACCESS_TOKEN\n```\n"},"oauth2":{"type":"oauth2","description":"OAuth 2.0 authentication using the Authorization Code or Client\nCredentials grant flow.\n","flows":{"authorizationCode":{"authorizationUrl":"https://www.movemint.cc/oauth/authorize","tokenUrl":"https://www.movemint.cc/oauth/token","refreshUrl":"https://www.movemint.cc/oauth/token","scopes":{}},"clientCredentials":{"tokenUrl":"https://www.movemint.cc/oauth/token","scopes":{}}}}},"parameters":{"EventHandle":{"name":"handle","in":"path","required":true,"description":"The unique handle (slug) of the event","schema":{"type":"string"}},"ResourceId":{"name":"id","in":"path","required":true,"description":"The ID of the resource","schema":{"type":"integer","format":"int64"}}},"schemas":{"UpdateRaceResultMappingRequest":{"allOf":[{"$ref":"#/components/schemas/RaceResultMappingWritableFields"}]},"RaceResultMappingWritableFields":{"type":"object","description":"Fields shared by the create and update mapping requests.","properties":{"team_mappings":{"$ref":"#/components/schemas/RaceResultTeamMappings"},"list_name":{"type":"string","description":"Race Result list name (from the lists endpoint)."},"division_column":{"type":"string","description":"Column expression for divisions (from division_column_candidates).\nEmpty string = Movemint default age/gender divisions.\n"},"split_by_gender":{"type":"boolean","description":"Also split each division by gender (only applies with a division_column)."},"place_column":{"type":"string","description":"Column expression to rank finishers by. Empty string = Race Result\noverall finish.\n"},"name":{"type":"string"},"distance":{"type":"number"},"distance_unit":{"type":"string","enum":["miles","kilometers","meters","yards"]},"pace_type":{"type":"string","description":"Superseded by pace_unit when that is set.","enum":["pace","speed"]},"pace_unit":{"type":"string","description":"The rate results display in. Pace units read time-per-distance\n(min_per_100_meters for pool swims, min_per_500_meters for rowing);\nspeed units read distance-per-time. Omit to derive one from\npace_type + distance_unit. An unrecognized value is treated as\nomitted rather than rejected.\n","enum":["min_per_mile","min_per_kilometer","min_per_100_meters","min_per_100_yards","min_per_500_meters","miles_per_hour","kilometers_per_hour","meters_per_second"]},"time_precision":{"type":"string","enum":["full_second","tenth_of_second","hundredth_of_second"]},"split_time_basis":{"type":"string","description":"How the Race Result list reports intermediate splits, times and\ndistances alike. Changing it re-reads the contest from Race Result\nso the stored split times are re-normalized — finisher times take a\nmoment to catch up.\n","enum":["cumulative","per_leg"]},"show_pace":{"type":"boolean","description":"Whether a pace/speed is displayed for the overall result. Defaults\nto true. Set false where a combined rate is meaningless (a\nmultisport result whose legs don't average into one number); each\nsplit keeps its own `show_pace`.\n"},"last_place_celebration":{"type":"string","enum":["lanterne_rouge","dfl"]},"splits":{"type":"array","description":"Replaces the result's split columns.","items":{"$ref":"#/components/schemas/RaceResultSplitInput"}},"custom_fields":{"type":"array","description":"Replaces the set of Race Result list columns imported as custom\ndata on the result. Send an empty array to import none.\n","items":{"$ref":"#/components/schemas/RaceResultCustomFieldInput"}}}},"RaceResultTeamMappings":{"type":"object","description":"Turns a result into a relay/team ingest. `team_name` is required either\nway; what accompanies it says which of the two shapes the RR list\npublishes.\n\nONE ROW PER LEG — send `role` alongside `team_name`: each RR row is one\nathlete's leg, rows sharing a team name are grouped, and each team\nbecomes one ranked entry whose members are its legs. `team_bib` is\noptional and names the bib the team races under.\n\nONE ROW PER TEAM — send `members` alongside `team_name`: each RR row is\nalready a whole team, with the athletes as columns across it, and each\nmember slot names the columns and the leg its athlete covers.\n\nSend `{}` to clear the mapping and go back to ingesting one finisher\nper row.\n","properties":{"team_name":{"$ref":"#/components/schemas/RaceResultTeamMappingColumn"},"role":{"$ref":"#/components/schemas/RaceResultTeamMappingColumn"},"team_bib":{"$ref":"#/components/schemas/RaceResultTeamMappingColumn"},"members":{"type":"array","items":{"$ref":"#/components/schemas/RaceResultTeamMappingMember"}}}},"RaceResultTeamMappingColumn":{"type":"object","description":"A Race Result list column carrying one part of a team entry.","required":["rr_list_column_heading","rr_list_column_expression"],"properties":{"rr_list_column_heading":{"type":"string","description":"RR list column heading to read."},"rr_list_column_expression":{"type":"string","description":"The column's RR expression."}}},"RaceResultTeamMappingMember":{"type":"object","description":"One seat on a team whose whole entry is a single RR row. Names the\ncolumn its athlete's name is read from, the label the seat renders\nunder, and the split whose time it covers. Two seats may name the same\nsplit, which is what a tandem's second paddler is. A seat with neither\nname column is discarded.\n","properties":{"first_name":{"$ref":"#/components/schemas/RaceResultTeamMappingColumn"},"last_name":{"$ref":"#/components/schemas/RaceResultTeamMappingColumn"},"role_label":{"type":"string","description":"What this seat renders under, e.g. \"Runner\"."},"split_rr_list_column_heading":{"type":"string","description":"The `rr_list_column_heading` of the split mapping whose time this\nseat's athlete ran for.\n"}}},"RaceResultSplitInput":{"type":"object","description":"A lap/split time column to bring back as a split.","required":["rr_list_column_heading","rr_list_column_expression","name","position"],"properties":{"rr_list_column_heading":{"type":"string","description":"RR list column heading carrying this split's time."},"role":{"type":"string","description":"Team results only: the value of the mapped role column whose rows\ncarry this leg's time (e.g. \"Cyclist\").\n"},"rr_list_column_expression":{"type":"string","description":"RR column expression read at sync time."},"name":{"type":"string","description":"Display name for the split (e.g. \"Mile 1\", \"Finish\")."},"distance":{"type":"number","nullable":true,"description":"This split's distance, in its own `distance_unit` (the result's,\nunless overridden below). How it is measured depends on the\nresult's `split_time_basis`: distance from the start under\n`cumulative`, this leg alone under `per_leg`.\n"},"position":{"type":"integer","description":"1-based ordering of the split."},"pace_unit":{"type":"string","nullable":true,"description":"Rate unit for this split only, overriding the result's. Null (or\nomitted) inherits. A multisport result needs this per split — the\nbike leg reads in miles_per_hour while the swim leg reads in\nmin_per_100_meters.\n","enum":["min_per_mile","min_per_kilometer","min_per_100_meters","min_per_100_yards","min_per_500_meters","miles_per_hour","kilometers_per_hour","meters_per_second",null]},"distance_unit":{"type":"string","nullable":true,"description":"Unit this split's `distance` is expressed in, overriding the\nresult's. Null (or omitted) inherits.\n","enum":["miles","kilometers","meters","yards",null]},"show_pace":{"type":"boolean","description":"Whether to display a pace/speed for this split. Defaults to true;\nset false for a transition or an untimed leg. Unlike the unit\noverrides above this does not inherit.\n"}}},"RaceResultCustomFieldInput":{"type":"object","description":"A Race Result list column to import as custom data on the result. Each\nbecomes a result-scoped custom question, answered per finisher at sync\ntime.\n","required":["rr_list_column_heading","rr_list_column_expression"],"properties":{"rr_list_column_heading":{"type":"string","description":"RR list column heading to import. This is the stable key — renaming\nthe display name never orphans the answers already recorded.\n"},"rr_list_column_expression":{"type":"string","description":"RR column expression read at sync time."},"column_display_name":{"type":"string","description":"Label shown on the result. Defaults to the column heading."}}},"RaceResultMapping":{"type":"object","description":"An existing Race Result mapping — one result row on the admin Results\npage (a race_result_result EventResult plus its category mapping).\n","required":["id","name","result_type","race_result_contest_id","finisher_count","distance","distance_unit","pace_type","pace_unit","effective_pace_unit","time_precision","split_time_basis","show_pace","last_place_celebration","divisions_label","mapping","splits","custom_fields","team_mappings","created_at","updated_at"],"properties":{"id":{"type":"integer","format":"int64","description":"The event result id. Use it to update or delete the mapping."},"name":{"type":"string"},"result_type":{"type":"string"},"race_result_contest_id":{"type":"integer","nullable":true},"finisher_count":{"type":"integer"},"distance":{"type":"number","nullable":true},"distance_unit":{"type":"string","nullable":true,"enum":["miles","kilometers","meters","yards",null]},"pace_type":{"type":"string","nullable":true,"enum":["pace","speed",null]},"pace_unit":{"type":"string","nullable":true,"description":"The rate results display in. Null derives one from pace_type +\ndistance_unit — see effective_pace_unit for what that resolves to.\n","enum":["min_per_mile","min_per_kilometer","min_per_100_meters","min_per_100_yards","min_per_500_meters","miles_per_hour","kilometers_per_hour","meters_per_second",null]},"effective_pace_unit":{"type":"string","description":"The rate unit actually rendered, after the derivation above.","enum":["min_per_mile","min_per_kilometer","min_per_100_meters","min_per_100_yards","min_per_500_meters","miles_per_hour","kilometers_per_hour","meters_per_second"]},"time_precision":{"type":"string","nullable":true,"enum":["full_second","tenth_of_second","hundredth_of_second",null]},"split_time_basis":{"type":"string","description":"How the Race Result list reports intermediate splits — both their\ntimes and their distances: `cumulative` (measured from the start) or\n`per_leg` (each value covers that leg alone). `per_leg` times are\nconverted to elapsed-from-start when the contest is read, never\nstored raw; `per_leg` distances are stored as entered.\n","enum":["cumulative","per_leg"]},"show_pace":{"type":"boolean","description":"Whether a pace/speed is displayed for the overall result. Defaults\nto true. Set false where a combined rate is meaningless (a\nmultisport result whose legs don't average into one number); each\nsplit keeps its own `show_pace`.\n"},"last_place_celebration":{"type":"string","nullable":true,"enum":["lanterne_rouge","dfl",null]},"divisions_label":{"type":"string","description":"Human description of the divisions (e.g. \"Online • Lap Detail • Gender\")."},"mapping":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/RaceResultCategoryMapping"}]},"splits":{"type":"array","items":{"$ref":"#/components/schemas/RaceResultMappingSplit"}},"custom_fields":{"type":"array","description":"Race Result list columns imported as custom data on this result.","items":{"$ref":"#/components/schemas/RaceResultCustomFieldInput"}},"team_mappings":{"allOf":[{"$ref":"#/components/schemas/RaceResultTeamMappings"}],"description":"Empty object when the result is not a team/relay ingest."},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}}},"RaceResultCategoryMapping":{"type":"object","description":"The saved contest/list/column mapping for a race result.","required":["rr_list_name","rr_column_name","split_by_gender","rr_place_column_name"],"properties":{"rr_list_name":{"type":"string","description":"Race Result list name backing this result."},"rr_column_name":{"type":"string","nullable":true,"description":"Division column expression. Null = Movemint default divisions."},"split_by_gender":{"type":"boolean","description":"Whether each division is also split by gender."},"rr_place_column_name":{"type":"string","nullable":true,"description":"Column expression to rank by. Null = Race Result overall finish."}}},"RaceResultMappingSplit":{"type":"object","description":"A split on a race result mapping, with its unit overrides resolved.","required":["id","name","position","distance","is_finish","pace_unit","distance_unit","effective_pace_unit","effective_distance_unit","show_pace"],"properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string","nullable":true},"position":{"type":"integer"},"distance":{"type":"number","nullable":true,"description":"This split's distance, in `effective_distance_unit`. Measured from\nthe start under a `cumulative` split_time_basis, or covering this\nleg alone under `per_leg`.\n"},"is_finish":{"type":"boolean"},"pace_unit":{"type":"string","nullable":true,"description":"This split's own override. Null = inherits the result's.","enum":["min_per_mile","min_per_kilometer","min_per_100_meters","min_per_100_yards","min_per_500_meters","miles_per_hour","kilometers_per_hour","meters_per_second",null]},"distance_unit":{"type":"string","nullable":true,"description":"This split's own override. Null = inherits the result's.","enum":["miles","kilometers","meters","yards",null]},"effective_pace_unit":{"type":"string","description":"The rate unit this split actually displays in, after inheritance.","enum":["min_per_mile","min_per_kilometer","min_per_100_meters","min_per_100_yards","min_per_500_meters","miles_per_hour","kilometers_per_hour","meters_per_second"]},"effective_distance_unit":{"type":"string","nullable":true,"description":"The unit `distance` is actually in, after inheritance.","enum":["miles","kilometers","meters","yards",null]},"show_pace":{"type":"boolean","description":"Whether a pace/speed is displayed for this split."}}},"OAuthError":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Machine-readable error code"},"error_description":{"type":"string","description":"Human-readable description of the error"}}},"Error":{"type":"object","description":"A generic error response","required":["error"],"properties":{"error":{"type":"string","description":"Human-readable error message"}}},"ValidationError":{"type":"object","description":"A validation error response with a list of error messages","required":["errors"],"properties":{"errors":{"type":"array","items":{"type":"string"},"description":"List of validation error messages"}}}},"responses":{"Unauthorized":{"description":"Unauthorized - invalid or missing token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthError"}}}},"Forbidden":{"description":"Forbidden - user is not an admin of this event","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"EventNotFound":{"description":"Event not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"paths":{"/api/v1/events/{handle}/race_result_mappings/{id}":{"patch":{"tags":["Race Result Mappings"],"summary":"Update a Race Result mapping","description":"Edit an existing mapping. Only the fields you send change. Pass an empty\nstring for `division_column` to revert to Movemint default divisions, or\nfor `place_column` to revert to overall finish. Re-syncs finishers when\nthe mapping changes, and also when `split_time_basis` changes — split\ntimes are normalized to elapsed-from-start as the contest is read, so a\nnew basis only takes effect on the next read. `id` is the event result\nid.\n","operationId":"updateRaceResultMapping","parameters":[{"$ref":"#/components/parameters/EventHandle"},{"$ref":"#/components/parameters/ResourceId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRaceResultMappingRequest"}}}},"responses":{"200":{"description":"Mapping updated","content":{"application/json":{"schema":{"type":"object","required":["race_result_mapping"],"properties":{"race_result_mapping":{"$ref":"#/components/schemas/RaceResultMapping"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/EventNotFound"},"422":{"description":"Validation error, or no Race Result event is connected.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}}}}}}}
````
