BETTERMENU
Studio

Suggest Added Sugars Answers

Suggests an answer for each requested open Added Sugars row of the recipe and saves the suggestions on the report in ONE new version, for a person to accept, edit or override. A suggestion is a proposal: it appears on the row as suggested and counts in the report's readiness.suggested_rows, and no row is answered until a person accepts it (accept_suggestion). Rows a person has already answered are never changed. A row that already carries a current suggestion is returned as it is (already_suggested_row_ids) and not run, saved or charged again, so asking twice costs once; send refresh: true to replace it. The response is the updated report in the shape of reading it, with suggested_row_ids, left_open and config_version in data.

Rows beyond the request's allowance, rows whose food record could not be found and rows no suggestion settled get no suggestion and are returned in left_open for the person to answer. When no row gets a suggestion nothing is saved and version_id is the current version.

Every row is named by its ingredient row id (irow_...), the id of one ingredient row of this recipe and the id used to answer that row.

Send the recipe's current version_id in the If-Match header. A stale token is refused before any suggestion is made or charged.

The operation is served only while suggestions are switched on; otherwise it answers 403 suggester_not_enabled.

You are charged one credit per row that returns a confident or unsure suggestion that was saved. Rows left open, and rows that need a value from the supplier, are not charged.

POST
/studio/recipes/{recipe_id}/added-sugars-report/suggestions

Path Parameters

recipe_id*Recipe Id

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

application/json

curl -X POST "https://api.bettermenu.live/studio/recipes/string/added-sugars-report/suggestions" \  -H "If-Match: string" \  -H "Content-Type: application/json" \  -d '{    "ingredient_row_ids": [      "string"    ]  }'
{
  "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",
    "suggested_row_ids": [
      "string"
    ],
    "already_suggested_row_ids": [
      "string"
    ],
    "left_open": [
      "string"
    ],
    "config_version": 0
  },
  "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"
  ]
}
{
  "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