write scope, and every request body must be valid JSON sent with Content-Type: application/json.
Deleting needs a separate scope. The
DELETE routes require a Full access key, and they remove one row at a time by id. There are no bulk-clear operations. Every delete is undoable from the app. DELETE /v1/custom-metrics/{metricId} is the widest of them: it takes the metric’s whole history and any dashboard widget built on it. To stop a metric syncing without losing what it has collected, unbind it with POST /v1/custom-metrics/{metricId} and healthMetricKey: null instead.No AI-billed operations are available via the API. Coach responses and photo logging are not reachable here.
POST /v1/water: Log a water intake entry
Adds a water intake entry to your log. You can optionally supply a date to back-fill a previous day; without one, the entry is assigned to today in UTC. Bounds:amountMl must be between 1 and 5000 millilitres.
Request body
number
required
Volume of water to log in millilitres. Must be between 1 and 5000.
string
Calendar date to log the entry on, in
YYYY-MM-DD format. Defaults to today in UTC.POST /v1/food: Log a food entry
Adds a food item to your nutrition log. Onlyname and calories are required; the macro fields are optional but recommended for accurate daily totals. If you omit meal, the entry is filed under snack.
Request body
string
required
Name of the food or meal item.
number
required
Calorie count for this entry in kcal.
number
Protein content in grams.
number
Carbohydrate content in grams.
number
Fat content in grams.
string
Meal slot to assign this entry to. One of
breakfast, lunch, dinner, or snack. Defaults to snack.string
Calendar date to log the entry on, in
YYYY-MM-DD format. Defaults to today in UTC.POST /v1/weight: Log a body weight measurement
Records a body weight weigh-in. If a weigh-in already exists for the target date, this replaces it rather than creating a second entry, so it is safe to send an updated reading for the same day. Bounds:weightKg must be between 20 and 400 kilograms.
Request body
number
required
Body weight in kilograms. Must be between 20 and 400.
string
Calendar date to record the weigh-in on, in
YYYY-MM-DD format. Defaults to today in UTC.POST /v1/body-measurements: Write or correct a check-in
Writes any part of a day’s check-in, and corrects one that already exists. This is the endpoint to use when a scale reports more than a weight, or when you need to fix a single field on a day that already has an entry.POST /v1/weight remains the shortest path for a plain weigh-in.
Partial by design: only the fields you send change. Everything else on that date is left exactly as it was, including measurements, notes, and the progress photo. To blank a value, name it in clearFields; omitting a field never deletes it.
Request body
string
Calendar date of the check-in, in
YYYY-MM-DD format. Defaults to today in UTC.number
Body weight in kilograms. Between 20 and 500.
number
Body fat percentage. Between 1 and 75.
number
Waist circumference in centimetres. Between 1 and 300.
number
Hip circumference in centimetres. Between 1 and 300.
number
Chest circumference in centimetres. Between 1 and 300.
number
Arm circumference in centimetres. Between 1 and 300.
number
Thigh circumference in centimetres. Between 1 and 300.
number
Calf circumference in centimetres. Between 1 and 300.
number
Neck circumference in centimetres. Between 1 and 300.
number
Lean body mass in kilograms. Between 10 and 300.
number
Bone mass in kilograms. Between 0.5 and 20.
number
Basal metabolic rate in kcal per day. Between 500 and 6000.
string
Free-text note attached to the check-in. Up to 2,000 characters.
string[]
Names of fields to blank on this check-in, for values you cannot express as a number.
Correcting a check-in that came from Apple Health or Health Connect marks it as manual. A later phone sync then leaves that day alone rather than writing over your correction.
POST /v1/workouts: Log a workout session
Records a complete workout session including all exercises and their sets. You may include a total duration and a specific date; without a date the session is assigned to today in UTC. Limits:- Maximum 20 exercises per session.
- Maximum 30 sets per exercise.
- Maximum 2 sessions per calendar day. A third POST on the same date returns a
400with an explanation; it is not silently dropped.
Request body
object[]
required
Array of exercises performed in the session. Each object must include a
name and a sets array.string
required
Name of the exercise (for example
"Squat" or "Bench Press").object[]
required
Array of sets performed for this exercise. Each set must include
reps and may include weightKg.number
required
Number of repetitions completed in this set.
number
Load used for this set in kilograms. Omit for bodyweight exercises.
number
Total session duration in minutes. Optional.
string
Calendar date to assign the session to, in
YYYY-MM-DD format. Defaults to today in UTC.POST /v1/health/days/: Correct a day’s health reading
Pins one field of one day’s synced health readings to a figure you supply, and stops the phone overwriting it on the next sync. The date goes in the path; the field and its value go in the body.Request body
string
required
Which reading to correct. One of
sleepMinutes, steps, restingHeartRateBpm, hrvMs, or activeEnergyKcal.number | null
required
The corrected reading, in the metric’s stored unit. Pass
null to release the field, after which the next device sync owns it again.GET /v1/health/days also reports per day as manualFields.
Overrides are per field. Correcting a resting heart rate leaves the same day’s step count syncing normally.
POST /v1/custom-metrics: Define a custom metric
Creates a metric the user can track that OneRep has no built-in screen for: migraines, espressos, blood glucose, anything countable.Request body
string
required
Name of the metric. Up to 48 characters.
string
required
One of
body, nutrition, or training. For a metric with no healthMetricKey, this decides which Health dial it files under: body to Body, nutrition to Nutrition, training to Activity. A bound metric files by the catalogue group of the signal it reads and ignores this.string
required
How the app draws it.
counter for whole things tallied through the day, number for a figure typed once, toggle for did-it-or-not.string
required
Unit label, up to 16 characters.
string
One line about what the metric means. Up to 180 characters.
number
How much one tap adds. Between 0.01 and 10,000, defaulting to 1.
number
Optional daily target, between 0 and 1,000,000.
string
Colour the app draws it in:
food, water, workout, or progress. Defaults to progress.string
A key from
GET /v1/health/metrics, to have the health sync fill the metric in instead of the user typing it.POST /v1/custom-metrics/: Update a definition
Changes an existing metric’s definition while keeping every value logged against it. Renaming a metric, moving it to another tab, or changing its target does not cost the user their history. Only the fields you send change. The body takes the same fields as creation, all optional, plus two nullable ones:number | null
New daily target, or
null to drop the target entirely.string | null
A new catalogue key, or
null to unbind the metric from the health sync. Unbinding leaves the values already stored alone.POST /v1/custom-metrics//values: Set a day’s value
Writes one metric’s value for one date, replacing whatever was there.Request body
number | null
required
The figure to record, or
null to clear the day.string
Calendar date, in
YYYY-MM-DD format. Defaults to today in UTC.The day is marked as typed, so a metric bound to the health sync keeps your figure rather than having it overwritten on the next sync. Sending
value: null clears the day and hands a bound metric back to the health store. Clearing a day that holds nothing is an error, not a silent success.POST /v1/rest-days: Mark dates as rest days
Marks one or more calendar dates as planned rest days. You can submit up to 31 dates in a single request, which makes it easy to pre-schedule a full month at once. Limit: Maximum 31 dates per request.Request body
string[]
required
Array of calendar dates to mark as rest days, each in
YYYY-MM-DD format. Maximum 31 entries per request.