{
  "openapi": "3.1.0",
  "jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
  "info": {
    "title": "Fiest Partner API",
    "version": "0.3.0",
    "summary": "Restaurant operations, accounting, orders, and guarded menu editing for approved Fiest integrations.",
    "description": "The Fiest Partner API gives reviewed integrations scoped access to restaurants explicitly approved by a Fiest owner or administrator. Public operations include restaurant, accounting, sold-order, menu, and catalog capabilities. Menu changes require separately granted write scopes, UUID-backed public identifiers, optimistic versions, and the documented draft-only safety checks. Access uses OAuth 2.1 authorization code with PKCE and audience-bound bearer tokens.\n\n## Versioning and deprecation\n\nEvery operation lives under `/v1`. The version is below 1.0, so the contract can still change in ways that break a client. Fiest registers every partner client and tells the affected partners before a breaking change ships, and lists it at https://docs.fiest.io/api/versioning. There is no promised notice period. New operations, new optional request fields, new response fields and new error codes can appear at any time; ignore what you do not know. A version or operation scheduled for removal sends `Deprecation` (RFC 9745), `Sunset` (RFC 8594) and a `Link` with `rel=\"deprecation\"` on every response until it stops answering, so a client can notice at runtime.\n\n## Rate limiting\n\nEach partner client gets 60 requests per 60 seconds for each authorizing user. Every response says so in `RateLimit-Policy` (`\"partner\";q=60;w=60`). Past the limit the API answers 429 `rate_limited` with `RateLimit` and `Retry-After`. Wait that many seconds, then retry.",
    "termsOfService": "https://fiest.io/terms",
    "contact": {
      "name": "Fiest integrations",
      "email": "support@fiest.io",
      "url": "https://docs.fiest.io/api"
    },
    "license": {
      "name": "Proprietary",
      "url": "https://fiest.io/terms"
    }
  },
  "externalDocs": {
    "description": "Fiest API guides",
    "url": "https://docs.fiest.io/api"
  },
  "servers": [
    {
      "url": "https://api-sandbox.fiest.io",
      "description": "Current environment"
    }
  ],
  "tags": [
    {
      "name": "Restaurants",
      "description": "Restaurants included in the current restaurant or Management organization authorization."
    },
    {
      "name": "Accounting",
      "description": "Bounded accounting summaries with sales, VAT, refunds, payment methods, and reconciliation."
    },
    {
      "name": "Orders",
      "description": "Bounded operational order search and exact sold-line details using opaque external identifiers."
    },
    {
      "name": "Menus",
      "description": "List menus, create inactive drafts, attach existing items, and deliberately publish reviewed menus."
    },
    {
      "name": "Catalog import",
      "description": "Validate and apply bounded create-only catalog imports without automatically publishing the resulting draft."
    }
  ],
  "security": [
    {
      "fiestOAuth": [
        "fiest.restaurant.read"
      ]
    }
  ],
  "paths": {
    "/v1/restaurants": {
      "get": {
        "x-fiest-visibility": "public",
        "x-fiest-conditional-scopes": {
          "organization": [
            "fiest.organization.read"
          ]
        },
        "operationId": "listRestaurants",
        "summary": "List authorized restaurants",
        "description": "Returns one restaurant for a restaurant authorization or the reviewed restaurant snapshot for a Management organization authorization. Organization responses report whether newly added restaurants require reauthorization and organization-boundary tokens also require fiest.organization.read.",
        "tags": [
          "Restaurants"
        ],
        "externalDocs": {
          "description": "Authorize a Partner API connection",
          "url": "https://docs.fiest.io/api/quickstart"
        },
        "security": [
          {
            "fiestOAuth": [
              "fiest.restaurant.read"
            ]
          }
        ],
        "responses": {
          "200": {
            "description": "The restaurants currently covered by the authorization.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RestaurantListResponse"
                },
                "examples": {
                  "restaurantAuthorization": {
                    "summary": "Single-restaurant authorization",
                    "value": {
                      "data": [
                        {
                          "restaurantId": "11111111-1111-4111-8111-111111111111",
                          "restaurantName": "Fiest Sandbox Helsinki",
                          "role": "owner"
                        }
                      ],
                      "meta": {
                        "authorization_boundary": "restaurant"
                      }
                    }
                  },
                  "organizationAuthorization": {
                    "summary": "Management organization authorization",
                    "value": {
                      "data": [
                        {
                          "restaurantId": "11111111-1111-4111-8111-111111111111",
                          "restaurantName": "Fiest Sandbox Helsinki",
                          "businessIdentity": {
                            "registeredName": "Fiest Sandbox Restaurants Oy",
                            "businessId": "1234567-8"
                          }
                        },
                        {
                          "restaurantId": "22222222-2222-4222-8222-222222222222",
                          "restaurantName": "Fiest Sandbox Tampere",
                          "businessIdentity": {
                            "registeredName": "Fiest Sandbox Tampere Oy",
                            "businessId": "2345678-9"
                          }
                        }
                      ],
                      "meta": {
                        "authorization_boundary": "organization",
                        "restaurants_truncated": false,
                        "authorization_coverage": {
                          "authorized_restaurant_count": 2,
                          "current_restaurant_count": 2,
                          "additional_restaurant_count": 0,
                          "reauthorization_available": false
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "The access token is missing, invalid, or expired.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              },
              "WWW-Authenticate": {
                "schema": {
                  "type": "string"
                },
                "description": "OAuth bearer challenge and protected-resource metadata. Present for token and scope failures; other responses with the same status can omit it."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "invalidToken": {
                    "summary": "Missing or invalid access token",
                    "value": {
                      "error": "invalid_token",
                      "error_description": "The access token is invalid.",
                      "request_id": "req_sandbox_invalid_token"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "The authorization has expired or does not include the required scope.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              },
              "WWW-Authenticate": {
                "schema": {
                  "type": "string"
                },
                "description": "OAuth bearer challenge and protected-resource metadata. Present for token and scope failures; other responses with the same status can omit it."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "insufficientScope": {
                    "summary": "Required scope is missing",
                    "value": {
                      "error": "insufficient_scope",
                      "error_description": "The operation requires an OAuth scope that is not granted.",
                      "request_id": "req_sandbox_insufficient_scope"
                    }
                  },
                  "organizationScopeMissing": {
                    "summary": "Organization scope is missing",
                    "value": {
                      "error": "insufficient_scope",
                      "error_description": "Organization read access is required.",
                      "request_id": "req_sandbox_organization_scope_missing"
                    }
                  },
                  "authorizationExpired": {
                    "summary": "Authorization no longer resolves an accessible restaurant",
                    "value": {
                      "error": "authorization_expired",
                      "request_id": "req_sandbox_authorization_expired"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "The partner request limit has been exceeded.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              },
              "RateLimit": {
                "schema": {
                  "type": "string"
                },
                "description": "The exhausted quota in the IETF RateLimit syntax (`\"name\";r=<remaining>;t=<seconds until reset>`). Sent only with 429; `r` is always 0 and `t` equals Retry-After."
              },
              "Retry-After": {
                "schema": {
                  "type": "integer",
                  "minimum": 1
                },
                "description": "Seconds to wait before retrying."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "rateLimited": {
                    "summary": "Partner request limit exceeded",
                    "value": {
                      "error": "rate_limited",
                      "request_id": "req_sandbox_rate_limited"
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "The API or one of its required services is unavailable.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "serviceUnavailable": {
                    "summary": "Temporary service failure",
                    "value": {
                      "error": "service_unavailable",
                      "request_id": "req_sandbox_service_unavailable"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/restaurants/{restaurantId}": {
      "get": {
        "x-fiest-visibility": "public",
        "x-fiest-conditional-scopes": {
          "organization": [
            "fiest.organization.read"
          ]
        },
        "operationId": "getRestaurant",
        "summary": "Get a restaurant profile",
        "description": "Returns general restaurant information. A restaurant outside the current authorization is returned as not found. Organization-boundary tokens also require fiest.organization.read.",
        "tags": [
          "Restaurants"
        ],
        "externalDocs": {
          "description": "Authorize a Partner API connection",
          "url": "https://docs.fiest.io/api/quickstart"
        },
        "security": [
          {
            "fiestOAuth": [
              "fiest.restaurant.read"
            ]
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/RestaurantId"
          }
        ],
        "responses": {
          "200": {
            "description": "The authorized restaurant profile.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/RestaurantProfile"
                    }
                  }
                },
                "example": {
                  "data": {
                    "restaurantId": "11111111-1111-4111-8111-111111111111",
                    "restaurantName": "Fiest Sandbox Helsinki",
                    "businessIdentity": {
                      "registeredName": "Fiest Sandbox Restaurants Oy",
                      "businessId": "1234567-8"
                    },
                    "countryCode": "FI",
                    "joinedAt": "2025-01-15T09:00:00.000Z",
                    "firstCompletedOrderAt": "2025-01-16T10:32:00.000Z",
                    "lastCompletedOrderAt": "2026-07-30T18:42:00.000Z",
                    "timeZone": "Europe/Helsinki",
                    "businessDayStartHour": 4,
                    "scheduleEnabled": true,
                    "openingHours": [
                      {
                        "day": "monday",
                        "isClosed": false,
                        "shifts": [
                          {
                            "openTime": "10:30",
                            "closeTime": "22:00",
                            "spansNextDay": false
                          }
                        ]
                      },
                      {
                        "day": "tuesday",
                        "isClosed": false,
                        "shifts": [
                          {
                            "openTime": "10:30",
                            "closeTime": "22:00",
                            "spansNextDay": false
                          }
                        ]
                      },
                      {
                        "day": "wednesday",
                        "isClosed": false,
                        "shifts": [
                          {
                            "openTime": "10:30",
                            "closeTime": "22:00",
                            "spansNextDay": false
                          }
                        ]
                      },
                      {
                        "day": "thursday",
                        "isClosed": false,
                        "shifts": [
                          {
                            "openTime": "10:30",
                            "closeTime": "23:00",
                            "spansNextDay": false
                          }
                        ]
                      },
                      {
                        "day": "friday",
                        "isClosed": false,
                        "shifts": [
                          {
                            "openTime": "10:30",
                            "closeTime": "01:00",
                            "spansNextDay": true
                          }
                        ]
                      },
                      {
                        "day": "saturday",
                        "isClosed": false,
                        "shifts": [
                          {
                            "openTime": "12:00",
                            "closeTime": "01:00",
                            "spansNextDay": true
                          }
                        ]
                      },
                      {
                        "day": "sunday",
                        "isClosed": true,
                        "shifts": []
                      }
                    ],
                    "openingHoursTruncated": false,
                    "paymentProviders": [
                      {
                        "provider": "sumup",
                        "connectedAt": "2025-01-15T10:00:00.000Z",
                        "activeForPos": true,
                        "preferredForOnline": false
                      }
                    ],
                    "paymentProvidersTruncated": false
                  }
                }
              }
            }
          },
          "400": {
            "description": "The request parameters are invalid.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "invalidRequest": {
                    "summary": "Invalid request parameters",
                    "value": {
                      "error": "invalid_request",
                      "message": "The requested date range is invalid.",
                      "request_id": "req_sandbox_invalid_request"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "The access token is missing, invalid, or expired.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              },
              "WWW-Authenticate": {
                "schema": {
                  "type": "string"
                },
                "description": "OAuth bearer challenge and protected-resource metadata. Present for token and scope failures; other responses with the same status can omit it."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "invalidToken": {
                    "summary": "Missing or invalid access token",
                    "value": {
                      "error": "invalid_token",
                      "error_description": "The access token is invalid.",
                      "request_id": "req_sandbox_invalid_token"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "The authorization has expired or does not include the required scope.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              },
              "WWW-Authenticate": {
                "schema": {
                  "type": "string"
                },
                "description": "OAuth bearer challenge and protected-resource metadata. Present for token and scope failures; other responses with the same status can omit it."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "insufficientScope": {
                    "summary": "Required scope is missing",
                    "value": {
                      "error": "insufficient_scope",
                      "error_description": "The operation requires an OAuth scope that is not granted.",
                      "request_id": "req_sandbox_insufficient_scope"
                    }
                  },
                  "organizationScopeMissing": {
                    "summary": "Organization scope is missing",
                    "value": {
                      "error": "insufficient_scope",
                      "error_description": "Organization read access is required.",
                      "request_id": "req_sandbox_organization_scope_missing"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "The restaurant does not exist or is outside the authorization.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "notFound": {
                    "summary": "Resource is outside the authorization",
                    "value": {
                      "error": "not_found",
                      "request_id": "req_sandbox_not_found"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "The partner request limit has been exceeded.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              },
              "RateLimit": {
                "schema": {
                  "type": "string"
                },
                "description": "The exhausted quota in the IETF RateLimit syntax (`\"name\";r=<remaining>;t=<seconds until reset>`). Sent only with 429; `r` is always 0 and `t` equals Retry-After."
              },
              "Retry-After": {
                "schema": {
                  "type": "integer",
                  "minimum": 1
                },
                "description": "Seconds to wait before retrying."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "rateLimited": {
                    "summary": "Partner request limit exceeded",
                    "value": {
                      "error": "rate_limited",
                      "request_id": "req_sandbox_rate_limited"
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "The API or one of its required services is unavailable.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "serviceUnavailable": {
                    "summary": "Temporary service failure",
                    "value": {
                      "error": "service_unavailable",
                      "request_id": "req_sandbox_service_unavailable"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/restaurants/{restaurantId}/accounting-summary": {
      "get": {
        "x-fiest-visibility": "public",
        "x-fiest-conditional-scopes": {
          "organization": [
            "fiest.organization.read"
          ]
        },
        "operationId": "getAccountingSummary",
        "summary": "Get an accounting summary",
        "description": "Returns a reconciled accounting summary for an inclusive business-date range of at most 31 days. All monetary values use integer euro cents. Organization-boundary tokens also require fiest.organization.read.",
        "tags": [
          "Accounting"
        ],
        "externalDocs": {
          "description": "Authorize a Partner API connection",
          "url": "https://docs.fiest.io/api/quickstart"
        },
        "security": [
          {
            "fiestOAuth": [
              "fiest.restaurant.read",
              "fiest.accounting.read"
            ]
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/RestaurantId"
          },
          {
            "name": "start_date",
            "in": "query",
            "required": true,
            "description": "First restaurant business date, inclusive.",
            "schema": {
              "type": "string",
              "format": "date"
            },
            "example": "2026-07-01"
          },
          {
            "name": "end_date",
            "in": "query",
            "required": true,
            "description": "Last restaurant business date, inclusive. It cannot be in the future, and the range may contain at most 31 days.",
            "schema": {
              "type": "string",
              "format": "date"
            },
            "example": "2026-07-27"
          }
        ],
        "responses": {
          "200": {
            "description": "The reconciled accounting summary.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/AccountingSummary"
                    }
                  }
                },
                "example": {
                  "data": {
                    "restaurantId": "11111111-1111-4111-8111-111111111111",
                    "period": {
                      "startDate": "2026-01-01",
                      "endDate": "2026-01-31",
                      "timeZone": "Europe/Helsinki",
                      "dayStartHour": 4
                    },
                    "currency": "EUR",
                    "totals": {
                      "grossBeforeRefundsMinor": 4417630,
                      "refundsMinor": 9630,
                      "grossSalesMinor": 4408000,
                      "netSalesMinor": 3769568,
                      "vatMinor": 638432,
                      "discountsMinor": 21400,
                      "tipsMinor": 12800,
                      "deferredGiftCardSalesMinor": 65000,
                      "orderCount": 728,
                      "paymentTransactionCount": 728
                    },
                    "paymentMethods": [
                      {
                        "key": "card",
                        "label": "Card",
                        "transactionCount": 459,
                        "grossBeforeRefundsMinor": 2800000,
                        "refundsMinor": 5000,
                        "grossSalesMinor": 2795000,
                        "netSalesMinor": 2390000,
                        "vatMinor": 405000
                      },
                      {
                        "key": "cash",
                        "label": "Cash",
                        "transactionCount": 132,
                        "grossBeforeRefundsMinor": 800000,
                        "refundsMinor": 1630,
                        "grossSalesMinor": 798370,
                        "netSalesMinor": 690000,
                        "vatMinor": 108370
                      },
                      {
                        "key": "online",
                        "label": "Online",
                        "transactionCount": 90,
                        "grossBeforeRefundsMinor": 600000,
                        "refundsMinor": 3000,
                        "grossSalesMinor": 597000,
                        "netSalesMinor": 510000,
                        "vatMinor": 87000
                      },
                      {
                        "key": "edenred",
                        "label": "Edenred",
                        "transactionCount": 47,
                        "grossBeforeRefundsMinor": 217630,
                        "refundsMinor": 0,
                        "grossSalesMinor": 217630,
                        "netSalesMinor": 179568,
                        "vatMinor": 38062
                      }
                    ],
                    "vatBreakdown": [
                      {
                        "category": "reduced",
                        "label": "14%",
                        "rateBasisPoints": 1400,
                        "grossSalesMinor": 3200000,
                        "netSalesMinor": 2807018,
                        "vatMinor": 392982
                      },
                      {
                        "category": "standard",
                        "label": "25.5%",
                        "rateBasisPoints": 2550,
                        "grossSalesMinor": 1208000,
                        "netSalesMinor": 962550,
                        "vatMinor": 245450
                      }
                    ],
                    "reconciliation": {
                      "paymentGrossMinor": 4408000,
                      "salesGrossMinor": 4408000,
                      "differenceMinor": 0,
                      "paymentVatMinor": 638432,
                      "salesVatMinor": 638432,
                      "vatDifferenceMinor": 0,
                      "balanced": true,
                      "exactTenderRefundsMinor": 9630,
                      "proportionallyAllocatedRefundsMinor": 0,
                      "unattributedPaymentGrossMinor": 0,
                      "attributionComplete": true
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "The request parameters are invalid.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "invalidRequest": {
                    "summary": "Invalid request parameters",
                    "value": {
                      "error": "invalid_request",
                      "message": "The requested date range is invalid.",
                      "request_id": "req_sandbox_invalid_request"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "The access token is missing, invalid, or expired.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              },
              "WWW-Authenticate": {
                "schema": {
                  "type": "string"
                },
                "description": "OAuth bearer challenge and protected-resource metadata. Present for token and scope failures; other responses with the same status can omit it."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "invalidToken": {
                    "summary": "Missing or invalid access token",
                    "value": {
                      "error": "invalid_token",
                      "error_description": "The access token is invalid.",
                      "request_id": "req_sandbox_invalid_token"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "The authorization has expired or does not include the required scope.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              },
              "WWW-Authenticate": {
                "schema": {
                  "type": "string"
                },
                "description": "OAuth bearer challenge and protected-resource metadata. Present for token and scope failures; other responses with the same status can omit it."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "insufficientScope": {
                    "summary": "Required scope is missing",
                    "value": {
                      "error": "insufficient_scope",
                      "error_description": "The operation requires an OAuth scope that is not granted.",
                      "request_id": "req_sandbox_insufficient_scope"
                    }
                  },
                  "organizationScopeMissing": {
                    "summary": "Organization scope is missing",
                    "value": {
                      "error": "insufficient_scope",
                      "error_description": "Organization read access is required.",
                      "request_id": "req_sandbox_organization_scope_missing"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "The restaurant does not exist or is outside the authorization.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "notFound": {
                    "summary": "Resource is outside the authorization",
                    "value": {
                      "error": "not_found",
                      "request_id": "req_sandbox_not_found"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "The partner request limit has been exceeded.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              },
              "RateLimit": {
                "schema": {
                  "type": "string"
                },
                "description": "The exhausted quota in the IETF RateLimit syntax (`\"name\";r=<remaining>;t=<seconds until reset>`). Sent only with 429; `r` is always 0 and `t` equals Retry-After."
              },
              "Retry-After": {
                "schema": {
                  "type": "integer",
                  "minimum": 1
                },
                "description": "Seconds to wait before retrying."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "rateLimited": {
                    "summary": "Partner request limit exceeded",
                    "value": {
                      "error": "rate_limited",
                      "request_id": "req_sandbox_rate_limited"
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "The API or one of its required services is unavailable.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "serviceUnavailable": {
                    "summary": "Temporary service failure",
                    "value": {
                      "error": "service_unavailable",
                      "request_id": "req_sandbox_service_unavailable"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/restaurants/{restaurantId}/orders": {
      "get": {
        "x-fiest-visibility": "public",
        "x-fiest-conditional-scopes": {
          "organization": [
            "fiest.organization.read"
          ]
        },
        "operationId": "findOrders",
        "summary": "Find orders",
        "description": "Returns newest-first order summaries. Exact order_id lookup and cursor browsing may search all history; partial or operational filters require an inclusive date range of at most 31 days. order_id and line identifiers are opaque and non-sequential.",
        "tags": [
          "Orders"
        ],
        "externalDocs": {
          "description": "Authorize and call the Fiest Partner API",
          "url": "https://docs.fiest.io/api/quickstart"
        },
        "security": [
          {
            "fiestOAuth": [
              "fiest.restaurant.read",
              "fiest.orders.read"
            ]
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/RestaurantId"
          },
          {
            "name": "start_date",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "end_date",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "order_id",
            "in": "query",
            "schema": {
              "type": "string",
              "maxLength": 255
            }
          },
          {
            "name": "receipt_reference",
            "in": "query",
            "schema": {
              "type": "string",
              "maxLength": 255
            }
          },
          {
            "name": "restaurant_order_number",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "item_name",
            "in": "query",
            "schema": {
              "type": "string",
              "maxLength": 100
            }
          },
          {
            "name": "payment_method",
            "in": "query",
            "description": "Effective settlement method. Manually recorded marketplace settlements use their marketplace key, such as wolt, rather than manual.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "status",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "any",
                "paid",
                "partially_refunded",
                "refunded",
                "voided"
              ],
              "default": "any"
            }
          },
          {
            "name": "min_total_minor",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 0
            }
          },
          {
            "name": "max_total_minor",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 0
            }
          },
          {
            "name": "start_time",
            "in": "query",
            "schema": {
              "type": "string",
              "pattern": "^([01]\\d|2[0-3]):[0-5]\\d$"
            }
          },
          {
            "name": "end_time",
            "in": "query",
            "schema": {
              "type": "string",
              "pattern": "^([01]\\d|2[0-3]):[0-5]\\d$"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "schema": {
              "type": "string",
              "maxLength": 1024
            }
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 20,
              "default": 10
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Bounded order matches.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/FindOrdersResult"
                    }
                  }
                },
                "example": {
                  "data": {
                    "restaurantId": "11111111-1111-4111-8111-111111111111",
                    "searchScope": "date_range",
                    "period": {
                      "startDate": "2026-07-15",
                      "endDate": "2026-07-15",
                      "timeZone": "Europe/Helsinki",
                      "dayStartHour": 4
                    },
                    "currency": "EUR",
                    "matches": [
                      {
                        "orderId": "fiest-50b6d34f-bc6e-4248-b3d6-839b3dda31a1",
                        "receiptHash": "fiest-50b6d34f-bc6e-4248-b3d6-839b3dda31a1",
                        "restaurantOrderNumber": 1042,
                        "occurredAt": "2026-07-15T10:42:00.000Z",
                        "businessDate": "2026-07-15",
                        "orderType": "dine_in",
                        "tableNumber": 12,
                        "status": "paid",
                        "paymentMethod": "card",
                        "orderOrigin": {
                          "kind": "fiest",
                          "provider": null
                        },
                        "originalAmountMinor": 1350,
                        "totalAmountMinor": 1350,
                        "vatMinor": 161,
                        "refundAmountMinor": 0,
                        "discountAmountMinor": 0,
                        "items": [
                          {
                            "lineId": "7fbb7bd1-661c-4a1e-9748-acde61280973",
                            "catalogItemId": "67fb6fb2-0f46-455b-934e-25707b77be08",
                            "catalogItemKind": "menu_item",
                            "catalogCategoryId": "af16a392-f8a1-47b4-849f-4d707001e9b1",
                            "menuId": "43f64da8-4ec2-4900-b137-1c0927c975d2",
                            "name": "Margherita",
                            "category": "Pizza",
                            "itemType": "food",
                            "quantity": 1,
                            "unitPriceMinor": 1350,
                            "originalUnitPriceMinor": null,
                            "grossAmountMinor": 1350,
                            "discountAmountMinor": 0,
                            "vatAmountMinor": 161,
                            "taxEvidence": "snapshot",
                            "taxCountryCode": "FI",
                            "taxRatesAsOf": "2026-07-15",
                            "vatRates": [
                              {
                                "category": "reduced",
                                "rateBps": 1350,
                                "vatAmountMinor": 161
                              }
                            ],
                            "selectedOptions": [
                              {
                                "optionId": "5378e830-a342-4f45-8793-f3eef0a3b063",
                                "optionGroupId": "437e9ca5-8daf-411a-b371-0bedb5ecb263",
                                "name": "Extra cheese",
                                "quantity": 1,
                                "unitPriceMinor": 100,
                                "grossAmountMinor": 100,
                                "vatAmountMinor": 12
                              }
                            ]
                          }
                        ],
                        "itemsTruncated": false
                      }
                    ],
                    "truncated": false,
                    "nextCursor": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "The request parameters are invalid.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "invalidRequest": {
                    "summary": "Invalid request parameters",
                    "value": {
                      "error": "invalid_request",
                      "message": "The requested date range is invalid.",
                      "request_id": "req_sandbox_invalid_request"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "The access token is missing, invalid, or expired.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              },
              "WWW-Authenticate": {
                "schema": {
                  "type": "string"
                },
                "description": "OAuth bearer challenge and protected-resource metadata. Present for token and scope failures; other responses with the same status can omit it."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "invalidToken": {
                    "summary": "Missing or invalid access token",
                    "value": {
                      "error": "invalid_token",
                      "error_description": "The access token is invalid.",
                      "request_id": "req_sandbox_invalid_token"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "The authorization has expired or does not include the required scope.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              },
              "WWW-Authenticate": {
                "schema": {
                  "type": "string"
                },
                "description": "OAuth bearer challenge and protected-resource metadata. Present for token and scope failures; other responses with the same status can omit it."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "insufficientScope": {
                    "summary": "Required scope is missing",
                    "value": {
                      "error": "insufficient_scope",
                      "error_description": "The operation requires an OAuth scope that is not granted.",
                      "request_id": "req_sandbox_insufficient_scope"
                    }
                  },
                  "organizationScopeMissing": {
                    "summary": "Organization scope is missing",
                    "value": {
                      "error": "insufficient_scope",
                      "error_description": "Organization read access is required.",
                      "request_id": "req_sandbox_organization_scope_missing"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "The restaurant or requested resource does not exist or is outside the authorization.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "notFound": {
                    "summary": "Resource is outside the authorization",
                    "value": {
                      "error": "not_found",
                      "request_id": "req_sandbox_not_found"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "The partner request limit has been exceeded.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              },
              "RateLimit": {
                "schema": {
                  "type": "string"
                },
                "description": "The exhausted quota in the IETF RateLimit syntax (`\"name\";r=<remaining>;t=<seconds until reset>`). Sent only with 429; `r` is always 0 and `t` equals Retry-After."
              },
              "Retry-After": {
                "schema": {
                  "type": "integer",
                  "minimum": 1
                },
                "description": "Seconds to wait before retrying."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "rateLimited": {
                    "summary": "Partner request limit exceeded",
                    "value": {
                      "error": "rate_limited",
                      "request_id": "req_sandbox_rate_limited"
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "The API or one of its required services is unavailable.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "serviceUnavailable": {
                    "summary": "Temporary service failure",
                    "value": {
                      "error": "service_unavailable",
                      "request_id": "req_sandbox_service_unavailable"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/restaurants/{restaurantId}/orders/{orderId}": {
      "get": {
        "x-fiest-visibility": "public",
        "x-fiest-conditional-scopes": {
          "organization": [
            "fiest.organization.read"
          ]
        },
        "operationId": "getOrderDetails",
        "summary": "Get order details",
        "description": "Returns one order by the opaque order_id returned by findOrders, including stable UUID or deterministic legacy sold-line IDs, catalog UUIDs where available, selected options, and explicit sale-time or legacy tax evidence.",
        "tags": [
          "Orders"
        ],
        "externalDocs": {
          "description": "Authorize and call the Fiest Partner API",
          "url": "https://docs.fiest.io/api/quickstart"
        },
        "security": [
          {
            "fiestOAuth": [
              "fiest.restaurant.read",
              "fiest.orders.read"
            ]
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/RestaurantId"
          },
          {
            "$ref": "#/components/parameters/OrderId"
          }
        ],
        "responses": {
          "200": {
            "description": "Exact order details.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/OrderDetails"
                    }
                  }
                },
                "example": {
                  "data": {
                    "restaurantId": "11111111-1111-4111-8111-111111111111",
                    "currency": "EUR",
                    "order": {
                      "orderId": "fiest-50b6d34f-bc6e-4248-b3d6-839b3dda31a1",
                      "receiptHash": "fiest-50b6d34f-bc6e-4248-b3d6-839b3dda31a1",
                      "restaurantOrderNumber": 1042,
                      "occurredAt": "2026-07-15T10:42:00.000Z",
                      "businessDate": "2026-07-15",
                      "orderType": "dine_in",
                      "tableNumber": 12,
                      "status": "paid",
                      "paymentMethod": "card",
                      "orderOrigin": {
                        "kind": "fiest",
                        "provider": null
                      },
                      "originalAmountMinor": 1350,
                      "totalAmountMinor": 1350,
                      "vatMinor": 161,
                      "refundAmountMinor": 0,
                      "discountAmountMinor": 0,
                      "items": [
                        {
                          "lineId": "7fbb7bd1-661c-4a1e-9748-acde61280973",
                          "catalogItemId": "67fb6fb2-0f46-455b-934e-25707b77be08",
                          "catalogItemKind": "menu_item",
                          "catalogCategoryId": "af16a392-f8a1-47b4-849f-4d707001e9b1",
                          "menuId": "43f64da8-4ec2-4900-b137-1c0927c975d2",
                          "name": "Margherita",
                          "category": "Pizza",
                          "itemType": "food",
                          "quantity": 1,
                          "unitPriceMinor": 1350,
                          "originalUnitPriceMinor": null,
                          "grossAmountMinor": 1350,
                          "discountAmountMinor": 0,
                          "vatAmountMinor": 161,
                          "taxEvidence": "snapshot",
                          "taxCountryCode": "FI",
                          "taxRatesAsOf": "2026-07-15",
                          "vatRates": [
                            {
                              "category": "reduced",
                              "rateBps": 1350,
                              "vatAmountMinor": 161
                            }
                          ],
                          "selectedOptions": [
                            {
                              "optionId": "5378e830-a342-4f45-8793-f3eef0a3b063",
                              "optionGroupId": "437e9ca5-8daf-411a-b371-0bedb5ecb263",
                              "name": "Extra cheese",
                              "quantity": 1,
                              "unitPriceMinor": 100,
                              "grossAmountMinor": 100,
                              "vatAmountMinor": 12
                            }
                          ]
                        }
                      ],
                      "itemsTruncated": false,
                      "grossSalesMinor": 1350,
                      "netSalesMinor": 1189,
                      "vatAllocationMethod": "stored",
                      "vatBreakdown": {
                        "countryCode": "FI",
                        "ratesAsOf": "2026-07-15",
                        "rows": [
                          {
                            "category": "reduced",
                            "rateBps": 1350,
                            "grossAmountMinor": 1350,
                            "netAmountMinor": 1189,
                            "vatAmountMinor": 161
                          }
                        ]
                      },
                      "tipAmountMinor": 0,
                      "refundedItems": [],
                      "refundedItemsTruncated": false
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "The request parameters are invalid.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "invalidRequest": {
                    "summary": "Invalid request parameters",
                    "value": {
                      "error": "invalid_request",
                      "message": "The requested date range is invalid.",
                      "request_id": "req_sandbox_invalid_request"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "The access token is missing, invalid, or expired.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              },
              "WWW-Authenticate": {
                "schema": {
                  "type": "string"
                },
                "description": "OAuth bearer challenge and protected-resource metadata. Present for token and scope failures; other responses with the same status can omit it."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "invalidToken": {
                    "summary": "Missing or invalid access token",
                    "value": {
                      "error": "invalid_token",
                      "error_description": "The access token is invalid.",
                      "request_id": "req_sandbox_invalid_token"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "The authorization has expired or does not include the required scope.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              },
              "WWW-Authenticate": {
                "schema": {
                  "type": "string"
                },
                "description": "OAuth bearer challenge and protected-resource metadata. Present for token and scope failures; other responses with the same status can omit it."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "insufficientScope": {
                    "summary": "Required scope is missing",
                    "value": {
                      "error": "insufficient_scope",
                      "error_description": "The operation requires an OAuth scope that is not granted.",
                      "request_id": "req_sandbox_insufficient_scope"
                    }
                  },
                  "organizationScopeMissing": {
                    "summary": "Organization scope is missing",
                    "value": {
                      "error": "insufficient_scope",
                      "error_description": "Organization read access is required.",
                      "request_id": "req_sandbox_organization_scope_missing"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "The restaurant or requested resource does not exist or is outside the authorization.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "notFound": {
                    "summary": "Resource is outside the authorization",
                    "value": {
                      "error": "not_found",
                      "request_id": "req_sandbox_not_found"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "The partner request limit has been exceeded.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              },
              "RateLimit": {
                "schema": {
                  "type": "string"
                },
                "description": "The exhausted quota in the IETF RateLimit syntax (`\"name\";r=<remaining>;t=<seconds until reset>`). Sent only with 429; `r` is always 0 and `t` equals Retry-After."
              },
              "Retry-After": {
                "schema": {
                  "type": "integer",
                  "minimum": 1
                },
                "description": "Seconds to wait before retrying."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "rateLimited": {
                    "summary": "Partner request limit exceeded",
                    "value": {
                      "error": "rate_limited",
                      "request_id": "req_sandbox_rate_limited"
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "The API or one of its required services is unavailable.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "serviceUnavailable": {
                    "summary": "Temporary service failure",
                    "value": {
                      "error": "service_unavailable",
                      "request_id": "req_sandbox_service_unavailable"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/restaurants/{restaurantId}/menus": {
      "get": {
        "x-fiest-visibility": "public",
        "x-fiest-conditional-scopes": {
          "organization": [
            "fiest.organization.read"
          ]
        },
        "operationId": "listMenus",
        "summary": "List menus",
        "description": "Returns bounded menu summaries including whether each menu is active for POS or online ordering. Organization-boundary tokens also require fiest.organization.read.",
        "tags": [
          "Menus"
        ],
        "externalDocs": {
          "description": "Authorize and call the Fiest Partner API",
          "url": "https://docs.fiest.io/api/quickstart"
        },
        "security": [
          {
            "fiestOAuth": [
              "fiest.restaurant.read",
              "fiest.menu.read"
            ]
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/RestaurantId"
          }
        ],
        "responses": {
          "200": {
            "description": "The restaurant menus.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ListMenusResult"
                    }
                  }
                },
                "example": {
                  "data": {
                    "restaurantId": "11111111-1111-4111-8111-111111111111",
                    "menus": [
                      {
                        "menuPublicId": "43f64da8-4ec2-4900-b137-1c0927c975d2",
                        "name": "Lunch menu",
                        "activeForPos": false,
                        "onlineOrdering": false,
                        "categoryCount": 2,
                        "itemCount": 8
                      }
                    ],
                    "truncated": false
                  }
                }
              }
            }
          },
          "400": {
            "description": "The request parameters are invalid.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "invalidRequest": {
                    "summary": "Invalid request parameters",
                    "value": {
                      "error": "invalid_request",
                      "message": "The requested date range is invalid.",
                      "request_id": "req_sandbox_invalid_request"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "The access token is missing, invalid, or expired.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              },
              "WWW-Authenticate": {
                "schema": {
                  "type": "string"
                },
                "description": "OAuth bearer challenge and protected-resource metadata. Present for token and scope failures; other responses with the same status can omit it."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "invalidToken": {
                    "summary": "Missing or invalid access token",
                    "value": {
                      "error": "invalid_token",
                      "error_description": "The access token is invalid.",
                      "request_id": "req_sandbox_invalid_token"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "The authorization has expired or does not include the required scope.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              },
              "WWW-Authenticate": {
                "schema": {
                  "type": "string"
                },
                "description": "OAuth bearer challenge and protected-resource metadata. Present for token and scope failures; other responses with the same status can omit it."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "insufficientScope": {
                    "summary": "Required scope is missing",
                    "value": {
                      "error": "insufficient_scope",
                      "error_description": "The operation requires an OAuth scope that is not granted.",
                      "request_id": "req_sandbox_insufficient_scope"
                    }
                  },
                  "organizationScopeMissing": {
                    "summary": "Organization scope is missing",
                    "value": {
                      "error": "insufficient_scope",
                      "error_description": "Organization read access is required.",
                      "request_id": "req_sandbox_organization_scope_missing"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "The restaurant or requested resource does not exist or is outside the authorization.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "notFound": {
                    "summary": "Resource is outside the authorization",
                    "value": {
                      "error": "not_found",
                      "request_id": "req_sandbox_not_found"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "The partner request limit has been exceeded.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              },
              "RateLimit": {
                "schema": {
                  "type": "string"
                },
                "description": "The exhausted quota in the IETF RateLimit syntax (`\"name\";r=<remaining>;t=<seconds until reset>`). Sent only with 429; `r` is always 0 and `t` equals Retry-After."
              },
              "Retry-After": {
                "schema": {
                  "type": "integer",
                  "minimum": 1
                },
                "description": "Seconds to wait before retrying."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "rateLimited": {
                    "summary": "Partner request limit exceeded",
                    "value": {
                      "error": "rate_limited",
                      "request_id": "req_sandbox_rate_limited"
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "The API or one of its required services is unavailable.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "serviceUnavailable": {
                    "summary": "Temporary service failure",
                    "value": {
                      "error": "service_unavailable",
                      "request_id": "req_sandbox_service_unavailable"
                    }
                  }
                }
              }
            }
          }
        }
      },
      "post": {
        "x-fiest-visibility": "public",
        "x-fiest-conditional-scopes": {
          "organization": [
            "fiest.organization.read"
          ]
        },
        "operationId": "createMenu",
        "summary": "Create a draft menu",
        "description": "Creates one empty inactive menu. It does not change the active POS or online-ordering menu. Organization-boundary tokens also require fiest.organization.read.",
        "tags": [
          "Menus"
        ],
        "externalDocs": {
          "description": "Authorize and call the Fiest Partner API",
          "url": "https://docs.fiest.io/api/quickstart"
        },
        "security": [
          {
            "fiestOAuth": [
              "fiest.restaurant.read",
              "fiest.menu.read",
              "fiest.menu.structure.write"
            ]
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/RestaurantId"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateMenuInput"
              },
              "example": {
                "name": "Lunch menu",
                "idempotencyKey": "bbbbbbbb-bbbb-4bbb-8bbb-bbbbbbbbbbbb",
                "confirmed": true
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "The newly created inactive menu.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/CreateMenuResult"
                    }
                  }
                },
                "example": {
                  "data": {
                    "actionId": "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa",
                    "restaurantId": "11111111-1111-4111-8111-111111111111",
                    "menu": {
                      "menuPublicId": "43f64da8-4ec2-4900-b137-1c0927c975d2",
                      "name": "Lunch menu",
                      "activeForPos": false,
                      "onlineOrdering": false,
                      "categoryCount": 0,
                      "itemCount": 0
                    },
                    "replayed": false
                  }
                }
              }
            }
          },
          "400": {
            "description": "The request parameters are invalid.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "invalidRequest": {
                    "summary": "Invalid request parameters",
                    "value": {
                      "error": "invalid_request",
                      "message": "The requested date range is invalid.",
                      "request_id": "req_sandbox_invalid_request"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "The access token is missing, invalid, or expired.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              },
              "WWW-Authenticate": {
                "schema": {
                  "type": "string"
                },
                "description": "OAuth bearer challenge and protected-resource metadata. Present for token and scope failures; other responses with the same status can omit it."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "invalidToken": {
                    "summary": "Missing or invalid access token",
                    "value": {
                      "error": "invalid_token",
                      "error_description": "The access token is invalid.",
                      "request_id": "req_sandbox_invalid_token"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "The authorization has expired or does not include the required scope.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              },
              "WWW-Authenticate": {
                "schema": {
                  "type": "string"
                },
                "description": "OAuth bearer challenge and protected-resource metadata. Present for token and scope failures; other responses with the same status can omit it."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "insufficientScope": {
                    "summary": "Required scope is missing",
                    "value": {
                      "error": "insufficient_scope",
                      "error_description": "The operation requires an OAuth scope that is not granted.",
                      "request_id": "req_sandbox_insufficient_scope"
                    }
                  },
                  "organizationScopeMissing": {
                    "summary": "Organization scope is missing",
                    "value": {
                      "error": "insufficient_scope",
                      "error_description": "Organization read access is required.",
                      "request_id": "req_sandbox_organization_scope_missing"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "The restaurant or requested resource does not exist or is outside the authorization.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "notFound": {
                    "summary": "Resource is outside the authorization",
                    "value": {
                      "error": "not_found",
                      "request_id": "req_sandbox_not_found"
                    }
                  }
                }
              }
            }
          },
          "409": {
            "description": "The write conflicts with current state, its idempotency key, or an active external integration.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              },
              "Retry-After": {
                "schema": {
                  "type": "integer",
                  "minimum": 1
                },
                "description": "Present when the same idempotent write is still processing."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "conflict": {
                    "summary": "Current restaurant state conflicts with the request",
                    "value": {
                      "error": "conflict",
                      "request_id": "req_sandbox_conflict"
                    }
                  },
                  "idempotencyConflict": {
                    "summary": "Idempotency key was reused with different input",
                    "value": {
                      "error": "idempotency_conflict",
                      "request_id": "req_sandbox_idempotency_conflict"
                    }
                  },
                  "preconditionFailed": {
                    "summary": "Restaurant state changed after review",
                    "value": {
                      "error": "precondition_failed",
                      "request_id": "req_sandbox_precondition_failed"
                    }
                  },
                  "managedExternally": {
                    "summary": "Setting is managed by another integration",
                    "value": {
                      "error": "managed_externally",
                      "request_id": "req_sandbox_managed_externally"
                    }
                  },
                  "writeInProgress": {
                    "summary": "Idempotent write is still processing",
                    "value": {
                      "error": "write_in_progress",
                      "request_id": "req_sandbox_write_in_progress"
                    }
                  }
                }
              }
            }
          },
          "413": {
            "description": "The JSON request body exceeds one megabyte.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "payloadTooLarge": {
                    "summary": "JSON body exceeds the one-megabyte limit",
                    "value": {
                      "error": "payload_too_large",
                      "request_id": "req_sandbox_payload_too_large"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "The partner request limit has been exceeded.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              },
              "RateLimit": {
                "schema": {
                  "type": "string"
                },
                "description": "The exhausted quota in the IETF RateLimit syntax (`\"name\";r=<remaining>;t=<seconds until reset>`). Sent only with 429; `r` is always 0 and `t` equals Retry-After."
              },
              "Retry-After": {
                "schema": {
                  "type": "integer",
                  "minimum": 1
                },
                "description": "Seconds to wait before retrying."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "rateLimited": {
                    "summary": "Partner request limit exceeded",
                    "value": {
                      "error": "rate_limited",
                      "request_id": "req_sandbox_rate_limited"
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "The capability is disabled in this environment or a required service is unavailable.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "capabilityDisabled": {
                    "summary": "Capability is disabled in this environment",
                    "value": {
                      "error": "capability_disabled",
                      "request_id": "req_sandbox_capability_disabled"
                    }
                  },
                  "serviceUnavailable": {
                    "summary": "Temporary service failure",
                    "value": {
                      "error": "service_unavailable",
                      "request_id": "req_sandbox_service_unavailable"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/restaurants/{restaurantId}/menu-items": {
      "get": {
        "x-fiest-visibility": "public",
        "x-fiest-conditional-scopes": {
          "organization": [
            "fiest.organization.read"
          ]
        },
        "operationId": "findMenuItems",
        "summary": "Find menu items",
        "description": "Returns bounded current catalog items with public item and category UUIDs. Database sequence IDs are not exposed. Organization-boundary tokens also require fiest.organization.read.",
        "tags": [
          "Menus"
        ],
        "externalDocs": {
          "description": "Authorize and call the Fiest Partner API",
          "url": "https://docs.fiest.io/api/quickstart"
        },
        "security": [
          {
            "fiestOAuth": [
              "fiest.restaurant.read",
              "fiest.menu.read"
            ]
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/RestaurantId"
          },
          {
            "name": "query",
            "in": "query",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 100
            }
          },
          {
            "name": "category_name",
            "in": "query",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 100
            }
          },
          {
            "name": "availability",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "available",
                "hidden",
                "all"
              ],
              "default": "all"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 50,
              "default": 25
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Matching restaurant menu items.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/FindMenuItemsResult"
                    }
                  }
                },
                "example": {
                  "data": {
                    "restaurantId": "11111111-1111-4111-8111-111111111111",
                    "currency": "EUR",
                    "items": [
                      {
                        "menuItemPublicId": "67fb6fb2-0f46-455b-934e-25707b77be08",
                        "name": "Margherita",
                        "categoryPublicId": "af16a392-f8a1-47b4-849f-4d707001e9b1",
                        "categoryName": "Pizza",
                        "priceMinor": 1350,
                        "availability": "available",
                        "productType": "food",
                        "openPrice": false
                      }
                    ],
                    "truncated": false
                  }
                }
              }
            }
          },
          "400": {
            "description": "The request parameters are invalid.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "invalidRequest": {
                    "summary": "Invalid request parameters",
                    "value": {
                      "error": "invalid_request",
                      "message": "The requested date range is invalid.",
                      "request_id": "req_sandbox_invalid_request"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "The access token is missing, invalid, or expired.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              },
              "WWW-Authenticate": {
                "schema": {
                  "type": "string"
                },
                "description": "OAuth bearer challenge and protected-resource metadata. Present for token and scope failures; other responses with the same status can omit it."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "invalidToken": {
                    "summary": "Missing or invalid access token",
                    "value": {
                      "error": "invalid_token",
                      "error_description": "The access token is invalid.",
                      "request_id": "req_sandbox_invalid_token"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "The authorization has expired or does not include the required scope.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              },
              "WWW-Authenticate": {
                "schema": {
                  "type": "string"
                },
                "description": "OAuth bearer challenge and protected-resource metadata. Present for token and scope failures; other responses with the same status can omit it."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "insufficientScope": {
                    "summary": "Required scope is missing",
                    "value": {
                      "error": "insufficient_scope",
                      "error_description": "The operation requires an OAuth scope that is not granted.",
                      "request_id": "req_sandbox_insufficient_scope"
                    }
                  },
                  "organizationScopeMissing": {
                    "summary": "Organization scope is missing",
                    "value": {
                      "error": "insufficient_scope",
                      "error_description": "Organization read access is required.",
                      "request_id": "req_sandbox_organization_scope_missing"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "The restaurant or requested resource does not exist or is outside the authorization.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "notFound": {
                    "summary": "Resource is outside the authorization",
                    "value": {
                      "error": "not_found",
                      "request_id": "req_sandbox_not_found"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "The partner request limit has been exceeded.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              },
              "RateLimit": {
                "schema": {
                  "type": "string"
                },
                "description": "The exhausted quota in the IETF RateLimit syntax (`\"name\";r=<remaining>;t=<seconds until reset>`). Sent only with 429; `r` is always 0 and `t` equals Retry-After."
              },
              "Retry-After": {
                "schema": {
                  "type": "integer",
                  "minimum": 1
                },
                "description": "Seconds to wait before retrying."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "rateLimited": {
                    "summary": "Partner request limit exceeded",
                    "value": {
                      "error": "rate_limited",
                      "request_id": "req_sandbox_rate_limited"
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "The API or one of its required services is unavailable.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "serviceUnavailable": {
                    "summary": "Temporary service failure",
                    "value": {
                      "error": "service_unavailable",
                      "request_id": "req_sandbox_service_unavailable"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/restaurants/{restaurantId}/menus/{menuPublicId}/items": {
      "post": {
        "x-fiest-visibility": "public",
        "x-fiest-conditional-scopes": {
          "organization": [
            "fiest.organization.read"
          ]
        },
        "operationId": "addExistingMenuItems",
        "summary": "Add existing items to a draft menu",
        "description": "Adds up to 50 existing restaurant menu items to one inactive menu. Expected counts prevent applying the request to a menu that changed after review. Organization-boundary tokens also require fiest.organization.read.",
        "tags": [
          "Menus"
        ],
        "externalDocs": {
          "description": "Authorize and call the Fiest Partner API",
          "url": "https://docs.fiest.io/api/quickstart"
        },
        "security": [
          {
            "fiestOAuth": [
              "fiest.restaurant.read",
              "fiest.menu.read",
              "fiest.menu.structure.write"
            ]
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/RestaurantId"
          },
          {
            "$ref": "#/components/parameters/MenuPublicId"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AddExistingMenuItemsBody"
              },
              "example": {
                "menuItemPublicIds": [
                  "67fb6fb2-0f46-455b-934e-25707b77be08",
                  "77777777-7777-4777-8777-777777777777"
                ],
                "expectedCategoryCount": 2,
                "expectedItemCount": 8,
                "idempotencyKey": "bbbbbbbb-bbbb-4bbb-8bbb-bbbbbbbbbbbb",
                "confirmed": true
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The updated draft menu.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/AddExistingMenuItemsResult"
                    }
                  }
                },
                "example": {
                  "data": {
                    "actionId": "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa",
                    "restaurantId": "11111111-1111-4111-8111-111111111111",
                    "menu": {
                      "menuPublicId": "43f64da8-4ec2-4900-b137-1c0927c975d2",
                      "name": "Lunch menu",
                      "activeForPos": false,
                      "onlineOrdering": false,
                      "categoryCount": 2,
                      "itemCount": 10
                    },
                    "addedMenuItemPublicIds": [
                      "67fb6fb2-0f46-455b-934e-25707b77be08",
                      "77777777-7777-4777-8777-777777777777"
                    ],
                    "replayed": false
                  }
                }
              }
            }
          },
          "400": {
            "description": "The request parameters are invalid.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "invalidRequest": {
                    "summary": "Invalid request parameters",
                    "value": {
                      "error": "invalid_request",
                      "message": "The requested date range is invalid.",
                      "request_id": "req_sandbox_invalid_request"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "The access token is missing, invalid, or expired.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              },
              "WWW-Authenticate": {
                "schema": {
                  "type": "string"
                },
                "description": "OAuth bearer challenge and protected-resource metadata. Present for token and scope failures; other responses with the same status can omit it."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "invalidToken": {
                    "summary": "Missing or invalid access token",
                    "value": {
                      "error": "invalid_token",
                      "error_description": "The access token is invalid.",
                      "request_id": "req_sandbox_invalid_token"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "The authorization has expired or does not include the required scope.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              },
              "WWW-Authenticate": {
                "schema": {
                  "type": "string"
                },
                "description": "OAuth bearer challenge and protected-resource metadata. Present for token and scope failures; other responses with the same status can omit it."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "insufficientScope": {
                    "summary": "Required scope is missing",
                    "value": {
                      "error": "insufficient_scope",
                      "error_description": "The operation requires an OAuth scope that is not granted.",
                      "request_id": "req_sandbox_insufficient_scope"
                    }
                  },
                  "organizationScopeMissing": {
                    "summary": "Organization scope is missing",
                    "value": {
                      "error": "insufficient_scope",
                      "error_description": "Organization read access is required.",
                      "request_id": "req_sandbox_organization_scope_missing"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "The restaurant or requested resource does not exist or is outside the authorization.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "notFound": {
                    "summary": "Resource is outside the authorization",
                    "value": {
                      "error": "not_found",
                      "request_id": "req_sandbox_not_found"
                    }
                  }
                }
              }
            }
          },
          "409": {
            "description": "The write conflicts with current state, its idempotency key, or an active external integration.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              },
              "Retry-After": {
                "schema": {
                  "type": "integer",
                  "minimum": 1
                },
                "description": "Present when the same idempotent write is still processing."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "conflict": {
                    "summary": "Current restaurant state conflicts with the request",
                    "value": {
                      "error": "conflict",
                      "request_id": "req_sandbox_conflict"
                    }
                  },
                  "idempotencyConflict": {
                    "summary": "Idempotency key was reused with different input",
                    "value": {
                      "error": "idempotency_conflict",
                      "request_id": "req_sandbox_idempotency_conflict"
                    }
                  },
                  "preconditionFailed": {
                    "summary": "Restaurant state changed after review",
                    "value": {
                      "error": "precondition_failed",
                      "request_id": "req_sandbox_precondition_failed"
                    }
                  },
                  "managedExternally": {
                    "summary": "Setting is managed by another integration",
                    "value": {
                      "error": "managed_externally",
                      "request_id": "req_sandbox_managed_externally"
                    }
                  },
                  "writeInProgress": {
                    "summary": "Idempotent write is still processing",
                    "value": {
                      "error": "write_in_progress",
                      "request_id": "req_sandbox_write_in_progress"
                    }
                  }
                }
              }
            }
          },
          "413": {
            "description": "The JSON request body exceeds one megabyte.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "payloadTooLarge": {
                    "summary": "JSON body exceeds the one-megabyte limit",
                    "value": {
                      "error": "payload_too_large",
                      "request_id": "req_sandbox_payload_too_large"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "The partner request limit has been exceeded.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              },
              "RateLimit": {
                "schema": {
                  "type": "string"
                },
                "description": "The exhausted quota in the IETF RateLimit syntax (`\"name\";r=<remaining>;t=<seconds until reset>`). Sent only with 429; `r` is always 0 and `t` equals Retry-After."
              },
              "Retry-After": {
                "schema": {
                  "type": "integer",
                  "minimum": 1
                },
                "description": "Seconds to wait before retrying."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "rateLimited": {
                    "summary": "Partner request limit exceeded",
                    "value": {
                      "error": "rate_limited",
                      "request_id": "req_sandbox_rate_limited"
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "The capability is disabled in this environment or a required service is unavailable.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "capabilityDisabled": {
                    "summary": "Capability is disabled in this environment",
                    "value": {
                      "error": "capability_disabled",
                      "request_id": "req_sandbox_capability_disabled"
                    }
                  },
                  "serviceUnavailable": {
                    "summary": "Temporary service failure",
                    "value": {
                      "error": "service_unavailable",
                      "request_id": "req_sandbox_service_unavailable"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/restaurants/{restaurantId}/menus/{menuPublicId}/items/{menuItemPublicId}": {
      "get": {
        "x-fiest-visibility": "public",
        "x-fiest-conditional-scopes": {
          "organization": [
            "fiest.organization.read"
          ]
        },
        "operationId": "getDraftMenuItemEditTarget",
        "summary": "Inspect a draft menu item for editing",
        "description": "Returns the exact editable state and opaque version for one item in one explicitly selected menu. The item can be edited only when the menu is inactive and the canonical item is not shared with another menu. Organization-boundary tokens also require fiest.organization.read.",
        "tags": [
          "Menus"
        ],
        "externalDocs": {
          "description": "Authorize and call the Fiest Partner API",
          "url": "https://docs.fiest.io/api/quickstart"
        },
        "security": [
          {
            "fiestOAuth": [
              "fiest.restaurant.read",
              "fiest.menu.read",
              "fiest.menu.structure.write"
            ]
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/RestaurantId"
          },
          {
            "$ref": "#/components/parameters/MenuPublicId"
          },
          {
            "$ref": "#/components/parameters/MenuItemPublicId"
          }
        ],
        "responses": {
          "200": {
            "description": "The exact reviewed draft-menu item state.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/DraftMenuItemEditTargetResult"
                    }
                  }
                },
                "example": {
                  "data": {
                    "restaurantId": "11111111-1111-4111-8111-111111111111",
                    "menu": {
                      "menuPublicId": "43f64da8-4ec2-4900-b137-1c0927c975d2",
                      "name": "Lunch menu",
                      "activeForPos": false,
                      "onlineOrdering": false,
                      "categoryCount": 2,
                      "itemCount": 8
                    },
                    "item": {
                      "menuItemPublicId": "67fb6fb2-0f46-455b-934e-25707b77be08",
                      "categoryPublicId": "af16a392-f8a1-47b4-849f-4d707001e9b1",
                      "name": "Margherita",
                      "priceMinor": 1350,
                      "description": "Tomato, mozzarella and basil",
                      "visible": true,
                      "showInKitchen": true
                    },
                    "sharedMenuCount": 1,
                    "canEdit": true,
                    "version": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
                  }
                }
              }
            }
          },
          "400": {
            "description": "The request parameters are invalid.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "invalidRequest": {
                    "summary": "Invalid request parameters",
                    "value": {
                      "error": "invalid_request",
                      "message": "The requested date range is invalid.",
                      "request_id": "req_sandbox_invalid_request"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "The access token is missing, invalid, or expired.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              },
              "WWW-Authenticate": {
                "schema": {
                  "type": "string"
                },
                "description": "OAuth bearer challenge and protected-resource metadata. Present for token and scope failures; other responses with the same status can omit it."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "invalidToken": {
                    "summary": "Missing or invalid access token",
                    "value": {
                      "error": "invalid_token",
                      "error_description": "The access token is invalid.",
                      "request_id": "req_sandbox_invalid_token"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "The authorization has expired or does not include the required scope.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              },
              "WWW-Authenticate": {
                "schema": {
                  "type": "string"
                },
                "description": "OAuth bearer challenge and protected-resource metadata. Present for token and scope failures; other responses with the same status can omit it."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "insufficientScope": {
                    "summary": "Required scope is missing",
                    "value": {
                      "error": "insufficient_scope",
                      "error_description": "The operation requires an OAuth scope that is not granted.",
                      "request_id": "req_sandbox_insufficient_scope"
                    }
                  },
                  "organizationScopeMissing": {
                    "summary": "Organization scope is missing",
                    "value": {
                      "error": "insufficient_scope",
                      "error_description": "Organization read access is required.",
                      "request_id": "req_sandbox_organization_scope_missing"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "The restaurant or requested resource does not exist or is outside the authorization.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "notFound": {
                    "summary": "Resource is outside the authorization",
                    "value": {
                      "error": "not_found",
                      "request_id": "req_sandbox_not_found"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "The partner request limit has been exceeded.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              },
              "RateLimit": {
                "schema": {
                  "type": "string"
                },
                "description": "The exhausted quota in the IETF RateLimit syntax (`\"name\";r=<remaining>;t=<seconds until reset>`). Sent only with 429; `r` is always 0 and `t` equals Retry-After."
              },
              "Retry-After": {
                "schema": {
                  "type": "integer",
                  "minimum": 1
                },
                "description": "Seconds to wait before retrying."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "rateLimited": {
                    "summary": "Partner request limit exceeded",
                    "value": {
                      "error": "rate_limited",
                      "request_id": "req_sandbox_rate_limited"
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "The API or one of its required services is unavailable.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "serviceUnavailable": {
                    "summary": "Temporary service failure",
                    "value": {
                      "error": "service_unavailable",
                      "request_id": "req_sandbox_service_unavailable"
                    }
                  }
                }
              }
            }
          }
        }
      },
      "patch": {
        "x-fiest-visibility": "public",
        "x-fiest-conditional-scopes": {
          "organization": [
            "fiest.organization.read"
          ]
        },
        "operationId": "updateDraftMenuItem",
        "summary": "Update a draft menu item",
        "description": "Updates only reviewed name, price, description, visibility, or kitchen-display fields on one unshared item in one inactive draft. Pass the unchanged version returned by the inspection operation so a concurrent edit fails safely. This operation never publishes the menu. Organization-boundary tokens also require fiest.organization.read.",
        "tags": [
          "Menus"
        ],
        "externalDocs": {
          "description": "Authorize and call the Fiest Partner API",
          "url": "https://docs.fiest.io/api/quickstart"
        },
        "security": [
          {
            "fiestOAuth": [
              "fiest.restaurant.read",
              "fiest.menu.read",
              "fiest.menu.structure.write"
            ]
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/RestaurantId"
          },
          {
            "$ref": "#/components/parameters/MenuPublicId"
          },
          {
            "$ref": "#/components/parameters/MenuItemPublicId"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateDraftMenuItemBody"
              },
              "example": {
                "expectedVersion": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
                "changes": {
                  "name": "Margherita classica",
                  "priceMinor": 1450
                },
                "idempotencyKey": "bbbbbbbb-bbbb-4bbb-8bbb-bbbbbbbbbbbb",
                "confirmed": true
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The committed draft-menu item state.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/UpdateDraftMenuItemResult"
                    }
                  }
                },
                "example": {
                  "data": {
                    "actionId": "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa",
                    "restaurantId": "11111111-1111-4111-8111-111111111111",
                    "menuPublicId": "43f64da8-4ec2-4900-b137-1c0927c975d2",
                    "item": {
                      "menuItemPublicId": "67fb6fb2-0f46-455b-934e-25707b77be08",
                      "categoryPublicId": "af16a392-f8a1-47b4-849f-4d707001e9b1",
                      "name": "Margherita classica",
                      "priceMinor": 1450,
                      "description": "Tomato, mozzarella and basil",
                      "visible": true,
                      "showInKitchen": true
                    },
                    "previousVersion": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
                    "version": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
                    "replayed": false
                  }
                }
              }
            }
          },
          "400": {
            "description": "The request parameters are invalid.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "invalidRequest": {
                    "summary": "Invalid request parameters",
                    "value": {
                      "error": "invalid_request",
                      "message": "The requested date range is invalid.",
                      "request_id": "req_sandbox_invalid_request"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "The access token is missing, invalid, or expired.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              },
              "WWW-Authenticate": {
                "schema": {
                  "type": "string"
                },
                "description": "OAuth bearer challenge and protected-resource metadata. Present for token and scope failures; other responses with the same status can omit it."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "invalidToken": {
                    "summary": "Missing or invalid access token",
                    "value": {
                      "error": "invalid_token",
                      "error_description": "The access token is invalid.",
                      "request_id": "req_sandbox_invalid_token"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "The authorization has expired or does not include the required scope.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              },
              "WWW-Authenticate": {
                "schema": {
                  "type": "string"
                },
                "description": "OAuth bearer challenge and protected-resource metadata. Present for token and scope failures; other responses with the same status can omit it."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "insufficientScope": {
                    "summary": "Required scope is missing",
                    "value": {
                      "error": "insufficient_scope",
                      "error_description": "The operation requires an OAuth scope that is not granted.",
                      "request_id": "req_sandbox_insufficient_scope"
                    }
                  },
                  "organizationScopeMissing": {
                    "summary": "Organization scope is missing",
                    "value": {
                      "error": "insufficient_scope",
                      "error_description": "Organization read access is required.",
                      "request_id": "req_sandbox_organization_scope_missing"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "The restaurant or requested resource does not exist or is outside the authorization.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "notFound": {
                    "summary": "Resource is outside the authorization",
                    "value": {
                      "error": "not_found",
                      "request_id": "req_sandbox_not_found"
                    }
                  }
                }
              }
            }
          },
          "409": {
            "description": "The write conflicts with current state, its idempotency key, or an active external integration.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              },
              "Retry-After": {
                "schema": {
                  "type": "integer",
                  "minimum": 1
                },
                "description": "Present when the same idempotent write is still processing."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "conflict": {
                    "summary": "Current restaurant state conflicts with the request",
                    "value": {
                      "error": "conflict",
                      "request_id": "req_sandbox_conflict"
                    }
                  },
                  "idempotencyConflict": {
                    "summary": "Idempotency key was reused with different input",
                    "value": {
                      "error": "idempotency_conflict",
                      "request_id": "req_sandbox_idempotency_conflict"
                    }
                  },
                  "preconditionFailed": {
                    "summary": "Restaurant state changed after review",
                    "value": {
                      "error": "precondition_failed",
                      "request_id": "req_sandbox_precondition_failed"
                    }
                  },
                  "managedExternally": {
                    "summary": "Setting is managed by another integration",
                    "value": {
                      "error": "managed_externally",
                      "request_id": "req_sandbox_managed_externally"
                    }
                  },
                  "writeInProgress": {
                    "summary": "Idempotent write is still processing",
                    "value": {
                      "error": "write_in_progress",
                      "request_id": "req_sandbox_write_in_progress"
                    }
                  }
                }
              }
            }
          },
          "413": {
            "description": "The JSON request body exceeds one megabyte.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "payloadTooLarge": {
                    "summary": "JSON body exceeds the one-megabyte limit",
                    "value": {
                      "error": "payload_too_large",
                      "request_id": "req_sandbox_payload_too_large"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "The partner request limit has been exceeded.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              },
              "RateLimit": {
                "schema": {
                  "type": "string"
                },
                "description": "The exhausted quota in the IETF RateLimit syntax (`\"name\";r=<remaining>;t=<seconds until reset>`). Sent only with 429; `r` is always 0 and `t` equals Retry-After."
              },
              "Retry-After": {
                "schema": {
                  "type": "integer",
                  "minimum": 1
                },
                "description": "Seconds to wait before retrying."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "rateLimited": {
                    "summary": "Partner request limit exceeded",
                    "value": {
                      "error": "rate_limited",
                      "request_id": "req_sandbox_rate_limited"
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "The capability is disabled in this environment or a required service is unavailable.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "capabilityDisabled": {
                    "summary": "Capability is disabled in this environment",
                    "value": {
                      "error": "capability_disabled",
                      "request_id": "req_sandbox_capability_disabled"
                    }
                  },
                  "serviceUnavailable": {
                    "summary": "Temporary service failure",
                    "value": {
                      "error": "service_unavailable",
                      "request_id": "req_sandbox_service_unavailable"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/restaurants/{restaurantId}/menus/active": {
      "put": {
        "x-fiest-visibility": "public",
        "x-fiest-conditional-scopes": {
          "organization": [
            "fiest.organization.read"
          ]
        },
        "operationId": "setActiveMenu",
        "summary": "Set the active POS menu",
        "description": "Makes a reviewed menu active for POS. Expected menu counts and the current active-menu ID prevent publishing stale state. Organization-boundary tokens also require fiest.organization.read.",
        "tags": [
          "Menus"
        ],
        "externalDocs": {
          "description": "Authorize and call the Fiest Partner API",
          "url": "https://docs.fiest.io/api/quickstart"
        },
        "security": [
          {
            "fiestOAuth": [
              "fiest.restaurant.read",
              "fiest.menu.read",
              "fiest.menu.publish.write"
            ]
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/RestaurantId"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SetActiveMenuInput"
              },
              "example": {
                "menuPublicId": "43f64da8-4ec2-4900-b137-1c0927c975d2",
                "expectedCategoryCount": 2,
                "expectedItemCount": 8,
                "expectedCurrentActiveMenuPublicId": null,
                "idempotencyKey": "bbbbbbbb-bbbb-4bbb-8bbb-bbbbbbbbbbbb",
                "confirmed": true
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The menu now active for POS.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/SetActiveMenuResult"
                    }
                  }
                },
                "example": {
                  "data": {
                    "actionId": "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa",
                    "restaurantId": "11111111-1111-4111-8111-111111111111",
                    "menu": {
                      "menuPublicId": "43f64da8-4ec2-4900-b137-1c0927c975d2",
                      "name": "Lunch menu",
                      "activeForPos": true,
                      "onlineOrdering": false,
                      "categoryCount": 2,
                      "itemCount": 8
                    },
                    "previousActiveMenuPublicId": null,
                    "replayed": false
                  }
                }
              }
            }
          },
          "400": {
            "description": "The request parameters are invalid.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "invalidRequest": {
                    "summary": "Invalid request parameters",
                    "value": {
                      "error": "invalid_request",
                      "message": "The requested date range is invalid.",
                      "request_id": "req_sandbox_invalid_request"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "The access token is missing, invalid, or expired.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              },
              "WWW-Authenticate": {
                "schema": {
                  "type": "string"
                },
                "description": "OAuth bearer challenge and protected-resource metadata. Present for token and scope failures; other responses with the same status can omit it."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "invalidToken": {
                    "summary": "Missing or invalid access token",
                    "value": {
                      "error": "invalid_token",
                      "error_description": "The access token is invalid.",
                      "request_id": "req_sandbox_invalid_token"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "The authorization has expired or does not include the required scope.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              },
              "WWW-Authenticate": {
                "schema": {
                  "type": "string"
                },
                "description": "OAuth bearer challenge and protected-resource metadata. Present for token and scope failures; other responses with the same status can omit it."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "insufficientScope": {
                    "summary": "Required scope is missing",
                    "value": {
                      "error": "insufficient_scope",
                      "error_description": "The operation requires an OAuth scope that is not granted.",
                      "request_id": "req_sandbox_insufficient_scope"
                    }
                  },
                  "organizationScopeMissing": {
                    "summary": "Organization scope is missing",
                    "value": {
                      "error": "insufficient_scope",
                      "error_description": "Organization read access is required.",
                      "request_id": "req_sandbox_organization_scope_missing"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "The restaurant or requested resource does not exist or is outside the authorization.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "notFound": {
                    "summary": "Resource is outside the authorization",
                    "value": {
                      "error": "not_found",
                      "request_id": "req_sandbox_not_found"
                    }
                  }
                }
              }
            }
          },
          "409": {
            "description": "The write conflicts with current state, its idempotency key, or an active external integration.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              },
              "Retry-After": {
                "schema": {
                  "type": "integer",
                  "minimum": 1
                },
                "description": "Present when the same idempotent write is still processing."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "conflict": {
                    "summary": "Current restaurant state conflicts with the request",
                    "value": {
                      "error": "conflict",
                      "request_id": "req_sandbox_conflict"
                    }
                  },
                  "idempotencyConflict": {
                    "summary": "Idempotency key was reused with different input",
                    "value": {
                      "error": "idempotency_conflict",
                      "request_id": "req_sandbox_idempotency_conflict"
                    }
                  },
                  "preconditionFailed": {
                    "summary": "Restaurant state changed after review",
                    "value": {
                      "error": "precondition_failed",
                      "request_id": "req_sandbox_precondition_failed"
                    }
                  },
                  "managedExternally": {
                    "summary": "Setting is managed by another integration",
                    "value": {
                      "error": "managed_externally",
                      "request_id": "req_sandbox_managed_externally"
                    }
                  },
                  "writeInProgress": {
                    "summary": "Idempotent write is still processing",
                    "value": {
                      "error": "write_in_progress",
                      "request_id": "req_sandbox_write_in_progress"
                    }
                  }
                }
              }
            }
          },
          "413": {
            "description": "The JSON request body exceeds one megabyte.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "payloadTooLarge": {
                    "summary": "JSON body exceeds the one-megabyte limit",
                    "value": {
                      "error": "payload_too_large",
                      "request_id": "req_sandbox_payload_too_large"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "The partner request limit has been exceeded.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              },
              "RateLimit": {
                "schema": {
                  "type": "string"
                },
                "description": "The exhausted quota in the IETF RateLimit syntax (`\"name\";r=<remaining>;t=<seconds until reset>`). Sent only with 429; `r` is always 0 and `t` equals Retry-After."
              },
              "Retry-After": {
                "schema": {
                  "type": "integer",
                  "minimum": 1
                },
                "description": "Seconds to wait before retrying."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "rateLimited": {
                    "summary": "Partner request limit exceeded",
                    "value": {
                      "error": "rate_limited",
                      "request_id": "req_sandbox_rate_limited"
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "The capability is disabled in this environment or a required service is unavailable.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "capabilityDisabled": {
                    "summary": "Capability is disabled in this environment",
                    "value": {
                      "error": "capability_disabled",
                      "request_id": "req_sandbox_capability_disabled"
                    }
                  },
                  "serviceUnavailable": {
                    "summary": "Temporary service failure",
                    "value": {
                      "error": "service_unavailable",
                      "request_id": "req_sandbox_service_unavailable"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/restaurants/{restaurantId}/menus/online": {
      "put": {
        "x-fiest-visibility": "public",
        "x-fiest-conditional-scopes": {
          "organization": [
            "fiest.organization.read"
          ]
        },
        "operationId": "setOnlineMenu",
        "summary": "Set the online-ordering menu",
        "description": "Makes a non-empty reviewed menu the restaurant online-ordering menu. Expected menu counts and the current online-menu ID prevent publishing stale state. Organization-boundary tokens also require fiest.organization.read.",
        "tags": [
          "Menus"
        ],
        "externalDocs": {
          "description": "Authorize and call the Fiest Partner API",
          "url": "https://docs.fiest.io/api/quickstart"
        },
        "security": [
          {
            "fiestOAuth": [
              "fiest.restaurant.read",
              "fiest.menu.read",
              "fiest.menu.publish.write"
            ]
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/RestaurantId"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SetOnlineMenuInput"
              },
              "example": {
                "menuPublicId": "43f64da8-4ec2-4900-b137-1c0927c975d2",
                "expectedCategoryCount": 2,
                "expectedItemCount": 8,
                "expectedCurrentOnlineMenuPublicId": null,
                "idempotencyKey": "bbbbbbbb-bbbb-4bbb-8bbb-bbbbbbbbbbbb",
                "confirmed": true
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The menu now used for online ordering.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/SetOnlineMenuResult"
                    }
                  }
                },
                "example": {
                  "data": {
                    "actionId": "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa",
                    "restaurantId": "11111111-1111-4111-8111-111111111111",
                    "menu": {
                      "menuPublicId": "43f64da8-4ec2-4900-b137-1c0927c975d2",
                      "name": "Lunch menu",
                      "activeForPos": false,
                      "onlineOrdering": true,
                      "categoryCount": 2,
                      "itemCount": 8
                    },
                    "previousOnlineMenuPublicId": null,
                    "replayed": false
                  }
                }
              }
            }
          },
          "400": {
            "description": "The request parameters are invalid.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "invalidRequest": {
                    "summary": "Invalid request parameters",
                    "value": {
                      "error": "invalid_request",
                      "message": "The requested date range is invalid.",
                      "request_id": "req_sandbox_invalid_request"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "The access token is missing, invalid, or expired.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              },
              "WWW-Authenticate": {
                "schema": {
                  "type": "string"
                },
                "description": "OAuth bearer challenge and protected-resource metadata. Present for token and scope failures; other responses with the same status can omit it."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "invalidToken": {
                    "summary": "Missing or invalid access token",
                    "value": {
                      "error": "invalid_token",
                      "error_description": "The access token is invalid.",
                      "request_id": "req_sandbox_invalid_token"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "The authorization has expired or does not include the required scope.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              },
              "WWW-Authenticate": {
                "schema": {
                  "type": "string"
                },
                "description": "OAuth bearer challenge and protected-resource metadata. Present for token and scope failures; other responses with the same status can omit it."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "insufficientScope": {
                    "summary": "Required scope is missing",
                    "value": {
                      "error": "insufficient_scope",
                      "error_description": "The operation requires an OAuth scope that is not granted.",
                      "request_id": "req_sandbox_insufficient_scope"
                    }
                  },
                  "organizationScopeMissing": {
                    "summary": "Organization scope is missing",
                    "value": {
                      "error": "insufficient_scope",
                      "error_description": "Organization read access is required.",
                      "request_id": "req_sandbox_organization_scope_missing"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "The restaurant or requested resource does not exist or is outside the authorization.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "notFound": {
                    "summary": "Resource is outside the authorization",
                    "value": {
                      "error": "not_found",
                      "request_id": "req_sandbox_not_found"
                    }
                  }
                }
              }
            }
          },
          "409": {
            "description": "The write conflicts with current state, its idempotency key, or an active external integration.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              },
              "Retry-After": {
                "schema": {
                  "type": "integer",
                  "minimum": 1
                },
                "description": "Present when the same idempotent write is still processing."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "conflict": {
                    "summary": "Current restaurant state conflicts with the request",
                    "value": {
                      "error": "conflict",
                      "request_id": "req_sandbox_conflict"
                    }
                  },
                  "idempotencyConflict": {
                    "summary": "Idempotency key was reused with different input",
                    "value": {
                      "error": "idempotency_conflict",
                      "request_id": "req_sandbox_idempotency_conflict"
                    }
                  },
                  "preconditionFailed": {
                    "summary": "Restaurant state changed after review",
                    "value": {
                      "error": "precondition_failed",
                      "request_id": "req_sandbox_precondition_failed"
                    }
                  },
                  "managedExternally": {
                    "summary": "Setting is managed by another integration",
                    "value": {
                      "error": "managed_externally",
                      "request_id": "req_sandbox_managed_externally"
                    }
                  },
                  "writeInProgress": {
                    "summary": "Idempotent write is still processing",
                    "value": {
                      "error": "write_in_progress",
                      "request_id": "req_sandbox_write_in_progress"
                    }
                  }
                }
              }
            }
          },
          "413": {
            "description": "The JSON request body exceeds one megabyte.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "payloadTooLarge": {
                    "summary": "JSON body exceeds the one-megabyte limit",
                    "value": {
                      "error": "payload_too_large",
                      "request_id": "req_sandbox_payload_too_large"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "The partner request limit has been exceeded.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              },
              "RateLimit": {
                "schema": {
                  "type": "string"
                },
                "description": "The exhausted quota in the IETF RateLimit syntax (`\"name\";r=<remaining>;t=<seconds until reset>`). Sent only with 429; `r` is always 0 and `t` equals Retry-After."
              },
              "Retry-After": {
                "schema": {
                  "type": "integer",
                  "minimum": 1
                },
                "description": "Seconds to wait before retrying."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "rateLimited": {
                    "summary": "Partner request limit exceeded",
                    "value": {
                      "error": "rate_limited",
                      "request_id": "req_sandbox_rate_limited"
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "The capability is disabled in this environment or a required service is unavailable.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "capabilityDisabled": {
                    "summary": "Capability is disabled in this environment",
                    "value": {
                      "error": "capability_disabled",
                      "request_id": "req_sandbox_capability_disabled"
                    }
                  },
                  "serviceUnavailable": {
                    "summary": "Temporary service failure",
                    "value": {
                      "error": "service_unavailable",
                      "request_id": "req_sandbox_service_unavailable"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/restaurants/{restaurantId}/catalog-import/capabilities": {
      "get": {
        "x-fiest-visibility": "public",
        "x-fiest-conditional-scopes": {
          "organization": [
            "fiest.organization.read"
          ]
        },
        "operationId": "getCatalogImportCapabilities",
        "summary": "Get catalog import capabilities",
        "description": "Returns the exact create-only entity support and bounded limits that an importer must honor before producing a document. Organization-boundary tokens also require fiest.organization.read.",
        "tags": [
          "Catalog import"
        ],
        "externalDocs": {
          "description": "Authorize and call the Fiest Partner API",
          "url": "https://docs.fiest.io/api/quickstart"
        },
        "security": [
          {
            "fiestOAuth": [
              "fiest.restaurant.read",
              "fiest.menu.read",
              "fiest.catalog.import.write"
            ]
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/RestaurantId"
          }
        ],
        "responses": {
          "200": {
            "description": "Supported catalog entities and limits.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/CatalogImportCapabilitiesResult"
                    }
                  }
                },
                "example": {
                  "data": {
                    "restaurantId": "11111111-1111-4111-8111-111111111111",
                    "createOnly": true,
                    "publishesAutomatically": false,
                    "combosEnabled": true,
                    "targetModes": [
                      "new_draft",
                      "existing_draft"
                    ],
                    "supportedEntities": [
                      "menu",
                      "menu_category",
                      "menu_item",
                      "option_group",
                      "option",
                      "product_category",
                      "product",
                      "combo"
                    ],
                    "limits": {
                      "menuCategories": 20,
                      "menuItems": 100,
                      "optionGroups": 20,
                      "options": 100,
                      "productCategories": 20,
                      "products": 100,
                      "combos": 20,
                      "comboComponents": 100
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "The request parameters are invalid.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "invalidRequest": {
                    "summary": "Invalid request parameters",
                    "value": {
                      "error": "invalid_request",
                      "message": "The requested date range is invalid.",
                      "request_id": "req_sandbox_invalid_request"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "The access token is missing, invalid, or expired.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              },
              "WWW-Authenticate": {
                "schema": {
                  "type": "string"
                },
                "description": "OAuth bearer challenge and protected-resource metadata. Present for token and scope failures; other responses with the same status can omit it."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "invalidToken": {
                    "summary": "Missing or invalid access token",
                    "value": {
                      "error": "invalid_token",
                      "error_description": "The access token is invalid.",
                      "request_id": "req_sandbox_invalid_token"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "The authorization has expired or does not include the required scope.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              },
              "WWW-Authenticate": {
                "schema": {
                  "type": "string"
                },
                "description": "OAuth bearer challenge and protected-resource metadata. Present for token and scope failures; other responses with the same status can omit it."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "insufficientScope": {
                    "summary": "Required scope is missing",
                    "value": {
                      "error": "insufficient_scope",
                      "error_description": "The operation requires an OAuth scope that is not granted.",
                      "request_id": "req_sandbox_insufficient_scope"
                    }
                  },
                  "organizationScopeMissing": {
                    "summary": "Organization scope is missing",
                    "value": {
                      "error": "insufficient_scope",
                      "error_description": "Organization read access is required.",
                      "request_id": "req_sandbox_organization_scope_missing"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "The restaurant or requested resource does not exist or is outside the authorization.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "notFound": {
                    "summary": "Resource is outside the authorization",
                    "value": {
                      "error": "not_found",
                      "request_id": "req_sandbox_not_found"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "The partner request limit has been exceeded.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              },
              "RateLimit": {
                "schema": {
                  "type": "string"
                },
                "description": "The exhausted quota in the IETF RateLimit syntax (`\"name\";r=<remaining>;t=<seconds until reset>`). Sent only with 429; `r` is always 0 and `t` equals Retry-After."
              },
              "Retry-After": {
                "schema": {
                  "type": "integer",
                  "minimum": 1
                },
                "description": "Seconds to wait before retrying."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "rateLimited": {
                    "summary": "Partner request limit exceeded",
                    "value": {
                      "error": "rate_limited",
                      "request_id": "req_sandbox_rate_limited"
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "The API or one of its required services is unavailable.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "serviceUnavailable": {
                    "summary": "Temporary service failure",
                    "value": {
                      "error": "service_unavailable",
                      "request_id": "req_sandbox_service_unavailable"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/restaurants/{restaurantId}/catalog-import/targets/{menuPublicId}": {
      "get": {
        "x-fiest-visibility": "public",
        "x-fiest-conditional-scopes": {
          "organization": [
            "fiest.organization.read"
          ]
        },
        "operationId": "getCatalogImportTarget",
        "summary": "Inspect a catalog import target",
        "description": "Returns the exact state and categories of one user-selected menu. Only inactive draft menus can receive newly created catalog entities. Organization-boundary tokens also require fiest.organization.read.",
        "tags": [
          "Catalog import"
        ],
        "externalDocs": {
          "description": "Authorize and call the Fiest Partner API",
          "url": "https://docs.fiest.io/api/quickstart"
        },
        "security": [
          {
            "fiestOAuth": [
              "fiest.restaurant.read",
              "fiest.menu.read",
              "fiest.catalog.import.write"
            ]
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/RestaurantId"
          },
          {
            "$ref": "#/components/parameters/MenuPublicId"
          }
        ],
        "responses": {
          "200": {
            "description": "The selected menu and its current categories.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/CatalogImportTargetResult"
                    }
                  }
                },
                "example": {
                  "data": {
                    "restaurantId": "11111111-1111-4111-8111-111111111111",
                    "menu": {
                      "menuPublicId": "43f64da8-4ec2-4900-b137-1c0927c975d2",
                      "name": "Lunch menu",
                      "activeForPos": false,
                      "onlineOrdering": false,
                      "categoryCount": 2,
                      "itemCount": 8
                    },
                    "canAddCatalogEntities": true,
                    "categories": [
                      {
                        "categoryPublicId": "af16a392-f8a1-47b4-849f-4d707001e9b1",
                        "name": "Pizzas",
                        "itemCount": 8
                      }
                    ]
                  }
                }
              }
            }
          },
          "400": {
            "description": "The request parameters are invalid.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "invalidRequest": {
                    "summary": "Invalid request parameters",
                    "value": {
                      "error": "invalid_request",
                      "message": "The requested date range is invalid.",
                      "request_id": "req_sandbox_invalid_request"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "The access token is missing, invalid, or expired.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              },
              "WWW-Authenticate": {
                "schema": {
                  "type": "string"
                },
                "description": "OAuth bearer challenge and protected-resource metadata. Present for token and scope failures; other responses with the same status can omit it."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "invalidToken": {
                    "summary": "Missing or invalid access token",
                    "value": {
                      "error": "invalid_token",
                      "error_description": "The access token is invalid.",
                      "request_id": "req_sandbox_invalid_token"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "The authorization has expired or does not include the required scope.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              },
              "WWW-Authenticate": {
                "schema": {
                  "type": "string"
                },
                "description": "OAuth bearer challenge and protected-resource metadata. Present for token and scope failures; other responses with the same status can omit it."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "insufficientScope": {
                    "summary": "Required scope is missing",
                    "value": {
                      "error": "insufficient_scope",
                      "error_description": "The operation requires an OAuth scope that is not granted.",
                      "request_id": "req_sandbox_insufficient_scope"
                    }
                  },
                  "organizationScopeMissing": {
                    "summary": "Organization scope is missing",
                    "value": {
                      "error": "insufficient_scope",
                      "error_description": "Organization read access is required.",
                      "request_id": "req_sandbox_organization_scope_missing"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "The restaurant or requested resource does not exist or is outside the authorization.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "notFound": {
                    "summary": "Resource is outside the authorization",
                    "value": {
                      "error": "not_found",
                      "request_id": "req_sandbox_not_found"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "The partner request limit has been exceeded.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              },
              "RateLimit": {
                "schema": {
                  "type": "string"
                },
                "description": "The exhausted quota in the IETF RateLimit syntax (`\"name\";r=<remaining>;t=<seconds until reset>`). Sent only with 429; `r` is always 0 and `t` equals Retry-After."
              },
              "Retry-After": {
                "schema": {
                  "type": "integer",
                  "minimum": 1
                },
                "description": "Seconds to wait before retrying."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "rateLimited": {
                    "summary": "Partner request limit exceeded",
                    "value": {
                      "error": "rate_limited",
                      "request_id": "req_sandbox_rate_limited"
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "The API or one of its required services is unavailable.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "serviceUnavailable": {
                    "summary": "Temporary service failure",
                    "value": {
                      "error": "service_unavailable",
                      "request_id": "req_sandbox_service_unavailable"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/restaurants/{restaurantId}/catalog-import/plan": {
      "post": {
        "x-fiest-visibility": "public",
        "x-fiest-conditional-scopes": {
          "organization": [
            "fiest.organization.read"
          ]
        },
        "operationId": "planCatalogImport",
        "summary": "Validate and plan a catalog import",
        "description": "Validates a bounded create-only catalog document and returns a deterministic plan hash. This operation does not write data. Organization-boundary tokens also require fiest.organization.read.",
        "tags": [
          "Catalog import"
        ],
        "externalDocs": {
          "description": "Authorize and call the Fiest Partner API",
          "url": "https://docs.fiest.io/api/quickstart"
        },
        "security": [
          {
            "fiestOAuth": [
              "fiest.restaurant.read",
              "fiest.menu.read",
              "fiest.catalog.import.write"
            ]
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/RestaurantId"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PlanMenuImportInput"
              },
              "example": {
                "target": {
                  "mode": "new_draft"
                },
                "document": {
                  "menu": {
                    "ref": "lunch-menu",
                    "name": "Lunch menu"
                  },
                  "existingMenuCategories": [],
                  "menuCategories": [
                    {
                      "ref": "pizzas",
                      "name": "Pizzas",
                      "visible": true,
                      "regulatedProductClass": "standard",
                      "discountPolicy": "allowed"
                    }
                  ],
                  "menuItems": [
                    {
                      "ref": "margherita",
                      "categoryRef": "pizzas",
                      "name": "Margherita",
                      "priceMinor": 1290,
                      "description": null,
                      "visible": true,
                      "dietaryInfo": {
                        "vegan": false,
                        "vegetarian": true,
                        "gluten-free": false,
                        "dairy-free": false,
                        "lactose-free": false,
                        "low-lactose": false,
                        "egg-free": false,
                        "nut-free": false,
                        "soy-free": false
                      },
                      "tag": null,
                      "productType": "food",
                      "showInKitchen": true,
                      "trackVolume": false,
                      "openPrice": false,
                      "isAlcohol": false,
                      "volume": null,
                      "unit": null,
                      "alcoholType": null,
                      "alcoholPercentage": null,
                      "regulatedProductClassOverride": null,
                      "discountPolicyOverride": null,
                      "optionGroupAssignments": []
                    }
                  ],
                  "optionGroups": [],
                  "productCategories": [],
                  "products": [],
                  "combos": []
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The validation result and import plan hash.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PlanMenuImportResult"
                    }
                  }
                },
                "example": {
                  "data": {
                    "restaurantId": "11111111-1111-4111-8111-111111111111",
                    "valid": true,
                    "planHash": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc",
                    "menuName": "Lunch menu",
                    "target": {
                      "mode": "new_draft",
                      "menuPublicId": null,
                      "menuName": "Lunch menu",
                      "previousCategoryCount": 0,
                      "previousItemCount": 0
                    },
                    "creates": {
                      "menus": 1,
                      "newMenus": 1,
                      "menuCategories": 1,
                      "menuItems": 1,
                      "optionGroups": 0,
                      "options": 0,
                      "productCategories": 0,
                      "products": 0,
                      "combos": 0,
                      "comboComponents": 0
                    },
                    "warnings": [],
                    "errors": [],
                    "publishesAutomatically": false
                  }
                }
              }
            }
          },
          "400": {
            "description": "The request parameters are invalid.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "invalidRequest": {
                    "summary": "Invalid request parameters",
                    "value": {
                      "error": "invalid_request",
                      "message": "The requested date range is invalid.",
                      "request_id": "req_sandbox_invalid_request"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "The access token is missing, invalid, or expired.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              },
              "WWW-Authenticate": {
                "schema": {
                  "type": "string"
                },
                "description": "OAuth bearer challenge and protected-resource metadata. Present for token and scope failures; other responses with the same status can omit it."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "invalidToken": {
                    "summary": "Missing or invalid access token",
                    "value": {
                      "error": "invalid_token",
                      "error_description": "The access token is invalid.",
                      "request_id": "req_sandbox_invalid_token"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "The authorization has expired or does not include the required scope.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              },
              "WWW-Authenticate": {
                "schema": {
                  "type": "string"
                },
                "description": "OAuth bearer challenge and protected-resource metadata. Present for token and scope failures; other responses with the same status can omit it."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "insufficientScope": {
                    "summary": "Required scope is missing",
                    "value": {
                      "error": "insufficient_scope",
                      "error_description": "The operation requires an OAuth scope that is not granted.",
                      "request_id": "req_sandbox_insufficient_scope"
                    }
                  },
                  "organizationScopeMissing": {
                    "summary": "Organization scope is missing",
                    "value": {
                      "error": "insufficient_scope",
                      "error_description": "Organization read access is required.",
                      "request_id": "req_sandbox_organization_scope_missing"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "The restaurant or requested resource does not exist or is outside the authorization.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "notFound": {
                    "summary": "Resource is outside the authorization",
                    "value": {
                      "error": "not_found",
                      "request_id": "req_sandbox_not_found"
                    }
                  }
                }
              }
            }
          },
          "413": {
            "description": "The JSON request body exceeds one megabyte.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "payloadTooLarge": {
                    "summary": "JSON body exceeds the one-megabyte limit",
                    "value": {
                      "error": "payload_too_large",
                      "request_id": "req_sandbox_payload_too_large"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "The partner request limit has been exceeded.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              },
              "RateLimit": {
                "schema": {
                  "type": "string"
                },
                "description": "The exhausted quota in the IETF RateLimit syntax (`\"name\";r=<remaining>;t=<seconds until reset>`). Sent only with 429; `r` is always 0 and `t` equals Retry-After."
              },
              "Retry-After": {
                "schema": {
                  "type": "integer",
                  "minimum": 1
                },
                "description": "Seconds to wait before retrying."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "rateLimited": {
                    "summary": "Partner request limit exceeded",
                    "value": {
                      "error": "rate_limited",
                      "request_id": "req_sandbox_rate_limited"
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "The API or one of its required services is unavailable.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "serviceUnavailable": {
                    "summary": "Temporary service failure",
                    "value": {
                      "error": "service_unavailable",
                      "request_id": "req_sandbox_service_unavailable"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/restaurants/{restaurantId}/catalog-import/apply": {
      "post": {
        "x-fiest-visibility": "public",
        "x-fiest-conditional-scopes": {
          "organization": [
            "fiest.organization.read"
          ]
        },
        "operationId": "applyCatalogImport",
        "summary": "Apply a catalog import",
        "description": "Creates the planned catalog entities and one inactive draft menu. The plan hash, explicit confirmation, and idempotency key are required; this operation never publishes the new menu. Organization-boundary tokens also require fiest.organization.read.",
        "tags": [
          "Catalog import"
        ],
        "externalDocs": {
          "description": "Authorize and call the Fiest Partner API",
          "url": "https://docs.fiest.io/api/quickstart"
        },
        "security": [
          {
            "fiestOAuth": [
              "fiest.restaurant.read",
              "fiest.menu.read",
              "fiest.catalog.import.write"
            ]
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/RestaurantId"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ApplyMenuImportInput"
              },
              "example": {
                "target": {
                  "mode": "new_draft"
                },
                "document": {
                  "menu": {
                    "ref": "lunch-menu",
                    "name": "Lunch menu"
                  },
                  "existingMenuCategories": [],
                  "menuCategories": [
                    {
                      "ref": "pizzas",
                      "name": "Pizzas",
                      "visible": true,
                      "regulatedProductClass": "standard",
                      "discountPolicy": "allowed"
                    }
                  ],
                  "menuItems": [
                    {
                      "ref": "margherita",
                      "categoryRef": "pizzas",
                      "name": "Margherita",
                      "priceMinor": 1290,
                      "description": null,
                      "visible": true,
                      "dietaryInfo": {
                        "vegan": false,
                        "vegetarian": true,
                        "gluten-free": false,
                        "dairy-free": false,
                        "lactose-free": false,
                        "low-lactose": false,
                        "egg-free": false,
                        "nut-free": false,
                        "soy-free": false
                      },
                      "tag": null,
                      "productType": "food",
                      "showInKitchen": true,
                      "trackVolume": false,
                      "openPrice": false,
                      "isAlcohol": false,
                      "volume": null,
                      "unit": null,
                      "alcoholType": null,
                      "alcoholPercentage": null,
                      "regulatedProductClassOverride": null,
                      "discountPolicyOverride": null,
                      "optionGroupAssignments": []
                    }
                  ],
                  "optionGroups": [],
                  "productCategories": [],
                  "products": [],
                  "combos": []
                },
                "expectedPlanHash": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc",
                "idempotencyKey": "bbbbbbbb-bbbb-4bbb-8bbb-bbbbbbbbbbbb",
                "confirmed": true
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "The committed create-only import result.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ApplyMenuImportResult"
                    }
                  }
                },
                "example": {
                  "data": {
                    "actionId": "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa",
                    "restaurantId": "11111111-1111-4111-8111-111111111111",
                    "menu": {
                      "menuPublicId": "43f64da8-4ec2-4900-b137-1c0927c975d2",
                      "name": "Lunch menu",
                      "activeForPos": false,
                      "onlineOrdering": false,
                      "categoryCount": 1,
                      "itemCount": 1
                    },
                    "created": {
                      "menus": 1,
                      "newMenus": 1,
                      "menuCategories": 1,
                      "menuItems": 1,
                      "optionGroups": 0,
                      "options": 0,
                      "productCategories": 0,
                      "products": 0,
                      "combos": 0,
                      "comboComponents": 0
                    },
                    "ids": {
                      "menu": {
                        "lunch-menu": "33333333-3333-4333-8333-333333333333"
                      },
                      "menuCategories": {
                        "pizzas": "44444444-4444-4444-8444-444444444444"
                      },
                      "existingMenuCategories": {},
                      "menuItems": {
                        "margherita": "55555555-5555-4555-8555-555555555555"
                      },
                      "optionGroups": {},
                      "options": {},
                      "productCategories": {},
                      "products": {}
                    },
                    "replayed": false
                  }
                }
              }
            }
          },
          "400": {
            "description": "The request parameters are invalid.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "invalidRequest": {
                    "summary": "Invalid request parameters",
                    "value": {
                      "error": "invalid_request",
                      "message": "The requested date range is invalid.",
                      "request_id": "req_sandbox_invalid_request"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "The access token is missing, invalid, or expired.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              },
              "WWW-Authenticate": {
                "schema": {
                  "type": "string"
                },
                "description": "OAuth bearer challenge and protected-resource metadata. Present for token and scope failures; other responses with the same status can omit it."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "invalidToken": {
                    "summary": "Missing or invalid access token",
                    "value": {
                      "error": "invalid_token",
                      "error_description": "The access token is invalid.",
                      "request_id": "req_sandbox_invalid_token"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "The authorization has expired or does not include the required scope.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              },
              "WWW-Authenticate": {
                "schema": {
                  "type": "string"
                },
                "description": "OAuth bearer challenge and protected-resource metadata. Present for token and scope failures; other responses with the same status can omit it."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "insufficientScope": {
                    "summary": "Required scope is missing",
                    "value": {
                      "error": "insufficient_scope",
                      "error_description": "The operation requires an OAuth scope that is not granted.",
                      "request_id": "req_sandbox_insufficient_scope"
                    }
                  },
                  "organizationScopeMissing": {
                    "summary": "Organization scope is missing",
                    "value": {
                      "error": "insufficient_scope",
                      "error_description": "Organization read access is required.",
                      "request_id": "req_sandbox_organization_scope_missing"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "The restaurant or requested resource does not exist or is outside the authorization.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "notFound": {
                    "summary": "Resource is outside the authorization",
                    "value": {
                      "error": "not_found",
                      "request_id": "req_sandbox_not_found"
                    }
                  }
                }
              }
            }
          },
          "409": {
            "description": "The write conflicts with current state, its idempotency key, or an active external integration.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              },
              "Retry-After": {
                "schema": {
                  "type": "integer",
                  "minimum": 1
                },
                "description": "Present when the same idempotent write is still processing."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "conflict": {
                    "summary": "Current restaurant state conflicts with the request",
                    "value": {
                      "error": "conflict",
                      "request_id": "req_sandbox_conflict"
                    }
                  },
                  "idempotencyConflict": {
                    "summary": "Idempotency key was reused with different input",
                    "value": {
                      "error": "idempotency_conflict",
                      "request_id": "req_sandbox_idempotency_conflict"
                    }
                  },
                  "preconditionFailed": {
                    "summary": "Restaurant state changed after review",
                    "value": {
                      "error": "precondition_failed",
                      "request_id": "req_sandbox_precondition_failed"
                    }
                  },
                  "managedExternally": {
                    "summary": "Setting is managed by another integration",
                    "value": {
                      "error": "managed_externally",
                      "request_id": "req_sandbox_managed_externally"
                    }
                  },
                  "writeInProgress": {
                    "summary": "Idempotent write is still processing",
                    "value": {
                      "error": "write_in_progress",
                      "request_id": "req_sandbox_write_in_progress"
                    }
                  }
                }
              }
            }
          },
          "413": {
            "description": "The JSON request body exceeds one megabyte.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "payloadTooLarge": {
                    "summary": "JSON body exceeds the one-megabyte limit",
                    "value": {
                      "error": "payload_too_large",
                      "request_id": "req_sandbox_payload_too_large"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "The partner request limit has been exceeded.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              },
              "RateLimit": {
                "schema": {
                  "type": "string"
                },
                "description": "The exhausted quota in the IETF RateLimit syntax (`\"name\";r=<remaining>;t=<seconds until reset>`). Sent only with 429; `r` is always 0 and `t` equals Retry-After."
              },
              "Retry-After": {
                "schema": {
                  "type": "integer",
                  "minimum": 1
                },
                "description": "Seconds to wait before retrying."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "rateLimited": {
                    "summary": "Partner request limit exceeded",
                    "value": {
                      "error": "rate_limited",
                      "request_id": "req_sandbox_rate_limited"
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "The capability is disabled in this environment or a required service is unavailable.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "capabilityDisabled": {
                    "summary": "Capability is disabled in this environment",
                    "value": {
                      "error": "capability_disabled",
                      "request_id": "req_sandbox_capability_disabled"
                    }
                  },
                  "serviceUnavailable": {
                    "summary": "Temporary service failure",
                    "value": {
                      "error": "service_unavailable",
                      "request_id": "req_sandbox_service_unavailable"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/restaurants/{restaurantId}/catalog-import/actions/{actionId}": {
      "get": {
        "x-fiest-visibility": "public",
        "x-fiest-conditional-scopes": {
          "organization": [
            "fiest.organization.read"
          ]
        },
        "operationId": "getCatalogImportResult",
        "summary": "Get a catalog import result",
        "description": "Returns the current result of a previously accepted import action without exposing another restaurant or authorization boundary. Organization-boundary tokens also require fiest.organization.read.",
        "tags": [
          "Catalog import"
        ],
        "externalDocs": {
          "description": "Authorize and call the Fiest Partner API",
          "url": "https://docs.fiest.io/api/quickstart"
        },
        "security": [
          {
            "fiestOAuth": [
              "fiest.restaurant.read",
              "fiest.menu.read",
              "fiest.catalog.import.write"
            ]
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/RestaurantId"
          },
          {
            "$ref": "#/components/parameters/ActionId"
          }
        ],
        "responses": {
          "200": {
            "description": "The current import action result.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/GetMenuImportResult"
                    }
                  }
                },
                "example": {
                  "data": {
                    "status": "succeeded",
                    "result": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "The request parameters are invalid.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "invalidRequest": {
                    "summary": "Invalid request parameters",
                    "value": {
                      "error": "invalid_request",
                      "message": "The requested date range is invalid.",
                      "request_id": "req_sandbox_invalid_request"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "The access token is missing, invalid, or expired.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              },
              "WWW-Authenticate": {
                "schema": {
                  "type": "string"
                },
                "description": "OAuth bearer challenge and protected-resource metadata. Present for token and scope failures; other responses with the same status can omit it."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "invalidToken": {
                    "summary": "Missing or invalid access token",
                    "value": {
                      "error": "invalid_token",
                      "error_description": "The access token is invalid.",
                      "request_id": "req_sandbox_invalid_token"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "The authorization has expired or does not include the required scope.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              },
              "WWW-Authenticate": {
                "schema": {
                  "type": "string"
                },
                "description": "OAuth bearer challenge and protected-resource metadata. Present for token and scope failures; other responses with the same status can omit it."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "insufficientScope": {
                    "summary": "Required scope is missing",
                    "value": {
                      "error": "insufficient_scope",
                      "error_description": "The operation requires an OAuth scope that is not granted.",
                      "request_id": "req_sandbox_insufficient_scope"
                    }
                  },
                  "organizationScopeMissing": {
                    "summary": "Organization scope is missing",
                    "value": {
                      "error": "insufficient_scope",
                      "error_description": "Organization read access is required.",
                      "request_id": "req_sandbox_organization_scope_missing"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "The restaurant or requested resource does not exist or is outside the authorization.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "notFound": {
                    "summary": "Resource is outside the authorization",
                    "value": {
                      "error": "not_found",
                      "request_id": "req_sandbox_not_found"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "The partner request limit has been exceeded.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              },
              "RateLimit": {
                "schema": {
                  "type": "string"
                },
                "description": "The exhausted quota in the IETF RateLimit syntax (`\"name\";r=<remaining>;t=<seconds until reset>`). Sent only with 429; `r` is always 0 and `t` equals Retry-After."
              },
              "Retry-After": {
                "schema": {
                  "type": "integer",
                  "minimum": 1
                },
                "description": "Seconds to wait before retrying."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "rateLimited": {
                    "summary": "Partner request limit exceeded",
                    "value": {
                      "error": "rate_limited",
                      "request_id": "req_sandbox_rate_limited"
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "The API or one of its required services is unavailable.",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string"
                },
                "description": "Correlation identifier to retain when contacting Fiest support."
              },
              "RateLimit-Policy": {
                "schema": {
                  "type": "string"
                },
                "description": "The request quota this response was subject to, in the IETF RateLimit-Policy syntax (`\"name\";q=<quota>;w=<window seconds>`). Currently `\"partner\";q=60;w=60`: 60 requests per 60 seconds for each partner client and authorizing user."
              },
              "Deprecation": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the announcement date as an RFC 9745 Structured Fields Date (`@<seconds since epoch>`). Policy: https://docs.fiest.io/api/versioning"
              },
              "Sunset": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: the RFC 8594 HTTP-date after which it stops answering."
              },
              "Link": {
                "schema": {
                  "type": "string"
                },
                "description": "Present only while the version or operation that answered is retiring: an RFC 8288 link with `rel=\"deprecation\"` to the notice describing the replacement."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiError"
                },
                "examples": {
                  "serviceUnavailable": {
                    "summary": "Temporary service failure",
                    "value": {
                      "error": "service_unavailable",
                      "request_id": "req_sandbox_service_unavailable"
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "fiestOAuth": {
        "type": "oauth2",
        "description": "OAuth 2.1 authorization code with PKCE. Partner clients and redirect URIs must be approved by Fiest before use.",
        "flows": {
          "authorizationCode": {
            "authorizationUrl": "https://auth-sandbox.fiest.io/api/auth/oauth2/authorize",
            "tokenUrl": "https://auth-sandbox.fiest.io/api/auth/oauth2/token",
            "refreshUrl": "https://auth-sandbox.fiest.io/api/auth/oauth2/token",
            "scopes": {
              "offline_access": "Keep the approved connection active with rotating refresh tokens.",
              "fiest.restaurant.read": "List and identify the restaurants covered by the authorization.",
              "fiest.accounting.read": "Read bounded accounting summaries for authorized restaurants.",
              "fiest.orders.read": "Read bounded order summaries and exact sold-line details.",
              "fiest.organization.read": "Use the reviewed restaurant snapshot from a Management organization authorization.",
              "fiest.menu.read": "List bounded menu summaries and search catalog items for authorized restaurants.",
              "fiest.menu.structure.write": "Create inactive draft menus, attach existing items, and update reviewed unshared draft items.",
              "fiest.menu.publish.write": "Set a reviewed menu active for POS or online ordering.",
              "fiest.catalog.import.write": "Plan and apply bounded create-only catalog imports."
            }
          }
        }
      }
    },
    "parameters": {
      "RestaurantId": {
        "name": "restaurantId",
        "in": "path",
        "required": true,
        "description": "A restaurant identifier returned by the authorized restaurant list.",
        "schema": {
          "type": "string",
          "format": "uuid"
        },
        "example": "11111111-1111-4111-8111-111111111111"
      },
      "OrderId": {
        "name": "orderId",
        "in": "path",
        "required": true,
        "description": "Opaque non-sequential order identifier returned by the order list.",
        "schema": {
          "type": "string",
          "minLength": 1,
          "maxLength": 255
        },
        "example": "fiest-50b6d34f-bc6e-4248-b3d6-839b3dda31a1"
      },
      "MenuPublicId": {
        "name": "menuPublicId",
        "in": "path",
        "required": true,
        "description": "The stable menu UUID returned by the menu list.",
        "schema": {
          "type": "string",
          "format": "uuid"
        },
        "example": "43f64da8-4ec2-4900-b137-1c0927c975d2"
      },
      "MenuItemPublicId": {
        "name": "menuItemPublicId",
        "in": "path",
        "required": true,
        "description": "The stable item UUID returned by the menu-item search.",
        "schema": {
          "type": "string",
          "format": "uuid"
        },
        "example": "67fb6fb2-0f46-455b-934e-25707b77be08"
      },
      "ActionId": {
        "name": "actionId",
        "in": "path",
        "required": true,
        "description": "The UUID action identifier returned when an import is accepted.",
        "schema": {
          "type": "string",
          "format": "uuid"
        },
        "example": "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa"
      }
    },
    "schemas": {
      "ApiError": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "error"
        ],
        "properties": {
          "error": {
            "type": "string",
            "enum": [
              "authorization_expired",
              "capability_disabled",
              "conflict",
              "idempotency_conflict",
              "insufficient_scope",
              "invalid_request",
              "invalid_token",
              "not_found",
              "managed_externally",
              "payload_too_large",
              "precondition_failed",
              "rate_limited",
              "service_unavailable",
              "write_in_progress"
            ],
            "description": "Stable machine-readable error code."
          },
          "message": {
            "type": "string",
            "description": "Safe human-readable error description."
          },
          "error_description": {
            "type": "string",
            "description": "OAuth bearer error description."
          },
          "request_id": {
            "type": "string",
            "description": "Correlation identifier to include when contacting Fiest support."
          }
        }
      },
      "RestaurantBusinessIdentity": {
        "type": "object",
        "properties": {
          "registeredName": {
            "anyOf": [
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 200
              },
              {
                "type": "null"
              }
            ]
          },
          "businessId": {
            "anyOf": [
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 50
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "registeredName",
          "businessId"
        ],
        "additionalProperties": false
      },
      "RestaurantSummary": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "restaurantId",
          "restaurantName"
        ],
        "properties": {
          "restaurantId": {
            "type": "string",
            "format": "uuid"
          },
          "restaurantName": {
            "type": "string",
            "minLength": 1
          },
          "role": {
            "type": "string",
            "enum": [
              "owner",
              "admin"
            ],
            "description": "Present for a single-restaurant authorization. Organization results omit this field."
          },
          "businessIdentity": {
            "$ref": "#/components/schemas/RestaurantBusinessIdentity",
            "description": "Present for a Management organization authorization. Informational legal-entity data; never use it as an authorization key."
          }
        }
      },
      "RestaurantListResponse": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "data",
          "meta"
        ],
        "properties": {
          "data": {
            "type": "array",
            "maxItems": 100,
            "items": {
              "$ref": "#/components/schemas/RestaurantSummary"
            }
          },
          "meta": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "authorization_boundary"
            ],
            "properties": {
              "authorization_boundary": {
                "type": "string",
                "enum": [
                  "restaurant",
                  "organization"
                ]
              },
              "restaurants_truncated": {
                "type": "boolean",
                "description": "Organization grants only. True when the reviewed authorization snapshot exceeds the 100-restaurant response bound."
              },
              "authorization_coverage": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "authorized_restaurant_count",
                  "current_restaurant_count",
                  "additional_restaurant_count",
                  "reauthorization_available"
                ],
                "properties": {
                  "authorized_restaurant_count": {
                    "type": "integer",
                    "minimum": 0
                  },
                  "current_restaurant_count": {
                    "type": "integer",
                    "minimum": 0
                  },
                  "additional_restaurant_count": {
                    "type": "integer",
                    "minimum": 0
                  },
                  "reauthorization_available": {
                    "type": "boolean"
                  }
                },
                "description": "Organization grants only. Describes the reviewed restaurant snapshot and whether the customer should authorize again."
              }
            }
          }
        }
      },
      "RestaurantProfile": {
        "type": "object",
        "properties": {
          "restaurantId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "restaurantName": {
            "type": "string",
            "minLength": 1
          },
          "businessIdentity": {
            "type": "object",
            "properties": {
              "registeredName": {
                "anyOf": [
                  {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "businessId": {
                "anyOf": [
                  {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 50
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            },
            "required": [
              "registeredName",
              "businessId"
            ],
            "additionalProperties": false
          },
          "countryCode": {
            "anyOf": [
              {
                "type": "string",
                "pattern": "^[A-Z]{2}$"
              },
              {
                "type": "null"
              }
            ]
          },
          "joinedAt": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
          },
          "firstCompletedOrderAt": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
              },
              {
                "type": "null"
              }
            ]
          },
          "lastCompletedOrderAt": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
              },
              {
                "type": "null"
              }
            ]
          },
          "timeZone": {
            "type": "string",
            "minLength": 1,
            "maxLength": 50
          },
          "businessDayStartHour": {
            "type": "integer",
            "minimum": 0,
            "maximum": 23
          },
          "scheduleEnabled": {
            "type": "boolean"
          },
          "openingHours": {
            "minItems": 7,
            "maxItems": 7,
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "day": {
                  "type": "string",
                  "enum": [
                    "monday",
                    "tuesday",
                    "wednesday",
                    "thursday",
                    "friday",
                    "saturday",
                    "sunday"
                  ]
                },
                "isClosed": {
                  "type": "boolean"
                },
                "shifts": {
                  "maxItems": 4,
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "openTime": {
                        "type": "string",
                        "pattern": "^([01]\\d|2[0-3]):[0-5]\\d$"
                      },
                      "closeTime": {
                        "type": "string",
                        "pattern": "^([01]\\d|2[0-3]):[0-5]\\d$"
                      },
                      "spansNextDay": {
                        "type": "boolean"
                      }
                    },
                    "required": [
                      "openTime",
                      "closeTime",
                      "spansNextDay"
                    ],
                    "additionalProperties": false
                  }
                }
              },
              "required": [
                "day",
                "isClosed",
                "shifts"
              ],
              "additionalProperties": false
            }
          },
          "openingHoursTruncated": {
            "type": "boolean"
          },
          "paymentProviders": {
            "maxItems": 10,
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "provider": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 50
                },
                "connectedAt": {
                  "anyOf": [
                    {
                      "type": "string",
                      "format": "date-time",
                      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "activeForPos": {
                  "type": "boolean"
                },
                "preferredForOnline": {
                  "type": "boolean"
                }
              },
              "required": [
                "provider",
                "connectedAt",
                "activeForPos",
                "preferredForOnline"
              ],
              "additionalProperties": false
            }
          },
          "paymentProvidersTruncated": {
            "type": "boolean"
          }
        },
        "required": [
          "restaurantId",
          "restaurantName",
          "businessIdentity",
          "countryCode",
          "joinedAt",
          "firstCompletedOrderAt",
          "lastCompletedOrderAt",
          "timeZone",
          "businessDayStartHour",
          "scheduleEnabled",
          "openingHours",
          "openingHoursTruncated",
          "paymentProviders",
          "paymentProvidersTruncated"
        ],
        "additionalProperties": false
      },
      "AccountingSummary": {
        "type": "object",
        "properties": {
          "restaurantId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "period": {
            "type": "object",
            "properties": {
              "startDate": {
                "type": "string",
                "format": "date",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
              },
              "endDate": {
                "type": "string",
                "format": "date",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
              },
              "timeZone": {
                "type": "string",
                "minLength": 1
              },
              "dayStartHour": {
                "type": "integer",
                "minimum": 0,
                "maximum": 23
              }
            },
            "required": [
              "startDate",
              "endDate",
              "timeZone",
              "dayStartHour"
            ],
            "additionalProperties": false
          },
          "currency": {
            "type": "string",
            "const": "EUR"
          },
          "totals": {
            "type": "object",
            "properties": {
              "grossBeforeRefundsMinor": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "refundsMinor": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "grossSalesMinor": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "netSalesMinor": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "vatMinor": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "discountsMinor": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "tipsMinor": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "deferredGiftCardSalesMinor": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "orderCount": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "paymentTransactionCount": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              }
            },
            "required": [
              "grossBeforeRefundsMinor",
              "refundsMinor",
              "grossSalesMinor",
              "netSalesMinor",
              "vatMinor",
              "discountsMinor",
              "tipsMinor",
              "deferredGiftCardSalesMinor",
              "orderCount",
              "paymentTransactionCount"
            ],
            "additionalProperties": false
          },
          "paymentMethods": {
            "maxItems": 30,
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "key": {
                  "type": "string",
                  "minLength": 1
                },
                "label": {
                  "type": "string",
                  "minLength": 1
                },
                "transactionCount": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 9007199254740991
                },
                "grossBeforeRefundsMinor": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 9007199254740991
                },
                "refundsMinor": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 9007199254740991
                },
                "grossSalesMinor": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 9007199254740991
                },
                "netSalesMinor": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 9007199254740991
                },
                "vatMinor": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 9007199254740991
                }
              },
              "required": [
                "key",
                "label",
                "transactionCount",
                "grossBeforeRefundsMinor",
                "refundsMinor",
                "grossSalesMinor",
                "netSalesMinor",
                "vatMinor"
              ],
              "additionalProperties": false
            }
          },
          "vatBreakdown": {
            "maxItems": 5,
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "category": {
                  "type": "string",
                  "enum": [
                    "zero",
                    "special",
                    "reduced",
                    "standard",
                    "unknown"
                  ]
                },
                "label": {
                  "type": "string",
                  "minLength": 1
                },
                "rateBasisPoints": {
                  "anyOf": [
                    {
                      "type": "integer",
                      "minimum": 0,
                      "maximum": 9007199254740991
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "grossSalesMinor": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 9007199254740991
                },
                "netSalesMinor": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 9007199254740991
                },
                "vatMinor": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 9007199254740991
                }
              },
              "required": [
                "category",
                "label",
                "rateBasisPoints",
                "grossSalesMinor",
                "netSalesMinor",
                "vatMinor"
              ],
              "additionalProperties": false
            }
          },
          "reconciliation": {
            "type": "object",
            "properties": {
              "paymentGrossMinor": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "salesGrossMinor": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "differenceMinor": {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              "paymentVatMinor": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "salesVatMinor": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "vatDifferenceMinor": {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              "balanced": {
                "type": "boolean"
              },
              "exactTenderRefundsMinor": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "proportionallyAllocatedRefundsMinor": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "unattributedPaymentGrossMinor": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "attributionComplete": {
                "type": "boolean"
              }
            },
            "required": [
              "paymentGrossMinor",
              "salesGrossMinor",
              "differenceMinor",
              "paymentVatMinor",
              "salesVatMinor",
              "vatDifferenceMinor",
              "balanced",
              "exactTenderRefundsMinor",
              "proportionallyAllocatedRefundsMinor",
              "unattributedPaymentGrossMinor",
              "attributionComplete"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "restaurantId",
          "period",
          "currency",
          "totals",
          "paymentMethods",
          "vatBreakdown",
          "reconciliation"
        ],
        "additionalProperties": false
      },
      "FindMenuItemsResult": {
        "type": "object",
        "properties": {
          "restaurantId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "currency": {
            "type": "string",
            "const": "EUR"
          },
          "items": {
            "maxItems": 50,
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "menuItemPublicId": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                },
                "name": {
                  "type": "string",
                  "minLength": 1
                },
                "categoryPublicId": {
                  "anyOf": [
                    {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "categoryName": {
                  "anyOf": [
                    {
                      "type": "string",
                      "minLength": 1
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "priceMinor": {
                  "anyOf": [
                    {
                      "type": "integer",
                      "minimum": 0,
                      "maximum": 9007199254740991
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "availability": {
                  "type": "string",
                  "enum": [
                    "available",
                    "hidden"
                  ]
                },
                "productType": {
                  "type": "string",
                  "enum": [
                    "food",
                    "drink"
                  ]
                },
                "openPrice": {
                  "type": "boolean"
                }
              },
              "required": [
                "menuItemPublicId",
                "name",
                "categoryPublicId",
                "categoryName",
                "priceMinor",
                "availability",
                "productType",
                "openPrice"
              ],
              "additionalProperties": false
            }
          },
          "truncated": {
            "type": "boolean"
          }
        },
        "required": [
          "restaurantId",
          "currency",
          "items",
          "truncated"
        ],
        "additionalProperties": false
      },
      "FindOrdersResult": {
        "type": "object",
        "properties": {
          "restaurantId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "searchScope": {
            "type": "string",
            "enum": [
              "all_history",
              "date_range"
            ]
          },
          "period": {
            "type": "object",
            "properties": {
              "startDate": {
                "anyOf": [
                  {
                    "type": "string",
                    "format": "date",
                    "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "endDate": {
                "anyOf": [
                  {
                    "type": "string",
                    "format": "date",
                    "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "timeZone": {
                "type": "string",
                "minLength": 1
              },
              "dayStartHour": {
                "type": "integer",
                "minimum": 0,
                "maximum": 23
              }
            },
            "required": [
              "startDate",
              "endDate",
              "timeZone",
              "dayStartHour"
            ],
            "additionalProperties": false
          },
          "currency": {
            "type": "string",
            "const": "EUR"
          },
          "matches": {
            "maxItems": 20,
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "orderId": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 255
                },
                "receiptHash": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 255
                },
                "restaurantOrderNumber": {
                  "anyOf": [
                    {
                      "type": "integer",
                      "exclusiveMinimum": 0,
                      "maximum": 9007199254740991
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "occurredAt": {
                  "type": "string",
                  "format": "date-time",
                  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                },
                "businessDate": {
                  "type": "string",
                  "format": "date",
                  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
                },
                "orderType": {
                  "type": "string",
                  "enum": [
                    "dine_in",
                    "takeaway"
                  ]
                },
                "tableNumber": {
                  "anyOf": [
                    {
                      "type": "integer",
                      "minimum": 0,
                      "maximum": 9007199254740991
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "status": {
                  "type": "string",
                  "enum": [
                    "paid",
                    "partially_refunded",
                    "refunded",
                    "voided"
                  ]
                },
                "paymentMethod": {
                  "type": "string",
                  "enum": [
                    "card",
                    "cash",
                    "card_split",
                    "split",
                    "gift_card",
                    "gift_card_card",
                    "gift_card_cash",
                    "edenred",
                    "edenred_card",
                    "epassi",
                    "smartum",
                    "zevoy",
                    "online",
                    "online_backup",
                    "stripe_backup",
                    "manual",
                    "wolt",
                    "wolt_catering",
                    "resq",
                    "mobile_pay",
                    "uber_eats",
                    "invoice",
                    "manual_card_reader",
                    "other"
                  ]
                },
                "orderOrigin": {
                  "type": "object",
                  "properties": {
                    "kind": {
                      "type": "string",
                      "enum": [
                        "fiest",
                        "manual",
                        "integration",
                        "unknown"
                      ],
                      "description": "How the order entered Fiest. This is independent of the settlement method."
                    },
                    "provider": {
                      "anyOf": [
                        {
                          "type": "string",
                          "enum": [
                            "wolt",
                            "wolt_catering",
                            "resq",
                            "uber_eats"
                          ]
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "Allowlisted source provider for integration-ingested orders, otherwise null."
                    }
                  },
                  "required": [
                    "kind",
                    "provider"
                  ],
                  "additionalProperties": false
                },
                "originalAmountMinor": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 9007199254740991
                },
                "totalAmountMinor": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 9007199254740991
                },
                "vatMinor": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 9007199254740991
                },
                "refundAmountMinor": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 9007199254740991
                },
                "discountAmountMinor": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 9007199254740991
                },
                "items": {
                  "maxItems": 20,
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "lineId": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 255
                      },
                      "catalogItemId": {
                        "anyOf": [
                          {
                            "type": "string",
                            "format": "uuid",
                            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "catalogItemKind": {
                        "type": "string",
                        "enum": [
                          "menu_item",
                          "product",
                          "synthetic",
                          "unknown"
                        ]
                      },
                      "catalogCategoryId": {
                        "anyOf": [
                          {
                            "type": "string",
                            "format": "uuid",
                            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "menuId": {
                        "anyOf": [
                          {
                            "type": "string",
                            "format": "uuid",
                            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "name": {
                        "type": "string",
                        "minLength": 1
                      },
                      "category": {
                        "anyOf": [
                          {
                            "type": "string",
                            "minLength": 1
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "itemType": {
                        "type": "string",
                        "enum": [
                          "food",
                          "drink",
                          "product",
                          "other"
                        ]
                      },
                      "quantity": {
                        "type": "number",
                        "minimum": 0
                      },
                      "unitPriceMinor": {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 9007199254740991
                      },
                      "originalUnitPriceMinor": {
                        "anyOf": [
                          {
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 9007199254740991
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "grossAmountMinor": {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 9007199254740991
                      },
                      "discountAmountMinor": {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 9007199254740991
                      },
                      "vatAmountMinor": {
                        "anyOf": [
                          {
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 9007199254740991
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "taxEvidence": {
                        "type": "string",
                        "enum": [
                          "snapshot",
                          "legacy_amount",
                          "unavailable"
                        ]
                      },
                      "taxCountryCode": {
                        "anyOf": [
                          {
                            "type": "string",
                            "pattern": "^[A-Z]{2}$"
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "taxRatesAsOf": {
                        "anyOf": [
                          {
                            "type": "string",
                            "format": "date",
                            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "vatRates": {
                        "maxItems": 4,
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "category": {
                              "type": "string",
                              "enum": [
                                "standard",
                                "reduced",
                                "special",
                                "zero"
                              ]
                            },
                            "rateBps": {
                              "type": "integer",
                              "minimum": 0,
                              "maximum": 100000
                            },
                            "vatAmountMinor": {
                              "type": "integer",
                              "minimum": 0,
                              "maximum": 9007199254740991
                            }
                          },
                          "required": [
                            "category",
                            "rateBps",
                            "vatAmountMinor"
                          ],
                          "additionalProperties": false
                        }
                      },
                      "selectedOptions": {
                        "maxItems": 50,
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "optionId": {
                              "anyOf": [
                                {
                                  "type": "string",
                                  "format": "uuid",
                                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "optionGroupId": {
                              "anyOf": [
                                {
                                  "type": "string",
                                  "format": "uuid",
                                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "name": {
                              "type": "string",
                              "minLength": 1
                            },
                            "quantity": {
                              "type": "number",
                              "exclusiveMinimum": 0
                            },
                            "unitPriceMinor": {
                              "type": "integer",
                              "minimum": 0,
                              "maximum": 9007199254740991
                            },
                            "grossAmountMinor": {
                              "type": "integer",
                              "minimum": 0,
                              "maximum": 9007199254740991
                            },
                            "vatAmountMinor": {
                              "anyOf": [
                                {
                                  "type": "integer",
                                  "minimum": 0,
                                  "maximum": 9007199254740991
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          },
                          "required": [
                            "optionId",
                            "optionGroupId",
                            "name",
                            "quantity",
                            "unitPriceMinor",
                            "grossAmountMinor",
                            "vatAmountMinor"
                          ],
                          "additionalProperties": false
                        }
                      }
                    },
                    "required": [
                      "lineId",
                      "catalogItemId",
                      "catalogItemKind",
                      "catalogCategoryId",
                      "menuId",
                      "name",
                      "category",
                      "itemType",
                      "quantity",
                      "unitPriceMinor",
                      "originalUnitPriceMinor",
                      "grossAmountMinor",
                      "discountAmountMinor",
                      "vatAmountMinor",
                      "taxEvidence",
                      "taxCountryCode",
                      "taxRatesAsOf",
                      "vatRates",
                      "selectedOptions"
                    ],
                    "additionalProperties": false
                  }
                },
                "itemsTruncated": {
                  "type": "boolean"
                }
              },
              "required": [
                "orderId",
                "receiptHash",
                "restaurantOrderNumber",
                "occurredAt",
                "businessDate",
                "orderType",
                "tableNumber",
                "status",
                "paymentMethod",
                "orderOrigin",
                "originalAmountMinor",
                "totalAmountMinor",
                "vatMinor",
                "refundAmountMinor",
                "discountAmountMinor",
                "items",
                "itemsTruncated"
              ],
              "additionalProperties": false
            }
          },
          "truncated": {
            "type": "boolean"
          },
          "nextCursor": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 1024
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "restaurantId",
          "searchScope",
          "period",
          "currency",
          "matches",
          "truncated",
          "nextCursor"
        ],
        "additionalProperties": false
      },
      "OrderDetails": {
        "type": "object",
        "properties": {
          "restaurantId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "currency": {
            "type": "string",
            "const": "EUR"
          },
          "order": {
            "type": "object",
            "properties": {
              "orderId": {
                "type": "string",
                "minLength": 1,
                "maxLength": 255
              },
              "receiptHash": {
                "type": "string",
                "minLength": 1,
                "maxLength": 255
              },
              "restaurantOrderNumber": {
                "anyOf": [
                  {
                    "type": "integer",
                    "exclusiveMinimum": 0,
                    "maximum": 9007199254740991
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "occurredAt": {
                "type": "string",
                "format": "date-time",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
              },
              "businessDate": {
                "type": "string",
                "format": "date",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
              },
              "orderType": {
                "type": "string",
                "enum": [
                  "dine_in",
                  "takeaway"
                ]
              },
              "tableNumber": {
                "anyOf": [
                  {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 9007199254740991
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "status": {
                "type": "string",
                "enum": [
                  "paid",
                  "partially_refunded",
                  "refunded",
                  "voided"
                ]
              },
              "paymentMethod": {
                "type": "string",
                "enum": [
                  "card",
                  "cash",
                  "card_split",
                  "split",
                  "gift_card",
                  "gift_card_card",
                  "gift_card_cash",
                  "edenred",
                  "edenred_card",
                  "epassi",
                  "smartum",
                  "zevoy",
                  "online",
                  "online_backup",
                  "stripe_backup",
                  "manual",
                  "wolt",
                  "wolt_catering",
                  "resq",
                  "mobile_pay",
                  "uber_eats",
                  "invoice",
                  "manual_card_reader",
                  "other"
                ]
              },
              "orderOrigin": {
                "type": "object",
                "properties": {
                  "kind": {
                    "type": "string",
                    "enum": [
                      "fiest",
                      "manual",
                      "integration",
                      "unknown"
                    ],
                    "description": "How the order entered Fiest. This is independent of the settlement method."
                  },
                  "provider": {
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "wolt",
                          "wolt_catering",
                          "resq",
                          "uber_eats"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ],
                    "description": "Allowlisted source provider for integration-ingested orders, otherwise null."
                  }
                },
                "required": [
                  "kind",
                  "provider"
                ],
                "additionalProperties": false
              },
              "originalAmountMinor": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "totalAmountMinor": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "grossSalesMinor": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "netSalesMinor": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "vatMinor": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "vatAllocationMethod": {
                "type": "string",
                "enum": [
                  "stored",
                  "proportional_refund"
                ]
              },
              "vatBreakdown": {
                "anyOf": [
                  {
                    "type": "object",
                    "properties": {
                      "countryCode": {
                        "type": "string",
                        "pattern": "^[A-Z]{2}$"
                      },
                      "ratesAsOf": {
                        "type": "string",
                        "format": "date",
                        "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
                      },
                      "rows": {
                        "maxItems": 16,
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "category": {
                              "type": "string",
                              "enum": [
                                "standard",
                                "reduced",
                                "special",
                                "zero"
                              ]
                            },
                            "rateBps": {
                              "type": "integer",
                              "minimum": 0,
                              "maximum": 100000
                            },
                            "grossAmountMinor": {
                              "type": "integer",
                              "minimum": 0,
                              "maximum": 9007199254740991
                            },
                            "netAmountMinor": {
                              "type": "integer",
                              "minimum": 0,
                              "maximum": 9007199254740991
                            },
                            "vatAmountMinor": {
                              "type": "integer",
                              "minimum": 0,
                              "maximum": 9007199254740991
                            }
                          },
                          "required": [
                            "category",
                            "rateBps",
                            "grossAmountMinor",
                            "netAmountMinor",
                            "vatAmountMinor"
                          ],
                          "additionalProperties": false
                        }
                      }
                    },
                    "required": [
                      "countryCode",
                      "ratesAsOf",
                      "rows"
                    ],
                    "additionalProperties": false
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "refundAmountMinor": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "discountAmountMinor": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "tipAmountMinor": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "items": {
                "maxItems": 50,
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "lineId": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 255
                    },
                    "catalogItemId": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "catalogItemKind": {
                      "type": "string",
                      "enum": [
                        "menu_item",
                        "product",
                        "synthetic",
                        "unknown"
                      ]
                    },
                    "catalogCategoryId": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "menuId": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "name": {
                      "type": "string",
                      "minLength": 1
                    },
                    "category": {
                      "anyOf": [
                        {
                          "type": "string",
                          "minLength": 1
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "itemType": {
                      "type": "string",
                      "enum": [
                        "food",
                        "drink",
                        "product",
                        "other"
                      ]
                    },
                    "quantity": {
                      "type": "number",
                      "minimum": 0
                    },
                    "unitPriceMinor": {
                      "type": "integer",
                      "minimum": 0,
                      "maximum": 9007199254740991
                    },
                    "originalUnitPriceMinor": {
                      "anyOf": [
                        {
                          "type": "integer",
                          "minimum": 0,
                          "maximum": 9007199254740991
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "grossAmountMinor": {
                      "type": "integer",
                      "minimum": 0,
                      "maximum": 9007199254740991
                    },
                    "discountAmountMinor": {
                      "type": "integer",
                      "minimum": 0,
                      "maximum": 9007199254740991
                    },
                    "vatAmountMinor": {
                      "anyOf": [
                        {
                          "type": "integer",
                          "minimum": 0,
                          "maximum": 9007199254740991
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "taxEvidence": {
                      "type": "string",
                      "enum": [
                        "snapshot",
                        "legacy_amount",
                        "unavailable"
                      ]
                    },
                    "taxCountryCode": {
                      "anyOf": [
                        {
                          "type": "string",
                          "pattern": "^[A-Z]{2}$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "taxRatesAsOf": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "date",
                          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "vatRates": {
                      "maxItems": 4,
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "category": {
                            "type": "string",
                            "enum": [
                              "standard",
                              "reduced",
                              "special",
                              "zero"
                            ]
                          },
                          "rateBps": {
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 100000
                          },
                          "vatAmountMinor": {
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 9007199254740991
                          }
                        },
                        "required": [
                          "category",
                          "rateBps",
                          "vatAmountMinor"
                        ],
                        "additionalProperties": false
                      }
                    },
                    "selectedOptions": {
                      "maxItems": 50,
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "optionId": {
                            "anyOf": [
                              {
                                "type": "string",
                                "format": "uuid",
                                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "optionGroupId": {
                            "anyOf": [
                              {
                                "type": "string",
                                "format": "uuid",
                                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "name": {
                            "type": "string",
                            "minLength": 1
                          },
                          "quantity": {
                            "type": "number",
                            "exclusiveMinimum": 0
                          },
                          "unitPriceMinor": {
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 9007199254740991
                          },
                          "grossAmountMinor": {
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 9007199254740991
                          },
                          "vatAmountMinor": {
                            "anyOf": [
                              {
                                "type": "integer",
                                "minimum": 0,
                                "maximum": 9007199254740991
                              },
                              {
                                "type": "null"
                              }
                            ]
                          }
                        },
                        "required": [
                          "optionId",
                          "optionGroupId",
                          "name",
                          "quantity",
                          "unitPriceMinor",
                          "grossAmountMinor",
                          "vatAmountMinor"
                        ],
                        "additionalProperties": false
                      }
                    }
                  },
                  "required": [
                    "lineId",
                    "catalogItemId",
                    "catalogItemKind",
                    "catalogCategoryId",
                    "menuId",
                    "name",
                    "category",
                    "itemType",
                    "quantity",
                    "unitPriceMinor",
                    "originalUnitPriceMinor",
                    "grossAmountMinor",
                    "discountAmountMinor",
                    "vatAmountMinor",
                    "taxEvidence",
                    "taxCountryCode",
                    "taxRatesAsOf",
                    "vatRates",
                    "selectedOptions"
                  ],
                  "additionalProperties": false
                }
              },
              "itemsTruncated": {
                "type": "boolean"
              },
              "refundedItems": {
                "maxItems": 50,
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "lineId": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 255
                    },
                    "catalogItemId": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "catalogItemKind": {
                      "type": "string",
                      "enum": [
                        "menu_item",
                        "product",
                        "synthetic",
                        "unknown"
                      ]
                    },
                    "catalogCategoryId": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "menuId": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "name": {
                      "type": "string",
                      "minLength": 1
                    },
                    "category": {
                      "anyOf": [
                        {
                          "type": "string",
                          "minLength": 1
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "itemType": {
                      "type": "string",
                      "enum": [
                        "food",
                        "drink",
                        "product",
                        "other"
                      ]
                    },
                    "quantity": {
                      "type": "number",
                      "minimum": 0
                    },
                    "unitPriceMinor": {
                      "type": "integer",
                      "minimum": 0,
                      "maximum": 9007199254740991
                    },
                    "originalUnitPriceMinor": {
                      "anyOf": [
                        {
                          "type": "integer",
                          "minimum": 0,
                          "maximum": 9007199254740991
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "grossAmountMinor": {
                      "type": "integer",
                      "minimum": 0,
                      "maximum": 9007199254740991
                    },
                    "discountAmountMinor": {
                      "type": "integer",
                      "minimum": 0,
                      "maximum": 9007199254740991
                    },
                    "vatAmountMinor": {
                      "anyOf": [
                        {
                          "type": "integer",
                          "minimum": 0,
                          "maximum": 9007199254740991
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "taxEvidence": {
                      "type": "string",
                      "enum": [
                        "snapshot",
                        "legacy_amount",
                        "unavailable"
                      ]
                    },
                    "taxCountryCode": {
                      "anyOf": [
                        {
                          "type": "string",
                          "pattern": "^[A-Z]{2}$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "taxRatesAsOf": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "date",
                          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "vatRates": {
                      "maxItems": 4,
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "category": {
                            "type": "string",
                            "enum": [
                              "standard",
                              "reduced",
                              "special",
                              "zero"
                            ]
                          },
                          "rateBps": {
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 100000
                          },
                          "vatAmountMinor": {
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 9007199254740991
                          }
                        },
                        "required": [
                          "category",
                          "rateBps",
                          "vatAmountMinor"
                        ],
                        "additionalProperties": false
                      }
                    },
                    "selectedOptions": {
                      "maxItems": 50,
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "optionId": {
                            "anyOf": [
                              {
                                "type": "string",
                                "format": "uuid",
                                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "optionGroupId": {
                            "anyOf": [
                              {
                                "type": "string",
                                "format": "uuid",
                                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "name": {
                            "type": "string",
                            "minLength": 1
                          },
                          "quantity": {
                            "type": "number",
                            "exclusiveMinimum": 0
                          },
                          "unitPriceMinor": {
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 9007199254740991
                          },
                          "grossAmountMinor": {
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 9007199254740991
                          },
                          "vatAmountMinor": {
                            "anyOf": [
                              {
                                "type": "integer",
                                "minimum": 0,
                                "maximum": 9007199254740991
                              },
                              {
                                "type": "null"
                              }
                            ]
                          }
                        },
                        "required": [
                          "optionId",
                          "optionGroupId",
                          "name",
                          "quantity",
                          "unitPriceMinor",
                          "grossAmountMinor",
                          "vatAmountMinor"
                        ],
                        "additionalProperties": false
                      }
                    }
                  },
                  "required": [
                    "lineId",
                    "catalogItemId",
                    "catalogItemKind",
                    "catalogCategoryId",
                    "menuId",
                    "name",
                    "category",
                    "itemType",
                    "quantity",
                    "unitPriceMinor",
                    "originalUnitPriceMinor",
                    "grossAmountMinor",
                    "discountAmountMinor",
                    "vatAmountMinor",
                    "taxEvidence",
                    "taxCountryCode",
                    "taxRatesAsOf",
                    "vatRates",
                    "selectedOptions"
                  ],
                  "additionalProperties": false
                }
              },
              "refundedItemsTruncated": {
                "type": "boolean"
              }
            },
            "required": [
              "orderId",
              "receiptHash",
              "restaurantOrderNumber",
              "occurredAt",
              "businessDate",
              "orderType",
              "tableNumber",
              "status",
              "paymentMethod",
              "orderOrigin",
              "originalAmountMinor",
              "totalAmountMinor",
              "grossSalesMinor",
              "netSalesMinor",
              "vatMinor",
              "vatAllocationMethod",
              "vatBreakdown",
              "refundAmountMinor",
              "discountAmountMinor",
              "tipAmountMinor",
              "items",
              "itemsTruncated",
              "refundedItems",
              "refundedItemsTruncated"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "restaurantId",
          "currency",
          "order"
        ],
        "additionalProperties": false
      },
      "ListMenusResult": {
        "type": "object",
        "properties": {
          "restaurantId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "menus": {
            "maxItems": 100,
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "menuPublicId": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                },
                "name": {
                  "type": "string",
                  "minLength": 1
                },
                "activeForPos": {
                  "type": "boolean"
                },
                "onlineOrdering": {
                  "type": "boolean"
                },
                "categoryCount": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 9007199254740991
                },
                "itemCount": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 9007199254740991
                }
              },
              "required": [
                "menuPublicId",
                "name",
                "activeForPos",
                "onlineOrdering",
                "categoryCount",
                "itemCount"
              ],
              "additionalProperties": false
            }
          },
          "truncated": {
            "type": "boolean"
          }
        },
        "required": [
          "restaurantId",
          "menus",
          "truncated"
        ],
        "additionalProperties": false
      },
      "CreateMenuInput": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 80
          },
          "idempotencyKey": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "confirmed": {
            "type": "boolean",
            "const": true
          }
        },
        "required": [
          "name",
          "idempotencyKey",
          "confirmed"
        ]
      },
      "CreateMenuResult": {
        "type": "object",
        "properties": {
          "actionId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "restaurantId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "menu": {
            "type": "object",
            "properties": {
              "menuPublicId": {
                "type": "string",
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
              },
              "name": {
                "type": "string",
                "minLength": 1
              },
              "activeForPos": {
                "type": "boolean"
              },
              "onlineOrdering": {
                "type": "boolean"
              },
              "categoryCount": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "itemCount": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              }
            },
            "required": [
              "menuPublicId",
              "name",
              "activeForPos",
              "onlineOrdering",
              "categoryCount",
              "itemCount"
            ],
            "additionalProperties": false
          },
          "replayed": {
            "type": "boolean"
          }
        },
        "required": [
          "actionId",
          "restaurantId",
          "menu",
          "replayed"
        ],
        "additionalProperties": false
      },
      "AddExistingMenuItemsBody": {
        "type": "object",
        "properties": {
          "menuItemPublicIds": {
            "minItems": 1,
            "maxItems": 50,
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          },
          "expectedCategoryCount": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991
          },
          "expectedItemCount": {
            "type": "integer",
            "minimum": 0,
            "maximum": 100
          },
          "idempotencyKey": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "confirmed": {
            "type": "boolean",
            "const": true
          }
        },
        "required": [
          "menuItemPublicIds",
          "expectedCategoryCount",
          "expectedItemCount",
          "idempotencyKey",
          "confirmed"
        ]
      },
      "AddExistingMenuItemsResult": {
        "type": "object",
        "properties": {
          "actionId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "restaurantId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "menu": {
            "type": "object",
            "properties": {
              "menuPublicId": {
                "type": "string",
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
              },
              "name": {
                "type": "string",
                "minLength": 1
              },
              "activeForPos": {
                "type": "boolean"
              },
              "onlineOrdering": {
                "type": "boolean"
              },
              "categoryCount": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "itemCount": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              }
            },
            "required": [
              "menuPublicId",
              "name",
              "activeForPos",
              "onlineOrdering",
              "categoryCount",
              "itemCount"
            ],
            "additionalProperties": false
          },
          "addedMenuItemPublicIds": {
            "minItems": 1,
            "maxItems": 50,
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          },
          "replayed": {
            "type": "boolean"
          }
        },
        "required": [
          "actionId",
          "restaurantId",
          "menu",
          "addedMenuItemPublicIds",
          "replayed"
        ],
        "additionalProperties": false
      },
      "DraftMenuItemEditTargetResult": {
        "type": "object",
        "properties": {
          "restaurantId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "menu": {
            "type": "object",
            "properties": {
              "menuPublicId": {
                "type": "string",
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
              },
              "name": {
                "type": "string",
                "minLength": 1
              },
              "activeForPos": {
                "type": "boolean"
              },
              "onlineOrdering": {
                "type": "boolean"
              },
              "categoryCount": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "itemCount": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              }
            },
            "required": [
              "menuPublicId",
              "name",
              "activeForPos",
              "onlineOrdering",
              "categoryCount",
              "itemCount"
            ],
            "additionalProperties": false
          },
          "item": {
            "type": "object",
            "properties": {
              "menuItemPublicId": {
                "type": "string",
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
              },
              "categoryPublicId": {
                "type": "string",
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
              },
              "name": {
                "type": "string",
                "minLength": 1,
                "maxLength": 80
              },
              "priceMinor": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "description": {
                "anyOf": [
                  {
                    "type": "string",
                    "maxLength": 2000
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "visible": {
                "type": "boolean"
              },
              "showInKitchen": {
                "type": "boolean"
              }
            },
            "required": [
              "menuItemPublicId",
              "categoryPublicId",
              "name",
              "priceMinor",
              "description",
              "visible",
              "showInKitchen"
            ],
            "additionalProperties": false
          },
          "sharedMenuCount": {
            "type": "integer",
            "exclusiveMinimum": 0,
            "maximum": 9007199254740991
          },
          "canEdit": {
            "type": "boolean"
          },
          "version": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          }
        },
        "required": [
          "restaurantId",
          "menu",
          "item",
          "sharedMenuCount",
          "canEdit",
          "version"
        ],
        "additionalProperties": false
      },
      "UpdateDraftMenuItemBody": {
        "type": "object",
        "properties": {
          "expectedVersion": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "changes": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string",
                "minLength": 1,
                "maxLength": 80
              },
              "priceMinor": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "description": {
                "anyOf": [
                  {
                    "type": "string",
                    "maxLength": 2000
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "visible": {
                "type": "boolean"
              },
              "showInKitchen": {
                "type": "boolean"
              }
            }
          },
          "idempotencyKey": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "confirmed": {
            "type": "boolean",
            "const": true
          }
        },
        "required": [
          "expectedVersion",
          "changes",
          "idempotencyKey",
          "confirmed"
        ]
      },
      "UpdateDraftMenuItemResult": {
        "type": "object",
        "properties": {
          "actionId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "restaurantId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "menuPublicId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "item": {
            "type": "object",
            "properties": {
              "menuItemPublicId": {
                "type": "string",
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
              },
              "categoryPublicId": {
                "type": "string",
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
              },
              "name": {
                "type": "string",
                "minLength": 1,
                "maxLength": 80
              },
              "priceMinor": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "description": {
                "anyOf": [
                  {
                    "type": "string",
                    "maxLength": 2000
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "visible": {
                "type": "boolean"
              },
              "showInKitchen": {
                "type": "boolean"
              }
            },
            "required": [
              "menuItemPublicId",
              "categoryPublicId",
              "name",
              "priceMinor",
              "description",
              "visible",
              "showInKitchen"
            ],
            "additionalProperties": false
          },
          "previousVersion": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "version": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "replayed": {
            "type": "boolean"
          }
        },
        "required": [
          "actionId",
          "restaurantId",
          "menuPublicId",
          "item",
          "previousVersion",
          "version",
          "replayed"
        ],
        "additionalProperties": false
      },
      "SetActiveMenuInput": {
        "type": "object",
        "properties": {
          "menuPublicId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "expectedCategoryCount": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991
          },
          "expectedItemCount": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991
          },
          "idempotencyKey": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "confirmed": {
            "type": "boolean",
            "const": true
          },
          "expectedCurrentActiveMenuPublicId": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "menuPublicId",
          "expectedCategoryCount",
          "expectedItemCount",
          "idempotencyKey",
          "confirmed",
          "expectedCurrentActiveMenuPublicId"
        ]
      },
      "SetActiveMenuResult": {
        "type": "object",
        "properties": {
          "actionId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "restaurantId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "menu": {
            "type": "object",
            "properties": {
              "menuPublicId": {
                "type": "string",
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
              },
              "name": {
                "type": "string",
                "minLength": 1
              },
              "activeForPos": {
                "type": "boolean"
              },
              "onlineOrdering": {
                "type": "boolean"
              },
              "categoryCount": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "itemCount": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              }
            },
            "required": [
              "menuPublicId",
              "name",
              "activeForPos",
              "onlineOrdering",
              "categoryCount",
              "itemCount"
            ],
            "additionalProperties": false
          },
          "replayed": {
            "type": "boolean"
          },
          "previousActiveMenuPublicId": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "actionId",
          "restaurantId",
          "menu",
          "replayed",
          "previousActiveMenuPublicId"
        ],
        "additionalProperties": false
      },
      "SetOnlineMenuInput": {
        "type": "object",
        "properties": {
          "menuPublicId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "expectedCategoryCount": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991
          },
          "expectedItemCount": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100
          },
          "idempotencyKey": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "confirmed": {
            "type": "boolean",
            "const": true
          },
          "expectedCurrentOnlineMenuPublicId": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "menuPublicId",
          "expectedCategoryCount",
          "expectedItemCount",
          "idempotencyKey",
          "confirmed",
          "expectedCurrentOnlineMenuPublicId"
        ]
      },
      "SetOnlineMenuResult": {
        "type": "object",
        "properties": {
          "actionId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "restaurantId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "menu": {
            "type": "object",
            "properties": {
              "menuPublicId": {
                "type": "string",
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
              },
              "name": {
                "type": "string",
                "minLength": 1
              },
              "activeForPos": {
                "type": "boolean"
              },
              "onlineOrdering": {
                "type": "boolean"
              },
              "categoryCount": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "itemCount": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              }
            },
            "required": [
              "menuPublicId",
              "name",
              "activeForPos",
              "onlineOrdering",
              "categoryCount",
              "itemCount"
            ],
            "additionalProperties": false
          },
          "replayed": {
            "type": "boolean"
          },
          "previousOnlineMenuPublicId": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "actionId",
          "restaurantId",
          "menu",
          "replayed",
          "previousOnlineMenuPublicId"
        ],
        "additionalProperties": false
      },
      "CatalogImportCapabilitiesResult": {
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "2026-08-11.1"
          },
          "restaurantId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "createOnly": {
            "type": "boolean",
            "const": true
          },
          "publishesAutomatically": {
            "type": "boolean",
            "const": false
          },
          "combosEnabled": {
            "type": "boolean"
          },
          "targetModes": {
            "type": "array",
            "prefixItems": [
              {
                "type": "string",
                "const": "new_draft"
              },
              {
                "type": "string",
                "const": "existing_draft"
              }
            ]
          },
          "supportedEntities": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "menu",
                "menu_category",
                "menu_item",
                "option_group",
                "option",
                "product_category",
                "product",
                "combo"
              ]
            }
          },
          "limits": {
            "type": "object",
            "properties": {
              "menuCategories": {
                "type": "integer",
                "exclusiveMinimum": 0,
                "maximum": 9007199254740991
              },
              "menuItems": {
                "type": "integer",
                "exclusiveMinimum": 0,
                "maximum": 9007199254740991
              },
              "optionGroups": {
                "type": "integer",
                "exclusiveMinimum": 0,
                "maximum": 9007199254740991
              },
              "options": {
                "type": "integer",
                "exclusiveMinimum": 0,
                "maximum": 9007199254740991
              },
              "productCategories": {
                "type": "integer",
                "exclusiveMinimum": 0,
                "maximum": 9007199254740991
              },
              "products": {
                "type": "integer",
                "exclusiveMinimum": 0,
                "maximum": 9007199254740991
              },
              "combos": {
                "type": "integer",
                "exclusiveMinimum": 0,
                "maximum": 9007199254740991
              },
              "comboComponents": {
                "type": "integer",
                "exclusiveMinimum": 0,
                "maximum": 9007199254740991
              }
            },
            "required": [
              "menuCategories",
              "menuItems",
              "optionGroups",
              "options",
              "productCategories",
              "products",
              "combos",
              "comboComponents"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "restaurantId",
          "createOnly",
          "publishesAutomatically",
          "combosEnabled",
          "targetModes",
          "supportedEntities",
          "limits"
        ],
        "additionalProperties": false
      },
      "CatalogImportTargetResult": {
        "type": "object",
        "properties": {
          "restaurantId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "menu": {
            "type": "object",
            "properties": {
              "menuPublicId": {
                "type": "string",
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
              },
              "name": {
                "type": "string",
                "minLength": 1
              },
              "activeForPos": {
                "type": "boolean"
              },
              "onlineOrdering": {
                "type": "boolean"
              },
              "categoryCount": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "itemCount": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              }
            },
            "required": [
              "menuPublicId",
              "name",
              "activeForPos",
              "onlineOrdering",
              "categoryCount",
              "itemCount"
            ],
            "additionalProperties": false
          },
          "canAddCatalogEntities": {
            "type": "boolean"
          },
          "categories": {
            "maxItems": 100,
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "categoryPublicId": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                },
                "name": {
                  "type": "string",
                  "minLength": 1
                },
                "itemCount": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 9007199254740991
                }
              },
              "required": [
                "categoryPublicId",
                "name",
                "itemCount"
              ],
              "additionalProperties": false
            }
          }
        },
        "required": [
          "restaurantId",
          "menu",
          "canAddCatalogEntities",
          "categories"
        ],
        "additionalProperties": false
      },
      "PlanMenuImportInput": {
        "type": "object",
        "properties": {
          "target": {
            "default": {
              "mode": "new_draft"
            },
            "oneOf": [
              {
                "type": "object",
                "properties": {
                  "mode": {
                    "type": "string",
                    "const": "new_draft"
                  }
                },
                "required": [
                  "mode"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "mode": {
                    "type": "string",
                    "const": "existing_draft"
                  },
                  "menuPublicId": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                  },
                  "expectedMenuName": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 80
                  },
                  "expectedCategoryCount": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 9007199254740991
                  },
                  "expectedItemCount": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 9007199254740991
                  }
                },
                "required": [
                  "mode",
                  "menuPublicId",
                  "expectedMenuName",
                  "expectedCategoryCount",
                  "expectedItemCount"
                ]
              }
            ]
          },
          "document": {
            "type": "object",
            "properties": {
              "menu": {
                "type": "object",
                "properties": {
                  "ref": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 64,
                    "pattern": "^[a-z][a-z0-9_-]*$",
                    "description": "Request-local relationship key. Use a unique lowercase slug such as pizza, pizza-extras, or extra-cheese; this is not a database ID."
                  },
                  "name": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 80,
                    "description": "Name of the new inactive draft, or the exact current name of the selected existing draft."
                  }
                },
                "required": [
                  "ref",
                  "name"
                ]
              },
              "existingMenuCategories": {
                "default": [],
                "description": "Existing categories from the selected draft that may parent newly created items or option groups. These rows are referenced, never updated.",
                "maxItems": 20,
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "ref": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 64,
                      "pattern": "^[a-z][a-z0-9_-]*$",
                      "description": "Request-local ref used by newly created items and option groups."
                    },
                    "categoryPublicId": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
                      "description": "Exact category UUID returned by get_catalog_import_target."
                    },
                    "name": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 120,
                      "description": "Exact current category name returned with categoryPublicId."
                    }
                  },
                  "required": [
                    "ref",
                    "categoryPublicId",
                    "name"
                  ]
                }
              },
              "menuCategories": {
                "maxItems": 20,
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "ref": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 64,
                      "pattern": "^[a-z][a-z0-9_-]*$",
                      "description": "Request-local relationship key. Use a unique lowercase slug such as pizza, pizza-extras, or extra-cheese; this is not a database ID."
                    },
                    "name": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 120,
                      "description": "Customer-facing menu category name."
                    },
                    "visible": {
                      "default": true,
                      "description": "Whether the category is visible.",
                      "type": "boolean"
                    },
                    "regulatedProductClass": {
                      "default": "standard",
                      "description": "Category-level legal classification. Use alcohol only for alcoholic drink categories.",
                      "type": "string",
                      "enum": [
                        "standard",
                        "alcohol",
                        "tobacco",
                        "other_regulated"
                      ]
                    },
                    "discountPolicy": {
                      "default": "allowed",
                      "description": "Whether discounts are allowed for items in this category by default.",
                      "type": "string",
                      "enum": [
                        "allowed",
                        "excluded"
                      ]
                    }
                  },
                  "required": [
                    "ref",
                    "name"
                  ]
                }
              },
              "menuItems": {
                "minItems": 1,
                "maxItems": 100,
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "ref": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 64,
                      "pattern": "^[a-z][a-z0-9_-]*$",
                      "description": "Request-local relationship key. Use a unique lowercase slug such as pizza, pizza-extras, or extra-cheese; this is not a database ID."
                    },
                    "categoryRef": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 64,
                      "pattern": "^[a-z][a-z0-9_-]*$",
                      "description": "Ref of this item's canonical menu category."
                    },
                    "name": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 160,
                      "description": "Customer-facing item name."
                    },
                    "priceMinor": {
                      "type": "integer",
                      "minimum": 0,
                      "maximum": 10000000,
                      "description": "Base price in currency minor units: EUR 12.50 is 1250. Never send a decimal major-unit price."
                    },
                    "description": {
                      "default": null,
                      "description": "Customer-facing description, or null when none is known. Never invent ingredients or claims.",
                      "anyOf": [
                        {
                          "type": "string",
                          "maxLength": 2000
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "visible": {
                      "default": true,
                      "description": "Whether the item is visible.",
                      "type": "boolean"
                    },
                    "dietaryInfo": {
                      "default": {},
                      "type": "object",
                      "properties": {
                        "vegan": {
                          "default": false,
                          "type": "boolean"
                        },
                        "vegetarian": {
                          "default": false,
                          "type": "boolean"
                        },
                        "gluten-free": {
                          "default": false,
                          "type": "boolean"
                        },
                        "dairy-free": {
                          "default": false,
                          "type": "boolean"
                        },
                        "lactose-free": {
                          "default": false,
                          "type": "boolean"
                        },
                        "low-lactose": {
                          "default": false,
                          "type": "boolean"
                        },
                        "egg-free": {
                          "default": false,
                          "type": "boolean"
                        },
                        "nut-free": {
                          "default": false,
                          "type": "boolean"
                        },
                        "soy-free": {
                          "default": false,
                          "type": "boolean"
                        }
                      }
                    },
                    "tag": {
                      "default": null,
                      "anyOf": [
                        {
                          "type": "string",
                          "enum": [
                            "Popular",
                            "Chef's Pick",
                            "New",
                            "Starter",
                            "Main",
                            "Side",
                            "Dessert",
                            "Pizza",
                            "Pasta",
                            "Soft Drink",
                            "Coffee",
                            "Tea",
                            "Beer",
                            "Wine",
                            "Sparkling Wine",
                            "Cocktail",
                            "Spirit"
                          ]
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "productType": {
                      "default": "food",
                      "description": "Use drink for beverages; otherwise food.",
                      "type": "string",
                      "enum": [
                        "food",
                        "drink"
                      ]
                    },
                    "showInKitchen": {
                      "default": true,
                      "description": "Whether orders for this item print/display in the kitchen.",
                      "type": "boolean"
                    },
                    "trackVolume": {
                      "default": false,
                      "description": "Whether inventory volume is tracked for this item.",
                      "type": "boolean"
                    },
                    "openPrice": {
                      "default": false,
                      "description": "True only when staff enters the price at sale time.",
                      "type": "boolean"
                    },
                    "isAlcohol": {
                      "default": false,
                      "type": "boolean"
                    },
                    "volume": {
                      "default": null,
                      "description": "Numeric serving volume expressed in unit, or null when unknown.",
                      "anyOf": [
                        {
                          "type": "number",
                          "exclusiveMinimum": 0,
                          "maximum": 100000
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "unit": {
                      "default": null,
                      "description": "Unit for volume: ml, cl, or l.",
                      "anyOf": [
                        {
                          "type": "string",
                          "enum": [
                            "ml",
                            "cl",
                            "l"
                          ]
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "alcoholType": {
                      "default": null,
                      "description": "Required beverage class for an alcohol item, otherwise null.",
                      "anyOf": [
                        {
                          "type": "string",
                          "enum": [
                            "wine",
                            "spirits",
                            "beer",
                            "cider",
                            "hard_seltzer",
                            "other",
                            "sparkling_wine",
                            "liquor",
                            "long_drink"
                          ]
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "alcoholPercentage": {
                      "default": null,
                      "description": "Human ABV percentage such as 5.2, or null when not supplied.",
                      "anyOf": [
                        {
                          "type": "number",
                          "minimum": 0,
                          "maximum": 100
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "regulatedProductClassOverride": {
                      "default": null,
                      "anyOf": [
                        {
                          "type": "string",
                          "enum": [
                            "standard",
                            "alcohol",
                            "tobacco",
                            "other_regulated"
                          ]
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "discountPolicyOverride": {
                      "default": null,
                      "anyOf": [
                        {
                          "type": "string",
                          "enum": [
                            "inherit",
                            "allowed",
                            "excluded"
                          ]
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "optionGroupAssignments": {
                      "default": [],
                      "maxItems": 20,
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "groupRef": {
                            "type": "string",
                            "minLength": 1,
                            "maxLength": 64,
                            "pattern": "^[a-z][a-z0-9_-]*$",
                            "description": "Ref of one optionGroups entry."
                          },
                          "optionRefs": {
                            "minItems": 1,
                            "maxItems": 50,
                            "type": "array",
                            "items": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 64,
                              "pattern": "^[a-z][a-z0-9_-]*$",
                              "description": "Request-local relationship key. Use a unique lowercase slug such as pizza, pizza-extras, or extra-cheese; this is not a database ID."
                            },
                            "description": "Exact ordered subset of options from the referenced group offered by this item. Do not include options that the item must not offer."
                          },
                          "enabled": {
                            "default": true,
                            "description": "Whether this group is enabled for this item.",
                            "type": "boolean"
                          },
                          "minSelectionsOverride": {
                            "default": null,
                            "description": "Item-specific minimum, or null to inherit the group minimum.",
                            "anyOf": [
                              {
                                "type": "integer",
                                "minimum": 0,
                                "maximum": 100
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "maxSelectionsOverride": {
                            "default": null,
                            "description": "Item-specific maximum, or null to inherit the group maximum.",
                            "anyOf": [
                              {
                                "type": "integer",
                                "minimum": 0,
                                "maximum": 100
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "indexOverride": {
                            "default": null,
                            "description": "Zero-based group order for this item, or null to use assignment order.",
                            "anyOf": [
                              {
                                "type": "integer",
                                "minimum": 0,
                                "maximum": 100
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "showInKitchenOverride": {
                            "default": null,
                            "description": "Item-specific kitchen visibility, or null to inherit the group setting.",
                            "anyOf": [
                              {
                                "type": "boolean"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          }
                        },
                        "required": [
                          "groupRef",
                          "optionRefs"
                        ]
                      }
                    }
                  },
                  "required": [
                    "ref",
                    "categoryRef",
                    "name",
                    "priceMinor"
                  ]
                }
              },
              "optionGroups": {
                "default": [],
                "maxItems": 20,
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "ref": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 64,
                      "pattern": "^[a-z][a-z0-9_-]*$",
                      "description": "Request-local relationship key. Use a unique lowercase slug such as pizza, pizza-extras, or extra-cheese; this is not a database ID."
                    },
                    "categoryRef": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 64,
                      "pattern": "^[a-z][a-z0-9_-]*$",
                      "description": "Canonical category ref shared by this group and every item that assigns it."
                    },
                    "name": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 160,
                      "description": "Customer-facing choice-group name, such as Choose a side or Extras."
                    },
                    "minSelections": {
                      "default": 0,
                      "description": "Default required selection count. Use 0 for optional choices.",
                      "type": "integer",
                      "minimum": 0,
                      "maximum": 100
                    },
                    "maxSelections": {
                      "default": null,
                      "description": "Default maximum selection count, or null for no explicit maximum.",
                      "anyOf": [
                        {
                          "type": "integer",
                          "exclusiveMinimum": 0,
                          "maximum": 100
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "productType": {
                      "default": "food",
                      "description": "Must match every assigning menu item productType.",
                      "type": "string",
                      "enum": [
                        "food",
                        "drink"
                      ]
                    },
                    "showInKitchen": {
                      "default": true,
                      "description": "Default kitchen visibility for selected options.",
                      "type": "boolean"
                    },
                    "options": {
                      "minItems": 1,
                      "maxItems": 50,
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "ref": {
                            "type": "string",
                            "minLength": 1,
                            "maxLength": 64,
                            "pattern": "^[a-z][a-z0-9_-]*$",
                            "description": "Request-local relationship key. Use a unique lowercase slug such as pizza, pizza-extras, or extra-cheese; this is not a database ID."
                          },
                          "name": {
                            "type": "string",
                            "minLength": 1,
                            "maxLength": 160
                          },
                          "priceMinor": {
                            "default": 0,
                            "description": "Price delta in minor units, not an absolute price. May be negative, zero, or positive.",
                            "type": "integer",
                            "minimum": -10000000,
                            "maximum": 10000000
                          },
                          "allowQuantity": {
                            "default": false,
                            "description": "Whether the customer may select multiple units of this option.",
                            "type": "boolean"
                          },
                          "modifiesBaseAttributes": {
                            "default": false,
                            "description": "True only when this option changes serving volume or alcohol attributes.",
                            "type": "boolean"
                          },
                          "volumeChange": {
                            "default": null,
                            "description": "Signed volume delta expressed in volumeUnit, or null for no volume change.",
                            "anyOf": [
                              {
                                "type": "number",
                                "minimum": -100000,
                                "maximum": 100000
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "volumeUnit": {
                            "default": null,
                            "description": "Unit for volumeChange, or null when volumeChange is null.",
                            "anyOf": [
                              {
                                "type": "string",
                                "enum": [
                                  "ml",
                                  "cl",
                                  "l"
                                ]
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "alcoholPercentage": {
                            "default": null,
                            "description": "Resulting human ABV percentage for an alcoholic modifier, or null.",
                            "anyOf": [
                              {
                                "type": "number",
                                "minimum": 0,
                                "maximum": 100
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "alcoholic": {
                            "default": false,
                            "description": "Whether the option represents an alcoholic modifier.",
                            "type": "boolean"
                          }
                        },
                        "required": [
                          "ref",
                          "name"
                        ]
                      },
                      "description": "All reusable options owned by this group."
                    }
                  },
                  "required": [
                    "ref",
                    "categoryRef",
                    "name",
                    "options"
                  ]
                }
              },
              "productCategories": {
                "default": [],
                "maxItems": 20,
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "ref": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 64,
                      "pattern": "^[a-z][a-z0-9_-]*$",
                      "description": "Request-local relationship key. Use a unique lowercase slug such as pizza, pizza-extras, or extra-cheese; this is not a database ID."
                    },
                    "name": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 120
                    },
                    "visible": {
                      "default": true,
                      "type": "boolean"
                    },
                    "vatRate": {
                      "default": "standard",
                      "type": "string",
                      "enum": [
                        "standard",
                        "reduced",
                        "special",
                        "zero"
                      ]
                    },
                    "categoryType": {
                      "default": "standard",
                      "description": "Use standard for ordinary products, open_price for staff-entered prices, gift_card for gift cards, and tip for gratuities.",
                      "type": "string",
                      "enum": [
                        "standard",
                        "open_price",
                        "gift_card",
                        "tip"
                      ]
                    },
                    "onlineEnabled": {
                      "default": false,
                      "type": "boolean"
                    },
                    "regulatedProductClass": {
                      "default": "standard",
                      "type": "string",
                      "enum": [
                        "standard",
                        "alcohol",
                        "tobacco",
                        "other_regulated"
                      ]
                    },
                    "discountPolicy": {
                      "default": "allowed",
                      "type": "string",
                      "enum": [
                        "allowed",
                        "excluded"
                      ]
                    }
                  },
                  "required": [
                    "ref",
                    "name"
                  ]
                }
              },
              "products": {
                "default": [],
                "maxItems": 100,
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "ref": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 64,
                      "pattern": "^[a-z][a-z0-9_-]*$",
                      "description": "Request-local relationship key. Use a unique lowercase slug such as pizza, pizza-extras, or extra-cheese; this is not a database ID."
                    },
                    "categoryRef": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 64,
                      "pattern": "^[a-z][a-z0-9_-]*$",
                      "description": "Ref of one productCategories entry."
                    },
                    "name": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 160
                    },
                    "priceMinor": {
                      "type": "integer",
                      "minimum": 0,
                      "maximum": 10000000,
                      "description": "Product price in currency minor units. Percentage tips still use 0 here and set tipPercentage."
                    },
                    "description": {
                      "default": null,
                      "anyOf": [
                        {
                          "type": "string",
                          "maxLength": 2000
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "visible": {
                      "default": true,
                      "type": "boolean"
                    },
                    "vatRate": {
                      "default": null,
                      "anyOf": [
                        {
                          "type": "string",
                          "enum": [
                            "standard",
                            "reduced",
                            "special",
                            "zero"
                          ]
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "onlineAvailable": {
                      "default": false,
                      "type": "boolean"
                    },
                    "maxOnlineQuantity": {
                      "default": null,
                      "anyOf": [
                        {
                          "type": "integer",
                          "exclusiveMinimum": 0,
                          "maximum": 100000
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "tipPricingType": {
                      "default": null,
                      "description": "Required only for a product in a tip category: fixed, open, or percentage.",
                      "anyOf": [
                        {
                          "type": "string",
                          "enum": [
                            "fixed",
                            "open",
                            "percentage"
                          ]
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "tipPercentage": {
                      "default": null,
                      "description": "Human percentage from 0–100, such as 12.5 for 12.5%; only with percentage tip pricing.",
                      "anyOf": [
                        {
                          "type": "number",
                          "exclusiveMinimum": 0,
                          "maximum": 100
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "regulatedProductClassOverride": {
                      "default": null,
                      "anyOf": [
                        {
                          "type": "string",
                          "enum": [
                            "standard",
                            "alcohol",
                            "tobacco",
                            "other_regulated"
                          ]
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "discountPolicyOverride": {
                      "default": null,
                      "anyOf": [
                        {
                          "type": "string",
                          "enum": [
                            "inherit",
                            "allowed",
                            "excluded"
                          ]
                        },
                        {
                          "type": "null"
                        }
                      ]
                    }
                  },
                  "required": [
                    "ref",
                    "categoryRef",
                    "name",
                    "priceMinor"
                  ]
                }
              },
              "combos": {
                "default": [],
                "maxItems": 20,
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "itemRef": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 64,
                      "pattern": "^[a-z][a-z0-9_-]*$",
                      "description": "Menu item ref that represents the combo for sale."
                    },
                    "components": {
                      "minItems": 1,
                      "maxItems": 25,
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "itemRef": {
                            "default": null,
                            "description": "Included menu item ref, or null when this component is a product.",
                            "anyOf": [
                              {
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 64,
                                "pattern": "^[a-z][a-z0-9_-]*$",
                                "description": "Request-local relationship key. Use a unique lowercase slug such as pizza, pizza-extras, or extra-cheese; this is not a database ID."
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "productRef": {
                            "default": null,
                            "description": "Included product ref, or null when this component is a menu item.",
                            "anyOf": [
                              {
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 64,
                                "pattern": "^[a-z][a-z0-9_-]*$",
                                "description": "Request-local relationship key. Use a unique lowercase slug such as pizza, pizza-extras, or extra-cheese; this is not a database ID."
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "quantity": {
                            "default": 1,
                            "description": "Positive component quantity.",
                            "type": "number",
                            "exclusiveMinimum": 0,
                            "maximum": 1000
                          }
                        }
                      },
                      "description": "Included menu items or products. Each component sets exactly one of itemRef or productRef."
                    }
                  },
                  "required": [
                    "itemRef",
                    "components"
                  ]
                }
              }
            },
            "required": [
              "menu",
              "menuCategories",
              "menuItems"
            ]
          }
        },
        "required": [
          "document"
        ]
      },
      "PlanMenuImportResult": {
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "2026-08-11.1"
          },
          "restaurantId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "valid": {
            "type": "boolean"
          },
          "planHash": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "menuName": {
            "type": "string",
            "minLength": 1
          },
          "target": {
            "type": "object",
            "properties": {
              "mode": {
                "type": "string",
                "enum": [
                  "new_draft",
                  "existing_draft"
                ]
              },
              "menuPublicId": {
                "anyOf": [
                  {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "menuName": {
                "type": "string",
                "minLength": 1
              },
              "previousCategoryCount": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "previousItemCount": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              }
            },
            "required": [
              "mode",
              "menuPublicId",
              "menuName",
              "previousCategoryCount",
              "previousItemCount"
            ],
            "additionalProperties": false
          },
          "creates": {
            "type": "object",
            "properties": {
              "menus": {
                "type": "number",
                "const": 1,
                "description": "Number of menu targets affected by this import."
              },
              "newMenus": {
                "description": "Number of new draft menus created. Zero when appending to an existing draft.",
                "type": "integer",
                "minimum": 0,
                "maximum": 1
              },
              "menuCategories": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "menuItems": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "optionGroups": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "options": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "productCategories": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "products": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "combos": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "comboComponents": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              }
            },
            "required": [
              "menus",
              "menuCategories",
              "menuItems",
              "optionGroups",
              "options",
              "productCategories",
              "products",
              "combos",
              "comboComponents"
            ],
            "additionalProperties": false
          },
          "warnings": {
            "maxItems": 50,
            "type": "array",
            "items": {
              "type": "string",
              "minLength": 1
            }
          },
          "errors": {
            "maxItems": 50,
            "type": "array",
            "items": {
              "type": "string",
              "minLength": 1
            }
          },
          "publishesAutomatically": {
            "type": "boolean",
            "const": false
          }
        },
        "required": [
          "restaurantId",
          "valid",
          "planHash",
          "menuName",
          "target",
          "creates",
          "warnings",
          "errors",
          "publishesAutomatically"
        ],
        "additionalProperties": false
      },
      "ApplyMenuImportInput": {
        "type": "object",
        "properties": {
          "target": {
            "default": {
              "mode": "new_draft"
            },
            "oneOf": [
              {
                "type": "object",
                "properties": {
                  "mode": {
                    "type": "string",
                    "const": "new_draft"
                  }
                },
                "required": [
                  "mode"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "mode": {
                    "type": "string",
                    "const": "existing_draft"
                  },
                  "menuPublicId": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                  },
                  "expectedMenuName": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 80
                  },
                  "expectedCategoryCount": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 9007199254740991
                  },
                  "expectedItemCount": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 9007199254740991
                  }
                },
                "required": [
                  "mode",
                  "menuPublicId",
                  "expectedMenuName",
                  "expectedCategoryCount",
                  "expectedItemCount"
                ]
              }
            ]
          },
          "document": {
            "type": "object",
            "properties": {
              "menu": {
                "type": "object",
                "properties": {
                  "ref": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 64,
                    "pattern": "^[a-z][a-z0-9_-]*$",
                    "description": "Request-local relationship key. Use a unique lowercase slug such as pizza, pizza-extras, or extra-cheese; this is not a database ID."
                  },
                  "name": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 80,
                    "description": "Name of the new inactive draft, or the exact current name of the selected existing draft."
                  }
                },
                "required": [
                  "ref",
                  "name"
                ]
              },
              "existingMenuCategories": {
                "default": [],
                "description": "Existing categories from the selected draft that may parent newly created items or option groups. These rows are referenced, never updated.",
                "maxItems": 20,
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "ref": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 64,
                      "pattern": "^[a-z][a-z0-9_-]*$",
                      "description": "Request-local ref used by newly created items and option groups."
                    },
                    "categoryPublicId": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
                      "description": "Exact category UUID returned by get_catalog_import_target."
                    },
                    "name": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 120,
                      "description": "Exact current category name returned with categoryPublicId."
                    }
                  },
                  "required": [
                    "ref",
                    "categoryPublicId",
                    "name"
                  ]
                }
              },
              "menuCategories": {
                "maxItems": 20,
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "ref": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 64,
                      "pattern": "^[a-z][a-z0-9_-]*$",
                      "description": "Request-local relationship key. Use a unique lowercase slug such as pizza, pizza-extras, or extra-cheese; this is not a database ID."
                    },
                    "name": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 120,
                      "description": "Customer-facing menu category name."
                    },
                    "visible": {
                      "default": true,
                      "description": "Whether the category is visible.",
                      "type": "boolean"
                    },
                    "regulatedProductClass": {
                      "default": "standard",
                      "description": "Category-level legal classification. Use alcohol only for alcoholic drink categories.",
                      "type": "string",
                      "enum": [
                        "standard",
                        "alcohol",
                        "tobacco",
                        "other_regulated"
                      ]
                    },
                    "discountPolicy": {
                      "default": "allowed",
                      "description": "Whether discounts are allowed for items in this category by default.",
                      "type": "string",
                      "enum": [
                        "allowed",
                        "excluded"
                      ]
                    }
                  },
                  "required": [
                    "ref",
                    "name"
                  ]
                }
              },
              "menuItems": {
                "minItems": 1,
                "maxItems": 100,
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "ref": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 64,
                      "pattern": "^[a-z][a-z0-9_-]*$",
                      "description": "Request-local relationship key. Use a unique lowercase slug such as pizza, pizza-extras, or extra-cheese; this is not a database ID."
                    },
                    "categoryRef": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 64,
                      "pattern": "^[a-z][a-z0-9_-]*$",
                      "description": "Ref of this item's canonical menu category."
                    },
                    "name": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 160,
                      "description": "Customer-facing item name."
                    },
                    "priceMinor": {
                      "type": "integer",
                      "minimum": 0,
                      "maximum": 10000000,
                      "description": "Base price in currency minor units: EUR 12.50 is 1250. Never send a decimal major-unit price."
                    },
                    "description": {
                      "default": null,
                      "description": "Customer-facing description, or null when none is known. Never invent ingredients or claims.",
                      "anyOf": [
                        {
                          "type": "string",
                          "maxLength": 2000
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "visible": {
                      "default": true,
                      "description": "Whether the item is visible.",
                      "type": "boolean"
                    },
                    "dietaryInfo": {
                      "default": {},
                      "type": "object",
                      "properties": {
                        "vegan": {
                          "default": false,
                          "type": "boolean"
                        },
                        "vegetarian": {
                          "default": false,
                          "type": "boolean"
                        },
                        "gluten-free": {
                          "default": false,
                          "type": "boolean"
                        },
                        "dairy-free": {
                          "default": false,
                          "type": "boolean"
                        },
                        "lactose-free": {
                          "default": false,
                          "type": "boolean"
                        },
                        "low-lactose": {
                          "default": false,
                          "type": "boolean"
                        },
                        "egg-free": {
                          "default": false,
                          "type": "boolean"
                        },
                        "nut-free": {
                          "default": false,
                          "type": "boolean"
                        },
                        "soy-free": {
                          "default": false,
                          "type": "boolean"
                        }
                      }
                    },
                    "tag": {
                      "default": null,
                      "anyOf": [
                        {
                          "type": "string",
                          "enum": [
                            "Popular",
                            "Chef's Pick",
                            "New",
                            "Starter",
                            "Main",
                            "Side",
                            "Dessert",
                            "Pizza",
                            "Pasta",
                            "Soft Drink",
                            "Coffee",
                            "Tea",
                            "Beer",
                            "Wine",
                            "Sparkling Wine",
                            "Cocktail",
                            "Spirit"
                          ]
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "productType": {
                      "default": "food",
                      "description": "Use drink for beverages; otherwise food.",
                      "type": "string",
                      "enum": [
                        "food",
                        "drink"
                      ]
                    },
                    "showInKitchen": {
                      "default": true,
                      "description": "Whether orders for this item print/display in the kitchen.",
                      "type": "boolean"
                    },
                    "trackVolume": {
                      "default": false,
                      "description": "Whether inventory volume is tracked for this item.",
                      "type": "boolean"
                    },
                    "openPrice": {
                      "default": false,
                      "description": "True only when staff enters the price at sale time.",
                      "type": "boolean"
                    },
                    "isAlcohol": {
                      "default": false,
                      "type": "boolean"
                    },
                    "volume": {
                      "default": null,
                      "description": "Numeric serving volume expressed in unit, or null when unknown.",
                      "anyOf": [
                        {
                          "type": "number",
                          "exclusiveMinimum": 0,
                          "maximum": 100000
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "unit": {
                      "default": null,
                      "description": "Unit for volume: ml, cl, or l.",
                      "anyOf": [
                        {
                          "type": "string",
                          "enum": [
                            "ml",
                            "cl",
                            "l"
                          ]
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "alcoholType": {
                      "default": null,
                      "description": "Required beverage class for an alcohol item, otherwise null.",
                      "anyOf": [
                        {
                          "type": "string",
                          "enum": [
                            "wine",
                            "spirits",
                            "beer",
                            "cider",
                            "hard_seltzer",
                            "other",
                            "sparkling_wine",
                            "liquor",
                            "long_drink"
                          ]
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "alcoholPercentage": {
                      "default": null,
                      "description": "Human ABV percentage such as 5.2, or null when not supplied.",
                      "anyOf": [
                        {
                          "type": "number",
                          "minimum": 0,
                          "maximum": 100
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "regulatedProductClassOverride": {
                      "default": null,
                      "anyOf": [
                        {
                          "type": "string",
                          "enum": [
                            "standard",
                            "alcohol",
                            "tobacco",
                            "other_regulated"
                          ]
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "discountPolicyOverride": {
                      "default": null,
                      "anyOf": [
                        {
                          "type": "string",
                          "enum": [
                            "inherit",
                            "allowed",
                            "excluded"
                          ]
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "optionGroupAssignments": {
                      "default": [],
                      "maxItems": 20,
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "groupRef": {
                            "type": "string",
                            "minLength": 1,
                            "maxLength": 64,
                            "pattern": "^[a-z][a-z0-9_-]*$",
                            "description": "Ref of one optionGroups entry."
                          },
                          "optionRefs": {
                            "minItems": 1,
                            "maxItems": 50,
                            "type": "array",
                            "items": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 64,
                              "pattern": "^[a-z][a-z0-9_-]*$",
                              "description": "Request-local relationship key. Use a unique lowercase slug such as pizza, pizza-extras, or extra-cheese; this is not a database ID."
                            },
                            "description": "Exact ordered subset of options from the referenced group offered by this item. Do not include options that the item must not offer."
                          },
                          "enabled": {
                            "default": true,
                            "description": "Whether this group is enabled for this item.",
                            "type": "boolean"
                          },
                          "minSelectionsOverride": {
                            "default": null,
                            "description": "Item-specific minimum, or null to inherit the group minimum.",
                            "anyOf": [
                              {
                                "type": "integer",
                                "minimum": 0,
                                "maximum": 100
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "maxSelectionsOverride": {
                            "default": null,
                            "description": "Item-specific maximum, or null to inherit the group maximum.",
                            "anyOf": [
                              {
                                "type": "integer",
                                "minimum": 0,
                                "maximum": 100
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "indexOverride": {
                            "default": null,
                            "description": "Zero-based group order for this item, or null to use assignment order.",
                            "anyOf": [
                              {
                                "type": "integer",
                                "minimum": 0,
                                "maximum": 100
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "showInKitchenOverride": {
                            "default": null,
                            "description": "Item-specific kitchen visibility, or null to inherit the group setting.",
                            "anyOf": [
                              {
                                "type": "boolean"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          }
                        },
                        "required": [
                          "groupRef",
                          "optionRefs"
                        ]
                      }
                    }
                  },
                  "required": [
                    "ref",
                    "categoryRef",
                    "name",
                    "priceMinor"
                  ]
                }
              },
              "optionGroups": {
                "default": [],
                "maxItems": 20,
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "ref": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 64,
                      "pattern": "^[a-z][a-z0-9_-]*$",
                      "description": "Request-local relationship key. Use a unique lowercase slug such as pizza, pizza-extras, or extra-cheese; this is not a database ID."
                    },
                    "categoryRef": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 64,
                      "pattern": "^[a-z][a-z0-9_-]*$",
                      "description": "Canonical category ref shared by this group and every item that assigns it."
                    },
                    "name": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 160,
                      "description": "Customer-facing choice-group name, such as Choose a side or Extras."
                    },
                    "minSelections": {
                      "default": 0,
                      "description": "Default required selection count. Use 0 for optional choices.",
                      "type": "integer",
                      "minimum": 0,
                      "maximum": 100
                    },
                    "maxSelections": {
                      "default": null,
                      "description": "Default maximum selection count, or null for no explicit maximum.",
                      "anyOf": [
                        {
                          "type": "integer",
                          "exclusiveMinimum": 0,
                          "maximum": 100
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "productType": {
                      "default": "food",
                      "description": "Must match every assigning menu item productType.",
                      "type": "string",
                      "enum": [
                        "food",
                        "drink"
                      ]
                    },
                    "showInKitchen": {
                      "default": true,
                      "description": "Default kitchen visibility for selected options.",
                      "type": "boolean"
                    },
                    "options": {
                      "minItems": 1,
                      "maxItems": 50,
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "ref": {
                            "type": "string",
                            "minLength": 1,
                            "maxLength": 64,
                            "pattern": "^[a-z][a-z0-9_-]*$",
                            "description": "Request-local relationship key. Use a unique lowercase slug such as pizza, pizza-extras, or extra-cheese; this is not a database ID."
                          },
                          "name": {
                            "type": "string",
                            "minLength": 1,
                            "maxLength": 160
                          },
                          "priceMinor": {
                            "default": 0,
                            "description": "Price delta in minor units, not an absolute price. May be negative, zero, or positive.",
                            "type": "integer",
                            "minimum": -10000000,
                            "maximum": 10000000
                          },
                          "allowQuantity": {
                            "default": false,
                            "description": "Whether the customer may select multiple units of this option.",
                            "type": "boolean"
                          },
                          "modifiesBaseAttributes": {
                            "default": false,
                            "description": "True only when this option changes serving volume or alcohol attributes.",
                            "type": "boolean"
                          },
                          "volumeChange": {
                            "default": null,
                            "description": "Signed volume delta expressed in volumeUnit, or null for no volume change.",
                            "anyOf": [
                              {
                                "type": "number",
                                "minimum": -100000,
                                "maximum": 100000
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "volumeUnit": {
                            "default": null,
                            "description": "Unit for volumeChange, or null when volumeChange is null.",
                            "anyOf": [
                              {
                                "type": "string",
                                "enum": [
                                  "ml",
                                  "cl",
                                  "l"
                                ]
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "alcoholPercentage": {
                            "default": null,
                            "description": "Resulting human ABV percentage for an alcoholic modifier, or null.",
                            "anyOf": [
                              {
                                "type": "number",
                                "minimum": 0,
                                "maximum": 100
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "alcoholic": {
                            "default": false,
                            "description": "Whether the option represents an alcoholic modifier.",
                            "type": "boolean"
                          }
                        },
                        "required": [
                          "ref",
                          "name"
                        ]
                      },
                      "description": "All reusable options owned by this group."
                    }
                  },
                  "required": [
                    "ref",
                    "categoryRef",
                    "name",
                    "options"
                  ]
                }
              },
              "productCategories": {
                "default": [],
                "maxItems": 20,
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "ref": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 64,
                      "pattern": "^[a-z][a-z0-9_-]*$",
                      "description": "Request-local relationship key. Use a unique lowercase slug such as pizza, pizza-extras, or extra-cheese; this is not a database ID."
                    },
                    "name": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 120
                    },
                    "visible": {
                      "default": true,
                      "type": "boolean"
                    },
                    "vatRate": {
                      "default": "standard",
                      "type": "string",
                      "enum": [
                        "standard",
                        "reduced",
                        "special",
                        "zero"
                      ]
                    },
                    "categoryType": {
                      "default": "standard",
                      "description": "Use standard for ordinary products, open_price for staff-entered prices, gift_card for gift cards, and tip for gratuities.",
                      "type": "string",
                      "enum": [
                        "standard",
                        "open_price",
                        "gift_card",
                        "tip"
                      ]
                    },
                    "onlineEnabled": {
                      "default": false,
                      "type": "boolean"
                    },
                    "regulatedProductClass": {
                      "default": "standard",
                      "type": "string",
                      "enum": [
                        "standard",
                        "alcohol",
                        "tobacco",
                        "other_regulated"
                      ]
                    },
                    "discountPolicy": {
                      "default": "allowed",
                      "type": "string",
                      "enum": [
                        "allowed",
                        "excluded"
                      ]
                    }
                  },
                  "required": [
                    "ref",
                    "name"
                  ]
                }
              },
              "products": {
                "default": [],
                "maxItems": 100,
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "ref": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 64,
                      "pattern": "^[a-z][a-z0-9_-]*$",
                      "description": "Request-local relationship key. Use a unique lowercase slug such as pizza, pizza-extras, or extra-cheese; this is not a database ID."
                    },
                    "categoryRef": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 64,
                      "pattern": "^[a-z][a-z0-9_-]*$",
                      "description": "Ref of one productCategories entry."
                    },
                    "name": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 160
                    },
                    "priceMinor": {
                      "type": "integer",
                      "minimum": 0,
                      "maximum": 10000000,
                      "description": "Product price in currency minor units. Percentage tips still use 0 here and set tipPercentage."
                    },
                    "description": {
                      "default": null,
                      "anyOf": [
                        {
                          "type": "string",
                          "maxLength": 2000
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "visible": {
                      "default": true,
                      "type": "boolean"
                    },
                    "vatRate": {
                      "default": null,
                      "anyOf": [
                        {
                          "type": "string",
                          "enum": [
                            "standard",
                            "reduced",
                            "special",
                            "zero"
                          ]
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "onlineAvailable": {
                      "default": false,
                      "type": "boolean"
                    },
                    "maxOnlineQuantity": {
                      "default": null,
                      "anyOf": [
                        {
                          "type": "integer",
                          "exclusiveMinimum": 0,
                          "maximum": 100000
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "tipPricingType": {
                      "default": null,
                      "description": "Required only for a product in a tip category: fixed, open, or percentage.",
                      "anyOf": [
                        {
                          "type": "string",
                          "enum": [
                            "fixed",
                            "open",
                            "percentage"
                          ]
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "tipPercentage": {
                      "default": null,
                      "description": "Human percentage from 0–100, such as 12.5 for 12.5%; only with percentage tip pricing.",
                      "anyOf": [
                        {
                          "type": "number",
                          "exclusiveMinimum": 0,
                          "maximum": 100
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "regulatedProductClassOverride": {
                      "default": null,
                      "anyOf": [
                        {
                          "type": "string",
                          "enum": [
                            "standard",
                            "alcohol",
                            "tobacco",
                            "other_regulated"
                          ]
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "discountPolicyOverride": {
                      "default": null,
                      "anyOf": [
                        {
                          "type": "string",
                          "enum": [
                            "inherit",
                            "allowed",
                            "excluded"
                          ]
                        },
                        {
                          "type": "null"
                        }
                      ]
                    }
                  },
                  "required": [
                    "ref",
                    "categoryRef",
                    "name",
                    "priceMinor"
                  ]
                }
              },
              "combos": {
                "default": [],
                "maxItems": 20,
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "itemRef": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 64,
                      "pattern": "^[a-z][a-z0-9_-]*$",
                      "description": "Menu item ref that represents the combo for sale."
                    },
                    "components": {
                      "minItems": 1,
                      "maxItems": 25,
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "itemRef": {
                            "default": null,
                            "description": "Included menu item ref, or null when this component is a product.",
                            "anyOf": [
                              {
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 64,
                                "pattern": "^[a-z][a-z0-9_-]*$",
                                "description": "Request-local relationship key. Use a unique lowercase slug such as pizza, pizza-extras, or extra-cheese; this is not a database ID."
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "productRef": {
                            "default": null,
                            "description": "Included product ref, or null when this component is a menu item.",
                            "anyOf": [
                              {
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 64,
                                "pattern": "^[a-z][a-z0-9_-]*$",
                                "description": "Request-local relationship key. Use a unique lowercase slug such as pizza, pizza-extras, or extra-cheese; this is not a database ID."
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "quantity": {
                            "default": 1,
                            "description": "Positive component quantity.",
                            "type": "number",
                            "exclusiveMinimum": 0,
                            "maximum": 1000
                          }
                        }
                      },
                      "description": "Included menu items or products. Each component sets exactly one of itemRef or productRef."
                    }
                  },
                  "required": [
                    "itemRef",
                    "components"
                  ]
                }
              }
            },
            "required": [
              "menu",
              "menuCategories",
              "menuItems"
            ]
          },
          "expectedPlanHash": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "idempotencyKey": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "confirmed": {
            "type": "boolean",
            "const": true
          }
        },
        "required": [
          "document",
          "expectedPlanHash",
          "idempotencyKey",
          "confirmed"
        ]
      },
      "ApplyMenuImportResult": {
        "type": "object",
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "2026-08-11.1"
          },
          "actionId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "restaurantId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "menu": {
            "type": "object",
            "properties": {
              "menuPublicId": {
                "type": "string",
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
              },
              "name": {
                "type": "string",
                "minLength": 1
              },
              "activeForPos": {
                "type": "boolean"
              },
              "onlineOrdering": {
                "type": "boolean"
              },
              "categoryCount": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "itemCount": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              }
            },
            "required": [
              "menuPublicId",
              "name",
              "activeForPos",
              "onlineOrdering",
              "categoryCount",
              "itemCount"
            ],
            "additionalProperties": false
          },
          "created": {
            "type": "object",
            "properties": {
              "menus": {
                "type": "number",
                "const": 1,
                "description": "Number of menu targets affected by this import."
              },
              "newMenus": {
                "description": "Number of new draft menus created. Zero when appending to an existing draft.",
                "type": "integer",
                "minimum": 0,
                "maximum": 1
              },
              "menuCategories": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "menuItems": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "optionGroups": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "options": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "productCategories": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "products": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "combos": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "comboComponents": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              }
            },
            "required": [
              "menus",
              "menuCategories",
              "menuItems",
              "optionGroups",
              "options",
              "productCategories",
              "products",
              "combos",
              "comboComponents"
            ],
            "additionalProperties": false
          },
          "ids": {
            "type": "object",
            "properties": {
              "menu": {
                "type": "object",
                "propertyNames": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 64,
                  "pattern": "^[a-z][a-z0-9_-]*$",
                  "description": "Request-local relationship key. Use a unique lowercase slug such as pizza, pizza-extras, or extra-cheese; this is not a database ID."
                },
                "additionalProperties": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                }
              },
              "menuCategories": {
                "type": "object",
                "propertyNames": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 64,
                  "pattern": "^[a-z][a-z0-9_-]*$",
                  "description": "Request-local relationship key. Use a unique lowercase slug such as pizza, pizza-extras, or extra-cheese; this is not a database ID."
                },
                "additionalProperties": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                }
              },
              "existingMenuCategories": {
                "type": "object",
                "propertyNames": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 64,
                  "pattern": "^[a-z][a-z0-9_-]*$",
                  "description": "Request-local relationship key. Use a unique lowercase slug such as pizza, pizza-extras, or extra-cheese; this is not a database ID."
                },
                "additionalProperties": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                }
              },
              "menuItems": {
                "type": "object",
                "propertyNames": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 64,
                  "pattern": "^[a-z][a-z0-9_-]*$",
                  "description": "Request-local relationship key. Use a unique lowercase slug such as pizza, pizza-extras, or extra-cheese; this is not a database ID."
                },
                "additionalProperties": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                }
              },
              "optionGroups": {
                "type": "object",
                "propertyNames": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 64,
                  "pattern": "^[a-z][a-z0-9_-]*$",
                  "description": "Request-local relationship key. Use a unique lowercase slug such as pizza, pizza-extras, or extra-cheese; this is not a database ID."
                },
                "additionalProperties": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                }
              },
              "options": {
                "type": "object",
                "propertyNames": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 64,
                  "pattern": "^[a-z][a-z0-9_-]*$",
                  "description": "Request-local relationship key. Use a unique lowercase slug such as pizza, pizza-extras, or extra-cheese; this is not a database ID."
                },
                "additionalProperties": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                }
              },
              "productCategories": {
                "type": "object",
                "propertyNames": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 64,
                  "pattern": "^[a-z][a-z0-9_-]*$",
                  "description": "Request-local relationship key. Use a unique lowercase slug such as pizza, pizza-extras, or extra-cheese; this is not a database ID."
                },
                "additionalProperties": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                }
              },
              "products": {
                "type": "object",
                "propertyNames": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 64,
                  "pattern": "^[a-z][a-z0-9_-]*$",
                  "description": "Request-local relationship key. Use a unique lowercase slug such as pizza, pizza-extras, or extra-cheese; this is not a database ID."
                },
                "additionalProperties": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                }
              }
            },
            "required": [
              "menu",
              "menuCategories",
              "existingMenuCategories",
              "menuItems",
              "optionGroups",
              "options",
              "productCategories",
              "products"
            ],
            "additionalProperties": false
          },
          "replayed": {
            "type": "boolean"
          }
        },
        "required": [
          "actionId",
          "restaurantId",
          "menu",
          "created",
          "ids",
          "replayed"
        ],
        "additionalProperties": false
      },
      "GetMenuImportResult": {
        "type": "object",
        "properties": {
          "status": {
            "type": "string",
            "enum": [
              "in_progress",
              "succeeded",
              "failed"
            ]
          },
          "result": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "schemaVersion": {
                    "type": "string",
                    "const": "2026-08-11.1"
                  },
                  "actionId": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                  },
                  "restaurantId": {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                  },
                  "menu": {
                    "type": "object",
                    "properties": {
                      "menuPublicId": {
                        "type": "string",
                        "format": "uuid",
                        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                      },
                      "name": {
                        "type": "string",
                        "minLength": 1
                      },
                      "activeForPos": {
                        "type": "boolean"
                      },
                      "onlineOrdering": {
                        "type": "boolean"
                      },
                      "categoryCount": {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 9007199254740991
                      },
                      "itemCount": {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 9007199254740991
                      }
                    },
                    "required": [
                      "menuPublicId",
                      "name",
                      "activeForPos",
                      "onlineOrdering",
                      "categoryCount",
                      "itemCount"
                    ],
                    "additionalProperties": false
                  },
                  "created": {
                    "type": "object",
                    "properties": {
                      "menus": {
                        "type": "number",
                        "const": 1,
                        "description": "Number of menu targets affected by this import."
                      },
                      "newMenus": {
                        "description": "Number of new draft menus created. Zero when appending to an existing draft.",
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 1
                      },
                      "menuCategories": {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 9007199254740991
                      },
                      "menuItems": {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 9007199254740991
                      },
                      "optionGroups": {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 9007199254740991
                      },
                      "options": {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 9007199254740991
                      },
                      "productCategories": {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 9007199254740991
                      },
                      "products": {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 9007199254740991
                      },
                      "combos": {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 9007199254740991
                      },
                      "comboComponents": {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 9007199254740991
                      }
                    },
                    "required": [
                      "menus",
                      "menuCategories",
                      "menuItems",
                      "optionGroups",
                      "options",
                      "productCategories",
                      "products",
                      "combos",
                      "comboComponents"
                    ],
                    "additionalProperties": false
                  },
                  "ids": {
                    "type": "object",
                    "properties": {
                      "menu": {
                        "type": "object",
                        "propertyNames": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 64,
                          "pattern": "^[a-z][a-z0-9_-]*$",
                          "description": "Request-local relationship key. Use a unique lowercase slug such as pizza, pizza-extras, or extra-cheese; this is not a database ID."
                        },
                        "additionalProperties": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                        }
                      },
                      "menuCategories": {
                        "type": "object",
                        "propertyNames": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 64,
                          "pattern": "^[a-z][a-z0-9_-]*$",
                          "description": "Request-local relationship key. Use a unique lowercase slug such as pizza, pizza-extras, or extra-cheese; this is not a database ID."
                        },
                        "additionalProperties": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                        }
                      },
                      "existingMenuCategories": {
                        "type": "object",
                        "propertyNames": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 64,
                          "pattern": "^[a-z][a-z0-9_-]*$",
                          "description": "Request-local relationship key. Use a unique lowercase slug such as pizza, pizza-extras, or extra-cheese; this is not a database ID."
                        },
                        "additionalProperties": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                        }
                      },
                      "menuItems": {
                        "type": "object",
                        "propertyNames": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 64,
                          "pattern": "^[a-z][a-z0-9_-]*$",
                          "description": "Request-local relationship key. Use a unique lowercase slug such as pizza, pizza-extras, or extra-cheese; this is not a database ID."
                        },
                        "additionalProperties": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                        }
                      },
                      "optionGroups": {
                        "type": "object",
                        "propertyNames": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 64,
                          "pattern": "^[a-z][a-z0-9_-]*$",
                          "description": "Request-local relationship key. Use a unique lowercase slug such as pizza, pizza-extras, or extra-cheese; this is not a database ID."
                        },
                        "additionalProperties": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                        }
                      },
                      "options": {
                        "type": "object",
                        "propertyNames": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 64,
                          "pattern": "^[a-z][a-z0-9_-]*$",
                          "description": "Request-local relationship key. Use a unique lowercase slug such as pizza, pizza-extras, or extra-cheese; this is not a database ID."
                        },
                        "additionalProperties": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                        }
                      },
                      "productCategories": {
                        "type": "object",
                        "propertyNames": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 64,
                          "pattern": "^[a-z][a-z0-9_-]*$",
                          "description": "Request-local relationship key. Use a unique lowercase slug such as pizza, pizza-extras, or extra-cheese; this is not a database ID."
                        },
                        "additionalProperties": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                        }
                      },
                      "products": {
                        "type": "object",
                        "propertyNames": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 64,
                          "pattern": "^[a-z][a-z0-9_-]*$",
                          "description": "Request-local relationship key. Use a unique lowercase slug such as pizza, pizza-extras, or extra-cheese; this is not a database ID."
                        },
                        "additionalProperties": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                        }
                      }
                    },
                    "required": [
                      "menu",
                      "menuCategories",
                      "existingMenuCategories",
                      "menuItems",
                      "optionGroups",
                      "options",
                      "productCategories",
                      "products"
                    ],
                    "additionalProperties": false
                  },
                  "replayed": {
                    "type": "boolean"
                  }
                },
                "required": [
                  "actionId",
                  "restaurantId",
                  "menu",
                  "created",
                  "ids",
                  "replayed"
                ],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "status",
          "result"
        ],
        "additionalProperties": false
      }
    }
  },
  "x-fiest-contract": {
    "audience": "https://api-sandbox.fiest.io",
    "defaultDocumentationVisibility": "private",
    "partnerAccess": "allowlisted",
    "tokenTransport": "authorization-header",
    "playground": "internal-only"
  },
  "x-fiest-error-codes": {
    "authorization_expired": {
      "status": [
        403
      ],
      "retryable": false,
      "description": "The authenticated authorization no longer resolves an accessible restaurant. Ask the customer to authorize the integration again."
    },
    "capability_disabled": {
      "status": [
        503
      ],
      "retryable": true,
      "description": "The capability is documented but is not enabled in the current Fiest environment."
    },
    "conflict": {
      "status": [
        409
      ],
      "retryable": false,
      "description": "The requested change conflicts with the current restaurant state or a platform limit."
    },
    "idempotency_conflict": {
      "status": [
        409
      ],
      "retryable": false,
      "description": "The supplied idempotency key was already used for a different request."
    },
    "insufficient_scope": {
      "status": [
        403
      ],
      "retryable": false,
      "description": "The access token does not include every scope required by the operation."
    },
    "invalid_request": {
      "status": [
        400
      ],
      "retryable": false,
      "description": "A path or query parameter is missing, malformed, or outside its supported bounds."
    },
    "invalid_token": {
      "status": [
        401
      ],
      "retryable": false,
      "description": "The bearer token, approved client, consent, membership, organization grant, or authorizer role is missing, expired, revoked, or invalid for this API."
    },
    "not_found": {
      "status": [
        404
      ],
      "retryable": false,
      "description": "The resource does not exist or is outside the current authorization boundary."
    },
    "managed_externally": {
      "status": [
        409
      ],
      "retryable": false,
      "description": "The requested setting is managed by an active external integration and cannot be changed through this API."
    },
    "payload_too_large": {
      "status": [
        413
      ],
      "retryable": false,
      "description": "The JSON request body exceeds the documented size limit."
    },
    "precondition_failed": {
      "status": [
        409
      ],
      "retryable": false,
      "description": "The restaurant state changed after it was reviewed. Fetch the latest state and build a new request."
    },
    "rate_limited": {
      "status": [
        429
      ],
      "retryable": true,
      "description": "The partner request limit was exceeded. Wait for the Retry-After duration before retrying."
    },
    "service_unavailable": {
      "status": [
        503
      ],
      "retryable": true,
      "description": "Fiest or a required downstream service is temporarily unavailable."
    },
    "write_in_progress": {
      "status": [
        409
      ],
      "retryable": true,
      "description": "An idempotent write is still processing. Retry the exact request with the same idempotency key after Retry-After."
    }
  }
}
