---
title: "Add a race or goal"
method: POST
path: "/events"
tags: ["Events"]
---

# Add a race or goal

`POST /events`

## Request

- Base URL: `https://bodylab.lol/api/v1`
- URL: `https://bodylab.lol/api/v1/events`
- Auth: HTTP bearer

Bounded, whoever is writing: no more than 800 days ahead or a day back (OUT_OF_HORIZON, 400), at most two events of one sport in any sixty days (DATE_OCCUPIED, 409), and at most 150 events on the calendar (SCHEDULE_FULL, 409 — waiting does not help; remove one). A connected app is also held to a rolling per-app quota (QUOTA_EXCEEDED, 429, with `retryAfterS`); the athlete's own session is not.

## Headers

- `X-Client-Platform` string
- `X-Client-Version` string

## Request body

- object
  - `name` string, required
  - `eventDate` string, date, required: A day on the athlete's own calendar: YYYY-MM-DD, no time zone.
  - `sport` string, required: Sport, from the engine's vocabulary (packages/engine/src/sports.ts), e.g. road_biking, running, hiking, strength_training. Known values: road_biking, running, hiking, strength_training, other. Treat unknown values as "other".
  - `priority` 'A' | 'B' | 'C', required
  - `distanceM` number, nullable
  - `durationS` integer, nullable
  - `notes` string

## Response `201`

OK

- object
  - `id` string, required: Opaque identifier.

## Other responses

- `400`: Error: OUT_OF_HORIZON.
- `401`: Error: UNAUTHORIZED.
- `409`: Error: DATE_OCCUPIED, SCHEDULE_FULL.
- `429`: Error: QUOTA_EXCEEDED.

---

[API](https://skmtc.dev/bodylab/apis/body-lab-api.md) · [All operations](https://skmtc.dev/bodylab/apis/body-lab-api/llms.txt) · [OpenAPI document](https://skmtc.dev/bodylab/apis/body-lab-api/revisions/544c201eaf88?raw)
