{
  "swagger": "2.0",
  "info": {
    "description": "The etender connect booking API.",
    "version": "1.0",
    "title": "eTender",
    "contact": {}
  },
  "host": "etender-connect.com",
  "basePath": "/v1",
  "schemes": [
    "https"
  ],
  "security": [
    {
      "Custom": []
    }
  ],
  "paths": {
    "/widget-config": {
      "get": {
        "summary": "Gets the widget configuration for the API key.",
        "description": "Returns the widgetUrl configured for the campaign associated with the API key in the Authorization header.",
        "produces": [
          "application/json"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Widget configuration returned successfully.",
            "schema": {
              "type": "object",
              "properties": {
                "widgetUrl": {
                  "type": "string",
                  "description": "The widget URL for this API key."
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized. Missing or invalid AccessKey.",
            "schema": {
              "$ref": "#/definitions/Error"
            }
          },
          "404": {
            "description": "Widget configuration not found.",
            "schema": {
              "$ref": "#/definitions/Error"
            }
          },
          "500": {
            "description": "Internal server error.",
            "schema": {
              "$ref": "#/definitions/Error"
            }
          }
        }
      }
    },
    "/restaurants": {
      "get": {
        "summary": "Gets all available restaurants for an API key.",
        "description": "Gets all available restaurants for an API key.",
        "produces": [
          "application/json"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Status 200",
            "schema": {
              "type": "array",
              "items": {
                "$ref": "#/definitions/Restaurant"
              }
            }
          }
        }
      }
    },
    "/restaurants/{restaurantId}": {
      "get": {
        "summary": "Gets a restaurant.",
        "description": "Gets a restaurant.",
        "produces": [
          "application/json"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "The restaurant.",
            "schema": {
              "$ref": "#/definitions/Restaurant"
            }
          },
          "404": {
            "description": "Status 404",
            "schema": {
              "$ref": "#/definitions/Error"
            }
          }
        }
      },
      "parameters": [
        {
          "name": "restaurantId",
          "in": "path",
          "required": true,
          "type": "integer",
          "format": "int32"
        }
      ]
    },
    "/restaurants/{restaurantId}/availability": {
      "get": {
        "summary": "Gets the availability for the next 60 days.",
        "description": "Gets the availability for the next 60 days.",
        "produces": [
          "application/json"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "The availability for the next 60 days.",
            "schema": {
              "type": "array",
              "items": {
                "$ref": "#/definitions/CalendarDate"
              }
            }
          },
          "404": {
            "description": "Status 404",
            "schema": {
              "$ref": "#/definitions/Error"
            }
          }
        }
      },
      "parameters": [
        {
          "name": "restaurantId",
          "in": "path",
          "required": true,
          "type": "integer",
          "format": "int32"
        }
      ]
    },
    "/restaurants/{restaurantId}/availability/{year}": {
      "get": {
        "summary": "Gets the availability for a year.",
        "description": "Gets the availability for a year.",
        "produces": [
          "application/json"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "The dates in this year and their availability.",
            "schema": {
              "type": "array",
              "items": {
                "$ref": "#/definitions/CalendarDate"
              }
            }
          },
          "404": {
            "description": "Status 404",
            "schema": {
              "$ref": "#/definitions/Error"
            }
          }
        }
      },
      "parameters": [
        {
          "name": "restaurantId",
          "in": "path",
          "required": true,
          "type": "integer",
          "format": "int32"
        },
        {
          "name": "year",
          "in": "path",
          "required": true,
          "type": "integer",
          "format": "int32"
        }
      ]
    },
    "/restaurants/{restaurantId}/availability/{year}/{month}": {
      "get": {
        "summary": "Gets the availability in a specific month.",
        "description": "Gets the availability in a specific month.",
        "produces": [
          "application/json"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "The calendar dates in this month and their availability.",
            "schema": {
              "type": "array",
              "items": {
                "$ref": "#/definitions/CalendarDate"
              }
            }
          },
          "404": {
            "description": "Status 404",
            "schema": {
              "$ref": "#/definitions/Error"
            }
          }
        }
      },
      "parameters": [
        {
          "name": "restaurantId",
          "in": "path",
          "required": true,
          "type": "integer",
          "format": "int32"
        },
        {
          "name": "year",
          "in": "path",
          "required": true,
          "type": "integer",
          "format": "int32"
        },
        {
          "name": "month",
          "in": "path",
          "required": true,
          "type": "integer",
          "format": "int32"
        }
      ]
    },
    "/restaurants/{restaurantId}/availability/{year}/{month}/{day}": {
      "get": {
        "summary": "Gets the availability on a specific day.",
        "description": "Gets the availability on a specific day.",
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "localtime",
            "in": "query",
            "required": false,
            "type": "string",
            "description": "The timeslot (hh:mm)",
            "x-example": "20:00"
          },
          {
            "name": "partysize",
            "in": "query",
            "required": false,
            "type": "integer",
            "description": "The party size",
            "x-example": 2
          },
          {
            "name": "sectionId",
            "in": "query",
            "required": false,
            "type": "array",
            "items": {
              "type": "integer"
            },
            "collectionFormat": "multi",
            "description": "The ids of the sections (rooms or specific sections of a restaurant that have separate availability)",
            "x-example": [
              1322,
              13322
            ]
          },
          {
            "name": "duration",
            "in": "query",
            "required": false,
            "type": "integer",
            "description": "The duration in minutes",
            "x-example": 120
          }
        ],
        "responses": {
          "200": {
            "description": "The timeslots on this day and their availability.",
            "schema": {
              "type": "array",
              "items": {
                "$ref": "#/definitions/Timeslot"
              }
            }
          },
          "404": {
            "description": "Status 404",
            "schema": {
              "$ref": "#/definitions/Error"
            }
          }
        }
      },
      "parameters": [
        {
          "name": "restaurantId",
          "in": "path",
          "required": true,
          "type": "integer",
          "format": "int32"
        },
        {
          "name": "year",
          "in": "path",
          "required": true,
          "type": "integer",
          "format": "int32"
        },
        {
          "name": "month",
          "in": "path",
          "required": true,
          "type": "integer",
          "format": "int32"
        },
        {
          "name": "day",
          "in": "path",
          "required": true,
          "type": "integer",
          "format": "int32"
        }
      ]
    },
    "/restaurants/{restaurantId}/occupancy": {
      "get": {
        "summary": "Gets the occupancy for the next 60 days.",
        "description": "Gets the occupancy for the next 60 days.",
        "produces": [
          "application/json"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "The occupancy for the next 60 days.",
            "schema": {
              "type": "array",
              "items": {
                "$ref": "#/definitions/DayOccupancy"
              }
            }
          },
          "404": {
            "description": "Status 404",
            "schema": {
              "$ref": "#/definitions/Error"
            }
          }
        }
      },
      "parameters": [
        {
          "name": "restaurantId",
          "in": "path",
          "required": true,
          "type": "integer",
          "format": "int32"
        }
      ]
    },
    "/restaurants/{restaurantId}/occupancy/{year}": {
      "get": {
        "summary": "Gets the occupancy for a year.",
        "description": "Gets the occupancy for a year.",
        "produces": [
          "application/json"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "The dates in this year and their occupancy.",
            "schema": {
              "type": "array",
              "items": {
                "$ref": "#/definitions/DayOccupancy"
              }
            }
          },
          "404": {
            "description": "Status 404",
            "schema": {
              "$ref": "#/definitions/Error"
            }
          }
        }
      },
      "parameters": [
        {
          "name": "restaurantId",
          "in": "path",
          "required": true,
          "type": "integer",
          "format": "int32"
        },
        {
          "name": "year",
          "in": "path",
          "required": true,
          "type": "integer",
          "format": "int32"
        }
      ]
    },
    "/restaurants/{restaurantId}/occupancy/{year}/{month}": {
      "get": {
        "summary": "Gets the occupancy in a specific month.",
        "description": "Gets the occupancy in a specific month.",
        "produces": [
          "application/json"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "The dates in this month and their occupancy.",
            "schema": {
              "type": "array",
              "items": {
                "$ref": "#/definitions/DayOccupancy"
              }
            }
          },
          "404": {
            "description": "Status 404",
            "schema": {
              "$ref": "#/definitions/Error"
            }
          }
        }
      },
      "parameters": [
        {
          "name": "restaurantId",
          "in": "path",
          "required": true,
          "type": "integer",
          "format": "int32"
        },
        {
          "name": "year",
          "in": "path",
          "required": true,
          "type": "integer",
          "format": "int32"
        },
        {
          "name": "month",
          "in": "path",
          "required": true,
          "type": "integer",
          "format": "int32"
        }
      ]
    },
    "/restaurants/{restaurantId}/occupancy/{year}/{month}/{day}": {
      "get": {
        "summary": "Gets the occupancy on a specific day.",
        "description": "Gets the occupancy on a specific day.",
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "localtime",
            "in": "query",
            "required": false,
            "type": "string",
            "description": "The timeslot (hh:mm)",
            "x-example": "20:00"
          }
        ],
        "responses": {
          "200": {
            "description": "The timeslots on this day and their occupancy.",
            "schema": {
              "type": "array",
              "items": {
                "$ref": "#/definitions/TimeOccupancy"
              }
            }
          },
          "404": {
            "description": "Status 404",
            "schema": {
              "$ref": "#/definitions/Error"
            }
          }
        }
      },
      "parameters": [
        {
          "name": "restaurantId",
          "in": "path",
          "required": true,
          "type": "integer",
          "format": "int32"
        },
        {
          "name": "year",
          "in": "path",
          "required": true,
          "type": "integer",
          "format": "int32"
        },
        {
          "name": "month",
          "in": "path",
          "required": true,
          "type": "integer",
          "format": "int32"
        },
        {
          "name": "day",
          "in": "path",
          "required": true,
          "type": "integer",
          "format": "int32"
        }
      ]
    },
    "/restaurants/{restaurantId}/reservations": {
      "get": {
        "summary": "Gets reservations by phone number or referral.",
        "description": "Gets reservations for a restaurant, either by phone number (phoneNumber) or by referral attribution (referral + referralToken). The two search modes are mutually exclusive. Only returns reservations that are not final (i.e., active and in the future).",
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "phoneNumber",
            "in": "query",
            "required": false,
            "type": "string",
            "description": "Phone number in E.164 format, without the +, so numbers only (e.g., 31628186311). Required when searching by phone number; mutually exclusive with referral/referralToken.",
            "x-example": "31628186311"
          },
          {
            "name": "referral",
            "in": "query",
            "required": false,
            "type": "string",
            "description": "Referral source (for instance google). Required together with referralToken when searching by referral; mutually exclusive with phoneNumber."
          },
          {
            "name": "referralToken",
            "in": "query",
            "required": false,
            "type": "string",
            "description": "Referral tracking token. Required together with referral when searching by referral; mutually exclusive with phoneNumber."
          }
        ],
        "responses": {
          "200": {
            "description": "List of reservations matching the phone number.",
            "schema": {
              "type": "array",
              "items": {
                "$ref": "#/definitions/Reservation"
              }
            }
          },
          "400": {
            "description": "Invalid phone number.",
            "schema": {
              "$ref": "#/definitions/Error"
            }
          },
          "401": {
            "description": "Unauthorized.",
            "schema": {
              "$ref": "#/definitions/Error"
            }
          }
        }
      },
      "post": {
        "summary": "Creates a table reservation.",
        "description": "Creates a table reservation.",
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "body",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Reservation"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The created reservation.",
            "schema": {
              "$ref": "#/definitions/Reservation"
            }
          },
          "400": {
            "description": "Status 400",
            "schema": {
              "$ref": "#/definitions/Error"
            }
          }
        }
      },
      "parameters": [
        {
          "name": "restaurantId",
          "in": "path",
          "required": true,
          "type": "integer",
          "format": "int32"
        }
      ]
    },
    "/restaurants/{restaurantId}/reservations/{reservationId}": {
      "get": {
        "summary": "Gets a reservation.",
        "description": "Gets a reservation.",
        "produces": [
          "application/json"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "The reservation.",
            "schema": {
              "$ref": "#/definitions/Reservation"
            }
          },
          "404": {
            "description": "Status 404",
            "schema": {
              "$ref": "#/definitions/Error"
            }
          }
        }
      },
      "delete": {
        "summary": "Cancels a reservation.",
        "description": "Cancels a reservation.",
        "produces": [
          "application/json"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "The cancelled reservation.",
            "schema": {
              "$ref": "#/definitions/Reservation"
            }
          },
          "404": {
            "description": "Status 404",
            "schema": {
              "$ref": "#/definitions/Error"
            }
          }
        }
      },
      "patch": {
        "summary": "Updates an existing reservation.",
        "description": "Updates an existing reservation.",
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "body",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/ReservationUpdate"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The updated reservation.",
            "schema": {
              "$ref": "#/definitions/Reservation"
            }
          },
          "404": {
            "description": "Status 404",
            "schema": {
              "$ref": "#/definitions/Error"
            }
          }
        }
      },
      "parameters": [
        {
          "name": "restaurantId",
          "in": "path",
          "required": true,
          "type": "integer",
          "format": "int32"
        },
        {
          "name": "reservationId",
          "in": "path",
          "required": true,
          "type": "string"
        }
      ]
    },
    "/restaurants/{restaurantId}/reservations/{reservationId}/confirm": {
      "post": {
        "summary": "Confirms a table reservation.",
        "description": "Confirms a table reservation.",
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "restaurantId",
            "in": "path",
            "required": true,
            "type": "integer",
            "format": "int32"
          },
          {
            "name": "reservationId",
            "in": "path",
            "required": true,
            "type": "string"
          }
        ],
        "responses": {
          "200": {
            "description": "The confirmed reservation.",
            "schema": {
              "$ref": "#/definitions/Reservation"
            }
          },
          "404": {
            "description": "Status 404",
            "schema": {
              "$ref": "#/definitions/Error"
            }
          }
        }
      }
    },
    "/exports/{restaurantId}/reservations": {
      "get": {
        "summary": "Exports the reservations for a restaurant.",
        "description": "Exports the reservations for a restaurant.",
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "start",
            "in": "query",
            "required": true,
            "type": "string",
            "description": "The start date time",
            "x-example": "2023-10-01T00:00Z"
          },
          {
            "name": "end",
            "in": "query",
            "required": true,
            "type": "string",
            "description": "The end date time",
            "x-example": "2023-12-01T08:00Z"
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "type": "string",
            "description": "The cursor that specifies the start of the next result set",
            "x-example": 1322
          },
          {
            "name": "exportType",
            "in": "query",
            "required": false,
            "type": "string",
            "description": "The export type: mutations or reservations",
            "x-example": "reservations"
          }
        ],
        "responses": {
          "200": {
            "description": "A paged result set of exported reservations.",
            "schema": {
              "$ref": "#/definitions/ReservationsExportResponse"
            }
          },
          "404": {
            "description": "Status 404",
            "schema": {
              "$ref": "#/definitions/Error"
            }
          }
        }
      },
      "parameters": [
        {
          "name": "restaurantId",
          "in": "path",
          "required": true,
          "type": "integer",
          "format": "int32"
        }
      ]
    },
    "/restaurants/{restaurantId}/feedback/{reservationCode}": {
      "parameters": [
        {
          "name": "reservationCode",
          "in": "path",
          "required": true,
          "type": "string"
        },
        {
          "name": "restaurantId",
          "in": "path",
          "required": true,
          "type": "integer",
          "format": "int32"
        }
      ],
      "get": {
        "summary": "Gets the feedback for a reservation.",
        "description": "Gets the feedback for a reservation.",
        "produces": [
          "application/json"
        ],
        "responses": {
          "200": {
            "description": "The feedback for the reservation.",
            "schema": {
              "type": "array",
              "items": {
                "$ref": "#/definitions/Feedback"
              }
            }
          },
          "404": {
            "description": "Status 404",
            "schema": {
              "$ref": "#/definitions/Error"
            }
          }
        }
      },
      "post": {
        "summary": "Creates a feedback for a reservation.",
        "description": "Creates a feedback for a reservation.",
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "body",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Feedback"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The created feedback.",
            "schema": {
              "$ref": "#/definitions/Feedback"
            }
          },
          "404": {
            "description": "Status 400",
            "schema": {
              "$ref": "#/definitions/Error"
            }
          }
        }
      }
    },
    "/restaurants/{restaurantId}/marketing-preferences/{marketingId}": {
      "put": {
        "summary": "Updates marketing preferences.",
        "description": "Updates marketing preferences for a given marketing ID.",
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "restaurantId",
            "in": "path",
            "required": true,
            "type": "integer",
            "format": "int32"
          },
          {
            "name": "marketingId",
            "in": "path",
            "required": true,
            "type": "string"
          },
          {
            "name": "body",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/MarketingPreferences"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Marketing preferences updated successfully."
          },
          "404": {
            "description": "Marketing preferences not found.",
            "schema": {
              "$ref": "#/definitions/Error"
            }
          }
        }
      }
    },
    "/restaurants/{restaurantId}/marketing-preferences/newsletter/subscribe": {
      "post": {
        "summary": "Subscribe email to newsletter.",
        "description": "Subscribes an email address to the restaurant's newsletter. Requires a valid Cloudflare Turnstile captcha token.",
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "restaurantId",
            "in": "path",
            "required": true,
            "type": "integer",
            "format": "int32",
            "description": "The ID of the restaurant."
          },
          {
            "name": "body",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/NewsletterSubscriptionRequest"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Email successfully subscribed to newsletter."
          },
          "400": {
            "description": "Invalid request or captcha validation failed.",
            "schema": {
              "$ref": "#/definitions/Error"
            }
          },
          "404": {
            "description": "Restaurant not found.",
            "schema": {
              "$ref": "#/definitions/Error"
            }
          }
        }
      }
    },
    "/restaurants/{restaurantId}/marketing-preferences/newsletter/unsubscribe": {
      "post": {
        "summary": "Unsubscribe email from newsletter.",
        "description": "Unsubscribes an email address from the restaurant's newsletter. Requires a valid Cloudflare Turnstile captcha token.",
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "restaurantId",
            "in": "path",
            "required": true,
            "type": "integer",
            "format": "int32",
            "description": "The ID of the restaurant."
          },
          {
            "name": "body",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/NewsletterSubscriptionRequest"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Email successfully unsubscribed from newsletter."
          },
          "400": {
            "description": "Invalid request or captcha validation failed.",
            "schema": {
              "$ref": "#/definitions/Error"
            }
          },
          "404": {
            "description": "Restaurant not found.",
            "schema": {
              "$ref": "#/definitions/Error"
            }
          }
        }
      }
    },
    "/restaurants/{restaurantId}/marketing-events/{marketingId}": {
      "post": {
        "summary": "Creates a marketing event.",
        "description": "Creates a marketing event for a given marketing ID.",
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "restaurantId",
            "in": "path",
            "required": true,
            "type": "integer",
            "format": "int32"
          },
          {
            "name": "marketingId",
            "in": "path",
            "required": true,
            "type": "string"
          },
          {
            "name": "body",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/MarketingEvent"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Marketing event created successfully."
          },
          "404": {
            "description": "Marketing event not found.",
            "schema": {
              "$ref": "#/definitions/Error"
            }
          }
        }
      }
    },
    "/restaurants/{accountId}/services": {
      "get": {
        "summary": "Gets active services for a locale.",
        "description": "Returns active services filtered by locale.",
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "accountId",
            "in": "path",
            "required": true,
            "type": "integer",
            "format": "int32"
          },
          {
            "name": "locale",
            "in": "query",
            "required": true,
            "type": "string",
            "description": "The locale for which to filter services."
          }
        ],
        "responses": {
          "200": {
            "description": "Status 200",
            "schema": {
              "type": "array",
              "items": {
                "$ref": "#/definitions/Service"
              }
            }
          }
        }
      }
    },
    "/restaurants/{restaurantId}/payment-intents/": {
      "post": {
        "summary": "Creates a payment intent for a reservation or gift card.",
        "description": "Creates a payment intent for either a reservation or gift card payment. Requires either reservationCode or giftCard in the request body, but not both.",
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "request",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/CreatePaymentIntentRequest"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "Payment intent created successfully.",
            "schema": {
              "$ref": "#/definitions/PaymentIntentResponse"
            }
          },
          "400": {
            "description": "Bad request - validation failed.",
            "schema": {
              "$ref": "#/definitions/Error"
            }
          },
          "404": {
            "description": "Reservation or gift card not found.",
            "schema": {
              "$ref": "#/definitions/Error"
            }
          }
        }
      },
      "parameters": [
        {
          "name": "restaurantId",
          "in": "path",
          "required": true,
          "type": "integer",
          "format": "int32"
        }
      ]
    },
    "/restaurants/{restaurantId}/payment-methods/": {
      "get": {
        "summary": "Gets all available payment methods.",
        "description": "Retrieves all available payment methods from the payment provider (Mollie).",
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "serviceId",
            "in": "query",
            "required": false,
            "type": "integer",
            "format": "int32",
            "description": "Optional ID of the service. If the service requires a guarantee, only 'creditcard' is returned."
          },
          {
            "name": "partySize",
            "in": "query",
            "required": false,
            "type": "integer",
            "format": "int32",
            "minimum": 1,
            "description": "Optional party size. If provided, it must be greater than zero. Used to calculate the amount filter for per-person services; when omitted, the filter uses the price for one person."
          }
        ],
        "responses": {
          "200": {
            "description": "List of available payment methods.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "description": "Payment method identifier"
              }
            }
          },
          "404": {
            "description": "Payment methods not found.",
            "schema": {
              "$ref": "#/definitions/Error"
            }
          }
        }
      },
      "parameters": [
        {
          "name": "restaurantId",
          "in": "path",
          "required": true,
          "type": "integer",
          "format": "int32"
        }
      ]
    }
  },
  "/restaurants/{accountId}/gift-card-products/{giftCardProductId}/issue/{giftCardProductPriceId}": {
    "post": {
      "tags": [
        "GiftCardProducts"
      ],
      "summary": "Issues a new gift card.",
      "parameters": [
        {
          "name": "accountId",
          "in": "path",
          "required": true,
          "type": "integer",
          "format": "int32"
        },
        {
          "name": "giftCardProductId",
          "in": "path",
          "required": true,
          "type": "integer",
          "format": "int32"
        },
        {
          "name": "giftCardProductPriceId",
          "in": "path",
          "required": true,
          "type": "integer",
          "format": "int32"
        },
        {
          "name": "body",
          "in": "body",
          "required": true,
          "schema": {
            "$ref": "#/definitions/IssueGiftCardRequest"
          }
        }
      ],
      "responses": {
        "201": {
          "description": "Gift card issued.",
          "schema": {
            "$ref": "#/definitions/GiftCard"
          }
        },
        "400": {
          "description": "Bad request.",
          "schema": {
            "$ref": "#/definitions/Error"
          }
        }
      }
    }
  },
  "securityDefinitions": {
    "Custom": {
      "type": "apiKey",
      "name": "Authorization",
      "in": "header"
    }
  },
  "definitions": {
    "Reservation": {
      "type": "object",
      "required": [
        "contact",
        "localDate",
        "localTime",
        "partySize"
      ],
      "properties": {
        "restaurantId": {
          "type": "integer",
          "description": "The restaurant id"
        },
        "sectionId": {
          "type": "integer",
          "format": "int32",
          "description": "The section of the restaurant."
        },
        "serviceId": {
          "type": "integer",
          "format": "int32",
          "description": "The id of the service."
        },
        "reservationCode": {
          "type": "string",
          "description": "The reservation code"
        },
        "localDate": {
          "type": "string",
          "description": "Date in the timezone of the restaurant. Format is yyyy-MM-dd."
        },
        "localTime": {
          "type": "string",
          "description": "Time in the timezone of the restaurant. Format is hh-mm."
        },
        "localEndTime": {
          "type": "string",
          "description": "The end time in the timezone of the restaurant. Format is hh-mm."
        },
        "partySize": {
          "type": "integer",
          "format": "int32"
        },
        "notes": {
          "type": "string"
        },
        "status": {
          "type": "string",
          "description": "The status of the reservation."
        },
        "referral": {
          "type": "string",
          "description": "The referral of the reservation (for instance facebook)."
        },
        "referralToken": {
          "type": "string",
          "description": "The referral tracking token of the reservation."
        },
        "idempotencyToken": {
          "type": "string",
          "description": "An optional client-generated token to ensure idempotency. If a reservation with the same token, restaurant and start datetime already exists, the existing reservation is returned instead of creating a new one."
        },
        "paymentClientSecret": {
          "type": "string",
          "description": "The stripe client secret."
        },
        "contact": {
          "$ref": "#/definitions/Contact"
        },
        "creditCard": {
          "$ref": "#/definitions/CreditCard"
        },
        "payment": {
          "$ref": "#/definitions/Payment"
        },
        "guarantee": {
          "$ref": "#/definitions/ReservationGuarantee"
        },
        "isWaitlist": {
          "type": "boolean",
          "description": "True, if the reservation is a waitlist reservation."
        },
        "localDateExpiration": {
          "type": "string",
          "description": "Date in the timezone of the restaurant when the reservation expires. Format is yyyy-MM-dd."
        },
        "localTimeExpiration": {
          "type": "string",
          "description": "Time in the timezone of the restaurant when the reservation expires. Format is hh-mm."
        },
        "links": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/Link"
          }
        },
        "guestNotes": {
          "type": "array",
          "description": "Notes associated with this guest across past and current reservations.",
          "items": {
            "$ref": "#/definitions/ReservationGuestNote"
          }
        }
      }
    },
    "ReservationGuarantee": {
      "type": "object",
      "properties": {
        "status": {
          "type": "string",
          "enum": ["PENDING", "ACTIVE", "RELEASED", "CHARGED", "REFUNDED", "CANCELLED", "UNKNOWN"],
          "description": "The status of the guarantee hold. PENDING: waiting for card details, ACTIVE: hold confirmed, RELEASED: hold released (guest showed up), CHARGED: no-show captured, REFUNDED: no-show fee refunded, CANCELLED: reservation cancelled, UNKNOWN: unrecognized value read from the database."
        },
        "amount": {
          "type": "integer",
          "format": "int64",
          "description": "The amount held on the guest's credit card, in cents."
        },
        "currency": {
          "$ref": "#/definitions/Currency"
        }
      }
    },
    "ReservationUpdate": {
      "type": "object",
      "properties": {
        "localDate": {
          "type": "string",
          "description": "Date in the timezone of the restaurant. Format is yyyy-MM-dd."
        },
        "localTime": {
          "type": "string",
          "description": "Time in the timezone of the restaurant. Format is hh-mm."
        },
        "partySize": {
          "type": "integer",
          "format": "int32"
        },
        "localEndTime": {
          "type": "string",
          "description": "The end time in the timezone of the restaurant. Format is hh-mm."
        },
        "sectionId": {
          "type": "integer",
          "format": "int32",
          "description": "The section of the restaurant."
        },
        "notes": {
          "type": "string"
        },
        "isWaitlist": {
          "type": "boolean",
          "description": "True, if the reservation is a waitlist reservation."
        },
        "contact": {
          "$ref": "#/definitions/ContactUpdate"
        },
        "isNonConfirmed": {
          "type": "boolean",
          "description": "True, if the reservation is non-confirmed."
        },
        "guestNotes": {
          "type": "array",
          "description": "New notes to append to this reservation. Existing notes are not affected. At most one entry per type is allowed.",
          "items": {
            "$ref": "#/definitions/ReservationGuestNoteInput"
          }
        }
      }
    },
    "Contact": {
      "type": "object",
      "required": [
        "email",
        "fullName",
        "language",
        "phone"
      ],
      "properties": {
        "title": {
          "type": "string"
        },
        "fullName": {
          "type": "string"
        },
        "company": {
          "type": "string"
        },
        "language": {
          "type": "string"
        },
        "phone": {
          "type": "string"
        },
        "email": {
          "type": "string"
        },
        "address": {
          "type": "string"
        },
        "postalCode": {
          "type": "string"
        },
        "city": {
          "type": "string"
        },
        "state": {
          "type": "string"
        },
        "country": {
          "type": "string"
        },
        "birthdate": {
          "type": "string"
        },
        "newsletterSubscription": {
          "type": "boolean"
        },
        "externalId": {
          "type": "string"
        }
      }
    },
    "ContactUpdate": {
      "type": "object",
      "properties": {
        "fullName": {
          "type": "string"
        },
        "phone": {
          "type": "string"
        },
        "email": {
          "type": "string"
        }
      }
    },
    "Restaurant": {
      "type": "object",
      "required": [
        "id",
        "name",
        "settings"
      ],
      "properties": {
        "id": {
          "type": "integer",
          "format": "int32"
        },
        "name": {
          "type": "string"
        },
        "phone": {
          "type": "string"
        },
        "email": {
          "type": "string"
        },
        "address": {
          "type": "string"
        },
        "postalcode": {
          "type": "string"
        },
        "city": {
          "type": "string"
        },
        "state": {
          "type": "string"
        },
        "country": {
          "type": "string"
        },
        "website": {
          "type": "string"
        },
        "facebook": {
          "type": "string"
        },
        "timeZone": {
          "type": "string"
        },
        "countryCode": {
          "type": "string"
        },
        "locale": {
          "type": "string",
          "description": "The locale, for instance nl-be, see https://github.com/moment/moment/tree/develop/locale"
        },
        "minPartySize": {
          "type": "integer",
          "format": "int32",
          "description": "The minimum party size allowed for reservations at this restaurant."
        },
        "maxPartySize": {
          "type": "integer",
          "format": "int32",
          "description": "The maximum party size allowed for reservations at this restaurant."
        },
        "color": {
          "type": "string"
        },
        "stripePublicKey": {
          "type": "string",
          "description": "The stripe public key."
        },
        "links": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/Link"
          }
        },
        "sections": {
          "type": "array",
          "description": "The sections for this restaurant.",
          "items": {
            "$ref": "#/definitions/Section"
          }
        },
        "settings": {
          "$ref": "#/definitions/RestaurantSettings"
        }
      }
    },
    "RestaurantSettings": {
      "type": "object",
      "properties": {
        "minMinutesToModify": {
          "type": "integer",
          "format": "int32",
          "description": "The minimum number of minutes before the reservation that the reservation can be modified."
        },
        "minMinutesInAdvance": {
          "type": "integer",
          "format": "int32",
          "description": "The minimum number of minutes in advance a reservation can be created."
        },
        "maxDaysInAdvance": {
          "type": "integer",
          "format": "int32",
          "description": "The maximum number of days in advance a reservation can be created."
        },
        "maxTimeForToday": {
          "type": "string",
          "description": "Cutoff time for creating reservations on the current day (HH:mm)."
        },
        "defaultMinPartySize": {
          "type": "integer",
          "format": "int32",
          "description": "Default minimum party size allowed for reservations."
        },
        "defaultMaxPartySize": {
          "type": "integer",
          "format": "int32",
          "description": "Default maximum party size allowed for reservations."
        },
        "tableAllocation": {
          "type": "boolean",
          "description": "True when automatic table allocation is enabled."
        },
        "markChangedAsRead": {
          "type": "boolean",
          "description": "True when changed reservations should be marked as read automatically."
        },
        "markCancelledAsRead": {
          "type": "boolean",
          "description": "True when cancelled reservations should be marked as read automatically."
        },
        "markAlwaysAsRead": {
          "type": "boolean",
          "description": "True when all reservations are automatically marked as read."
        },
        "enableSuccessivePlanning": {
          "type": "boolean",
          "description": "True when successive planning of reservations is enabled."
        },
        "widgetUseEmailValidation": {
          "type": "boolean"
        },
        "widgetUseReservationNotes": {
          "type": "boolean"
        },
        "widgetUseNewsletterSubscription": {
          "type": "boolean"
        },
        "widgetUseNewsletterSubscriptionOptIn": {
          "type": "boolean"
        },
        "widgetUseRestaurantPhone": {
          "type": "boolean"
        },
        "widgetUseRestaurantEmail": {
          "type": "boolean"
        },
        "widgetUseMaxPartySizeLink": {
          "type": "boolean"
        },
        "widgetUseWidgetSnippets": {
          "type": "boolean"
        },
        "widgetUseServices": {
          "type": "boolean"
        },
        "widgetUseTerms": {
          "type": "boolean"
        },
        "widgetUseTermsUrl": {
          "type": "string"
        },
        "widgetUsePartySizeBreakdown": {
          "type": "boolean"
        },
        "widgetUsePartySizeChildSeatsBreakdown": {
          "type": "boolean"
        },
        "widgetUseHtmlLanguage": {
          "type": "boolean"
        },
        "widgetTranslations": {
          "type": "object",
          "description": "JSON object for widget translation overrides."
        },
        "widgetExtraInfo": {
          "type": "object",
          "description": "JSON object for extra information in the widget."
        },
        "widgetWelcomeMessage": {
          "type": "object",
          "description": "JSON object for a custom welcome message in the widget."
        },
        "widgetServicesFirst": {
          "type": "boolean"
        },
        "widgetShowGiftCardFab": {
          "type": "boolean"
        },
        "widgetOpen": {
          "type": "boolean"
        },
        "widgetShowFab": {
          "type": "boolean"
        },
        "widgetFabLogo": {
          "type": "boolean"
        },
        "widgetFabText": {
          "type": "string"
        },
        "widgetFullPage": {
          "type": "boolean"
        },
        "widgetColor": {
          "type": "string"
        },
        "widgetAdditionalContactData": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "widgetUseFeedbackBreakdown": {
          "type": "boolean"
        },
        "enableWaitlist": {
          "type": "boolean",
          "description": "True, if the restaurant has a waitlist."
        }
      }
    },
    "CalendarDate": {
      "type": "object",
      "required": [
        "isAvailable",
        "isOpen",
        "localDate"
      ],
      "properties": {
        "localDate": {
          "type": "string",
          "description": "Date in the timezone of the restaurant. Format is yyyy-MM-dd."
        },
        "isAvailable": {
          "type": "boolean",
          "description": "True, if there is a timeslot on this date that is available."
        },
        "isOpen": {
          "type": "boolean",
          "description": "True, if the restaurant is open on this day."
        },
        "isAvailableWithWaitlist": {
          "type": "boolean",
          "description": "True, if there is a timeslot on this date that is available with a waitlist."
        },
        "links": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/Link"
          }
        }
      }
    },
    "Timeslot": {
      "type": "object",
      "required": [
        "isAvailable",
        "isOpen",
        "localTime"
      ],
      "properties": {
        "localTime": {
          "type": "string",
          "description": "Time in the timezone of the restaurant. Format is hh-mm."
        },
        "minPartySize": {
          "type": "integer",
          "format": "int32",
          "description": "The minimum partysize for which this timeslot is available."
        },
        "maxPartySize": {
          "type": "integer",
          "format": "int32",
          "description": "The maximum partysize for which this timeslot is available."
        },
        "fixedLocalEndTime": {
          "type": "string",
          "description": "Fixed end time in the timezone of the restaurant. Format is hh-mm."
        },
        "isOpen": {
          "type": "boolean",
          "description": "True, if the restaurant is open."
        },
        "isAvailable": {
          "type": "boolean",
          "description": "True, if the timeslot is available."
        },
        "isAvailableWithWaitlist": {
          "type": "boolean",
          "description": "True, if the timeslot is available with a waitlist."
        },
        "availablePartySizes": {
          "type": "array",
          "items": {
            "type": "integer",
            "format": "int32"
          }
        },
        "unavailablePartySizes": {
          "type": "array",
          "items": {
            "type": "integer",
            "format": "int32"
          }
        }
      }
    },
    "TimeOccupancy": {
      "type": "object",
      "required": [
        "totalGuests",
        "totalReservations",
        "localTime"
      ],
      "properties": {
        "localTime": {
          "type": "string",
          "description": "Time in the timezone of the restaurant. Format is hh-mm."
        },
        "totalReservations": {
          "type": "integer",
          "format": "int32",
          "description": "The total number of reservations for this time slot."
        },
        "totalGuests": {
          "type": "integer",
          "format": "int32",
          "description": "The total number of guests that arrive on this time slot."
        }
      }
    },
    "DayOccupancy": {
      "type": "object",
      "required": [
        "totalGuests",
        "totalReservations",
        "localDate"
      ],
      "properties": {
        "localDate": {
          "type": "string",
          "description": "Date in the timezone of the restaurant. Format is yyyy-MM-dd."
        },
        "totalReservations": {
          "type": "integer",
          "format": "int32",
          "description": "The total number of reservations for this time slot."
        },
        "totalGuests": {
          "type": "integer",
          "format": "int32",
          "description": "The total number of guests that arrive on this time slot."
        },
        "links": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/Link"
          }
        }
      }
    },
    "Link": {
      "type": "object",
      "required": [
        "href",
        "method",
        "rel"
      ],
      "properties": {
        "href": {
          "type": "string"
        },
        "rel": {
          "type": "string"
        },
        "method": {
          "type": "string"
        }
      }
    },
    "Error": {
      "type": "object",
      "required": [
        "code",
        "description"
      ],
      "properties": {
        "code": {
          "type": "integer",
          "format": "int32"
        },
        "description": {
          "type": "string"
        }
      }
    },
    "CreditCard": {
      "type": "object",
      "required": [
        "expirationMonth",
        "expirationYear",
        "number",
        "verificationCode"
      ],
      "properties": {
        "number": {
          "type": "string"
        },
        "expirationMonth": {
          "type": "integer"
        },
        "expirationYear": {
          "type": "integer"
        },
        "verificationCode": {
          "type": "integer"
        }
      },
      "description": "The creditcard information."
    },
    "Section": {
      "type": "object",
      "required": [
        "Name",
        "id"
      ],
      "properties": {
        "id": {
          "type": "integer",
          "description": "The id of the section"
        },
        "Name": {
          "type": "string",
          "description": "The name of the section"
        }
      },
      "description": "A section is a part (for instance a room) of a restaurant with a specific separate availability."
    },
    "Payment": {
      "type": "object",
      "required": [
        "price",
        "status",
        "currency"
      ],
      "properties": {
        "price": {
          "type": "number",
          "description": "The price (in cents), so 99,00 euro is returned as 9900."
        },
        "status": {
          "type": "string",
          "description": "The status of the payment."
        },
        "currency": {
          "$ref": "#/definitions/Currency"
        }
      }
    },
    "Currency": {
      "type": "object",
      "required": [
        "code",
        "hasDecimals"
      ],
      "properties": {
        "code": {
          "type": "string",
          "description": "The currency code."
        },
        "hasDecimals": {
          "type": "boolean",
          "description": "True, if the currency has decimals."
        }
      }
    },
    "ReservationsExportResponse": {
      "type": "object",
      "required": [
        "reservations",
        "links"
      ],
      "properties": {
        "reservations": {
          "type": "array",
          "description": "The exported reservations.",
          "items": {
            "$ref": "#/definitions/ReservationExport"
          }
        },
        "links": {
          "description": "Use the next link as a cursor to page through the result set.",
          "type": "array",
          "items": {
            "$ref": "#/definitions/Link"
          }
        }
      }
    },
    "ReservationExport": {
      "type": "object",
      "required": [
        "contact",
        "localDate",
        "localTime",
        "partySize"
      ],
      "properties": {
        "restaurantId": {
          "type": "integer",
          "description": "The restaurant id."
        },
        "reservationCode": {
          "type": "string",
          "description": "The reservation code."
        },
        "localDate": {
          "type": "string",
          "description": "Date in the timezone of the restaurant. Format is yyyy-MM-dd."
        },
        "localTime": {
          "type": "string",
          "description": "Time in the timezone of the restaurant. Format is HH:mm."
        },
        "localEndTime": {
          "type": "string",
          "description": "The end time in the timezone of the restaurant. Format is HH:mm."
        },
        "partySize": {
          "type": "integer",
          "format": "int32"
        },
        "notes": {
          "type": "string"
        },
        "status": {
          "type": "string",
          "description": "The status of the reservation."
        },
        "referral": {
          "type": "string",
          "description": "The referral of the reservation (for instance Facebook)."
        },
        "price": {
          "type": "integer",
          "format": "int64",
          "description": "The price (in cents), so 99,00 euro is returned as 9900."
        },
        "currencyCode": {
          "type": "string",
          "description": "The currency code."
        },
        "serviceCode": {
          "type": "string",
          "description": "The service code linked to this reservation."
        },
        "dateCreated": {
          "type": "string",
          "format": "date-time",
          "description": "The date and time when the reservation was created in UTC. Format is yyyy-MM-ddTHH:mmZ.",
          "example": "2025-12-01T14:23Z"
        },
        "contact": {
          "$ref": "#/definitions/Contact"
        }
      }
    },
    "Feedback": {
      "type": "object",
      "required": [
        "overallRating"
      ],
      "properties": {
        "foodRating": {
          "type": "integer",
          "format": "int32",
          "description": "The rating of the food"
        },
        "serviceRating": {
          "type": "integer",
          "format": "int32",
          "description": "The rating of the service"
        },
        "ambienceRating": {
          "type": "integer",
          "format": "int32",
          "description": "The rating of the ambiance"
        },
        "overallRating": {
          "type": "integer",
          "format": "int32",
          "description": "The overall rating"
        },
        "comments": {
          "type": "string",
          "description": "The comments of the feedback"
        },
        "isPublic": {
          "type": "boolean",
          "description": "True, if the feedback is public"
        }
      },
      "description": "A feedback is a rating for a reservation."
    },
    "MarketingPreferences": {
      "type": "object",
      "properties": {
        "newsletterSubscription": {
          "type": "boolean",
          "description": "True, if the user is subscribed to the newsletter."
        }
      }
    },
    "NewsletterSubscriptionRequest": {
      "type": "object",
      "required": [
        "email",
        "captchaToken"
      ],
      "properties": {
        "email": {
          "type": "string",
          "description": "The email address to subscribe to the newsletter.",
          "format": "email"
        },
        "captchaToken": {
          "type": "string",
          "description": "The Cloudflare Turnstile captcha token."
        },
        "fullName": {
          "type": "string",
          "description": "Optional full name of the contact. Existing value is preserved when omitted."
        },
        "title": {
          "type": "string",
          "description": "Optional salutation or title (e.g. Mr, Mrs). Existing value is preserved when omitted."
        },
        "phone": {
          "type": "string",
          "description": "Optional phone number. Existing value is preserved when omitted."
        },
        "company": {
          "type": "string",
          "description": "Optional company name. Existing value is preserved when omitted."
        },
        "language": {
          "type": "string",
          "description": "Optional preferred language (ISO 639-1, e.g. 'nl', 'en'). Existing value is preserved when omitted."
        },
        "address": {
          "type": "string",
          "description": "Optional street address. Existing value is preserved when omitted."
        },
        "postalCode": {
          "type": "string",
          "description": "Optional postal code. Existing value is preserved when omitted."
        },
        "city": {
          "type": "string",
          "description": "Optional city. Existing value is preserved when omitted."
        },
        "state": {
          "type": "string",
          "description": "Optional state or province. Existing value is preserved when omitted."
        },
        "country": {
          "type": "string",
          "description": "Optional ISO 3166-1 alpha-2 country code (e.g. 'NL', 'BE'). Existing value is preserved when omitted."
        },
        "birthDate": {
          "type": "string",
          "format": "date",
          "description": "Optional date of birth (ISO 8601, e.g. '1990-06-15'). Existing value is preserved when omitted."
        },
        "externalId": {
          "type": "string",
          "description": "Optional external CRM identifier for the contact. Existing value is preserved when omitted."
        }
      }
    },
    "MarketingEvent": {
      "type": "object",
      "properties": {
        "eventType": {
          "type": "string",
          "description": "The type of marketing event."
        },
        "reference": {
          "type": "string",
          "description": "The refence for the event."
        }
      }
    },
    "Service": {
      "type": "object",
      "properties": {
        "id": {
          "type": "integer",
          "format": "int32"
        },
        "title": {
          "type": "string"
        },
        "description": {
          "type": "string"
        },
        "imageUrl": {
          "type": "string"
        },
        "isRequired": {
          "type": "boolean"
        },
        "tags": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "locale": {
          "type": "string"
        },
        "weekDays": {
          "type": "array",
          "items": {
            "type": "integer",
            "format": "int32"
          }
        },
        "localStartDate": {
          "type": "string",
          "format": "date-time"
        },
        "localEndDate": {
          "type": "string",
          "format": "date-time"
        },
        "minPartySize": {
          "type": "integer",
          "format": "int32"
        },
        "maxPartySize": {
          "type": "integer",
          "format": "int32"
        },
        "localStartTime": {
          "type": "string"
        },
        "localEndTime": {
          "type": "string"
        },
        "sections": {
          "type": "array",
          "items": {
            "type": "integer",
            "format": "int32"
          }
        },
        "isDeleted": {
          "type": "boolean"
        },
        "isPromoted": {
          "type": "boolean"
        },
        "order": {
          "type": "integer",
          "format": "int32"
        },
        "code": {
          "type": "string"
        },
        "directLink": {
          "type": "string"
        },
        "duration": {
          "type": "integer",
          "format": "int32"
        },
        "price": {
          "type": "integer",
          "format": "int64"
        },
        "isPricePerPerson": {
          "type": "boolean"
        },
        "currency": {
          "$ref": "#/definitions/Currency"
        },
        "isPaymentRequired": {
          "type": "boolean"
        },
        "isGuaranteeRequired": {
          "type": "boolean",
          "description": "If true, a credit card hold (pre-authorization) is required for this service. The guest must provide card details before the reservation is confirmed."
        },
        "guaranteeAmount": {
          "type": "integer",
          "format": "int64",
          "description": "The amount to hold (pre-authorize) on the guest's credit card, in cents."
        },
        "isGuaranteeAmountPerPerson": {
          "type": "boolean",
          "description": "If true, the guarantee amount is multiplied by the party size to determine the total hold amount."
        },
        "guaranteeHoldLocalCutoffDateTime": {
          "type": "string",
          "description": "The local cutoff datetime (in the restaurant's timezone) before which the hold must be placed, based on guaranteeHoldDays and the service's minimum duration. The widget compares the slot START against this datetime. Format is yyyy-MM-ddTHH:mm:ss (restaurant-local wall time, no timezone offset)."
        },
        "guaranteeDeadlineMinutes": {
          "type": "integer",
          "format": "int32",
          "description": "Number of minutes before the reservation start time that the guarantee deadline expires. If not set, no expiration deadline is applied."
        },
        "minMinutesInAdvance": {
          "type": "integer",
          "format": "int32"
        },
        "minMinutesToModify": {
          "type": "integer",
          "format": "int32"
        },
        "blackouts": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/ServiceBlackout"
          }
        },
        "isDeposit": {
          "type": "boolean"
        },
        "extraInfo": {
          "type": "object",
          "description": "JSON object for extra service-specific information."
        }
      }
    },
    "ServiceBlackout": {
      "type": "object",
      "properties": {
        "startDate": {
          "type": "string",
          "format": "date-time"
        },
        "endDate": {
          "type": "string",
          "format": "date-time"
        }
      }
    },
    "CreatePaymentIntentRequest": {
      "type": "object",
      "properties": {
        "reservationCode": {
          "type": "string",
          "description": "The reservation code for which to create a payment intent. Either this or giftCard must be provided, but not both."
        },
        "giftCard": {
          "type": "string",
          "description": "The gift card reference for which to create a payment intent. Either this or reservationCode must be provided, but not both."
        },
        "redirectUrl": {
          "type": "string",
          "description": "The URL to redirect to after payment completion."
        },
        "paymentMethod": {
          "$ref": "#/definitions/PaymentMethodType",
          "description": "The preferred payment method."
        },
        "cardToken": {
          "type": "string",
          "description": "Card token for credit card payments with Mollie."
        }
      }
    },
    "PaymentIntentResponse": {
      "type": "object",
      "required": [
        "paymentId",
        "status",
        "amount",
        "currency",
        "provider"
      ],
      "properties": {
        "paymentId": {
          "type": "string",
          "description": "The unique payment identifier."
        },
        "clientSecret": {
          "type": "string",
          "description": "Client secret for Stripe payments."
        },
        "checkoutUrl": {
          "type": "string",
          "description": "Checkout URL for Mollie payments."
        },
        "status": {
          "$ref": "#/definitions/PaymentStatus",
          "description": "The current status of the payment."
        },
        "amount": {
          "type": "integer",
          "format": "int64",
          "description": "The payment amount in the smallest currency unit."
        },
        "currency": {
          "$ref": "#/definitions/Currency",
          "description": "The payment currency."
        },
        "provider": {
          "$ref": "#/definitions/PaymentProvider",
          "description": "The payment provider used."
        }
      }
    },
    "PaymentMethodType": {
      "type": "string",
      "enum": [
        "alma",
        "applepay",
        "bacs",
        "bancomatpay",
        "bancontact",
        "banktransfer",
        "belfius",
        "billie",
        "blik",
        "creditcard",
        "directdebit",
        "eps",
        "giftcard",
        "ideal",
        "in3",
        "kbc",
        "klarna",
        "mbway",
        "multibanco",
        "mybank",
        "payconiq",
        "paypal",
        "paysafecard",
        "pointofsale",
        "przelewy24",
        "riverty",
        "satispay",
        "swish",
        "trustly",
        "twint",
        "voucher"
      ],
      "description": "Available payment method types."
    },
    "PaymentProvider": {
      "type": "string",
      "enum": [
        "STRIPE",
        "MOLLIE",
        "STRIPE_CONNECT",
        "NONE"
      ],
      "description": "Available payment providers."
    },
    "PaymentStatus": {
      "type": "string",
      "enum": [
        "PENDING",
        "OK",
        "CANCELLED",
        "REFUNDED",
        "UNKNOWN"
      ],
      "description": "Payment status values."
    },
    "GiftCardProductPrice": {
      "type": "object",
      "properties": {
        "price": {
          "type": "integer",
          "format": "int64"
        },
        "currency": {
          "$ref": "#/definitions/Currency"
        },
        "id": {
          "type": "integer",
          "format": "int32"
        }
      }
    },
    "GiftCardRecipient": {
      "type": "object",
      "properties": {
        "message": {
          "type": "string"
        },
        "email": {
          "type": "string"
        },
        "fullName": {
          "type": "string"
        },
        "deliveryDateTime": {
          "type": "string",
          "format": "date-time"
        }
      }
    },
    "IssueGiftCardRequest": {
      "type": "object",
      "properties": {
        "idempotencyToken": {
          "type": "string"
        },
        "contact": {
          "$ref": "#/definitions/Contact"
        },
        "recipient": {
          "$ref": "#/definitions/GiftCardRecipient"
        },
        "price": {
          "$ref": "#/definitions/GiftCardProductPrice"
        }
      }
    },
    "ReservationGuestNote": {
      "type": "object",
      "description": "A note attached to a reservation for a specific guest note type.",
      "properties": {
        "type": {
          "type": "string",
          "description": "The note type.",
          "enum": [
            "allergy",
            "extra_info",
            "online",
            "widget"
          ]
        },
        "text": {
          "type": "string",
          "description": "The note text."
        },
        "sourceData": {
          "type": "string",
          "description": "Optional raw source data associated with the note."
        },
        "dateCreated": {
          "type": "string",
          "description": "UTC timestamp when the note was created. Format is yyyy-MM-dd'T'HH:mm'Z'.",
          "example": "2026-06-29T09:12Z"
        }
      }
    },
    "ReservationGuestNoteInput": {
      "type": "object",
      "description": "A note to append to a reservation.",
      "required": [
        "type",
        "text"
      ],
      "properties": {
        "type": {
          "type": "string",
          "description": "The note type. At most one entry per type per request.",
          "enum": [
            "allergy",
            "extra_info",
            "online",
            "widget"
          ]
        },
        "text": {
          "type": "string",
          "description": "The note text."
        },
        "sourceData": {
          "type": "string",
          "description": "Optional raw source data associated with the note."
        }
      }
    }
  }
}
