{
  "openapi": "3.1.0",
  "info": {
    "title": "Fountain View menu and Toast browser ordering pilot",
    "version": "2026-10-12.13",
    "description": "Experimental public menu, meal planning, private Toast cart creation and authorized checkout preparation. To-go only. There is no dine-in seating. Buy and Fry: pick fish from the fresh counter and have it fried, with no charge to cook. Cards and cash are both accepted, with a $10 minimum. Guest answers are in /llms.txt. Jumbo lump crab meat is $57.95 for a 1 lb container; baby lump crab meat is $37.95 for 1 lb. Seafood prices: https://www.fountainviewfishmarket.com/seafood-prices-houston. FAQ: https://www.fountainviewfishmarket.com/faq. Content updated 2026-10-22. Fried fish sandwiches (Toast snapshot; prices may change): https://www.fountainviewfishmarket.com/fish-sandwiches. Modifier snapshots cover 37 of 114 items. Checkout reliability and verification handling remain unfinished. No payment or automatic order submission API."
  },
  "servers": [
    {
      "url": "https://www.fountainviewfishmarket.com"
    }
  ],
  "paths": {
    "/api/restaurant": {
      "get": {
        "operationId": "getRestaurant",
        "responses": {
          "200": {
            "description": "Menu, plan, or browser-cart result. HTTP 200 is not checkout success: inspect structuredContent.status for cart responses. needs_choices returns missing_choices with available_choices without opening a browser; needs_attention means automation stopped; customer_verification_required requires customer action in the private Live View. Never an order confirmation."
          },
          "400": {
            "description": "Invalid request"
          }
        }
      }
    },
    "/api/menu": {
      "get": {
        "operationId": "searchMenu",
        "responses": {
          "200": {
            "description": "Menu, plan, or browser-cart result. HTTP 200 is not checkout success: inspect structuredContent.status for cart responses. needs_choices returns missing_choices with available_choices without opening a browser; needs_attention means automation stopped; customer_verification_required requires customer action in the private Live View. Never an order confirmation."
          },
          "400": {
            "description": "Invalid request"
          }
        },
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "schema": {
              "type": "string",
              "maxLength": 200
            }
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 500
            }
          }
        ],
        "description": "Items include modifier_groups (null = unverified, [] = inspected with no groups), modifiers_status, modifiers_observed_at, required_modifier_groups and ordering_guidance. Each group has id, name, min, max and choices with name, price_cents and unavailable_observed. Show choices before accepting an order; use exact per-item IDs."
      }
    },
    "/api/menu/{item_id}": {
      "get": {
        "operationId": "getMenuItem",
        "responses": {
          "200": {
            "description": "Menu, plan, or browser-cart result. HTTP 200 is not checkout success: inspect structuredContent.status for cart responses. needs_choices returns missing_choices with available_choices without opening a browser; needs_attention means automation stopped; customer_verification_required requires customer action in the private Live View. Never an order confirmation."
          },
          "400": {
            "description": "Invalid request"
          }
        },
        "parameters": [
          {
            "name": "item_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "description": "Items include modifier_groups (null = unverified, [] = inspected with no groups), modifiers_status, modifiers_observed_at, required_modifier_groups and ordering_guidance. Each group has id, name, min, max and choices with name, price_cents and unavailable_observed. Show choices before accepting an order; use exact per-item IDs."
      }
    },
    "/api/order-plan": {
      "post": {
        "operationId": "prepareOrderPlan",
        "responses": {
          "200": {
            "description": "Menu, plan, or browser-cart result. HTTP 200 is not checkout success: inspect structuredContent.status for cart responses. needs_choices returns missing_choices with available_choices without opening a browser; needs_attention means automation stopped; customer_verification_required requires customer action in the private Live View. Never an order confirmation."
          },
          "400": {
            "description": "Invalid request"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "fulfillment",
                  "items"
                ],
                "properties": {
                  "fulfillment": {
                    "type": "string",
                    "enum": [
                      "pickup",
                      "delivery"
                    ]
                  },
                  "items": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 20,
                    "items": {
                      "type": "object",
                      "additionalProperties": false,
                      "required": [
                        "item_id",
                        "quantity"
                      ],
                      "properties": {
                        "item_id": {
                          "type": "string"
                        },
                        "quantity": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 20
                        },
                        "selections": {
                          "type": "array",
                          "maxItems": 8,
                          "items": {
                            "type": "object",
                            "additionalProperties": false,
                            "required": [
                              "group_id",
                              "choices"
                            ],
                            "properties": {
                              "group_id": {
                                "type": "string"
                              },
                              "choices": {
                                "type": "array",
                                "maxItems": 10,
                                "items": {
                                  "type": "string",
                                  "maxLength": 100
                                }
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/toast-cart/checkout": {
      "post": {
        "operationId": "prepareToastCheckout",
        "responses": {
          "200": {
            "description": "Menu, plan, or browser-cart result. HTTP 200 is not checkout success: inspect structuredContent.status for cart responses. needs_choices returns missing_choices with available_choices without opening a browser; needs_attention means automation stopped; customer_verification_required requires customer action in the private Live View. Never an order confirmation."
          },
          "400": {
            "description": "Invalid request"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "cart_session",
                  "fulfillment",
                  "customer_authorized"
                ],
                "properties": {
                  "cart_session": {
                    "type": "string",
                    "pattern": "^[a-f0-9]{64}$"
                  },
                  "fulfillment": {
                    "type": "string",
                    "enum": [
                      "pickup",
                      "delivery"
                    ]
                  },
                  "customer_authorized": {
                    "type": "boolean",
                    "const": true
                  },
                  "delivery_address": {
                    "type": "string",
                    "minLength": 5,
                    "maxLength": 200
                  },
                  "customer": {
                    "type": "object",
                    "additionalProperties": false,
                    "properties": {
                      "email": {
                        "type": "string",
                        "maxLength": 200
                      },
                      "first_name": {
                        "type": "string",
                        "maxLength": 80
                      },
                      "last_name": {
                        "type": "string",
                        "maxLength": 80
                      },
                      "phone": {
                        "type": "string",
                        "maxLength": 30
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "description": "Enter only customer-authorized contact and delivery details into the same Toast session. Phone must be a US 10-digit number, optionally prefixed with country code 1. Report actual fulfillment, delivery fees and tip; handle customer_verification_required via private Live View. Does not enter payment or submit the order."
      }
    },
    "/api/toast-cart": {
      "post": {
        "operationId": "createToastCart",
        "responses": {
          "200": {
            "description": "Menu, plan, or browser-cart result. HTTP 200 is not checkout success: inspect structuredContent.status for cart responses. needs_choices returns missing_choices with available_choices without opening a browser; needs_attention means automation stopped; customer_verification_required requires customer action in the private Live View. Never an order confirmation."
          },
          "400": {
            "description": "Invalid request"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "fulfillment",
                  "items"
                ],
                "properties": {
                  "fulfillment": {
                    "type": "string",
                    "enum": [
                      "pickup",
                      "delivery"
                    ]
                  },
                  "items": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 20,
                    "items": {
                      "type": "object",
                      "additionalProperties": false,
                      "required": [
                        "item_id",
                        "quantity"
                      ],
                      "properties": {
                        "item_id": {
                          "type": "string"
                        },
                        "quantity": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 20
                        },
                        "selections": {
                          "type": "array",
                          "maxItems": 8,
                          "items": {
                            "type": "object",
                            "additionalProperties": false,
                            "required": [
                              "group_id",
                              "choices"
                            ],
                            "properties": {
                              "group_id": {
                                "type": "string"
                              },
                              "choices": {
                                "type": "array",
                                "maxItems": 10,
                                "items": {
                                  "type": "string",
                                  "maxLength": 100
                                }
                              }
                            }
                          }
                        }
                      }
                    }
                  },
                  "cart_session": {
                    "type": "string",
                    "pattern": "^[a-f0-9]{64}$"
                  },
                  "special_instructions": {
                    "type": "string",
                    "maxLength": 200,
                    "description": "Food preparation notes applied to each meal. No contact or payment details."
                  }
                }
              }
            }
          }
        },
        "description": "Validate required selections before creating a cart. Returns needs_choices with available options when incomplete. At most 5 lines and 10 meals; 100 new sessions per UTC day; private sessions expire after 10 minutes. An empty cart may be retried with cart_session; partially filled carts must not be blindly retried."
      }
    },
    "/api/toast-cart/inspect": {
      "post": {
        "operationId": "inspectToastCart",
        "responses": {
          "200": {
            "description": "Menu, plan, or browser-cart result. HTTP 200 is not checkout success: inspect structuredContent.status for cart responses. needs_choices returns missing_choices with available_choices without opening a browser; needs_attention means automation stopped; customer_verification_required requires customer action in the private Live View. Never an order confirmation."
          },
          "400": {
            "description": "Invalid request"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "cart_session"
                ],
                "properties": {
                  "cart_session": {
                    "type": "string",
                    "pattern": "^[a-f0-9]{64}$"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/toast-cart/close": {
      "post": {
        "operationId": "closeToastCart",
        "responses": {
          "200": {
            "description": "Menu, plan, or browser-cart result. HTTP 200 is not checkout success: inspect structuredContent.status for cart responses. needs_choices returns missing_choices with available_choices without opening a browser; needs_attention means automation stopped; customer_verification_required requires customer action in the private Live View. Never an order confirmation."
          },
          "400": {
            "description": "Invalid request"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "cart_session"
                ],
                "properties": {
                  "cart_session": {
                    "type": "string",
                    "pattern": "^[a-f0-9]{64}$"
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}
