# Indoor Rowing API
> Indoor-rowing (Concept2 erg) maths as an API, computed locally and deterministically — the watts, split and calorie numbers a rower, coach or fitness app works a piece out with, using the published Concept2 relations. The split-to-watts endpoint turns a 500 m split into power: on an erg the power is fixed by the pace, not the stroke rate, so watts = 2.80 ÷ pace³ where the pace is the seconds per metre (the split ÷ 500) — a 2:00 split is about 202 W. Because power goes as the inverse cube of pace, small split gains cost a lot of watts: pulling 1:50 instead of 2:00 is roughly 270 W, not 220. The watts-to-split endpoint inverts it — pace = (2.80 ÷ watts)^(1/3), split = pace × 500 — so a target wattage maps to the split on the monitor and a rower's power compares directly with a cyclist's or any other watts figure. The calories endpoint applies the Concept2 calorie formula, Cal/hr = (watts × 4 × 0.8604) + 300, where the +300 is a fixed resting-metabolism term that makes the erg's count run higher than pure mechanical work; 200 W is about 988 Cal/hr, roughly 494 calories over 30 minutes. Everything is computed locally and deterministically, so it is instant and private. Ideal for rowing and erg training tools, coaching and leaderboard apps, and fitness calculators. Pure local computation — no key, no third-party service, instant. Concept2 model — a machine estimate, not lab calorimetry. 3 compute endpoints. For running pace use a pace API; for cycling a cycling API.

## Authentication
All requests require your oanor API key in the `x-oanor-key` header. Get one at https://www.oanor.com/developer/keys.

```bash
curl -H "x-oanor-key: oanor_live_…" "https://api.oanor.com/rowing-api/..."
```

## Pricing
- **Free** (Free) — 7,500 calls/Mo, 2 req/s
- **Starter** ($7/Mo) — 63,000 calls/Mo, 6 req/s
- **Pro** ($25/Mo) — 250,000 calls/Mo, 15 req/s
- **Mega** ($77/Mo) — 1,170,000 calls/Mo, 40 req/s

## Endpoints

### Rowing

#### `GET /v1/calories` — Calories from watts (Concept2)

**Parameters:**
- `watts` (query, required, string) — Power (watts) Example: `200`
- `duration_min` (query, optional, string) — Duration (minutes) for a total Example: `30`

**Example:**
```bash
curl -H "x-oanor-key: $KEY" \
  "https://api.oanor.com/rowing-api/v1/calories?watts=200&duration_min=30"
```

**Response:**
```json
{
    "data": {
        "note": "Concept2 estimates calories from power, not pace: Cal/hr = (watts × 4 × 0.8604) + 300. The +300 is a fixed resting-metabolism term, which is why even an easy paddle burns a baseline rate and why the erg's calorie count runs higher than pure mechanical work. 200 W is about 988 Cal/hr; over 30 minutes that is roughly 494 Cal. It is a machine estimate, not a substitute for indirect calorimetry.",
        "inputs": {
            "watts": 200,
            "duration_min": 30
        },
        "total_calories": 494.2,
        "calories_per_hour": 988.3
    },
    "meta": {
        "timestamp": "2026-06-07T08:17:52.585Z",
        "request_id": "bdbe1d6d-ddff-4fdb-b429-8aca94b0d5f8"
    },
    "status": "ok",
    "message": "Calories",
    "success": true
}
```

#### `GET /v1/split-to-watts` — Watts from a 500 m split

**Parameters:**
- `split_seconds_500m` (query, required, string) — 500 m split in seconds (e.g. 120 = 2:00) Example: `120`

**Example:**
```bash
curl -H "x-oanor-key: $KEY" \
  "https://api.oanor.com/rowing-api/v1/split-to-watts?split_seconds_500m=120"
```

**Response:**
```json
{
    "data": {
        "note": "On a Concept2 erg the power is fixed by the pace, not the rate: watts = 2.80 ÷ pace³, where the pace is the seconds taken per metre (the 500 m split ÷ 500). A 2:00 split (120 s / 500 m = 0.24 s/m) is about 202 W. Because power goes as the inverse cube of pace, small split improvements cost a lot of watts — pulling 1:50 instead of 2:00 is roughly 270 W, not 220.",
        "watts": 202.5,
        "inputs": {
            "split_seconds_500m": 120
        },
        "split_formatted": "2:00.0",
        "pace_seconds_per_m": 0.24
    },
    "meta": {
        "timestamp": "2026-06-07T08:17:52.685Z",
        "request_id": "e440ec6d-c84a-425a-97bf-3de606ce4422"
    },
    "status": "ok",
    "message": "Split to watts",
    "success": true
}
```

#### `GET /v1/watts-to-split` — 500 m split from watts

**Parameters:**
- `watts` (query, required, string) — Power (watts) Example: `202.5`

**Example:**
```bash
curl -H "x-oanor-key: $KEY" \
  "https://api.oanor.com/rowing-api/v1/watts-to-split?watts=202.5"
```

**Response:**
```json
{
    "data": {
        "note": "Inverting the power law gives the pace a target wattage holds: pace = (2.80 ÷ watts)^(1/3) seconds per metre, and the 500 m split = pace × 500. 200 W works out to about a 2:00.4 split. This is how an erg converts a watts target into the split shown on the monitor, and lets you compare a rower's power to a cyclist's or any other watts figure.",
        "inputs": {
            "watts": 202.5
        },
        "split_formatted": "2:00.0",
        "pace_seconds_per_m": 0.240018,
        "split_seconds_500m": 120.01
    },
    "meta": {
        "timestamp": "2026-06-07T08:17:52.781Z",
        "request_id": "80977b19-f273-47ec-8b36-aee6324466d0"
    },
    "status": "ok",
    "message": "Watts to split",
    "success": true
}
```

### Meta

#### `GET /v1/meta` — Spec

**Example:**
```bash
curl -H "x-oanor-key: $KEY" \
  "https://api.oanor.com/rowing-api/v1/meta"
```

**Response:**
```json
{
    "data": {
        "notes": "Seconds, watts, kcal. watts = 2.80/pace³ (pace = split/500 s/m); split = 500·(2.80/watts)^(1/3); Cal/hr = 4·watts·0.8604 + 300. Concept2 relations. For running pace use a pace API; for cycling a cycling API.",
        "service": "rowing-api",
        "endpoints": {
            "GET /v1/meta": "This document.",
            "GET /v1/calories": "Calories per hour (and total) from watts via the Concept2 formula.",
            "GET /v1/split-to-watts": "Power from a 500 m split (seconds).",
            "GET /v1/watts-to-split": "500 m split from a power in watts."
        },
        "description": "Indoor-rowing (Concept2 erg) maths: watts from a 500 m split, split from watts, and calories burned."
    },
    "meta": {
        "timestamp": "2026-06-07T08:17:52.857Z",
        "request_id": "19e5d389-7189-408a-a509-52be29b19d61"
    },
    "status": "ok",
    "message": "Meta",
    "success": true
}
```


---
Marketplace page: https://www.oanor.com/api/rowing-api
OpenAPI spec: https://www.oanor.com/api/rowing-api/openapi.json
