---
title: "Log a new variant, preserving the original"
method: POST
path: "/v1/meal-variants"
tags: ["meal-variants"]
---

# Log a new variant, preserving the original

`POST /v1/meal-variants`

## Request

- Base URL: `http://localhost:4318`
- URL: `http://localhost:4318/v1/meal-variants`
- Auth: HTTP bearer

## Headers

- `Idempotency-Key` string, required

## Request body

- object
  - `base` union, required
    - object
      - `kind` 'meal', required
      - `id` string, uuid, required
      - `expectedRevision` integer, required
    - object
      - `kind` 'saved', required
      - `id` string, uuid, required
  - `title` string, required
  - `eatenAt` string, date-time, required
  - `mealType` 'breakfast' | 'lunch' | 'dinner' | 'snack', required
  - `description` string, required
  - `removeItemIds` string[]
  - `replacements` object[]
    - `itemId` string, required
    - `ingredient` union, required
      - object
        - `foodId` string, required
        - `grams` number, required
      - object
        - `item` object, required
          - `calories` number, required
          - `protein` number, required
          - `carbs` number, required
          - `fat` number, required
          - `id` string, required
          - `name` string, required
          - `grams` number, nullable, required
          - `preparation` string
          - `emoji` string
          - `source` string, required
          - `sourceUrl` string, uri
          - `basis` 'database' | 'estimate' | 'measured', required
          - `calorieLow` number, required
          - `calorieHigh` number, required
  - `portions` object[]
    - `itemId` string, required
    - `multiplier` number, required
  - `additions` union[]
    - union
      - object
        - `foodId` string, required
        - `grams` number, required
      - object
        - `item` object, required
          - `calories` number, required
          - `protein` number, required
          - `carbs` number, required
          - `fat` number, required
          - `id` string, required
          - `name` string, required
          - `grams` number, nullable, required
          - `preparation` string
          - `emoji` string
          - `source` string, required
          - `sourceUrl` string, uri
          - `basis` 'database' | 'estimate' | 'measured', required
          - `calorieLow` number, required
          - `calorieHigh` number, required
  - `assumptions` string[]

## Response `201`

Success

- Meal
  - `title` string, required
  - `items` object[], required
    - `calories` number, required
    - `protein` number, required
    - `carbs` number, required
    - `fat` number, required
    - `id` string, required
    - `name` string, required
    - `grams` number, nullable, required
    - `preparation` string
    - `emoji` string
    - `source` string, required
    - `sourceUrl` string, uri
    - `basis` 'database' | 'estimate' | 'measured', required
    - `calorieLow` number, required
    - `calorieHigh` number, required
  - `confidence` 'high' | 'medium' | 'low' | 'measured', required
  - `assumptions` string[], required
  - `id` string, uuid, required
  - `eatenAt` string, date-time, required
  - `description` string, required
  - `mealType` 'breakfast' | 'lunch' | 'dinner' | 'snack', required
  - `source` string, required
  - `revision` integer, required
  - `calories` number, required
  - `protein` number, required
  - `carbs` number, required
  - `fat` number, required
  - `calorieLow` number, required
  - `calorieHigh` number, required

## Other responses

- `400`: Invalid input
- `401`: Missing or invalid bearer token
- `409`: Revision or idempotency conflict
- `429`: Rate limit exceeded

---

[API](https://skmtc.dev/nibb/apis/nibb-api.md) · [All operations](https://skmtc.dev/nibb/apis/nibb-api/llms.txt) · [OpenAPI document](https://skmtc.dev/nibb/apis/nibb-api/revisions/75bcd8b761ed?raw)
