> 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","time_precision","last_place_celebration","divisions_label","mapping","splits","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]},"time_precision":{"type":"string","nullable":true,"enum":["full_second","tenth_of_second","hundredth_of_second",null]},"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/EventResultSplit"}},"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."}}},"EventResultSplit":{"type":"object","description":"A split point within an event result. Each result must have at\nleast one split marked as the finish.\n","required":["id","event_result_id","name","position","is_finish","created_at","updated_at"],"properties":{"id":{"type":"integer","format":"int64","description":"Unique identifier"},"event_result_id":{"type":"integer","format":"int64","description":"ID of the parent event result"},"name":{"type":"string","nullable":true,"description":"Name of the split (e.g., \"Mile 1\", \"Finish\")"},"position":{"type":"integer","description":"Order position (0-indexed)"},"is_finish":{"type":"boolean","description":"Whether this split represents the finish line"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-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"}}}},"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":{"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","enum":["pace","speed"]},"time_precision":{"type":"string","enum":["full_second","tenth_of_second","hundredth_of_second"]},"last_place_celebration":{"type":"string","enum":["lanterne_rouge","dfl"]},"splits":{"type":"array","items":{"$ref":"#/components/schemas/RaceResultSplitInput"}}}},"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."},"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":"Distance to this split, in the result's distance unit."},"position":{"type":"integer","description":"1-based ordering of the split."}}},"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","time_precision","last_place_celebration","divisions_label","mapping","splits","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]},"time_precision":{"type":"string","nullable":true,"enum":["full_second","tenth_of_second","hundredth_of_second",null]},"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/EventResultSplit"}},"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."}}},"EventResultSplit":{"type":"object","description":"A split point within an event result. Each result must have at\nleast one split marked as the finish.\n","required":["id","event_result_id","name","position","is_finish","created_at","updated_at"],"properties":{"id":{"type":"integer","format":"int64","description":"Unique identifier"},"event_result_id":{"type":"integer","format":"int64","description":"ID of the parent event result"},"name":{"type":"string","nullable":true,"description":"Name of the split (e.g., \"Mile 1\", \"Finish\")"},"position":{"type":"integer","description":"Order position (0-indexed)"},"is_finish":{"type":"boolean","description":"Whether this split represents the finish line"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-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_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. \`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":{"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","enum":["pace","speed"]},"time_precision":{"type":"string","enum":["full_second","tenth_of_second","hundredth_of_second"]},"last_place_celebration":{"type":"string","enum":["lanterne_rouge","dfl"]},"splits":{"type":"array","items":{"$ref":"#/components/schemas/RaceResultSplitInput"}}}},"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."},"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":"Distance to this split, in the result's distance unit."},"position":{"type":"integer","description":"1-based ordering of the split."}}},"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","time_precision","last_place_celebration","divisions_label","mapping","splits","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]},"time_precision":{"type":"string","nullable":true,"enum":["full_second","tenth_of_second","hundredth_of_second",null]},"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/EventResultSplit"}},"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."}}},"EventResultSplit":{"type":"object","description":"A split point within an event result. Each result must have at\nleast one split marked as the finish.\n","required":["id","event_result_id","name","position","is_finish","created_at","updated_at"],"properties":{"id":{"type":"integer","format":"int64","description":"Unique identifier"},"event_result_id":{"type":"integer","format":"int64","description":"ID of the parent event result"},"name":{"type":"string","nullable":true,"description":"Name of the split (e.g., \"Mile 1\", \"Finish\")"},"position":{"type":"integer","description":"Order position (0-indexed)"},"is_finish":{"type":"boolean","description":"Whether this split represents the finish line"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-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_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. `id` is the event result id.\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"}}}}}}}}}
````
