BETTERMENU
Studio

Answer One Added Sugars Row

Records your answer for one ingredient row of the recipe's Added Sugars report and returns the updated report in the same shape as reading it: data holds report, report_hash (the value confirming this report needs) and confirmation, and version_id is the new version. The row is named by its ingredient row id (irow_...), the id of one ingredient row of this recipe: two rows of one food have two row ids.

The action is one of accept_suggestion, set_contribution, add_contribution, remove_contribution or keep. For set_contribution and add_contribution give the amount either as added_sugars_grams (grams in this row at its current quantity) or as added_sugars_per_100g (grams per 100 g of the ingredient), never both: the server turns per-100 g into row grams at the row's current quantity. Each row of the report also carries the counted amount per 100 g (added_sugars_per_100g) so you never divide. A reason and a supplier_reference are optional on every action. Your answer is kept as you gave it, with the row's quantity at the time, the person and the channel. The row's counted grams, the totals, the declarations and the findings are recomputed from it.

An answer that puts a row's, the batch's or a serving's added sugars above its total sugars is rejected and nothing is saved. Nothing is ever lowered to fit.

Every answer saves one new version of the recipe, so an earlier confirmation of the report no longer applies and the Added Sugars line is taken off the recipe's nutrition and labels until the new report is confirmed. Send the recipe's current version_id in the If-Match header.

PATCH
/studio/recipes/{recipe_id}/added-sugars-report/rows/{ingredient_row_id}

Path Parameters

recipe_id*Recipe Id
ingredient_row_id*Ingredient Row Id

Ingredient row id (irow_...) of the row to answer, as the report names it.

Match^irow_[a-z0-9]{21}$
Length26 <= length <= 26

Header Parameters

If-Match*string

The recipe's current version_id: the one the last change to this recipe returned, or the one reading the recipe returns (get_recipe). A stale value is refused with the current version_id; read the recipe again and retry.

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

application/json

curl -X PATCH "https://api.bettermenu.live/studio/recipes/string/added-sugars-report/rows/stringstringstringstringst" \  -H "If-Match: string" \  -H "Content-Type: application/json" \  -d '{    "action": "accept_suggestion"  }'
{
  "data": {
    "report": {
      "market": "US",
      "engine": {
        "regulatory_package_version": "string",
        "suggester_allowed": true,
        "suggester_used": true,
        "suggester_prompt_version": "string"
      },
      "determination": {
        "basis": "batch",
        "reference_weight_grams": "string",
        "rows": [
          {
            "ingredient_row_id": "stringstringstringstringst",
            "ingredient": {
              "ingredient_id": "string",
              "custom_ingredient_id": "stringstringstringstringst",
              "custom_ingredient_version_id": "string",
              "name": "string",
              "quantity_grams": "string",
              "total_sugars_per_100g": "string",
              "total_sugars_grams": "string"
            },
            "derived": {
              "resolution": "settled",
              "path": [
                {
                  "question": "string",
                  "answer": "yes",
                  "docs_url": "string"
                }
              ],
              "contributes": true,
              "factor": "string",
              "added_sugars_grams": "string",
              "settled_by": "data_check",
              "open_reasons": [
                "sugars_missing"
              ],
              "citation": {
                "authority": "regulation",
                "cite": "string",
                "quote": "string"
              },
              "added_sugars_per_100g": "string"
            },
            "suggested": {
              "by": "suggester",
              "confidence": "confident",
              "added_sugars_grams": "string",
              "quantity_grams_when_entered": "string",
              "reason": "string",
              "citation": {
                "authority": "regulation",
                "cite": "string",
                "quote": "string"
              },
              "provenance": {
                "model": "string",
                "fallback_model_used": true,
                "prompt_version": "string",
                "config_version": 0,
                "settled_by_stage": "string"
              },
              "question": "string",
              "added_sugars_per_100g": "string"
            },
            "caller": {
              "action": "accept_suggestion",
              "added_sugars_grams": "string",
              "quantity_grams_when_entered": "string",
              "entered_added_sugars_per_100g": "string",
              "reason": "string",
              "supplier_reference": "string",
              "actor": {
                "type": "member",
                "id": "string"
              },
              "channel": "studio",
              "at": "2019-08-24T14:15:22Z"
            },
            "effective": {
              "added_sugars_grams": "string",
              "source": "data_check",
              "added_sugars_per_100g": "string"
            },
            "checks": [
              {
                "id": "sugar_data",
                "status": "ok",
                "summary": "string",
                "why_it_matters": "string",
                "citation": {
                  "authority": "regulation",
                  "cite": "string",
                  "quote": "string"
                },
                "docs_url": "string"
              }
            ]
          }
        ],
        "totals": {
          "added_sugars_grams": "string",
          "total_sugars_grams": "string"
        },
        "declarations": [
          {
            "serving_id": "stringstringstringstrings",
            "serving_description": "string",
            "servings_per_container": "string",
            "added_sugars_grams_per_serving": "string",
            "total_sugars_grams_per_serving": "string",
            "declared_grams": {
              "outcome": "zero",
              "value": "string"
            },
            "total_sugars_declared_grams": {
              "outcome": "zero",
              "value": "string"
            },
            "population": "adults_and_children_over_4",
            "drv_grams": "string",
            "percent_dv": "string",
            "dv_basis": "unrounded_amount"
          }
        ],
        "findings": [
          {
            "code": "row_added_sugar_invalid",
            "row_id": "string",
            "serving_id": "string"
          }
        ]
      },
      "presentation": {
        "readiness": {
          "total_rows": 0,
          "settled_rows": 0,
          "suggested_rows": 0,
          "open_rows": 0,
          "ready_to_confirm": true
        },
        "unresolved_rows": [
          "stringstringstringstringst"
        ],
        "total_sugars_complete": true,
        "rows_without_total_sugars": [
          "stringstringstringstringst"
        ]
      },
      "checks": [
        {
          "id": "sugar_data",
          "status": "ok",
          "summary": "string",
          "why_it_matters": "string",
          "citation": {
            "authority": "regulation",
            "cite": "string",
            "quote": "string"
          },
          "docs_url": "string"
        }
      ]
    },
    "report_hash": "string",
    "confirmation": "confirmed"
  },
  "meta": {
    "version": "string",
    "request_id": "string",
    "timestamp": "string"
  },
  "version_id": "string"
}
{
  "type": "https://api.bettermenu.live/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"
  ]
}
{
  "type": "https://api.bettermenu.live/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
{
  "type": "https://api.bettermenu.live/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"
  ]
}
BETTERMENU

FDA-compliant nutrition labels from a recipe, in minutes.

Visit bettermenu.live