BETTERMENU
Studio

Confirm and save ingredients

Step 2 of the resolve → confirm workflow. Takes a resolution_id from a prior startIngredientResolution call. Validates all rows are resolved, then saves as recipe ingredients. Returns 404 if resolution not found, 409 if already confirmed, 422 if rows are unresolved or ingredient IDs are stale.

POST
/studio/recipes/{recipe_id}/ingredient-resolutions/confirm

Path Parameters

recipe_id*Recipe Id

Header Parameters

If-Match*string

Optimistic-concurrency token. Pass the version_id returned by the previous mutation (or by GET /recipes/{id}/versions) so the server can reject the request when another writer has advanced the recipe in the meantime. A stale token (header present but HEAD has moved) surfaces HTTP 409 with the current version_id in the response body. An absent token on a versioned recipe surfaces HTTP 412. Only consumed on API versions that declare the recipe_versioning capability — older versions ignore the header.

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

resolution_id*Resolution Id

The resolution_id to confirm and save as recipe ingredients.

Response Body

application/json

application/json

application/json

curl -X POST "https://api.bettermenu.live/studio/recipes/string/ingredient-resolutions/confirm" \  -H "If-Match: string" \  -H "Content-Type: application/json" \  -d '{    "resolution_id": "ireslv_01H8X3K9Q2YV0J7M5R6N4P3T2W"  }'
{
  "data": {
    "recipe_id": "string",
    "resolution_id": "string",
    "ingredients": [
      {
        "id": "string",
        "original_text": "string",
        "parsed_quantity": 0,
        "parsed_unit": "string",
        "parsed_ingredient_name": "string",
        "selected_ingredient_id": "string",
        "selected_ingredient_name": "string",
        "metric_quantity_g": 0
      }
    ],
    "ingredient_conversions": [
      {
        "conversion_source": "string",
        "reasoning": "string",
        "portion_reference": {
          "portion_bmid": "string",
          "measure_unit_name": "string",
          "gram_weight": "string",
          "amount": "string"
        }
      }
    ],
    "ingredient_resolutions": [
      {
        "original_text": "string",
        "parsed": {
          "quantity_text": "string",
          "quantity": 0,
          "unit": "string",
          "ingredient_name": "string"
        },
        "converted": {
          "quantity": 0,
          "unit": "string",
          "steps": [
            {
              "from_quantity": 0,
              "from_unit": "string",
              "to_quantity": 0,
              "to_unit": "string",
              "source": "string",
              "reasoning": "string"
            }
          ]
        },
        "matches": {
          "query_text": "string",
          "candidates": [
            {
              "ingredient_id": "string",
              "ingredient_name": "string"
            }
          ],
          "selected_match": {
            "ingredient_id": "string",
            "ingredient_name": "string"
          },
          "match_confidence": 0,
          "search_strategy_used": "standard"
        }
      }
    ],
    "updated_at": "string"
  },
  "meta": {
    "version": "string",
    "request_id": "string",
    "timestamp": "string"
  },
  "version_id": "string"
}
{
  "type": "https://api.bettermenu.com/errors/recipe_not_found",
  "title": "Recipe Not Found",
  "status": 400,
  "detail": "Recipe rcpe_abc123 does not exist",
  "code": "recipe_not_found",
  "retryable": true,
  "instance": "/api/v1/recipes/rcpe_abc123",
  "trace_id": "req_xyz789",
  "errors": [
    {}
  ],
  "invalid_ids": [
    "f_abc123",
    "f_xyz789"
  ]
}
Empty
Empty
{
  "type": "https://api.bettermenu.com/errors/recipe_not_found",
  "title": "Recipe Not Found",
  "status": 400,
  "detail": "Recipe rcpe_abc123 does not exist",
  "code": "recipe_not_found",
  "retryable": true,
  "instance": "/api/v1/recipes/rcpe_abc123",
  "trace_id": "req_xyz789",
  "errors": [
    {}
  ],
  "invalid_ids": [
    "f_abc123",
    "f_xyz789"
  ]
}