{
"openapi": "3.0.0",
"info": {
"title": "Paytronix Online Ordering Api Docs",
"version": "1.0.26",
"description": "#### **Postman Files**\n* [API Collection](/api/postman/order_and_delivery_api.postman_collection.json)\n* [Production API Environment](/api/postman/production.postman_environment.json)\n* [Staging API Environment](/api/postman/staging.postman_environment.json)"
},
"servers": [
{
"url": "https://test.opendining.net/api/v1"
},
{
"url": "https://od.pxsweb.com/api/v1"
}
],
"security": [
{
"ApiKey": []
}
],
"externalDocs": {
"description": "Authorization and Access Information",
"url": "http://docs.opendining.net/pages/authorization.html"
},
"paths": {
"/tokens/google_pay": {
"get": {
"tags": [
"tokens"
],
"summary": "Generate JWT token for Google Pay",
"operationId": "getGooglePayToken",
"parameters": [
{
"name": "app_id",
"in": "query",
"description": "App ID",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "domain",
"in": "query",
"description": "Current domain",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "JWT token",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"token": {
"type": "string"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/400MissingParameters"
}
}
}
},
"/tokens/spreedly_signature": {
"get": {
"tags": [
"tokens"
],
"summary": "Generate Signature for Spreedly iFrame",
"operationId": "getSpreedlySignature",
"responses": {
"200": {
"description": "Spreedly Signature",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"nonce": {
"type": "string"
},
"timestamp": {
"type": "string"
},
"token": {
"type": "string"
},
"signature": {
"type": "string"
}
}
}
}
}
}
}
}
},
"/account": {
"get": {
"tags": [
"accounts"
],
"summary": "Get current account information for a logged-in user",
"operationId": "getAccountInfo",
"parameters": [
{
"$ref": "#/components/parameters/AccessToken"
},
{
"$ref": "#/components/parameters/Provider"
},
{
"$ref": "#/components/parameters/ProviderEnv"
},
{
"$ref": "#/components/parameters/MerchantId"
},
{
"$ref": "#/components/parameters/PrintedCardNumber"
},
{
"in": "query",
"name": "app_id",
"description": "App ID, only required if you need to get app-specific information such as the assigned employer",
"schema": {
"type": "string"
},
"required": false
}
],
"responses": {
"200": {
"description": "Current User",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/User"
}
}
}
},
"401": {
"$ref": "#/components/responses/401AccessToken"
}
}
},
"post": {
"tags": [
"accounts"
],
"summary": "Creates a new user, either from complete user information or from a reference order via the order_id parameter",
"operationId": "createNewUser",
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"email": {
"type": "string",
"description": "Email address of the user account. Required, if order_id is not provided"
},
"password": {
"type": "string",
"description": "Password for the user account."
},
"client_id": {
"type": "string",
"description": "Your OAuth client ID, as provided by Paytronix"
},
"order_id": {
"type": "string",
"description": "To create user from a reference order"
},
"name": {
"type": "string",
"description": "User full name"
},
"addresses": {
"type": "array",
"description": "Array of [User Address](#model-UserAddress) objects. Example of curl params: `addresses[0][address]=UserAddress&addresses[0][zip]=UserZipCode`
**Do not send via this ui**",
"items": {
"$ref": "#/components/schemas/UserAddress"
}
},
"cards": {
"type": "array",
"description": "Array of [Card](#model-Card) objects.
**Do not send via this ui**",
"items": {
"$ref": "#/components/schemas/Card"
}
},
"phones": {
"type": "array",
"title": "I'm title",
"description": "Array of User Phones. Example of curl params: `phones[]=123123123&phones[]=234234234`
**Do not send via this ui**",
"items": {
"type": "string"
}
},
"app_id": {
"type": "string"
}
},
"required": [
"password",
"client_id"
]
}
}
}
},
"responses": {
"200": {
"description": "User Created",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"successful": {
"type": "boolean"
},
"token": {
"type": "string"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/400MissingParameters"
},
"401": {
"$ref": "#/components/responses/401AccessToken"
}
}
},
"put": {
"tags": [
"accounts"
],
"summary": "Updates user details, such as name, phone numbers",
"operationId": "updateUser",
"description": "Partial updates are allowed, so you only need to submit the fields you intend to modify",
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"access_token": {
"type": "string",
"description": "Access Token"
},
"email": {
"type": "string",
"description": "New Email address of the user account"
},
"name": {
"type": "string",
"description": "New User Name"
},
"addresses": {
"type": "array",
"description": "Array of [User Address](#model-UserAddress) objects. It will overwrite existing addresses. Example of curl params: `addresses[0][address]=UserAddress&addresses[0][zip]=UserZipCode`
**Do not send via this ui**",
"items": {
"$ref": "#/components/schemas/UserAddress"
}
},
"cards": {
"type": "array",
"description": "Array of [Card](#model-Card) objects. It will overwrite existing cards.
**Do not send via this ui**",
"items": {
"$ref": "#/components/schemas/Card"
}
},
"phones": {
"type": "array",
"description": "Array of User Phones. It will overwrite existing numbers. Example of curl params: `phones[]=123123123&phones[]=234234234`
**Do not send via this ui**",
"items": {
"type": "string"
}
}
},
"required": [
"access_token"
]
}
}
}
},
"responses": {
"200": {
"description": "Updated User",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/User"
}
}
}
},
"400": {
"description": "A user already exists with that email address",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"401": {
"$ref": "#/components/responses/401AccessToken"
}
}
},
"delete": {
"tags": [
"accounts"
],
"summary": "Deletes a user",
"operationId": "deleteUser",
"description": "Deletes the user account permanently",
"parameters": [
{
"$ref": "#/components/parameters/AccessToken"
},
{
"$ref": "#/components/parameters/Provider"
},
{
"$ref": "#/components/parameters/ProviderEnv"
},
{
"$ref": "#/components/parameters/MerchantId"
},
{
"$ref": "#/components/parameters/PrintedCardNumber"
}
],
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"successful": {
"type": "boolean"
}
}
}
}
}
},
"401": {
"$ref": "#/components/responses/401AccessToken"
}
}
}
},
"/account/me": {
"get": {
"tags": [
"accounts"
],
"summary": "Get short account information for a logged-in user",
"operationId": "getShortAccountInfo",
"parameters": [
{
"$ref": "#/components/parameters/AccessToken"
},
{
"$ref": "#/components/parameters/Provider"
},
{
"$ref": "#/components/parameters/ProviderEnv"
},
{
"$ref": "#/components/parameters/MerchantId"
},
{
"$ref": "#/components/parameters/PrintedCardNumber"
}
],
"responses": {
"200": {
"description": "Current User Info",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"email": {
"type": "string"
},
"name": {
"type": "string"
}
}
}
}
}
},
"401": {
"$ref": "#/components/responses/401AccessToken"
}
}
}
},
"/account/addresses": {
"post": {
"tags": [
"accounts"
],
"summary": "Add new User Address",
"operationId": "addUserAddress",
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"description": "User address data",
"required": [
"access_token",
"address",
"zip"
],
"properties": {
"access_token": {
"type": "string",
"description": "Access Token"
},
"address": {
"type": "string",
"description": "The street address"
},
"address_line_2": {
"type": "string",
"description": "Additional information for given address, like room number, floor number etc."
},
"zip": {
"type": "string",
"description": "The zip/post code"
},
"country": {
"type": "string",
"description": "The two-letter country code"
},
"special_instructions": {
"type": "string",
"description": "Delivery special instructions for this address"
},
"company": {
"type": "string",
"description": "Company name, if available"
}
}
}
}
}
},
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"successful": {
"type": "boolean"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/400MissingParameters"
},
"401": {
"$ref": "#/components/responses/401AccessToken"
}
}
}
},
"/account/addresses/{address_id}": {
"delete": {
"tags": [
"accounts"
],
"summary": "Remove User Address",
"operationId": "deleteUserAddress",
"parameters": [
{
"name": "address_id",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
},
{
"$ref": "#/components/parameters/AccessToken"
},
{
"$ref": "#/components/parameters/Provider"
},
{
"$ref": "#/components/parameters/ProviderEnv"
},
{
"$ref": "#/components/parameters/MerchantId"
},
{
"$ref": "#/components/parameters/PrintedCardNumber"
}
],
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"successful": {
"type": "boolean"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/400MissingParameters"
},
"401": {
"$ref": "#/components/responses/401AccessToken"
}
}
}
},
"/addresses/validate": {
"post": {
"tags": [
"accounts"
],
"summary": "Validate User Address",
"operationId": "validateUserAddress",
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"description": "User address data",
"required": [
"address"
],
"properties": {
"address": {
"type": "string",
"description": "The User address"
},
"address_line_2": {
"type": "string",
"description": "Additional information for given address, like room number, floor number etc."
},
"zip": {
"type": "string",
"description": "The zip/post code"
},
"restaurant_id": {
"type": "string",
"description": "Restaurant ID, we recommend to send it for restaurants in non US countries to find accurate address."
}
}
}
}
}
},
"responses": {
"200": {
"description": "Validated address",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"located": {
"type": "boolean"
},
"house_number": {
"type": "string"
},
"street": {
"type": "string"
},
"city": {
"type": "string"
},
"state": {
"type": "string"
},
"zip": {
"type": "string"
},
"address": {
"type": "string"
},
"formatted_address": {
"type": "string"
},
"can_deliver": {
"type": "boolean"
},
"delivery_error": {
"type": "string"
},
"latitude": {
"type": "string"
},
"longitude": {
"type": "string"
},
"delivery_type": {
"type": "string"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/400MissingParameters"
}
}
}
},
"/account/cards": {
"post": {
"tags": [
"accounts"
],
"summary": "Add new User Card",
"operationId": "addUserCard",
"parameters": [
{
"$ref": "#/components/parameters/AccessToken"
},
{
"$ref": "#/components/parameters/Provider"
},
{
"$ref": "#/components/parameters/ProviderEnv"
},
{
"$ref": "#/components/parameters/MerchantId"
},
{
"$ref": "#/components/parameters/PrintedCardNumber"
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"description": "User card data",
"required": [
"token_type",
"token",
"type",
"digits",
"month",
"year"
],
"properties": {
"token_type": {
"type": "string",
"enum": [
"spreedly",
"square"
],
"description": "Payment or card tokenization source. Default is 'spreedly' if not set."
},
"type": {
"type": "string",
"enum": [
"visa",
"master",
"american_express",
"discover",
"dankort"
],
"description": "The credit card brand/type (visa, master, american_express, discover, dankort)"
},
"digits": {
"type": "string",
"description": "The last 4 digits of the card"
},
"month": {
"type": "string",
"description": "The expiration month of the card (1-2 digits)"
},
"year": {
"type": "string",
"description": "The expiration year of the card (4 digits)"
},
"token": {
"type": "string",
"description": "The card token value, from payment tokenization source (Spreedly, Square)"
},
"zip": {
"type": "string",
"description": "The user's zip code to send to Spreedly (and on to a payment processor)"
}
}
}
}
}
},
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"successful": {
"type": "boolean"
},
"card": {
"$ref": "#/components/schemas/Card"
}
}
}
}
}
},
"401": {
"$ref": "#/components/responses/401AccessToken"
}
}
}
},
"/account/cards/{token}": {
"put": {
"tags": [
"accounts"
],
"summary": "Update User Card",
"description": "DO NOT SEND CARD NUMBERS HERE. This is primarily used to keep billing address information in sync, when billing addresses are used",
"operationId": "updateUserCard",
"parameters": [
{
"$ref": "#/components/parameters/AccessToken"
},
{
"$ref": "#/components/parameters/Provider"
},
{
"$ref": "#/components/parameters/ProviderEnv"
},
{
"$ref": "#/components/parameters/MerchantId"
},
{
"$ref": "#/components/parameters/PrintedCardNumber"
},
{
"in": "path",
"name": "token",
"description": "Card token",
"schema": {
"type": "string"
},
"required": true
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"description": "User address data",
"required": [
"token",
"type",
"digits",
"month",
"year"
],
"properties": {
"type": {
"type": "string",
"description": "The credit card brand/type (visa, master, american_express, discover, dankort)"
},
"digits": {
"type": "string",
"description": "The last 4 digits of the card"
},
"month": {
"type": "string",
"description": "The expiration month of the card (1-2 digits)"
},
"year": {
"type": "string",
"description": "The expiration year of the card (4 digits)"
},
"token": {
"type": "string",
"description": "The card token value, from payment tokenization source (Spreedly, Square)"
},
"email": {
"type": "string",
"description": "The user's email address to send to Spreedly (and on to a payment processor)"
},
"first_name": {
"type": "string",
"description": "The user's first name to send to Spreedly (and on to a payment processor)"
},
"last_name": {
"type": "string",
"description": "The user's last name to send to Spreedly (and on to a payment processor)"
},
"address1": {
"type": "string",
"description": "The user's street address to send to Spreedly (and on to a payment processor)"
},
"address2": {
"type": "string",
"description": "The user's street address (2nd line) to send to Spreedly (and on to a payment processor)"
},
"city": {
"type": "string",
"description": "The user's city to send to Spreedly (and on to a payment processor)"
},
"state": {
"type": "string",
"description": "The user's state to send to Spreedly (and on to a payment processor)"
},
"zip": {
"type": "string",
"description": "The user's zip code to send to Spreedly (and on to a payment processor)"
},
"country": {
"type": "string",
"description": "The user's country code to send to Spreedly (and on to a payment processor)"
},
"phone_number": {
"type": "string",
"description": "The user's phone number to send to Spreedly (and on to a payment processor)"
}
}
}
}
}
},
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"successful": {
"type": "boolean"
}
}
}
}
}
},
"401": {
"$ref": "#/components/responses/401AccessToken"
}
}
},
"delete": {
"tags": [
"accounts"
],
"summary": "Delete User Card",
"operationId": "deleteUserCard",
"parameters": [
{
"$ref": "#/components/parameters/AccessToken"
},
{
"$ref": "#/components/parameters/Provider"
},
{
"$ref": "#/components/parameters/ProviderEnv"
},
{
"$ref": "#/components/parameters/MerchantId"
},
{
"$ref": "#/components/parameters/PrintedCardNumber"
},
{
"in": "path",
"name": "token",
"description": "Card token",
"schema": {
"type": "string"
},
"required": true
}
],
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"successful": {
"type": "boolean"
}
}
}
}
}
},
"401": {
"$ref": "#/components/responses/401AccessToken"
}
}
}
},
"/account/orders": {
"get": {
"tags": [
"accounts"
],
"summary": "Gets the current user's order history",
"operationId": "getUserOrderHistory",
"parameters": [
{
"$ref": "#/components/parameters/AccessToken"
},
{
"$ref": "#/components/parameters/Provider"
},
{
"$ref": "#/components/parameters/ProviderEnv"
},
{
"$ref": "#/components/parameters/MerchantId"
},
{
"$ref": "#/components/parameters/PrintedCardNumber"
},
{
"in": "query",
"name": "app_id",
"description": "App ID, only required if you need to get app-specific information",
"schema": {
"type": "string"
},
"required": false
},
{
"in": "query",
"name": "hide_orders",
"description": "Specify true to hide orders that have been 'hidden' by the customer.
Usually used for in-app order history displays, not for reports/analytics",
"schema": {
"type": "boolean"
},
"required": false
},
{
"in": "query",
"name": "limit",
"description": "The maximum number of orders to be returned, default is all orders",
"schema": {
"type": "integer"
},
"required": false
},
{
"in": "query",
"name": "page",
"description": "If using a limit, you may also specify a page number (starting at 1) to paginate the results",
"schema": {
"type": "integer"
},
"required": false
}
],
"responses": {
"200": {
"description": "[Orders](#model-Order) History",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Order"
}
}
}
}
},
"401": {
"$ref": "#/components/responses/401AccessToken"
}
}
}
},
"/account/orders/{order_id}/hide": {
"post": {
"tags": [
"accounts"
],
"summary": "Marks an order as hidden",
"operationId": "hideUserOrder",
"parameters": [
{
"$ref": "#/components/parameters/OrderIdPath"
},
{
"$ref": "#/components/parameters/AccessToken"
},
{
"$ref": "#/components/parameters/Provider"
},
{
"$ref": "#/components/parameters/ProviderEnv"
},
{
"$ref": "#/components/parameters/MerchantId"
},
{
"$ref": "#/components/parameters/PrintedCardNumber"
}
],
"responses": {
"200": {
"description": "Order Hidden",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"successful": {
"type": "boolean"
}
}
}
}
}
},
"401": {
"$ref": "#/components/responses/401AccessToken"
}
}
}
},
"/account/orders/{order_id}/resend_receipt": {
"post": {
"tags": [
"accounts"
],
"summary": "Resends an order receipt to a given email address",
"operationId": "resendOrderReceipt",
"parameters": [
{
"$ref": "#/components/parameters/OrderIdPath"
},
{
"$ref": "#/components/parameters/AccessToken"
},
{
"$ref": "#/components/parameters/Provider"
},
{
"$ref": "#/components/parameters/ProviderEnv"
},
{
"$ref": "#/components/parameters/MerchantId"
},
{
"$ref": "#/components/parameters/PrintedCardNumber"
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"email"
],
"properties": {
"email": {
"type": "string",
"description": "Email address"
}
}
}
}
}
},
"responses": {
"200": {
"description": "Email was sent",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"successful": {
"type": "boolean"
}
}
}
}
}
},
"400": {
"description": "The email provided was invalid",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"401": {
"$ref": "#/components/responses/401AccessToken"
},
"403": {
"description": "Order access denied",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"404": {
"$ref": "#/components/responses/404Order"
}
}
}
},
"/account/forgot_password": {
"post": {
"tags": [
"accounts"
],
"summary": "Starts the forgot password process by sending the user an email with password reset instructions",
"operationId": "startForgotPassword",
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"email": {
"type": "string",
"description": "Email address for the account to reset"
}
},
"required": [
"email"
]
}
}
}
},
"responses": {
"200": {
"description": "Instructions were sent to email",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"successful": {
"type": "boolean"
}
}
}
}
}
},
"400": {
"description": "The email provided was invalid or not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
}
}
},
"/account/verify_reset_code": {
"post": {
"tags": [
"accounts"
],
"summary": "Verify password reset code",
"operationId": "verifyPasswordReset",
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"code": {
"type": "string",
"description": "Reset code"
}
},
"required": [
"code"
]
}
}
}
},
"responses": {
"200": {
"description": "Verification Status",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"valid": {
"type": "boolean"
}
}
}
}
}
},
"400": {
"description": "Invalid input",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
}
}
},
"/account/confirm_forgot_password": {
"post": {
"tags": [
"accounts"
],
"summary": "Confirm forgot password",
"operationId": "confirmForgotPassword",
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"client_id": {
"type": "string",
"description": "Your OAuth client ID, as provided by Paytronix"
},
"code": {
"type": "string",
"description": "Reset Code"
},
"password": {
"type": "string",
"description": "New Password"
},
"confirm_password": {
"type": "string",
"description": "Confirm New Password"
}
},
"required": [
"client_id",
"code",
"password",
"confirm_password"
]
}
}
}
},
"responses": {
"200": {
"description": "Password was changed",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"successful": {
"type": "boolean"
},
"token": {
"type": "string",
"description": "User Access Token"
}
}
}
}
}
},
"400": {
"description": "The email provided was invalid or not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"403": {
"description": "Invalid OAuth client ID",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
}
}
},
"/account/password": {
"post": {
"tags": [
"accounts"
],
"summary": "Changes a user's password for logging into the system",
"operationId": "changeUserPassword",
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"access_token": {
"type": "string",
"description": "Access token"
},
"old_password": {
"type": "string",
"description": "The user's old/current password"
},
"new_password": {
"type": "string",
"description": "The user's new password"
},
"confirm_password": {
"type": "string",
"description": "The user's new password, retyped for confirmation"
}
},
"required": [
"access_token",
"old_password",
"new_password",
"confirm_password"
]
}
}
}
},
"responses": {
"200": {
"description": "Password was changed",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"successful": {
"type": "boolean"
}
}
}
}
}
},
"400": {
"description": "The old password was invalid",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
}
}
},
"/account/mobile_pay_card": {
"post": {
"tags": [
"accounts"
],
"summary": "Get payment method token based on mobile card (Apple Pay or Google Pay)",
"operationId": "getPayMethodToken",
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"provider": {
"type": "string",
"enum": [
"apple",
"google"
],
"description": "Payment data provider"
},
"payment_data": {
"type": "string",
"description": "JSON encoded payment data from provider"
},
"billing_name": {
"type": "string",
"description": "Cardholder name"
},
"billing_address": {
"type": "string",
"description": "Cardholder address"
},
"billing_city": {
"type": "string",
"description": "Cardholder city"
},
"billing_state": {
"type": "string",
"description": "Cardholder state"
},
"billing_zip": {
"type": "string",
"description": "Cardholder zip"
},
"billing_country": {
"type": "string",
"description": "Cardholder country"
},
"is_test": {
"type": "boolean",
"description": "Send true to use test credit card"
}
},
"required": [
"provider",
"payment_data"
]
}
}
}
},
"responses": {
"200": {
"description": "Payment method info",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"token": {
"type": "string",
"description": "Payment Method Token"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/400MissingParameters"
}
}
}
},
"/account/apple_pay_session/{order_id}": {
"post": {
"tags": [
"accounts"
],
"summary": "Get Apple Pay session",
"operationId": "getApplePaySession",
"parameters": [
{
"$ref": "#/components/parameters/OrderIdPath"
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "Apple Pay validation url"
},
"domain": {
"type": "string",
"description": "Restaurant domain (for custom domains)"
}
},
"required": [
"url"
]
}
}
}
},
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"epochTimestamp": {
"type": "number"
},
"expiresAt": {
"type": "number"
},
"merchantSessionIdentifier": {
"type": "string"
},
"nonce": {
"type": "string"
},
"merchantIdentifier": {
"type": "string"
},
"domainName": {
"type": "string"
},
"displayName": {
"type": "string"
},
"signature": {
"type": "string"
},
"operationalAnalyticsIdentifier": {
"type": "string"
},
"retries": {
"type": "number"
},
"api_request_id": {
"type": "string"
}
}
}
}
}
},
"400": {
"description": "Url parameter was missing",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"404": {
"$ref": "#/components/responses/404Order"
}
}
}
},
"/account/favorite_items/{restaurant_id}": {
"get": {
"tags": [
"accounts"
],
"summary": "Get a list of favorite menuitems/combos",
"operationId": "getFavoriteItems",
"parameters": [
{
"$ref": "#/components/parameters/RestaurantIdPath"
},
{
"$ref": "#/components/parameters/AccessToken"
},
{
"$ref": "#/components/parameters/Provider"
},
{
"$ref": "#/components/parameters/ProviderEnv"
},
{
"$ref": "#/components/parameters/MerchantId"
},
{
"$ref": "#/components/parameters/PrintedCardNumber"
}
],
"responses": {
"200": {
"description": "List of favorite items",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"oneOf": [
{
"$ref": "#/components/schemas/FavoriteMenuitem"
},
{
"$ref": "#/components/schemas/FavoriteCombo"
}
]
}
}
}
}
},
"401": {
"$ref": "#/components/responses/401AccessToken"
},
"403": {
"$ref": "#/components/responses/403AccessDenied"
},
"404": {
"$ref": "#/components/responses/404Restaurant"
}
}
}
},
"/orders": {
"post": {
"tags": [
"orders"
],
"summary": "Create new Order",
"operationId": "createNewOrder",
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"restaurant_id": {
"type": "string",
"description": "The ID of the restaurant to which the order will be submitted. Required unless `merchant_id` and `store_code` are provided"
},
"merchant_id": {
"type": "integer",
"description": "The Paytronix Merchant ID. Can be used with `store_code` to replace `restaurant_id`"
},
"store_code": {
"type": "string",
"description": "The Paytronix Store Code. Can be used with `merchant_id` to replace `restaurant_id`"
},
"provider_env": {
"type": "string",
"enum": [
"production",
"train",
"staging",
"test",
"demo"
]
},
"type": {
"type": "string",
"enum": [
"takeout",
"delivery",
"dinein"
],
"description": "The order type, either takeout, delivery or dine in.
If no type is specified, the default type for the restaurant will be used"
},
"order_date": {
"type": "string",
"description": "For advance orders, the date to use, in `MM/DD/YYYY` format; omit for ASAP orders"
},
"eta": {
"type": "string",
"description": "For advance orders, the time to use, in `H:MM AM` format, like `9:30 PM`"
},
"items": {
"type": "array",
"items": {
"$ref": "#/components/schemas/NewOrderItem"
},
"description": "[Items](#model-NewOrderItem) to add to the order to start with. This can be omitted to create an empty order, and items can be added later.
Options are specified as a map, with option group names as keys, and a string array of selected values.
See [Adding Items to an Order](http://support.opendining.net/article/88-adding-items-to-an-order) for more information.
**Do not send via this ui**"
},
"order_id": {
"type": "string",
"description": "To repeat a past order, specify the prior order ID here (the full ID, not the short_id)"
},
"ua": {
"type": "string",
"description": "The user agent string for the client creating the order"
},
"app": {
"type": "string",
"description": "A free-form text string of the application / channel creating the order, like web vs. mobile vs. Facebook"
},
"source": {
"type": "string",
"description": "A free-form text string describing the 'source' of the order, typically a marketing campaign, offer, or transactional action"
},
"force": {
"type": "boolean",
"description": "Normally, orders are rejected if the restaurant is closed or not accepting orders. Set force to true, and we will create the order anyway. You will still receive an error if you try to submit an invalid order."
},
"email": {
"type": "string",
"description": "If the user is logged in, send their email address when creating the order."
},
"access_token": {
"type": "string",
"description": "If authenticating a user when creating new orders, specify the access token"
},
"discount_amount": {
"type": "number",
"description": "Custom discount amount. Only for LevelUp orders"
},
"address": {
"type": "string",
"description": "The street address"
},
"address_line_2": {
"type": "string",
"description": "Additional information for given address, like room number, floor number etc."
},
"zip": {
"type": "string",
"description": "The zip/post code"
},
"latitude": {
"type": "number",
"description": "Latitude of User's address"
},
"longitude": {
"type": "number",
"description": "Longitude of User's address"
},
"referrer": {
"type": "string",
"description": "Referrer"
},
"pt_id": {
"type": "string",
"description": "Push Token ID"
},
"coupons": {
"type": "array",
"description": "Array of coupons codes. Only one, with the best discount, will be added to order.
**Do not send via this ui**",
"items": {
"type": "string"
}
}
},
"required": [
"restaurant_id",
"type"
]
}
}
}
},
"responses": {
"200": {
"description": "Order Created",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"order_id": {
"type": "string"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/400MissingParameters"
},
"404": {
"$ref": "#/components/responses/404Restaurant"
},
"406": {
"description": "Restaurant is closed or not accepting orders.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
}
}
},
"/orders/{order_id}": {
"get": {
"tags": [
"orders"
],
"summary": "Get Order",
"operationId": "getOrder",
"parameters": [
{
"$ref": "#/components/parameters/OrderIdPath"
},
{
"$ref": "#/components/parameters/LangCode"
}
],
"responses": {
"200": {
"description": "Order",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Order"
}
}
}
},
"403": {
"$ref": "#/components/responses/403AccessDenied"
},
"404": {
"$ref": "#/components/responses/404Order"
}
}
},
"post": {
"tags": [
"orders"
],
"summary": "Updates an order",
"operationId": "updateOrder",
"description": "This call may only be made to unsubmitted orders",
"parameters": [
{
"$ref": "#/components/parameters/OrderIdPath"
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": [
"takeout",
"delivery"
],
"description": "The order type, either takeout or delivery. If no type is specified, the default type for the restaurant will be used"
},
"ordering_for": {
"type": "string",
"enum": [
"now",
"later"
],
"description": "For order for later you must provide order_date and eta"
},
"order_date": {
"type": "string",
"description": "For advance orders, the date to use, in `MM/DD/YYYY` format; omit for ASAP orders"
},
"eta": {
"type": "string",
"description": "For advance orders, the time to use, in `H:MM AM` format, like `9:30 PM`"
},
"coupon": {
"type": "string",
"description": "Coupon ID or code to apply to order"
},
"contactless_delivery": {
"type": "boolean",
"description": "For orders using DoorDash delivery, set this to true if you want to enable contactless delivery"
},
"tip": {
"type": "number",
"description": "A tip amount to pre-populate on the order. Will be included in the order total_amount. On submit, tip must be omitted for this value to apply"
},
"payment_type": {
"type": "string",
"enum": [
"cc",
"pip",
"ap",
"gp",
"gc"
],
"description": "The payment type to set on the order"
},
"return_order": {
"type": "boolean",
"description": "Set to true if you want to receive the updated order"
}
}
}
}
}
},
"responses": {
"200": {
"description": "Order Updated",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"successful": {
"type": "boolean"
},
"order": {
"$ref": "#/components/schemas/Order"
}
}
}
}
}
},
"400": {
"description": "Validation Error.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"404": {
"description": "Order could not be found, or it is already submitted.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
}
}
},
"/orders/{order_id}/items": {
"post": {
"tags": [
"orders"
],
"summary": "Adds an item to an existing order",
"description": "Send [NewOrderItem](#model-NewOrderItem) object in request",
"operationId": "addItemToOrder",
"parameters": [
{
"$ref": "#/components/parameters/OrderIdPath"
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The menuitem ID to add"
},
"quantity": {
"type": "integer",
"description": "The quantity of items ordered (1+)"
},
"options": {
"type": "array",
"description": "The [options](#model-NewOrderOption) selected for this ordered item, only required if the item has required options.
Option *values* in the API can come in 3 ways:
Simple array of strings: `[\"Tomatoes\", \"Onions\"]`
Quantities array: `[\"Tomatoes\":2, \"Onions\":2]`
[Object format](#model-NewOrderOptionValue): `[{\"name\":\"Tomatoes\", \"quantity\": 2},{\"name\":\"Onions\", \"quantity\": 2}]`
**Do not send via this ui**",
"items": {
"$ref": "#/components/schemas/NewOrderOption"
}
},
"option_levels": {
"type": "array",
"description": "If option has [Levels](#model-NewOptionLevels) need to send it.
Option levels allow customers to modify an individual option selection, such as specifying \"double\" for a topping or \"no\" to exclude a given topping.
**Do not send via this ui**",
"items": {
"$ref": "#/components/schemas/NewOptionLevels"
}
},
"size": {
"type": "string",
"description": "The size name of this item; if an item only has one size, this is usually an empty string"
},
"force": {
"type": "boolean",
"description": "Normally, adding items are rejected if disabled or not currently being served. Set force to true to allow adding the item anyway, although submitting the order will fail if the contents are still invalid"
},
"for": {
"type": "string",
"description": "Recipient of the order item"
},
"notes": {
"type": "string",
"description": "Notes/special instructions for the item"
},
"item_source": {
"type": "string",
"description": "For analytics purposes only - indication of how or where the guest discovered the item being added"
},
"combo_id": {
"type": "string",
"description": "Combo Item ID. Combo is an item object with array of [items](#model-NewOrderItem) it's contain"
},
"items": {
"type": "array",
"description": "Array of combo [items](#model-NewOrderItem). Will be ignored without combo_id.
**Do not send via this ui**",
"items": {
"$ref": "#/components/schemas/NewOrderItem"
}
}
}
}
}
}
},
"responses": {
"200": {
"description": "Item Added",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/OrderItem"
}
}
}
},
"400": {
"description": "Validation Error.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"404": {
"description": "Order could not be found, or it is already submitted.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
}
}
},
"/orders/{order_id}/items/{ordered_item_id}": {
"put": {
"tags": [
"orders"
],
"summary": "Update item in order",
"operationId": "updateOrderItem",
"parameters": [
{
"$ref": "#/components/parameters/OrderIdPath"
},
{
"name": "ordered_item_id",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"quantity": {
"type": "integer",
"description": "The quantity of items ordered (1+)"
},
"options": {
"type": "array",
"description": "The [options](#model-NewOrderOption) selected for this ordered item, only required if the item has required options.
Option *values* in the API can come in 3 ways:
Simple array of strings: `[\"Tomatoes\", \"Onions\"]`
Quantities array: `[\"Tomatoes\":2, \"Onions\":2]`
[Object format](#model-NewOrderOptionValue): `[{\"name\":\"Tomatoes\", \"quantity\": 2},{\"name\":\"Onions\", \"quantity\": 2}]`
**Do not send via this ui**",
"items": {
"$ref": "#/components/schemas/NewOrderOption"
}
},
"option_levels": {
"type": "array",
"description": "If option has [Levels](#model-NewOptionLevels) need to send it.
Option levels allow customers to modify an individual option selection, such as specifying \"double\" for a topping or \"no\" to exclude a given topping.
**Do not send via this ui**",
"items": {
"$ref": "#/components/schemas/NewOptionLevels"
}
},
"size": {
"type": "string",
"description": "The size name of this item; if an item only has one size, this is usually an empty string"
},
"force": {
"type": "boolean",
"description": "Normally, adding items are rejected if disabled or not currently being served. Set force to true to allow adding the item anyway, although submitting the order will fail if the contents are still invalid"
},
"for": {
"type": "string",
"description": "Recipient of the order item"
},
"notes": {
"type": "string",
"description": "Notes/special instructions for the item"
},
"combo_id": {
"type": "string",
"description": "Combo Item ID. If item belongs to combo"
},
"slot_index": {
"type": "integer",
"description": "Slot Index in combo"
}
}
}
}
}
},
"responses": {
"200": {
"description": "Item Updated",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/OrderItem"
}
}
}
},
"400": {
"description": "Validation Error.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"404": {
"description": "Order could not be found, or it is already submitted.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
}
},
"patch": {
"tags": [
"orders"
],
"summary": "Patch line item in order",
"operationId": "updateOrderLineItem",
"parameters": [
{
"$ref": "#/components/parameters/OrderIdPath"
},
{
"name": "ordered_item_id",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"quantity": {
"type": "integer",
"minimum": 1,
"description": "The new quantity for the line item. Must be > 0."
}
}
}
}
}
},
"responses": {
"200": {
"description": "Item Updated",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/OrderItem"
}
}
}
},
"400": {
"description": "Validation Error.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"404": {
"description": "Order could not be found, or it is already submitted.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
}
},
"delete": {
"tags": [
"orders"
],
"summary": "Removes items from an order",
"operationId": "deleteOrderItem",
"parameters": [
{
"$ref": "#/components/parameters/OrderIdPath"
},
{
"name": "ordered_item_id",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Item Deleted",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"successful": {
"type": "boolean"
}
}
}
}
}
},
"404": {
"description": "Order could not be found, or it is already submitted.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
}
}
},
"/orders/{order_id}/delete_items": {
"delete": {
"tags": [
"orders"
],
"summary": "Removes all items from an order",
"operationId": "removeAllItemsFromOrder",
"parameters": [
{
"$ref": "#/components/parameters/OrderIdPath"
}
],
"responses": {
"200": {
"description": "Items Deleted",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"successful": {
"type": "boolean"
}
}
}
}
}
},
"400": {
"description": "Validation Error.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"404": {
"description": "Order could not be found, or it is already submitted.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
}
}
},
"/orders/{order_id}/combo/{combo_item_id}": {
"patch": {
"tags": [
"orders"
],
"summary": "Update existing combo in order",
"operationId": "updateComboInOrder",
"parameters": [
{
"$ref": "#/components/parameters/OrderIdPath"
},
{
"in": "path",
"name": "combo_item_id",
"description": "Combo item id, id of combo in combos array.",
"schema": {
"type": "string"
},
"required": false
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"quantity": {
"type": "integer",
"minimum": 1,
"description": "The new quantity for the combo item. Must be > 0."
}
}
}
}
}
},
"responses": {
"200": {
"description": "Quantity for combo has been updated.",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"successful": {
"type": "boolean"
}
}
}
}
}
},
"400": {
"description": "Validation Error.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"404": {
"$ref": "#/components/responses/404Order"
}
}
},
"delete": {
"tags": [
"orders"
],
"summary": "Remove Combo from Order",
"operationId": "removeComboFromOrder",
"parameters": [
{
"$ref": "#/components/parameters/OrderIdPath"
},
{
"in": "path",
"name": "combo_item_id",
"description": "Combo MenuItem ID",
"schema": {
"type": "string"
},
"required": false
}
],
"responses": {
"200": {
"description": "Combo was removed from order",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"successful": {
"type": "boolean"
}
}
}
}
}
},
"404": {
"$ref": "#/components/responses/404Order"
}
}
}
},
"/orders/{order_id}/photos/{ordered_item_id}": {
"post": {
"tags": [
"orders"
],
"summary": "Adds a photo upload to an order item",
"operationId": "addPhotoToOrderItem",
"parameters": [
{
"$ref": "#/components/parameters/OrderIdPath"
},
{
"name": "ordered_item_id",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[a-f\\d]{24}$"
},
"description": "The ID of the order item the photo should be added to"
}
],
"requestBody": {
"content": {
"multipart/form-data": {
"schema": {
"type": "object",
"properties": {
"replace": {
"type": "boolean",
"description": "If true, replace all existing photos with the uploads in this post"
},
"images[]": {
"type": "string",
"format": "binary",
"description": "Photo upload to associate with order item. Must be image/png, image/jpeg or image/gif."
}
}
},
"encoding": {
"images[]": {
"contentType": "image/png, image/jpeg, image/gif"
}
}
}
}
},
"responses": {
"200": {
"description": "Item Photo Added",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/OrderItem"
}
}
}
},
"400": {
"description": "Validation Error.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"404": {
"description": "Order could not be found, or it is already submitted.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
}
}
},
"/orders/{order_id}/photos/{ordered_item_id}/{photo_id}": {
"delete": {
"tags": [
"orders"
],
"summary": "Removes a photo from an order item",
"operationId": "removePhotoFromOrderItem",
"parameters": [
{
"$ref": "#/components/parameters/OrderIdPath"
},
{
"name": "ordered_item_id",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[a-f\\d]{24}$"
},
"description": "The ID of the order item with the photo to remove"
},
{
"name": "photo_id",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[a-f\\d]{24}$"
},
"description": "The ID of the photo to remove"
}
],
"responses": {
"200": {
"description": "Photo Deleted",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Order"
}
}
}
},
"404": {
"description": "Order could not be found, or it is already submitted.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
}
}
},
"/orders/{order_id}/coupons": {
"post": {
"tags": [
"orders"
],
"summary": "Adds a coupon to an order",
"operationId": "addCouponToOrder",
"parameters": [
{
"$ref": "#/components/parameters/OrderIdPath"
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"code": {
"type": "string",
"description": "Coupon Code"
},
"discount_amount": {
"type": "number",
"description": "Custom discount amount, for open discount coupons"
}
},
"required": [
"code"
]
}
}
}
},
"responses": {
"200": {
"description": "Coupon Added",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Order"
}
}
}
},
"400": {
"description": "Validation Error.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"404": {
"description": "Order could not be found, or it is already submitted.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
}
}
},
"/orders/{order_id}/coupons/{coupon_id}": {
"delete": {
"tags": [
"orders"
],
"summary": "Removes a coupon from an order",
"operationId": "removeCouponFromOrder",
"parameters": [
{
"$ref": "#/components/parameters/OrderIdPath"
},
{
"name": "coupon_id",
"in": "path",
"required": true,
"schema": {
"type": "string"
},
"description": "The coupon ID (NOT the code, the ID from the API)"
}
],
"responses": {
"200": {
"description": "Coupon Deleted",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Order"
}
}
}
},
"404": {
"description": "Order could not be found, or it is already submitted.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
}
}
},
"/orders/{order_id}/send": {
"post": {
"tags": [
"orders"
],
"summary": "Send Dine In items to restaurant",
"operationId": "sendDineInItems",
"parameters": [
{
"$ref": "#/components/parameters/OrderIdPath"
}
],
"responses": {
"200": {
"description": "Items were sent",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"successful": {
"type": "boolean"
}
}
}
}
}
},
"400": {
"description": "This order has already been submitted",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"404": {
"$ref": "#/components/responses/404Order"
}
}
}
},
"/orders/{order_id}/submit": {
"post": {
"tags": [
"orders"
],
"summary": "Attempts to submit an order",
"operationId": "submitOrder",
"parameters": [
{
"$ref": "#/components/parameters/OrderIdPath"
},
{
"$ref": "#/components/parameters/AccessToken"
},
{
"$ref": "#/components/parameters/Provider"
},
{
"$ref": "#/components/parameters/ProviderEnv"
},
{
"$ref": "#/components/parameters/MerchantId"
},
{
"$ref": "#/components/parameters/PrintedCardNumber"
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"client_id": {
"type": "string",
"description": "OAuth client ID"
},
"first_name": {
"type": "string",
"description": "The customer's first name"
},
"last_name": {
"type": "string",
"description": "The customer's last name"
},
"order_type": {
"type": "string",
"enum": [
"takeout",
"delivery",
"dinein"
],
"description": "Order Type: takeout, delivery, dinein."
},
"payment_type": {
"type": "string",
"enum": [
"cc",
"pip",
"ap",
"gp",
"gc"
],
"description": "The payment type being used. For Credit Card Payment send the card token in the card.token field and card token type (spreedly) in the card.token_type field
**Allowed values:**
**'cc'** - for Credit card (Credit Card + Gift Card),
**'pip'** - for Pay-in-person,
**'ap'** - for ApplePay,
**'gp'** - for GooglePay,
**'gc'** - for Gift Card."
},
"phone": {
"type": "string",
"description": "The customer's phone number"
},
"email": {
"type": "string",
"description": "The customer's email address"
},
"ordering_for": {
"type": "string",
"enum": [
"now",
"later"
],
"description": "Ordering for now or later. Set later for advance orders"
},
"order_date": {
"type": "string",
"description": "For orders for later, the date to use, in `MM/DD/YYYY` format; omit for ASAP orders"
},
"eta": {
"type": "string",
"description": "For orders for later, the time to use, in `H:MM AM` format, like `9:30 PM`"
},
"access_token": {
"type": "string",
"description": "If authenticating a user, specify the access token"
},
"billing_address": {
"type": "string",
"description": "The billing street address, if required"
},
"billing_city": {
"type": "string",
"description": "The billing city, if required"
},
"billing_state": {
"type": "string",
"description": "The billing state, if required"
},
"billing_zip": {
"type": "string",
"description": "The billing zip, if required"
},
"billing_country": {
"type": "string",
"description": "The billing country, if required"
},
"save_cc": {
"type": "boolean",
"description": "Save Credit Card for future uses"
},
"existing_address": {
"type": "string",
"description": "Existing address ID"
},
"address": {
"type": "string",
"description": "The customer's delivery street address, **required for delivery orders**"
},
"zip": {
"type": "string",
"description": "The customer's delivery zip/post code, **required for delivery orders** (doesn't equal to billing zip)."
},
"address_line_2": {
"type": "string",
"description": "Additional information for given address, like room number, floor number etc."
},
"special_instructions": {
"type": "string",
"description": "Delivery instructions for delivery orders"
},
"company": {
"type": "string",
"description": "The company name, if ordering for a company"
},
"tip": {
"type": "number",
"description": "Tip Amount"
},
"donation": {
"type": "number",
"description": "Donation Amount"
},
"token_type": {
"type": "string",
"enum": [
"spreedly",
"square",
"integration",
"stripe_link"
],
"description": "Payment or card tokenization source. Defaults to 'spreedly' if not set."
},
"existing_card": {
"type": "string",
"description": "Existing Card token"
},
"card": {
"$ref": "#/components/schemas/Card"
},
"browser_info": {
"type": "string",
"description": "Value from Spreedly.ThreeDS.serialize. Need to be sent if restaurant has 3DS enabled."
},
"optin": {
"type": "boolean",
"description": "Opt in to the restaurant's email marketing list?"
},
"curbside": {
"type": "string",
"description": "Whether the customer is using curbside for a pickup/takeout order ('true' or 'false')"
},
"curbside_vehicle_make": {
"type": "string",
"description": "(For Curbside) The customer vehicle's make"
},
"curbside_vehicle_model": {
"type": "string",
"description": "(For Curbside) The customer vehicle's model"
},
"curbside_vehicle_color": {
"type": "string",
"description": "(For Curbside) The customer vehicle's color"
},
"field_{form_name}": {
"type": "string",
"description": "To send [Custom Checkout Fields](#model-CustomCheckoutField), use the 'form_name' property in the key. For checkout fields with the 'select' type, send the index of the selected option, rather than the selected value.
The 'form_name' is typically the field name with all non-alpha/non-digits removed in all lower case.
Example - a custom checkout field with a name of 'Special Instructions' would have a form name of 'specialinstructions' and would be included in the submit data using 'field_specialinstructions'."
},
"three_ds_global_test_scenario": {
"type": "string",
"enum": [
"authenticated",
"not_authenticated",
"challenge"
],
"description": "Only relevant for 3ds test gateways. 'challenge' is the default if not provided. Scenario can be triggered by special tip amounts as well. Tip '3.33' for 'authenticated', '6.66' for 'not_authenticated'."
},
"forter_mobile_uid": {
"type": "string",
"description": "When using [Forter Mobile SDKs](https://docs.forter.com/docs/mobile-sdks-overview), this is the device identifier such as IMEI in android or identifier for vendor in iOS. This should match the deviceId sent via the mobile events API (for mobile transactions only). The 'mobile_os_type' field is also required."
},
"mobile_os_type": {
"type": "string",
"enum": [
"iOS",
"Android",
"Mobile"
],
"description": "When using Forter Mobile SDKs, this field should be included in the submit data long with `forter_mobile_uid'."
},
"forter_token": {
"type": "string",
"description": "When using Forter in a Web view, the value of the Forter cookie should be included in the submit data in this field. The 'ua' field must also be supplied."
},
"ua": {
"type": "string",
"description": "When using Forter in a Web view, this value should contain the User Agent string for the web view."
}
},
"required": [
"client_id",
"first_name",
"last_name",
"phone",
"email",
"payment_type",
"order_type"
]
}
}
}
},
"responses": {
"200": {
"description": "Order Submitted. Order Access Token",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"token": {
"type": "string",
"description": "Order token."
},
"payment_state": {
"type": "string",
"enum": [
"",
"succeeded",
"pending",
"failed"
],
"description": "Payment state if order is paid. Empty if it's not paid."
},
"payment_token": {
"type": "string",
"description": "Payment token for 3DS2 transactions."
}
}
}
}
}
},
"400": {
"description": "Validation Error.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/SubmitError"
}
}
}
},
"404": {
"description": "Order could not be found, or it is already submitted.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
}
}
},
"/orders/{order_id}/stripe_link_payment_intent": {
"post": {
"tags": [
"orders"
],
"summary": "Creates or updates a Stripe Link PaymentIntent for checkout",
"operationId": "createStripeLinkPaymentIntent",
"description": "Creates a card-only Stripe PaymentIntent for PXPay merchants with Stripe Link checkout enabled. Pass payment_intent_id from a previous response to update its amount before confirmation; the intent must belong to this order and remain in requires_payment_method. Confirm the returned client_secret in Stripe.js, then submit the order with payment_type `cc`, token_type `stripe_link`, and card.token set to payment_intent_id.",
"parameters": [
{
"$ref": "#/components/parameters/OrderIdPath"
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"payment_intent_id": {
"type": "string",
"description": "Existing Stripe Link PaymentIntent to update before confirmation. Omit to create a new PaymentIntent.",
"example": "pi_123"
},
"order_type": {
"type": "string",
"enum": [
"takeout",
"delivery",
"dinein"
]
},
"tip": {
"type": "number",
"description": "Tip amount to include in the PaymentIntent when tips are prepaid."
},
"donation": {
"type": "number",
"description": "Donation amount to include in the PaymentIntent."
}
}
}
}
}
},
"responses": {
"200": {
"description": "Stripe Link PaymentIntent created or updated",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"payment_intent_id": {
"type": "string",
"example": "pi_123"
},
"client_secret": {
"type": "string"
},
"publishable_key": {
"type": "string"
},
"amount": {
"type": "number"
},
"currency": {
"type": "string",
"example": "usd"
},
"token_type": {
"type": "string",
"enum": [
"stripe_link"
]
}
}
}
}
}
},
"400": {
"description": "The order cannot use Stripe Link checkout for the submitted amount or Stripe returned an error."
},
"403": {
"description": "Stripe Link checkout is not enabled for this restaurant or payment type."
},
"404": {
"$ref": "#/components/responses/404Order"
}
}
}
},
"/orders/complete_payment": {
"post": {
"tags": [
"orders"
],
"summary": "Complete order payment and submit process after successful 3DS response. This endpoint can also be called after an unsuccessful 3DS response to reset the order to allow resubmission (reset pending state).",
"operationId": "completeOrderPayment",
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"order_id": {
"type": "string",
"description": "Order ID to complete payment."
}
},
"required": []
}
}
}
},
"responses": {
"200": {
"description": "When called after a successful 3DS response, 200 indicates order payment was completed successfully and submit was finished. When called after a failed 3DS response, 200 indicates the order has been reset and may be resubmitted.",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean",
"description": "A true value indicates successful payment completion. This field is not returned when the API is used to reset the order state after 3DS failure."
},
"succeeded": {
"type": "boolean",
"description": "Only returned when resetting order state after 3DS failure. Should always be false."
},
"state": {
"type": "string",
"description": "Only returned when resetting order state after 3DS failure. Should always be 'failed'."
},
"message": {
"type": "string",
"description": "Only returned when resetting order state after 3DS failure. Spreedly message providing additional detail on failure."
}
}
}
}
}
},
"400": {
"description": "Complete Payment Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
}
}
},
"/orders/{order_id}/applicable_rewards": {
"get": {
"tags": [
"orders"
],
"summary": "Get applicable rewards for this order",
"operationId": "getApplicableRewards",
"description": "Note: Auto-redemption rewards will be applied to the order automatically.",
"parameters": [
{
"$ref": "#/components/parameters/OrderIdPath"
},
{
"$ref": "#/components/parameters/AccessToken"
},
{
"$ref": "#/components/parameters/Provider"
},
{
"$ref": "#/components/parameters/ProviderEnv"
},
{
"$ref": "#/components/parameters/MerchantId"
},
{
"$ref": "#/components/parameters/PrintedCardNumber"
},
{
"in": "query",
"name": "show_all",
"description": "When true, toggles behavior to always return all available rewards for the life of the order.",
"schema": {
"type": "boolean"
},
"required": false
}
],
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Rewards"
}
}
},
"description": "Rewards"
},
"403": {
"$ref": "#/components/responses/403AccessDenied"
},
"404": {
"$ref": "#/components/responses/404Order"
}
}
}
},
"/orders/{order_id}/redeem_rewards": {
"post": {
"tags": [
"orders"
],
"summary": "Apply rewards to the order",
"operationId": "redeemReward",
"description": "Send the keys of applicable rewards to apply to the order. Sending an empty array will clear out rewards from the order.
Note: to redeem a variable reward such as \"reward dollars\" with a specific amount, individual parameters of the reward key may be adjusted. For these dollar-based rewards, the key takes the form `---`. The parameters `amount` and `quantity` can be adjusted in tandem to change the reward amount. ",
"parameters": [
{
"$ref": "#/components/parameters/OrderIdPath"
},
{
"$ref": "#/components/parameters/AccessToken"
},
{
"$ref": "#/components/parameters/Provider"
},
{
"$ref": "#/components/parameters/ProviderEnv"
},
{
"$ref": "#/components/parameters/MerchantId"
},
{
"$ref": "#/components/parameters/PrintedCardNumber"
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"selected_rewards": {
"type": "array",
"description": "Reward keys obtained from applicable_rewards endpoint.",
"items": {
"type": "string"
}
},
"reset_point_rewards": {
"type": "boolean",
"description": "If true, remove all point-based rewards from the order"
}
},
"required": []
}
}
}
},
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Rewards"
}
}
},
"description": "List of Rewards that's applied to the order"
},
"403": {
"$ref": "#/components/responses/403AccessDenied"
},
"404": {
"$ref": "#/components/responses/404Order"
}
}
}
},
"/orders/{order_id}/feedback": {
"post": {
"tags": [
"orders"
],
"summary": "Submits feedback for an order",
"operationId": "submitOrderFeedback",
"description": "Here is the list of default feedback fields. It is possible to save custom field value if such field exists in restaurant feedback settings",
"parameters": [
{
"$ref": "#/components/parameters/OrderIdPath"
},
{
"$ref": "#/components/parameters/AccessToken"
},
{
"$ref": "#/components/parameters/Provider"
},
{
"$ref": "#/components/parameters/ProviderEnv"
},
{
"$ref": "#/components/parameters/MerchantId"
},
{
"$ref": "#/components/parameters/PrintedCardNumber"
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"food",
"service",
"value",
"recommend",
"repeat"
],
"properties": {
"food": {
"type": "integer",
"description": "The rating of how good the food was. From 1 to 5"
},
"foodwhy": {
"type": "string",
"description": "Explanation for the food rating. Required, if food rating lower then 3"
},
"service": {
"type": "integer",
"description": "The rating of the service. From 1 to 5"
},
"servicewhy": {
"type": "string",
"description": "Explanation for the service rating. Required, if service rating lower then 3"
},
"value": {
"type": "integer",
"description": "The rating of how good the value was. From 1 to 5"
},
"valuewhy": {
"type": "string",
"description": "Explanation for the value rating. Required, if value rating lower then 3"
},
"recommend": {
"type": "integer",
"description": "The rating of the recommend question. From 1 to 5"
},
"repeat": {
"type": "integer",
"description": "The rating of the repeat question. From 1 to 5"
},
"repeatwhy": {
"type": "string",
"description": "Explanation for the repeat rating. Required, if repeat rating lower then 3"
},
"comments": {
"type": "string",
"description": "General comments"
},
"items": {
"type": "array",
"description": "Item level feedback",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Order item id"
},
"liked": {
"type": "boolean",
"nullable": true,
"description": "True for liked, false for disliked, null for no rating provided"
}
}
}
}
}
}
}
}
},
"responses": {
"200": {
"description": "[Feedback](#model-Feedback) was sent",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"successful": {
"type": "boolean"
}
}
}
}
}
},
"400": {
"description": "Feedback has already been submitted for this order",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"403": {
"description": "Order access denied",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"404": {
"$ref": "#/components/responses/404Order"
}
}
}
},
"/orders/{order_id}/reorder/{prev_order_id}": {
"post": {
"tags": [
"orders"
],
"summary": "Reorder previous order",
"operationId": "reorderPriorOrder",
"parameters": [
{
"$ref": "#/components/parameters/OrderIdPath"
},
{
"in": "path",
"name": "prev_order_id",
"description": "Previous order ID | order sharing key",
"schema": {
"type": "string",
"pattern": "^[a-f\\d]{24}$"
},
"required": true
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"order_date": {
"type": "string",
"description": "For advance orders, the date to use, in `MM/DD/YYYY` format; omit for ASAP orders"
},
"eta": {
"type": "string",
"description": "For advance orders, the time to use, in `H:MM AM` format, like `9:30 PM`"
},
"item": {
"type": "string",
"description": "Specific item ID from previous order to reorder"
},
"item_quantity": {
"type": "integer",
"description": "Used to specify quantity when reordering specific 'item'. Does not work for combo items"
},
"group_token": {
"type": "string",
"description": "Group order token"
},
"scale_to_headcount": {
"type": "integer",
"description": "For catering orders only, auto-scales the contents of the previous order to meet the specified headcount"
}
}
}
}
}
},
"responses": {
"200": {
"description": "Result information",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"successful": {
"type": "boolean"
},
"items_count": {
"type": "integer",
"description": "Count of items, that was added to current order from previous"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/400MissingParameters"
},
"404": {
"$ref": "#/components/responses/404Order"
}
}
}
},
"/orders/{order_id}/checkout": {
"get": {
"tags": [
"orders"
],
"summary": "Marks an order as checkout-viewed",
"operationId": "markOrderCheckoutViewed",
"description": "When a user goes to checkout for a given order, call this API to log the step for reporting/data analysis purposes",
"parameters": [
{
"$ref": "#/components/parameters/OrderIdPath"
}
],
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"successful": {
"type": "boolean"
}
}
}
}
}
},
"404": {
"$ref": "#/components/responses/404Order"
}
}
},
"post": {
"tags": [
"orders"
],
"summary": "Marks an order as checkout-viewed",
"operationId": "markOrderCheckoutViewedPost",
"description": "When a user goes to checkout for a given order, call this API to log the step for reporting/data analysis purposes",
"parameters": [
{
"$ref": "#/components/parameters/OrderIdPath"
}
],
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"successful": {
"type": "boolean"
}
}
}
}
}
},
"404": {
"$ref": "#/components/responses/404Order"
}
}
}
},
"/orders/{order_id}/favorite": {
"post": {
"tags": [
"orders"
],
"summary": "Marks an order (or order item) as favorite",
"operationId": "markOrderAsFavorite",
"parameters": [
{
"$ref": "#/components/parameters/OrderIdPath"
},
{
"$ref": "#/components/parameters/AccessToken"
},
{
"$ref": "#/components/parameters/Provider"
},
{
"$ref": "#/components/parameters/ProviderEnv"
},
{
"$ref": "#/components/parameters/MerchantId"
},
{
"$ref": "#/components/parameters/PrintedCardNumber"
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"favorite"
],
"properties": {
"item_id": {
"type": "string",
"description": "Item ID to mark/unmark order item as favorite"
},
"favorite": {
"type": "boolean",
"description": "true, to mark order as favorite, false - to unmark"
}
}
}
}
}
},
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"successful": {
"type": "boolean"
}
}
}
}
}
},
"403": {
"$ref": "#/components/responses/403AccessDenied"
},
"404": {
"$ref": "#/components/responses/404Order"
}
}
}
},
"/orders/{order_id}/validate": {
"get": {
"tags": [
"orders"
],
"summary": "Checks whether order timing is valid for order.",
"operationId": "validateOrder",
"parameters": [
{
"$ref": "#/components/parameters/OrderIdPath"
}
],
"responses": {
"200": {
"description": "Validate result",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"valid": {
"type": "boolean"
},
"error_type": {
"type": "string",
"description": "Possible values: order_submitted, order_expired if the requested time is in the past, restaurant_not_working if the requested time is not valid for the restaurant"
},
"display_message": {
"type": "string"
}
}
}
}
}
},
"404": {
"$ref": "#/components/responses/404Order"
}
}
}
},
"/orders/{order_id}/delivery_address": {
"post": {
"tags": [
"orders"
],
"summary": "Add delivery address to order and get location object. Update delivery expiration time.",
"operationId": "setOrderDeliveryAddress",
"description": "Need to send existing address or create new one",
"parameters": [
{
"$ref": "#/components/parameters/OrderIdPath"
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"existing_address": {
"type": "string",
"description": "User Address ID"
},
"address": {
"type": "string",
"description": "User Address, **required if no existing address**"
},
"address_line_2": {
"type": "string",
"description": "Additional information for given address, like room number, floor number etc."
},
"zip": {
"type": "string",
"description": "User zip/postal code, **required if no existing address**"
}
}
}
}
}
},
"responses": {
"200": {
"description": "Delivery Info",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Order ID"
},
"location": {
"$ref": "#/components/schemas/UserLocation"
},
"time": {
"type": "integer"
},
"delivery_fee": {
"type": "number"
},
"total_amount": {
"type": "number"
},
"delivery_exp": {
"type": "integer",
"description": "Delivery quote expiration timestamp. Available only for DSP orders."
},
"delivery_exp_display": {
"type": "string",
"description": "Delivery quote formatted expiration date/time. Available only for DSP orders."
},
"delivery_ttl": {
"type": "integer",
"description": "Remaining time-to-live (in seconds) until the delivery quote expiration"
},
"error": {
"type": "string",
"description": "Exists, if there was a problem with this address"
}
}
}
}
}
},
"400": {
"description": "Invalid data",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"404": {
"$ref": "#/components/responses/404Order"
}
}
}
},
"/orders/{order_id}/get_cross_sell": {
"get": {
"tags": [
"orders"
],
"summary": "Get Cross Sell Item for order",
"operationId": "getOrderCrossSellItem",
"parameters": [
{
"$ref": "#/components/parameters/OrderIdPath"
}
],
"responses": {
"200": {
"description": "Additional [Menuitem](#model-MenuItem) that can be offered to customer",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"item_id": {
"type": "string"
}
}
}
}
}
},
"404": {
"$ref": "#/components/responses/404Order"
}
}
}
},
"/orders/{order_id}/recommendation/{recommendation_id}": {
"post": {
"tags": [
"orders"
],
"summary": "Notify that cross-sell from get_cross_sell has been interacted with.",
"operationId": "submitCrossSellResult",
"parameters": [
{
"$ref": "#/components/parameters/OrderIdPath"
},
{
"$ref": "#/components/parameters/RecommendationIdPath"
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"accepted": {
"type": "boolean",
"description": "Whether the cross-sell / recommendation was accepted or declined by the guest"
},
"item_id": {
"type": "string",
"description": "[Menuitem](#model-MenuItem) ID. Include when available to improve future recommendation results."
}
},
"required": [
"accepted"
]
}
}
}
},
"responses": {
"200": {
"description": "Success of receiving this request and updating the order accordingly",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
}
}
}
}
}
},
"404": {
"$ref": "#/components/responses/404Order"
}
}
}
},
"/orders/{order_id}/add_gift_card": {
"post": {
"tags": [
"orders"
],
"summary": "Add Gift Card to order",
"operationId": "addGiftCardToOrder",
"parameters": [
{
"$ref": "#/components/parameters/OrderIdPath"
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"card_number": {
"type": "string"
},
"reg_code": {
"type": "string"
}
}
}
}
}
},
"responses": {
"200": {
"description": "Gift card was added",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"balance": {
"type": "number"
},
"from_gc": {
"type": "number"
},
"from_user": {
"type": "number"
},
"error": {
"type": "string",
"description": "Exists, if there was a problem with gift card"
}
}
}
}
}
},
"404": {
"$ref": "#/components/responses/404Order"
}
}
}
},
"/orders/{order_id}/reset_gift_card": {
"post": {
"tags": [
"orders"
],
"summary": "Reset all gift cards or remove by number",
"operationId": "resetGiftCards",
"parameters": [
{
"$ref": "#/components/parameters/OrderIdPath"
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"card_number": {
"type": "string"
}
}
}
}
}
},
"responses": {
"200": {
"description": "Gift cards have been reset / Gift card has been removed",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"gift_cards": {
"type": "array",
"items": {
"$ref": "#/components/schemas/GiftCard"
}
}
}
}
}
}
},
"404": {
"description": "Order could not be found or it is already submitted",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
}
}
},
"/orders/{order_id}/toggle_auto_gift_card": {
"post": {
"tags": [
"orders"
],
"summary": "Toggle auto gift card",
"operationId": "toggleAutoGiftCard",
"parameters": [
{
"$ref": "#/components/parameters/OrderIdPath"
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"toggle": {
"type": "boolean",
"description": "Add or remove auto gift card"
},
"tip": {
"type": "number",
"description": "Tip amount"
}
},
"required": [
"toggle",
"tip"
]
}
}
}
},
"responses": {
"200": {
"description": "Auto gift card has been added/removed or something went wrong",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"error": {
"type": "string"
},
"gift_cards": {
"type": "array",
"items": {
"$ref": "#/components/schemas/GiftCard"
}
}
}
}
}
}
},
"404": {
"description": "Order could not be found or it is already submitted",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
}
}
},
"/orders/{order_id}/add_gift_card_tip": {
"post": {
"tags": [
"orders"
],
"summary": "Add tip to order with gift card",
"operationId": "addGiftCardTip",
"parameters": [
{
"$ref": "#/components/parameters/OrderIdPath"
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"tip": {
"type": "number",
"description": "Tip amount"
}
},
"required": [
"tip"
]
}
}
}
},
"responses": {
"200": {
"description": "Tip added or something went wrong",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"error": {
"type": "string"
},
"gift_cards": {
"type": "array",
"items": {
"$ref": "#/components/schemas/GiftCard"
}
}
}
}
}
}
},
"404": {
"description": "Order could not be found or it is already submitted",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
}
}
},
"/orders/{order_id}/notification": {
"post": {
"tags": [
"orders"
],
"summary": "Confirm reception of the order notifications (reserved for future use)",
"operationId": "confirmOrderNotificationReceipt",
"parameters": [
{
"$ref": "#/components/parameters/OrderIdPath"
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"notification_ids": {
"type": "array",
"description": "List of notification ids that the user has confirmed",
"items": {
"type": "string"
}
}
},
"required": [
"notification_ids"
]
}
}
}
},
"responses": {
"200": {
"description": "Result information",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"successful": {
"type": "boolean"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/400MissingParameters"
},
"404": {
"$ref": "#/components/responses/404Order"
}
}
},
"get": {
"tags": [
"orders"
],
"summary": "Get a list of notifications about an order (reserved for future use)",
"operationId": "getOrderNotifications",
"parameters": [
{
"$ref": "#/components/parameters/OrderIdPath"
}
],
"responses": {
"200": {
"description": "Order Notifications",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"guest_notifications": {
"type": "array",
"description": "The list of unread notifications",
"items": {
"type": "object",
"properties": {
"notification_id": {
"type": "string",
"description": "The GUID of the notification"
},
"type": {
"type": "string",
"description": "The type of the notification"
},
"message": {
"type": "string",
"description": "The notification message body"
}
}
}
}
}
}
}
}
},
"403": {
"$ref": "#/components/responses/403AccessDenied"
},
"404": {
"$ref": "#/components/responses/404Order"
}
}
}
},
"/orders/{order_id}/check_in": {
"post": {
"tags": [
"orders"
],
"summary": "Performs a check-in for an order",
"operationId": "orderCheckIn",
"parameters": [
{
"$ref": "#/components/parameters/OrderIdPath"
},
{
"$ref": "#/components/parameters/AccessToken"
},
{
"$ref": "#/components/parameters/Provider"
},
{
"$ref": "#/components/parameters/ProviderEnv"
},
{
"$ref": "#/components/parameters/MerchantId"
},
{
"$ref": "#/components/parameters/PrintedCardNumber"
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"message": {
"type": "string",
"description": "A message from the guest for the check-in, if applicable"
},
"application": {
"type": "string",
"description": "The application that is sending the check-in, such as a mobile app or a web-based check-in"
},
"location": {
"type": "string",
"description": "The guest's location, if provided / applicable"
}
},
"required": []
}
}
}
},
"responses": {
"200": {
"description": "Check-in processed successfully",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"check_in": {
"$ref": "#/components/schemas/CheckIn"
}
}
}
}
}
},
"400": {
"description": "Order already checked-in",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"404": {
"$ref": "#/components/responses/404Order"
}
}
}
},
"/orders/{order_sharing_key}/shared_item/{shared_item_id}": {
"get": {
"tags": [
"orders"
],
"summary": "Get shared item info",
"operationId": "getSharedItemInfo",
"parameters": [
{
"name": "order_sharing_key",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "shared_item_id",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "item",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/OrderItem"
}
}
}
},
"404": {
"$ref": "#/components/responses/404Order"
}
}
}
},
"/orders/{order_id}/pos_validation_status": {
"get": {
"tags": [
"orders"
],
"summary": "Order POS validation status",
"operationId": "getOrderPOSValidationStatus",
"parameters": [
{
"$ref": "#/components/parameters/OrderIdPath"
}
],
"responses": {
"200": {
"description": "POS validation status result",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"validated": {
"type": "boolean",
"description": "Indicates if validation process has been completed"
}
}
}
}
}
},
"404": {
"$ref": "#/components/responses/404Order"
}
}
}
},
"/orders/{order_id}/catering_payment": {
"post": {
"tags": [
"orders"
],
"summary": "Complete catering order payment when auto payment is not possible.",
"operationId": "cateringPayment",
"parameters": [
{
"$ref": "#/components/parameters/OrderIdPath"
},
{
"$ref": "#/components/parameters/AccessToken"
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"payment_type": {
"type": "string",
"enum": [
"cc",
"pip",
"ap",
"gp",
"gc"
],
"description": "The payment type being used. For Credit Card Payment send the card token in the card.token field and card token type (spreedly, square) in the card.token_type field
**Allowed values:**
**'cc'** - for Credit card (Credit Card + Gift Card),
**'pip'** - for Pay-in-person,
**'ap'** - for ApplePay,
**'gp'** - for GooglePay,
**'gc'** - for Gift Card."
},
"existing_card": {
"type": "string",
"description": "Existing Card token"
},
"card": {
"$ref": "#/components/schemas/Card"
},
"token_type": {
"type": "string",
"enum": [
"spreedly",
"square"
],
"description": "Payment or card tokenization source. Defaults to 'spreedly' if not set."
},
"billing_address": {
"type": "string",
"description": "Cardholder address"
},
"billing_city": {
"type": "string",
"description": "Cardholder city"
},
"billing_state": {
"type": "string",
"description": "Cardholder state"
},
"billing_zip": {
"type": "string",
"description": "Cardholder zip"
},
"billing_country": {
"type": "string",
"description": "Cardholder country"
},
"forter_token": {
"type": "string",
"description": "When using Forter in a Web view, the value of the Forter cookie should be included in the submit data in this field. The 'ua' field must also be supplied."
},
"ua": {
"type": "string",
"description": "When using Forter in a Web view, this value should contain the User Agent string for the web view."
}
},
"required": [
"payment_type"
]
}
}
}
},
"responses": {
"200": {
"description": "200 indicates catering order payment was completed successfully.",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"successful": {
"type": "boolean",
"description": "A true value indicates successful payment completion."
}
}
}
}
}
},
"400": {
"description": "Catering Payment Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
}
}
},
"/menuitems/{item_id}": {
"get": {
"tags": [
"menuitems"
],
"summary": "Get a menuitem",
"operationId": "getMenuItem",
"parameters": [
{
"in": "path",
"name": "item_id",
"description": "Menuitem ID",
"schema": {
"type": "string"
},
"required": true
},
{
"in": "query",
"name": "include_combo",
"description": "Include combo information for item. False by default",
"schema": {
"type": "boolean"
},
"required": false
},
{
"in": "query",
"name": "include_pos",
"description": "Show POS information for item. False by default",
"schema": {
"type": "boolean"
},
"required": false
},
{
"in": "query",
"name": "fields",
"description": "Limits response to only include the fields in this comma delimited list.",
"schema": {
"type": "string"
},
"required": false
},
{
"in": "query",
"name": "call_center_user",
"description": "ID of the call center requesting the item. If not provided, items marked call_center_only will not be returned",
"schema": {
"type": "boolean"
},
"required": false
},
{
"$ref": "#/components/parameters/LangCode"
}
],
"responses": {
"200": {
"description": "[Menuitem](#model-MenuItem)",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/MenuItem"
}
}
}
},
"404": {
"description": "Menu item not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
}
}
},
"/comboitems/{item_id}": {
"get": {
"tags": [
"menuitems"
],
"summary": "Get all menu items for the slots in a combo item.",
"operationId": "getComboItem",
"parameters": [
{
"in": "path",
"name": "item_id",
"description": "Comboitem ID",
"schema": {
"type": "string"
},
"required": true
},
{
"in": "query",
"name": "include_pos",
"description": "Show POS information for item. False by default",
"schema": {
"type": "boolean"
},
"required": false
},
{
"in": "query",
"name": "fields",
"description": "Limits response to only include the fields in this comma delimited list.",
"schema": {
"type": "string"
},
"required": false
},
{
"$ref": "#/components/parameters/LangCode"
}
],
"responses": {
"200": {
"description": "The unique menu [items](#model-MenuItem) in the combo item slots.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ComboItemList"
}
}
}
},
"404": {
"description": "Combo item not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
}
}
},
"/merchant/{merchant_id}/restaurants/{store_code}": {
"get": {
"tags": [
"merchant"
],
"summary": "Get a restaurant's details",
"operationId": "getMerchantLocationDetails",
"parameters": [
{
"in": "path",
"name": "merchant_id",
"description": "The Paytronix Merchant ID",
"schema": {
"type": "integer"
},
"required": true
},
{
"in": "path",
"name": "store_code",
"description": "The Paytronix Store Code",
"schema": {
"type": "string"
},
"required": true
},
{
"$ref": "#/components/parameters/ProviderEnvMerchant"
}
],
"responses": {
"200": {
"description": "Restaurant",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Restaurant"
}
}
}
},
"400": {
"$ref": "#/components/responses/400MissingParameters"
},
"404": {
"$ref": "#/components/responses/404Restaurant"
}
}
}
},
"/merchant/{merchant_id}/restaurants/{store_code}/menu": {
"get": {
"tags": [
"merchant"
],
"summary": "Get a restaurant's menu",
"operationId": "getMerchantLocationMenu",
"parameters": [
{
"in": "path",
"name": "merchant_id",
"description": "The Paytronix Merchant ID",
"schema": {
"type": "integer"
},
"required": true
},
{
"in": "path",
"name": "store_code",
"description": "The Paytronix Store Code",
"schema": {
"type": "string"
},
"required": true
},
{
"$ref": "#/components/parameters/ProviderEnvMerchant"
},
{
"in": "query",
"name": "show_unavailable",
"description": "Get unavailable items. False by default",
"schema": {
"type": "boolean"
},
"required": false
},
{
"in": "query",
"name": "show_no_first_party",
"description": "Show items that are unavailable for first party ordering. False by default",
"schema": {
"type": "boolean"
},
"required": false
},
{
"in": "query",
"name": "include_combo",
"description": "Get Combo items. False by default",
"schema": {
"type": "boolean"
},
"required": false
},
{
"in": "query",
"name": "ids",
"description": "Comma separated list of menu item ids that response should be limited to.",
"schema": {
"type": "string"
},
"required": false
},
{
"in": "query",
"name": "emids",
"description": "Comma separated list of menu item emids that response should be limited to.",
"schema": {
"type": "string"
},
"required": false
},
{
"$ref": "#/components/parameters/LangCode"
}
],
"responses": {
"200": {
"description": "[Flat Menu](#model-FlatMenu)",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/FlatMenu"
}
}
}
},
"400": {
"$ref": "#/components/responses/400MissingParameters"
},
"404": {
"$ref": "#/components/responses/404Restaurant"
}
}
}
},
"/merchant/{merchant_id}/restaurants/{store_code}/menu/tier": {
"get": {
"tags": [
"merchant"
],
"summary": "Get a restaurant's menu, organized into categories",
"operationId": "getMerchantLocationMenuTiered",
"parameters": [
{
"in": "path",
"name": "merchant_id",
"description": "The Paytronix Merchant ID",
"schema": {
"type": "integer"
},
"required": true
},
{
"in": "path",
"name": "store_code",
"description": "The Paytronix Store Code",
"schema": {
"type": "string"
},
"required": true
},
{
"$ref": "#/components/parameters/ProviderEnvMerchant"
},
{
"in": "query",
"name": "show_unavailable",
"description": "Get unavailable items. False by default",
"schema": {
"type": "boolean"
},
"required": false
},
{
"in": "query",
"name": "show_no_first_party",
"description": "Show items that are unavailable for first party ordering. False by default",
"schema": {
"type": "boolean"
},
"required": false
},
{
"in": "query",
"name": "include_combo",
"description": "Get Combo items. False by default",
"schema": {
"type": "boolean"
},
"required": false
},
{
"$ref": "#/components/parameters/LangCode"
}
],
"responses": {
"200": {
"description": "[Tier Menu](#model-TierMenu)",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/TierMenu"
}
}
}
},
"400": {
"$ref": "#/components/responses/400MissingParameters"
},
"404": {
"$ref": "#/components/responses/404Restaurant"
}
}
}
},
"/merchant/{merchant_id}/restaurants/{store_code}/menu/option_images": {
"get": {
"tags": [
"merchant"
],
"summary": "Get a restaurant's option images",
"operationId": "getMerchantLocationOptionImages",
"parameters": [
{
"in": "path",
"name": "merchant_id",
"description": "The Paytronix Merchant ID",
"schema": {
"type": "integer"
},
"required": true
},
{
"in": "path",
"name": "store_code",
"description": "The Paytronix Store Code",
"schema": {
"type": "string"
},
"required": true
},
{
"$ref": "#/components/parameters/ProviderEnvMerchant"
}
],
"responses": {
"200": {
"description": "[Array of Option Images](#model-OptionImage)",
"content": {
"application/json": {
"schema": {
"type": "object",
"description": "Option Images Response",
"properties": {
"option_images": {
"type": "array",
"description": "Array of Option Images",
"items": {
"$ref": "#/components/schemas/OptionImage"
}
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/400MissingParameters"
},
"404": {
"$ref": "#/components/responses/404Restaurant"
}
}
}
},
"/merchant/{merchant_id}/restaurants/{store_code}/menu/tags": {
"get": {
"tags": [
"merchant"
],
"summary": "Get the list of tags for this restaurant",
"operationId": "getMerchantLocationTags",
"parameters": [
{
"in": "path",
"name": "merchant_id",
"description": "The Paytronix Merchant ID",
"schema": {
"type": "integer"
},
"required": true
},
{
"in": "path",
"name": "store_code",
"description": "The Paytronix Store Code",
"schema": {
"type": "string"
},
"required": true
},
{
"$ref": "#/components/parameters/ProviderEnvMerchant"
}
],
"responses": {
"200": {
"description": "List of tags",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Tag"
}
}
}
}
},
"403": {
"$ref": "#/components/responses/403AccessDenied"
},
"404": {
"$ref": "#/components/responses/404Restaurant"
}
}
}
},
"/pos/ping": {
"get": {
"tags": [
"pos"
],
"summary": "The status ping request is used to notify Paytronix the connectivity status of the Point Of Sale terminals.",
"operationId": "posPing",
"parameters": [
{
"in": "query",
"name": "restaurant_id",
"description": "The restaurant ID",
"schema": {
"type": "string",
"pattern": "^[a-f\\d]{24}$"
},
"required": true
},
{
"$ref": "#/components/parameters/ExternalStoreId"
},
{
"$ref": "#/components/parameters/Secret"
},
{
"$ref": "#/components/parameters/IntegratorKey"
},
{
"in": "query",
"name": "device_id",
"description": "The device ID (UUID) for the device, as generated by the integrator",
"schema": {
"type": "string"
},
"required": true
}
],
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/400MissingParameters"
},
"404": {
"$ref": "#/components/responses/404Restaurant"
}
}
}
},
"/pos/aws_s3_access": {
"get": {
"tags": [
"pos"
],
"summary": "Obtain access to Paytronix Order Delivery AWS S3 bucket for menu update. ",
"operationId": "getMenuS3Access",
"description": "Learn more about how to integrate your application with AWS S3 [visiting here](https://docs.aws.amazon.com/AmazonS3/latest/dev/Welcome.html).",
"parameters": [
{
"in": "query",
"name": "restaurant_id",
"description": "The restaurant ID",
"schema": {
"type": "string",
"pattern": "^[a-f\\d]{24}$"
},
"required": true
},
{
"$ref": "#/components/parameters/ExternalStoreId"
},
{
"$ref": "#/components/parameters/Secret"
},
{
"$ref": "#/components/parameters/IntegratorKey"
}
],
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"aws_key": {
"type": "string"
},
"aws_secret": {
"type": "string"
},
"aws_s3_resource_path": {
"type": "string"
},
"expiration_time_stamp": {
"type": "integer",
"description": "The expiration [unix timestamp](https://en.wikipedia.org/wiki/Unix_time) of the AWS access key. Please make sure to request another access token before the expiration datetime!"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/400MissingParameters"
},
"404": {
"$ref": "#/components/responses/404Restaurant"
}
}
}
},
"/pos/aws_sqs_access": {
"get": {
"tags": [
"pos"
],
"summary": "Obtain access to Paytronix Order Delivery AWS SQS Order bucket for order notification.",
"operationId": "getOrderSqsAccess",
"description": "Learn more about how to integrate your application with AWS SQS queue [visiting here](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/welcome.html).",
"parameters": [
{
"in": "query",
"name": "restaurant_id",
"description": "The restaurant ID",
"schema": {
"type": "string",
"pattern": "^[a-f\\d]{24}$"
},
"required": true
},
{
"$ref": "#/components/parameters/ExternalStoreId"
},
{
"$ref": "#/components/parameters/Secret"
},
{
"$ref": "#/components/parameters/IntegratorKey"
},
{
"in": "query",
"name": "device_uuid",
"description": "The [Universally Unique Identifier](https://en.wikipedia.org/wiki/Universally_unique_identifier#Version_4_(random)) of a POS device. ",
"schema": {
"type": "string"
},
"required": true
},
{
"in": "query",
"name": "version",
"description": "The version of a POS device. ",
"schema": {
"type": "string"
},
"required": true
}
],
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"aws_key": {
"type": "string"
},
"aws_secret": {
"type": "string"
},
"queue_url": {
"type": "string"
},
"expiration_time_stamp": {
"type": "integer",
"description": "The expiration [unix timestamp](https://en.wikipedia.org/wiki/Unix_time) of the AWS access key. Please make sure to request another access token before the expiration datetime!"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/400MissingParameters"
},
"404": {
"$ref": "#/components/responses/404Restaurant"
}
}
}
},
"/pos/post_menu_s3": {
"post": {
"tags": [
"pos"
],
"summary": "Submit a new menu using Paytronix provided AWS S3 storage",
"operationId": "posSubmitMenuS3",
"description": "You can find Paytronix Order Delivery menu schema [here](https://s3.amazonaws.com/pos-uploads.opendining.net/PX_Order_Delivery_POS_Data_Schema.pdf).",
"parameters": [
{
"in": "query",
"name": "restaurant_id",
"description": "The restaurant ID",
"schema": {
"type": "string",
"pattern": "^[a-f\\d]{24}$"
},
"required": true
},
{
"$ref": "#/components/parameters/ExternalStoreId"
},
{
"$ref": "#/components/parameters/Secret"
},
{
"$ref": "#/components/parameters/IntegratorKey"
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"s3_file_name": {
"type": "string",
"description": "The name of the new menu file that has been uploaded to Paytronix provided AWS S3 storage, please DO NOT include the AWS S3 resource path/prefix in file name!"
}
},
"required": [
"s3_file_name"
]
}
}
}
},
"responses": {
"200": {
"description": "New Menu enqueued for processing",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/400MissingParameters"
},
"404": {
"$ref": "#/components/responses/404Restaurant"
}
}
}
},
"/pos/post_menu_remote": {
"post": {
"tags": [
"pos"
],
"summary": "Submit a new menu using partner's self hosted public file storage",
"operationId": "posSubmitMenuRemote",
"description": "You can find Paytronix Order Delivery menu schema [here](https://s3.amazonaws.com/pos-uploads.opendining.net/PX_Order_Delivery_POS_Data_Schema.pdf).",
"parameters": [
{
"in": "query",
"name": "restaurant_id",
"description": "The restaurant ID",
"schema": {
"type": "string",
"pattern": "^[a-f\\d]{24}$"
},
"required": true
},
{
"$ref": "#/components/parameters/ExternalStoreId"
},
{
"$ref": "#/components/parameters/Secret"
},
{
"$ref": "#/components/parameters/IntegratorKey"
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"download_link": {
"type": "string",
"description": "The HTTPS URL pointed to the new menu file hosted by the partner"
}
},
"required": [
"download_link"
]
}
}
}
},
"responses": {
"200": {
"description": "New Menu enqueued for processing",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/400MissingParameters"
},
"404": {
"$ref": "#/components/responses/404Restaurant"
}
}
}
},
"/pos/ops_data": {
"post": {
"tags": [
"pos"
],
"summary": "Submit POS related Operational Data. Only provided fields will be updated; if a field is not provided, it will not be changed on the restaurant.",
"operationId": "posOpsData",
"parameters": [
{
"in": "query",
"name": "restaurant_id",
"description": "The restaurant ID",
"schema": {
"type": "string",
"pattern": "^[a-f\\d]{24}$"
},
"required": true
},
{
"$ref": "#/components/parameters/ExternalStoreId"
},
{
"$ref": "#/components/parameters/Secret"
},
{
"$ref": "#/components/parameters/IntegratorKey"
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"orders": {
"type": "integer",
"description": "Number of open orders in the partner POS systems (Paytronix uses this value to determine the lead time for new orders)"
},
"out_of_stock": {
"type": "array",
"description": "The pos item id that is currently out of stock",
"items": {
"type": "string"
}
},
"location_code": {
"type": "string",
"description": "A location code to be shown on admin pages to help find locations, not shown to customers."
},
"website": {
"type": "string",
"description": "The restaurant's web address (full URL)"
},
"phone": {
"type": "string",
"description": "Restaurant phone number"
},
"tz": {
"type": "string",
"description": "The restaurant's time zone (Olson time zone, like America/New_York)"
},
"address": {
"type": "string",
"description": "The restaurant's street address"
},
"address2": {
"type": "string",
"description": "The restaurant's street address, line 2, if applicable"
},
"city": {
"type": "string",
"description": "The restaurant's city"
},
"state": {
"type": "string",
"description": "The restaurant's state/province"
},
"zip": {
"type": "string",
"description": "The restaurant's zip/postal code"
},
"country": {
"type": "string",
"description": "The restaurant's two-letter country code"
},
"loc": {
"type": "array",
"items": {
"type": "number"
},
"description": "An array of two decimal numbers representing the restaurant’s latitude and longitude."
},
"tax_rate": {
"type": "number",
"description": "The restaurant's sales tax rate, expressed as a decimal (e.g. 0.08 for 8%)"
},
"hours": {
"$ref": "#/components/schemas/Hours"
},
"hour_cutoff": {
"type": "array",
"description": "Minutes before closing to cut off online orders",
"items": {
"type": "integer",
"description": "Seven elements array with keys: m, t, w, th, f, s, su. Hours cut off for each day of week"
}
},
"eh": {
"type": "array",
"items": {
"$ref": "#/components/schemas/ExceptionHours"
},
"description": "A list of any closed periods during the general open hours. [Exception Hours](#model-ExceptionHours)"
},
"delivery_hours": {
"type": "object",
"description": "The delivery hours, if different than the normal business hours.
If specified, then the normal hours become applicable only to takeout orders",
"properties": {
"hours": {
"$ref": "#/components/schemas/Hours"
},
"tz": {
"type": "string",
"description": "Time Zone"
},
"eh": {
"type": "array",
"items": {
"$ref": "#/components/schemas/ExceptionHours"
},
"description": "A list of any closed periods during the delivery open hours. [Exception Hours](#model-ExceptionHours)"
},
"hours_rules": {
"type": "array",
"items": {
"$ref": "#/components/schemas/HoursRule"
}
},
"hour_cutoff": {
"type": "array",
"description": "Minutes before closing to cut off online orders for delivery",
"items": {
"type": "integer",
"description": "Seven elements array with keys: m, t, w, th, f, s, su. Hours cut off for each day of week"
}
}
}
},
"lead": {
"type": "integer",
"description": "The average lead/prep time for an order, like 10 minutes, used for sorting and providing a single time estimate for an order"
},
"delivery_lead": {
"type": "integer",
"description": "The average lead/prep time for a delivery order, like 10 minutes, used for sorting and providing a single time estimate for an order"
},
"use_date": {
"type": "boolean",
"description": "True if the restaurant accepts advance orders; false to disable advance/future ordering"
},
"allow_notes": {
"type": "boolean",
"description": "True if the restaurant allows special instructions for items; false to disable special instructions on individual items"
},
"notes_label": {
"type": "string",
"description": "If allow_notes is true, the label that will be displayed for adding special instructions, such as 'Special Instructions'"
}
},
"required": []
}
}
}
},
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/400MissingParameters"
},
"404": {
"$ref": "#/components/responses/404Restaurant"
}
}
}
},
"/pos/orders/{order_id}/acknowledge": {
"post": {
"tags": [
"pos"
],
"summary": "Acknowledge an order on the POS, providing the order's POS ID / check number, and any errors. At a minimum, this should be called to acknowledge that the order was received by the POS, even if it could not be successfully injected.",
"operationId": "posAcknowledgeOrder",
"parameters": [
{
"$ref": "#/components/parameters/OrderIdPath"
},
{
"$ref": "#/components/parameters/Secret"
},
{
"$ref": "#/components/parameters/IntegratorKey"
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"pos_id": {
"type": "string",
"description": "The POS identifier or check number for the order. This value is displayed to the merchant administrator in our portal and can be used for troubleshooting or reference."
},
"errors": {
"type": "string",
"description": "An array of errors that occurred on the POS.",
"items": {
"type": "string"
}
}
},
"required": []
}
}
}
},
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/400MissingParameters"
},
"404": {
"$ref": "#/components/responses/404Order"
}
}
}
},
"/pos/orders/{order_id}/confirm": {
"post": {
"tags": [
"pos"
],
"summary": "If an integrator uses order confirmation, this API should be used to accept or reject an order. This should typically be done after a store employee manually reviews and accepts or rejects the order.",
"operationId": "posConfirmOrder",
"parameters": [
{
"$ref": "#/components/parameters/OrderIdPath"
},
{
"$ref": "#/components/parameters/Secret"
},
{
"$ref": "#/components/parameters/IntegratorKey"
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"confirmation": {
"type": "string",
"enum": [
"accept",
"reject"
],
"description": "Whether the order should be accepted or rejected."
},
"reason": {
"type": "string",
"description": "If an order is rejected, the rejection reason may be specified here. This is a free-text field that will be communicated to the guest."
}
},
"required": [
"confirmation"
]
}
}
}
},
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/400MissingParameters"
},
"404": {
"$ref": "#/components/responses/404Order"
}
}
}
},
"/pos/orders/{order_id}/events": {
"post": {
"tags": [
"pos"
],
"summary": "Submit order-level events, like prep-started or order-ready.",
"operationId": "posOrderEvent",
"parameters": [
{
"$ref": "#/components/parameters/OrderIdPath"
},
{
"$ref": "#/components/parameters/Secret"
},
{
"$ref": "#/components/parameters/IntegratorKey"
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"event": {
"type": "string",
"enum": [
"pos_prep_started",
"pos_ready",
"pos_closed",
"pos_voided"
],
"description": "The event that occurred at the POS / integrator level."
},
"timestamp": {
"type": "integer",
"description": "UNIX timestamp of when the event occurred. If not supplied, will use the current time."
}
},
"required": [
"event"
]
}
}
}
},
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/400MissingParameters"
},
"404": {
"$ref": "#/components/responses/404Order"
}
}
}
},
"/tokens": {
"post": {
"tags": [
"online ordering tokens"
],
"summary": "Create a new Online Ordering access token. Used for integrations without loyalty.",
"operationId": "createOOAccessToken",
"description": "Access tokens are used to authorize user-specific operations. This operation allows you to exchange the user's credentials for an access token. For integrations that include loyalty, [Paytronix Oauth Services](https://developers.paytronix.com/pxs_api_reference/oauth.html) should be used to obtain a Paytronix Guest Access Token.",
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"email": {
"type": "string",
"description": "Email address of the user account"
},
"password": {
"type": "string",
"description": "Password for the user account"
},
"client_id": {
"type": "string",
"description": "Your OAuth client ID, as provided by Paytronix (just for our Business Partners)"
},
"app_id": {
"type": "string",
"description": "App ID, to find user in certain app"
},
"device_uuid": {
"type": "string",
"description": "Client-generated device UUID. When provided along with app_id, links any existing A/B test assignments from this device to the authenticated user for consistent test assignments across authentication."
}
},
"required": [
"email",
"password",
"client_id"
]
}
}
}
},
"responses": {
"200": {
"description": "Access Token",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/AccessToken"
}
}
}
},
"400": {
"$ref": "#/components/responses/400MissingParameters"
},
"403": {
"$ref": "#/components/responses/403AccessDenied"
}
}
}
},
"/restaurants/{restaurant_id}": {
"get": {
"tags": [
"restaurants"
],
"summary": "Get a restaurant's details",
"operationId": "getRestaurantDetails",
"parameters": [
{
"$ref": "#/components/parameters/RestaurantIdPath"
}
],
"responses": {
"200": {
"description": "Restaurant",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Restaurant"
}
}
}
},
"400": {
"$ref": "#/components/responses/400MissingParameters"
},
"404": {
"$ref": "#/components/responses/404Restaurant"
}
}
}
},
"/restaurants/get_by_slug/{restaurant_slug}": {
"get": {
"tags": [
"restaurants"
],
"summary": "Get a restaurant's details",
"operationId": "getRestaurantDetailsBySlug",
"parameters": [
{
"in": "path",
"name": "restaurant_slug",
"description": "The restaurant slug",
"schema": {
"type": "string"
},
"required": true
}
],
"responses": {
"200": {
"description": "Restaurant",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Restaurant"
}
}
}
},
"404": {
"$ref": "#/components/responses/404Restaurant"
}
}
}
},
"/restaurants/{restaurant_id}/menu": {
"get": {
"tags": [
"restaurants"
],
"summary": "Get a restaurant's menu",
"operationId": "getRestaurantMenu",
"parameters": [
{
"$ref": "#/components/parameters/RestaurantIdPath"
},
{
"in": "query",
"name": "user_id",
"description": "Can supply user ID to factor in reward points",
"schema": {
"type": "string"
},
"required": false
},
{
"in": "query",
"name": "include_reward_points",
"description": "Add redeemable rewards and the rewards points possible to be earned with each menu item, if the user has an account with rewards. False by default",
"schema": {
"type": "boolean"
},
"required": false
},
{
"in": "query",
"name": "show_unavailable",
"description": "Get unavailable items. False by default",
"schema": {
"type": "boolean"
},
"required": false
},
{
"in": "query",
"name": "show_no_first_party",
"description": "Show items that are unavailable for first party ordering. False by default",
"schema": {
"type": "boolean"
},
"required": false
},
{
"in": "query",
"name": "include_combo",
"description": "Get Combo items. False by default",
"schema": {
"type": "boolean"
},
"required": false
},
{
"in": "query",
"name": "include_pos",
"description": "Show POS information for each item. False by default",
"schema": {
"type": "boolean"
},
"required": false
},
{
"in": "query",
"name": "skip_options",
"description": "Exclude options from result",
"schema": {
"type": "boolean"
},
"required": false
},
{
"in": "query",
"name": "exclude_half_toppings",
"description": "Will exclude option groups for half toppings. Only relevant when skip_options is false.",
"schema": {
"type": "boolean"
},
"required": false
},
{
"in": "query",
"name": "wallet_codes",
"description": "Returns a list of wallet details for each wallet code given. Matches menu items to wallets and vice versa.",
"schema": {
"type": "array",
"items": {
"type": "integer"
}
},
"required": false
},
{
"in": "query",
"name": "filter_by_rewards",
"description": "Used with wallet_codes. Filters the menu down to only menu items that are associated with one of the given wallets.",
"schema": {
"type": "boolean"
},
"required": false
},
{
"in": "query",
"name": "ids",
"description": "Comma separated list of menu item ids that response should be limited to.",
"schema": {
"type": "string"
},
"required": false
},
{
"in": "query",
"name": "emids",
"description": "Comma separated list of menu item emids that response should be limited to.",
"schema": {
"type": "string"
},
"required": false
},
{
"$ref": "#/components/parameters/LangCode"
}
],
"responses": {
"200": {
"description": "[Flat Menu](#model-FlatMenu)",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/FlatMenu"
}
}
}
},
"400": {
"$ref": "#/components/responses/400MissingParameters"
},
"404": {
"$ref": "#/components/responses/404Restaurant"
}
}
}
},
"/restaurants/{restaurant_id}/menu/tier": {
"get": {
"tags": [
"restaurants"
],
"summary": "Get a restaurant's menu by categories",
"operationId": "getRestaurantMenuTiered",
"parameters": [
{
"$ref": "#/components/parameters/RestaurantIdPath"
},
{
"in": "query",
"name": "user_id",
"description": "Can supply user ID to factor in reward points",
"schema": {
"type": "string",
"pattern": "^[a-f\\d]{24}$"
},
"required": false
},
{
"in": "query",
"name": "include_reward_points",
"description": "Add redeemable rewards and the rewards points possible to be earned with each menu item, if the user has an account with rewards. False by default",
"schema": {
"type": "boolean"
},
"required": false
},
{
"in": "query",
"name": "order_date",
"description": "Set a date and time to place the order (and see what items are available during that time.) Must be used with 'eta'",
"schema": {
"type": "string"
},
"required": false
},
{
"in": "query",
"name": "eta",
"description": "Set a date and time to place the order (and see what items are available during that time.) Must be used with 'order_date'",
"schema": {
"type": "string"
},
"required": false
},
{
"in": "query",
"name": "show_unavailable",
"description": "Get unavailable items. False by default",
"schema": {
"type": "boolean"
},
"required": false
},
{
"in": "query",
"name": "show_inactive",
"description": "Show inactive menu items in the result. False by default",
"schema": {
"type": "boolean"
},
"required": false
},
{
"in": "query",
"name": "show_no_first_party",
"description": "Show items that are unavailable for first party ordering. False by default",
"schema": {
"type": "boolean"
},
"required": false
},
{
"in": "query",
"name": "include_combo",
"description": "Get Combo items. False by default",
"schema": {
"type": "boolean"
},
"required": false
},
{
"in": "query",
"name": "include_pos",
"description": "Show POS information for each item. False by default",
"schema": {
"type": "boolean"
},
"required": false
},
{
"in": "query",
"name": "dine_in",
"description": "Only shows dine-in menu items. False by default",
"schema": {
"type": "boolean"
},
"required": false
},
{
"in": "query",
"name": "one_click",
"description": "Adds one-click-ordering details for each menu item where it is available. False by default",
"schema": {
"type": "boolean"
},
"required": false
},
{
"in": "query",
"name": "skip_options",
"description": "Exclude options from result. Significantly reduces size of the menu response. Recommended if the menu UI is not using options. False by default",
"schema": {
"type": "boolean"
},
"required": false
},
{
"in": "query",
"name": "exclude_half_toppings",
"description": "Will exclude option groups for half toppings. Only relevant when skip_options is false.",
"schema": {
"type": "boolean"
},
"required": false
},
{
"in": "query",
"name": "wallet_codes",
"description": "Returns a list of wallet details for each wallet code given. Matches menu items to wallets and vice versa.",
"schema": {
"type": "array",
"items": {
"type": "integer"
}
},
"required": false
},
{
"in": "query",
"name": "filter_by_rewards",
"description": "Used with wallet_codes. Filters the menu down to only menu items that are associated with one of the given wallets.",
"schema": {
"type": "boolean"
},
"required": false
},
{
"$ref": "#/components/parameters/LangCode"
}
],
"responses": {
"200": {
"description": "[Tier Menu](#model-TierMenu)",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/TierMenu"
}
}
}
},
"400": {
"$ref": "#/components/responses/400MissingParameters"
},
"404": {
"$ref": "#/components/responses/404Restaurant"
}
}
}
},
"/restaurants/{restaurant_id}/menu/option_images": {
"get": {
"tags": [
"restaurants"
],
"summary": "Get a restaurant's option images",
"operationId": "getRestaurantOptionImages",
"parameters": [
{
"$ref": "#/components/parameters/RestaurantIdPath"
}
],
"responses": {
"200": {
"description": "[Array of Option Images](#model-OptionImage)",
"content": {
"application/json": {
"schema": {
"type": "object",
"description": "Option Images Response",
"properties": {
"option_images": {
"type": "array",
"description": "Array of Option Images",
"items": {
"$ref": "#/components/schemas/OptionImage"
}
}
}
}
}
}
},
"404": {
"$ref": "#/components/responses/404Restaurant"
}
}
}
},
"/restaurants/{restaurant_id}/menu/tags": {
"get": {
"tags": [
"restaurants"
],
"summary": "Get the list of tags for this restaurant",
"operationId": "getRestaurantTags",
"parameters": [
{
"$ref": "#/components/parameters/RestaurantIdPath"
}
],
"responses": {
"200": {
"description": "List of tags",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Tag"
}
}
}
}
},
"403": {
"$ref": "#/components/responses/403AccessDenied"
},
"404": {
"$ref": "#/components/responses/404Restaurant"
}
}
}
},
"/restaurants/cross_sell/{restaurant_id}": {
"get": {
"tags": [
"restaurants"
],
"summary": "Restaurant's Cross-Sell Configuration",
"operationId": "getRestaurantCrossSellConfig",
"parameters": [
{
"$ref": "#/components/parameters/RestaurantIdPath"
}
],
"responses": {
"200": {
"description": "Cross-Sell [config](#model-CrossSell)",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/CrossSell"
}
}
}
},
"400": {
"description": "Restaurant could not be found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
}
}
},
"/restaurants/{restaurant_id}/allowed_order_time": {
"get": {
"tags": [
"restaurants"
],
"summary": "Given a day, get the available times for an order",
"operationId": "getRestaurantAllowedOrderTimes",
"parameters": [
{
"$ref": "#/components/parameters/RestaurantIdPath"
},
{
"in": "query",
"name": "order_id",
"description": "Get available future times for a specified order",
"schema": {
"type": "string",
"pattern": "^[a-f\\d]{24}$"
},
"required": false
},
{
"in": "query",
"name": "type",
"description": "The order type",
"schema": {
"type": "string",
"enum": [
"takeout",
"delivery",
"dinein"
],
"default": "takeout"
},
"required": false
},
{
"in": "query",
"name": "date",
"description": "The day to get times for in y-m-d format, defaults to today",
"schema": {
"type": "string"
},
"required": false
}
],
"responses": {
"200": {
"description": "Allowed order times",
"content": {
"application/json": {
"schema": {
"type": "object",
"description": "Allowed order time",
"properties": {
"times": {
"type": "array",
"description": "Array of allowed order times",
"items": {
"type": "integer",
"description": "Time in minutes from start of day"
}
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/400MissingParameters"
},
"404": {
"description": "The restaurant or order could not be found.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
}
}
},
"/restaurants/{restaurant_id}/allowed_order_time/table": {
"get": {
"tags": [
"restaurants"
],
"summary": "Get the available times for multiple order types and multiple dates",
"operationId": "getRestaurantAllowedOrderTimesTable",
"parameters": [
{
"$ref": "#/components/parameters/RestaurantIdPath"
},
{
"in": "query",
"name": "order_id",
"description": "Get available future times for a specified order",
"schema": {
"type": "string",
"pattern": "^[a-f\\d]{24}$"
},
"required": false
},
{
"in": "query",
"name": "type",
"description": "The order type",
"schema": {
"type": "string",
"enum": [
"all",
"takeout",
"delivery",
"dinein"
],
"default": "takeout"
},
"required": false
},
{
"in": "query",
"name": "date",
"description": "The day to get times for in y-m-d format, defaults to today",
"schema": {
"type": "string"
},
"required": false
},
{
"in": "query",
"name": "advance_days",
"description": "Starting from the selected date, also return this many future days. This value cannot be greater than 30 and will be capped by the restaurant's advanced order limit.",
"schema": {
"type": "integer",
"default": 0
},
"required": false
}
],
"responses": {
"200": {
"description": "Allowed order times table",
"content": {
"application/json": {
"schema": {
"type": "object",
"description": "Table of allowed order times by order type and date",
"properties": {
"times": {
"type": "object",
"description": "Object containing keys for each order type",
"properties": {
"takeout": {
"type": "array",
"description": "Array where the first index is the selected date and the last index is the last advance day",
"items": {
"type": "array",
"description": "Array of allowed order times",
"items": {
"type": "integer",
"description": "Time in minutes from start of day"
}
}
}
}
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/400MissingParameters"
},
"403": {
"$ref": "#/components/responses/403AccessDenied"
},
"404": {
"description": "The restaurant or order could not be found.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
}
}
},
"/restaurants/{restaurant_id}/coupons": {
"get": {
"tags": [
"restaurants"
],
"summary": "Get restaurant's available in-store coupons",
"operationId": "getRestaurantCoupons",
"parameters": [
{
"$ref": "#/components/parameters/RestaurantIdPath"
},
{
"in": "query",
"name": "include_merchant",
"description": "Include merchant level coupons. True by default",
"schema": {
"type": "boolean"
},
"required": false
}
],
"responses": {
"200": {
"description": "List of coupons",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/CouponList"
}
}
}
},
"403": {
"description": "Invalid or missing API credentials",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"404": {
"$ref": "#/components/responses/404Restaurant"
}
}
}
},
"/restaurants/{restaurant_id}/single_use_coupon_codes": {
"post": {
"tags": [
"restaurants"
],
"summary": "Create a single-use coupon code",
"description": "Create a single-use coupon code for feedback surveys. Automatically creates or updates the underlying system coupon.",
"operationId": "createSingleUseCouponCode",
"parameters": [
{
"$ref": "#/components/parameters/RestaurantIdPath"
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"benefit"
],
"properties": {
"benefit": {
"type": "string",
"enum": [
"discount",
"free_delivery",
"free_item"
],
"description": "Type of benefit for the coupon"
},
"code": {
"type": "string",
"minLength": 3,
"maxLength": 32,
"pattern": "^[a-zA-Z0-9_-]+$",
"description": "Optional single-use code. If not provided, will be auto-generated."
},
"discount_amount": {
"type": "number",
"minimum": 0.01,
"description": "Required when benefit is 'discount'. Dollar amount off the order."
},
"free_item_category": {
"type": "string",
"description": "Required when benefit is 'free_item'. Category name for the free item."
}
}
}
}
}
},
"responses": {
"201": {
"description": "Single-use coupon code created successfully",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"code": {
"type": "string",
"description": "The single-use coupon code"
},
"system_coupon_id": {
"type": "string",
"description": "ID of the underlying system coupon"
},
"benefit": {
"type": "string",
"enum": [
"discount",
"free_delivery",
"free_item"
]
},
"discount_amount": {
"type": "number",
"description": "Present when benefit is 'discount'"
},
"free_item_category": {
"type": "string",
"description": "Present when benefit is 'free_item'"
},
"api_request_id": {
"type": "string"
}
}
}
}
}
},
"400": {
"description": "Bad request - invalid input",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"403": {
"description": "Invalid or missing API credentials",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"404": {
"$ref": "#/components/responses/404Restaurant"
},
"409": {
"description": "Conflict - code already exists",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"500": {
"description": "Internal server error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
}
}
},
"/restaurants/{restaurant_id}/suggested_orders": {
"get": {
"tags": [
"restaurants"
],
"summary": "Get a restaurant's suggested orders",
"operationId": "getRestaurantSuggestedOrders",
"parameters": [
{
"$ref": "#/components/parameters/RestaurantIdPath"
},
{
"in": "query",
"name": "required_fed_headcount",
"description": "Required headcount for the order, suggested orders will automatically scale to fit the headcount requirement.",
"schema": {
"type": "integer"
},
"required": false
}
],
"responses": {
"200": {
"description": "List of Suggested Orders",
"content": {
"application/json": {
"schema": {
"type": "object",
"description": "Suggested Orders Response",
"properties": {
"suggested_orders": {
"type": "array",
"description": "Array of Suggested Orders",
"items": {
"$ref": "#/components/schemas/SuggestedOrder"
}
}
}
}
}
}
},
"404": {
"$ref": "#/components/responses/404Restaurant"
}
}
}
},
"/restaurants/{restaurant_id}/toggle_ordering": {
"post": {
"tags": [
"restaurants"
],
"summary": "Toggle a restaurant's ordering state (on/off)",
"description": "Enables or disables online ordering for a restaurant. If online ordering is currently enabled, it will be disabled, and vice versa.",
"operationId": "toggleRestaurantOrdering",
"parameters": [
{
"$ref": "#/components/parameters/RestaurantIdPath"
}
],
"requestBody": {
"description": "Toggle ordering parameters",
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"active": {
"type": "boolean",
"description": "The desired active state of the restaurant's ordering (true to enable, false to disable)"
},
"reactivate_delay": {
"type": "integer",
"description": "Optional delay in seconds before reactivation if toggling to active state"
}
},
"required": [
"active"
]
}
}
}
},
"responses": {
"200": {
"description": "Successful response",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"successful": {
"type": "boolean",
"description": "Whether the operation was successful"
},
"is_active": {
"type": "boolean",
"description": "The new active state of the restaurant's ordering"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/400MissingParameters"
},
"401": {
"$ref": "#/components/responses/401AccessToken"
},
"404": {
"$ref": "#/components/responses/404Restaurant"
}
}
}
},
"/restaurants/{restaurant_id}/toggle_marketplace_ordering": {
"post": {
"tags": [
"restaurants"
],
"summary": "Toggle a restaurant's marketplace ordering state (on/off)",
"description": "Enables or disables marketplace ordering for a restaurant. If marketplace ordering is currently enabled, it will be disabled, and vice versa. Optionally, a specific marketplace provider can be specified to only toggle that provider.",
"operationId": "toggleRestaurantMarketplaceOrdering",
"parameters": [
{
"$ref": "#/components/parameters/RestaurantIdPath"
}
],
"requestBody": {
"description": "Toggle marketplace ordering parameters",
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"active": {
"type": "boolean",
"description": "The desired active state of the restaurant's marketplace ordering (true to enable, false to disable)"
},
"reactivate_delay": {
"type": "integer",
"description": "Optional delay in seconds before reactivation if toggling to active state"
},
"marketplace": {
"type": "string",
"description": "Optional marketplace provider type (e.g., 'doordash', 'ubereats', etc.). If specified, only this provider's state will be toggled."
}
},
"required": [
"active"
]
}
}
}
},
"responses": {
"200": {
"description": "Successful response",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"successful": {
"type": "boolean",
"description": "Whether the operation was successful"
},
"is_active": {
"type": "boolean",
"description": "The new active state of the restaurant's marketplace ordering"
},
"provider": {
"type": "string",
"description": "The marketplace provider that was toggled, if one was specified"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/400MissingParameters"
},
"401": {
"$ref": "#/components/responses/401AccessToken"
},
"404": {
"$ref": "#/components/responses/404Restaurant"
},
"422": {
"description": "Unprocessable Entity - The specified marketplace provider was not found"
}
}
}
},
"/search/restaurants": {
"get": {
"tags": [
"restaurants"
],
"summary": "Search for restaurants by location",
"operationId": "searchLocations",
"parameters": [
{
"in": "query",
"name": "app_id",
"description": "The App ID",
"schema": {
"type": "string"
},
"required": true
},
{
"in": "query",
"name": "name",
"description": "String to search for within location name",
"schema": {
"type": "string"
},
"required": false
},
{
"in": "query",
"name": "for",
"description": "Limit results to locations that support the order type provided - takeout or delivery",
"schema": {
"type": "string",
"enum": [
"takeout",
"delivery"
]
},
"required": false
},
{
"in": "query",
"name": "lat",
"description": "Latitude for search origin, must be paired with lon",
"schema": {
"type": "number"
},
"required": false
},
{
"in": "query",
"name": "lon",
"description": "Longitude for search origin, must be paired with lat",
"schema": {
"type": "number"
},
"required": false
},
{
"in": "query",
"name": "radius",
"description": "Radius for search in miles, default is 100. Only used if lat/lon also provided.",
"schema": {
"type": "number"
},
"required": false
},
{
"in": "query",
"name": "limit",
"description": "Number of results to return. Default is 25, max allowed is 50.",
"schema": {
"type": "number"
},
"required": false
},
{
"in": "query",
"name": "skip",
"description": "Number of results to skip, used for pagination. Default is 0",
"schema": {
"type": "number"
},
"required": false
},
{
"in": "query",
"name": "show_all",
"description": "Include locations that are not accepting orders, open or closed. Default 0.",
"schema": {
"type": "number",
"enum": [
1,
0
]
},
"required": false
},
{
"in": "query",
"name": "show_closed",
"description": "Include locations that are accepting orders, but are currently closed. Default 0.",
"schema": {
"type": "number",
"enum": [
1,
0
]
},
"required": false
},
{
"in": "query",
"name": "mobile_app_id",
"description": "The application ID to restrict search only for mobile app.",
"schema": {
"type": "string"
},
"required": false
},
{
"in": "query",
"name": "address",
"description": "Address to geocode for geo-location based search. Used when lat/lon are not provided. Falls back to city name search if geocoding yields no results.",
"schema": {
"type": "string"
},
"required": false
},
{
"in": "query",
"name": "country",
"description": "Country code used for geocoding the address parameter (e.g. 'US'). Defaults to the app's configured country.",
"schema": {
"type": "string"
},
"required": false
},
{
"in": "query",
"name": "is_catering",
"description": "Send true to search only catering locations",
"schema": {
"type": "boolean"
},
"required": false
}
],
"responses": {
"200": {
"description": "Search Results",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"results": {
"description": "The restaurant objects returned are augmented with the following search specific fields: can_order (bool), can_order_advance (bool), distance (number), delivers_to (bool)",
"type": "array",
"items": {
"$ref": "#/components/schemas/Restaurant"
}
},
"count": {
"description": "Total number of matching locations",
"type": "number"
},
"active_restaurants": {
"description": "Number of results returned",
"type": "number"
}
}
}
}
}
},
"400": {
"$ref": "#/components/responses/400MissingParameters"
},
"404": {
"$ref": "#/components/responses/404Restaurant"
}
}
}
},
"/apps/{app_id}": {
"get": {
"tags": [
"apps"
],
"summary": "Returns Application Settings",
"operationId": "getAppSettings",
"parameters": [
{
"in": "path",
"name": "app_id",
"description": "The App ID",
"schema": {
"type": "string",
"pattern": "^[a-f\\d]{24}$"
},
"required": true
}
],
"responses": {
"200": {
"description": "[App Settings](#model-App)",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/App"
}
}
}
},
"404": {
"description": "The application could not be found.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
}
}
},
"/apps/get_by_slug/{app_slug}": {
"get": {
"tags": [
"apps"
],
"summary": "Returns Application Settings",
"operationId": "getAppSettingsBySlug",
"parameters": [
{
"in": "path",
"name": "app_slug",
"description": "The App slug",
"schema": {
"type": "string"
},
"required": true
}
],
"responses": {
"200": {
"description": "[App Settings](#model-App)",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/App"
}
}
}
},
"404": {
"description": "The application could not be found.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
}
}
},
"/apps/get_by_domain/{app_domain}": {
"get": {
"tags": [
"apps"
],
"summary": "Returns Application Settings",
"operationId": "getAppSettingsByDomain",
"parameters": [
{
"in": "path",
"name": "app_domain",
"description": "The App domain",
"schema": {
"type": "string"
},
"required": true
}
],
"responses": {
"200": {
"description": "[App Settings](#model-App)",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/App"
}
}
}
},
"404": {
"description": "The application could not be found.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
}
}
},
"/apps/restaurants/{app_id}": {
"get": {
"tags": [
"apps"
],
"summary": "Returns details for all restaurants in app",
"operationId": "getAppLocations",
"parameters": [
{
"in": "path",
"name": "app_id",
"description": "The App ID",
"schema": {
"type": "string",
"pattern": "^[a-f\\d]{24}$"
},
"required": true
},
{
"in": "query",
"name": "fields",
"description": "List of restaurant fields to return. Some basic fields are already returned by default. Use array bracket notation or a comma (or space) seperated list.",
"schema": {
"type": "string"
},
"required": false
},
{
"in": "query",
"name": "lat",
"description": "Latitude for geolocation-based restaurant sorting. Must be used with lon parameter.",
"schema": {
"type": "number"
},
"required": false
},
{
"in": "query",
"name": "lon",
"description": "Longitude for geolocation-based restaurant sorting. Must be used with lat parameter.",
"schema": {
"type": "number"
},
"required": false
}
],
"responses": {
"200": {
"description": "Restaurants",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Restaurant"
}
}
}
}
},
"404": {
"description": "The application could not be found.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
}
}
},
"/apps/delivery_info/{app_id}": {
"get": {
"tags": [
"apps"
],
"summary": "Returns delivery information for the first restaurant in app",
"operationId": "getMerchantDeliveryInfo",
"parameters": [
{
"in": "path",
"name": "app_id",
"description": "The App ID",
"schema": {
"type": "string",
"pattern": "^[a-f\\d]{24}$"
},
"required": true
}
],
"responses": {
"200": {
"description": "Delivery Info",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"courier_enabled": {
"type": "boolean"
},
"delivery_fee": {
"type": "number"
},
"delivery_areas": {
"type": "array",
"items": {
"$ref": "#/components/schemas/DeliveryArea"
}
},
"delivery_lead": {
"type": "number"
}
}
}
}
}
},
"404": {
"description": "App not found or no restaurants assigned to app",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
}
}
},
"/apps/order_details/{app_id}": {
"get": {
"tags": [
"apps"
],
"summary": "Order details report",
"operationId": "getOrderDetailsReport",
"parameters": [
{
"in": "path",
"name": "app_id",
"description": "The App ID",
"schema": {
"type": "string",
"pattern": "^[a-f\\d]{24}$"
},
"required": true
},
{
"in": "query",
"name": "start_date",
"description": "The start of the time range to report on, in any date/time format accepted by PHP strtotime. Time-zone independent format recommended",
"schema": {
"type": "string"
},
"required": false
},
{
"in": "query",
"name": "end_date",
"description": "The end of the time range to report on, in any date/time format accepted by PHP strtotime. Time-zone independent format recommended",
"schema": {
"type": "string"
},
"required": false
},
{
"in": "query",
"name": "date_type",
"description": "The date to use when querying for orders, submit_time by default",
"schema": {
"type": "string",
"enum": [
"creation_time",
"submit_time"
]
},
"required": false
},
{
"in": "query",
"name": "status",
"description": "The order status to query for",
"schema": {
"type": "string",
"enum": [
"unsubmitted",
"completed_unsuccessful",
"submitted",
"completed_successful"
]
}
}
],
"responses": {
"200": {
"description": "Order Details [Reports](#model-OrderReport)",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/OrderReport"
}
}
}
}
}
}
},
"404": {
"description": "App not found or no restaurants assigned to app",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
}
}
},
"/apps/user_updates/{app_id}": {
"get": {
"tags": [
"apps"
],
"summary": "Returns user registration information for an app, based on the user's registration date or first order date. Date fields used to determine each field vary",
"operationId": "getAppUserRegInfo",
"parameters": [
{
"in": "path",
"name": "app_id",
"description": "The App ID",
"schema": {
"type": "string",
"pattern": "^[a-f\\d]{24}$"
},
"required": true
},
{
"in": "query",
"name": "start_date",
"description": "The start of the time range to report on, in any date/time format accepted by PHP strtotime. Time-zone independent format recommended. Start and end times are optional, but both start and end must be specified to query for a date range.",
"schema": {
"type": "string"
},
"required": true
},
{
"in": "query",
"name": "end_date",
"description": "The end of the time range to report on, in any date/time format accepted by PHP strtotime. Time-zone independent format recommended. Start and end times are optional, but both start and end must be specified to query for a date range.",
"schema": {
"type": "string"
},
"required": true
}
],
"responses": {
"200": {
"description": "User Registered [Report](#model-AppUserRegDetails)",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/AppUserRegDetails"
}
}
}
},
"404": {
"description": "App not found or no restaurants assigned to app",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
}
}
},
"/apps/user_stats_point_in_time/{app_id}": {
"get": {
"tags": [
"apps"
],
"summary": "Returns user registration information for an app, based on the user's registration date or first order date, for a given point in time. Date fields used to determine each field vary",
"operationId": "getAppUserRegInfoPointInTime",
"parameters": [
{
"in": "path",
"name": "app_id",
"description": "The App ID",
"schema": {
"type": "string",
"pattern": "^[a-f\\d]{24}$"
},
"required": true
},
{
"in": "query",
"name": "date",
"description": "The point in time to report on, in any date/time format accepted by PHP strtotime. Time-zone independent format recommended. Start and end times are optional, but both start and end must be specified to query for a date range.",
"schema": {
"type": "string"
},
"required": true
}
],
"responses": {
"200": {
"description": "User Registered [Report](#model-AppUserRegDetails)",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/AppUserRegDetails"
}
}
}
},
"404": {
"description": "App not found or no restaurants assigned to app",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
}
}
},
"/oxb/ab_test/{app_id}": {
"post": {
"tags": [
"oxb"
],
"summary": "Returns an A/B test assignment and page-to-file mappings",
"operationId": "getOxbAbTest",
"parameters": [
{
"in": "path",
"name": "app_id",
"description": "The App ID",
"schema": {
"type": "string",
"pattern": "^[a-f\\d]{24}$"
},
"required": true
}
],
"requestBody": {
"required": true,
"content": {
"application/x-www-form-urlencoded": {
"schema": {
"type": "object",
"properties": {
"device_uuid": {
"type": "string",
"description": "Client-generated device UUID used to keep the same A/B assignment across sessions."
},
"access_token": {
"type": "string",
"description": "Optional O&D access token used to link the A/B assignment to the logged-in user.",
"writeOnly": true
}
},
"required": [
"device_uuid"
]
}
}
}
},
"responses": {
"200": {
"description": "A/B test assignment and page-to-file mappings, or an empty page map when no test applies.",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"test_id": {
"type": "string",
"nullable": true,
"pattern": "^[a-f\\d]{24}$"
},
"group": {
"type": "string",
"nullable": true,
"enum": [
"A",
"B"
]
},
"pages": {
"type": "object",
"description": "Map of OXB page keys to static file base names without extensions. No page content is returned.",
"additionalProperties": {
"type": "string"
}
},
"api_request_id": {
"type": "string"
}
},
"required": [
"test_id",
"group",
"pages"
]
}
}
}
},
"400": {
"description": "access_token and device_uuid must be sent in the POST request body, not the query string.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"405": {
"description": "Method not allowed. Use POST with device_uuid and optional access_token in the request body.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
}
}
}
},
"components": {
"schemas": {
"Error": {
"type": "object",
"properties": {
"error": {
"type": "object",
"properties": {
"code": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"messages": {
"type": "string"
},
"display_message": {
"type": "string"
}
}
}
}
},
"SubmitError": {
"type": "object",
"properties": {
"error": {
"type": "object",
"properties": {
"code": {
"type": "string"
},
"messages": {
"type": "string"
},
"display_message": {
"type": "string"
}
}
},
"payment_type": {
"type": "string",
"enum": [
"cc",
"ap",
"gp",
"pip"
],
"description": "When available, payment type will be included in the error response."
},
"card_type": {
"type": "string",
"description": "When available, the type of credit card will be included in the error response."
}
}
},
"RegistrationError": {
"type": "object",
"properties": {
"error": {
"type": "object",
"properties": {
"code": {
"type": "string"
},
"messages": {
"type": "string"
},
"display_message": {
"type": "string"
}
}
},
"errors": {
"type": "array",
"items": {
"properties": {
"field": {
"type": "string"
},
"messages": {
"type": "string"
},
"display_message": {
"type": "string"
}
}
}
}
}
},
"AccessToken": {
"type": "object",
"properties": {
"token": {
"type": "string"
}
}
},
"User": {
"type": "object",
"description": "User account data",
"properties": {
"id": {
"type": "string",
"description": "The user's ID"
},
"email": {
"type": "string",
"description": "The user's email address"
},
"addresses": {
"type": "array",
"description": "The user's registered addresses",
"items": {
"$ref": "#/components/schemas/UserAddress"
}
},
"cards": {
"type": "array",
"description": "The user's saved credit [cards](#model-Card)",
"items": {
"$ref": "#/components/schemas/Card"
}
},
"name": {
"type": "string",
"description": "The user's full name"
},
"restaurants": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Restaurant"
},
"description": "The user's [restaurants](#model-Restaurant), only provided when app_id is specified when getting account information"
},
"phones": {
"type": "array",
"description": "The user's previously-used phone numbers",
"items": {
"type": "string"
}
},
"vehicle": {
"type": "object",
"description": "The user's curbside vehicle information",
"properties": {
"make": {
"type": "string",
"description": "Vehicle make"
},
"model": {
"type": "string",
"description": "Vehicle model"
},
"color": {
"type": "string",
"description": "Vehicle color"
}
}
},
"password": {
"type": "string",
"description": "The new user's password, only supplied when creating a new user"
},
"order_id": {
"type": "string",
"description": "The order referenced when creating a new user, only supplied when creating a new user"
},
"loyalty_points": {
"description": "Only provided when app_id is specified when getting account information"
}
},
"required": [
"id",
"email"
]
},
"UserAddress": {
"type": "object",
"description": "User address data",
"required": [
"address",
"zip"
],
"properties": {
"id": {
"type": "string",
"description": "The ID of the address, if stored with a user profile"
},
"address": {
"type": "string",
"description": "The street address"
},
"address_line_2": {
"type": "string",
"description": "Additional information for given address, like room number, floor number etc."
},
"zip": {
"type": "string",
"description": "The zip/post code"
},
"special_instructions": {
"type": "string",
"description": "Delivery special instructions for this address"
},
"company": {
"type": "string",
"description": "Company name, if available"
}
}
},
"UserLocation": {
"type": "object",
"description": "[Location](#model-UserLocation) object for delivery orders",
"properties": {
"house": {
"type": "string"
},
"street": {
"type": "string"
},
"uzip": {
"type": "string"
},
"city": {
"type": "string"
},
"statecode": {
"type": "string"
},
"formatted_address": {
"type": "string"
},
"latitude": {
"type": "number"
},
"longitude": {
"type": "number"
}
}
},
"Card": {
"type": "object",
"description": "Credit Card Data",
"required": [
"token",
"type",
"month",
"year"
],
"properties": {
"type": {
"type": "string",
"description": "The credit card brand/type (visa, master, american_express, discover, dankort)"
},
"digits": {
"type": "string",
"description": "The last 4 digits of the card"
},
"month": {
"type": "string",
"description": "The expiration month of the card (1-2 digits)"
},
"year": {
"type": "string",
"description": "The expiration year of the card (4 digits)"
},
"token": {
"type": "string",
"description": "The card token value, from payment tokenization source (Spreedly, Square)"
},
"token_type": {
"type": "string",
"enum": [
"spreedly",
"square"
],
"description": "Payment or card tokenization source. Default is 'spreedly' if not set."
},
"email": {
"type": "string",
"description": "The user's email address to send to Spreedly (and on to a payment processor)"
},
"first_name": {
"type": "string",
"description": "The user's first name to send to Spreedly (and on to a payment processor)"
},
"last_name": {
"type": "string",
"description": "The user's last name to send to Spreedly (and on to a payment processor)"
},
"address1": {
"type": "string",
"description": "The user's street address to send to Spreedly (and on to a payment processor)"
},
"address2": {
"type": "string",
"description": "The user's street address (2nd line) to send to Spreedly (and on to a payment processor)"
},
"city": {
"type": "string",
"description": "The user's city to send to Spreedly (and on to a payment processor)"
},
"state": {
"type": "string",
"description": "The user's state to send to Spreedly (and on to a payment processor)"
},
"zip": {
"type": "string",
"description": "The user's zip code to send to Spreedly (and on to a payment processor)"
},
"country": {
"type": "string",
"description": "The user's country code to send to Spreedly (and on to a payment processor)"
},
"phone_number": {
"type": "string",
"description": "The user's phone number to send to Spreedly (and on to a payment processor)"
}
}
},
"Restaurant": {
"type": "object",
"description": "Restaurant",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "The ID of this restaurant"
},
"name": {
"type": "string",
"description": "The name of this item"
},
"description": {
"type": "string",
"nullable": true,
"description": "A short description of the restaurant, a few sentences long"
},
"website": {
"type": "string",
"nullable": true,
"description": "The restaurant's web address (full URL)"
},
"phone": {
"type": "string",
"nullable": true,
"description": "Restaurant phone number"
},
"tz": {
"type": "string",
"nullable": true,
"description": "The restaurant's time zone (Olson time zone, like America/New_York)"
},
"address": {
"type": "string",
"description": "The restaurant's street address"
},
"city": {
"type": "string",
"description": "The restaurant's city"
},
"state": {
"type": "string",
"description": "The restaurant's state/province"
},
"zip": {
"type": "string",
"description": "The restaurant's zip/postal code"
},
"country": {
"type": "string",
"description": "The restaurant's two-letter country code"
},
"loc": {
"type": "array",
"items": {
"type": "number"
},
"nullable": true,
"description": "An array of two decimal numbers representing the restaurant’s latitude and longitude."
},
"image_url": {
"type": "string",
"nullable": true,
"description": "A URL to an image for the restaurant, typically a logo"
},
"accepts": {
"type": "array",
"description": "An array of the payment options accepted by the restaurant.
Possible values are: cc - Credit Card, pip - Pay-in-Person, ap - Apple Pay)",
"items": {
"type": "string"
}
},
"cuisines": {
"type": "array",
"items": {
"type": "string"
},
"nullable": true,
"description": "Types of cuisine in the restaurant"
},
"currency": {
"type": "string",
"description": "Currency code for the primary currency used by the restaurant, like USD or CAD"
},
"unverified": {
"type": "boolean",
"description": "True, if the restaurant is unverified"
},
"accepting_orders": {
"type": "boolean",
"description": "False, if the restaurant has been totally disabled by the administrator. Differs from can_order, in that can_order factors in hours and other considerations."
},
"hours": {
"$ref": "#/components/schemas/Hours"
},
"hour_cutoff": {
"type": "array",
"description": "Minutes before closing to cut off online orders",
"items": {
"type": "integer",
"description": "Seven elements array with keys: m, t, w, th, f, s, su. Hours cut off for each day of week"
}
},
"eh": {
"type": "array",
"items": {
"$ref": "#/components/schemas/ExceptionHours"
},
"nullable": true,
"description": "A list of any closed periods during the general open hours. [Exception Hours](#model-ExceptionHours)"
},
"holiday_hours": {
"type": "array",
"items": {
"$ref": "#/components/schemas/HolidayHours"
}
},
"delivery": {
"type": "boolean",
"description": "Does the restaurant accept delivery orders?"
},
"delivery_fee": {
"type": "string",
"nullable": true,
"description": "A fee applied to delivery orders"
},
"free_delivery_min": {
"oneOf": [
{
"type": "integer",
"nullable": true
},
{
"type": "string",
"nullable": true
}
],
"description": "If delivery is free above a certain amount, that amount is specified here (like free delivery when you order at least $20)"
},
"delivery_radius": {
"oneOf": [
{
"type": "number",
"nullable": true
},
{
"type": "string",
"nullable": true
}
],
"description": "The delivery radius, in miles"
},
"delivery_hours": {
"type": "object",
"description": "The delivery hours, if different than the normal business hours.
If specified, then the normal hours become applicable only to takeout orders",
"properties": {
"hours": {
"$ref": "#/components/schemas/Hours"
},
"tz": {
"type": "string",
"description": "Time Zone"
},
"eh": {
"type": "array",
"items": {
"$ref": "#/components/schemas/ExceptionHours"
},
"description": "A list of any closed periods during the delivery open hours. [Exception Hours](#model-ExceptionHours)"
},
"holiday_hours": {
"type": "array",
"items": {
"$ref": "#/components/schemas/HolidayHours"
}
},
"hours_rules": {
"type": "array",
"items": {
"$ref": "#/components/schemas/HoursRule"
}
},
"hour_cutoff": {
"type": "array",
"description": "Minutes before closing to cut off online orders for delivery",
"items": {
"type": "integer",
"description": "Seven elements array with keys: m, t, w, th, f, s, su. Hours cut off for each day of week"
}
}
}
},
"delivery_areas": {
"type": "array",
"items": {
"$ref": "#/components/schemas/DeliveryArea"
},
"nullable": true
},
"delivery_min": {
"type": "string",
"nullable": true,
"description": "The minimum amount required for order delivery"
},
"menu_tagging": {
"$ref": "#/components/schemas/MenuTagging"
},
"takeout": {
"type": "boolean",
"description": "Does the restaurant accept takeout orders?"
},
"dinein": {
"type": "boolean",
"description": "Does the restaurant accept Dine In orders?"
},
"source": {
"type": "string",
"nullable": true,
"description": "If the data is provided by a third party, that party's ID will be listed here. See our Terms of Service for applicable information about using this data."
},
"omf": {
"type": "string",
"nullable": true,
"description": "If the restaurant has an OpenMenu file, the OpenMenu URL will be listed here"
},
"can_order": {
"type": "boolean",
"description": "Same as takeout_now"
},
"takeout_now": {
"type": "boolean",
"description": "True if the restaurant is currently accepting ASAP takeout orders"
},
"delivery_now": {
"type": "boolean",
"description": "True if the restaurant is currently accepting ASAP delivery orders"
},
"dinein_now": {
"type": "boolean",
"description": "True if the restaurant is currently accepting ASAP dine in orders"
},
"advance_days": {
"type": "integer",
"nullable": true
},
"lead": {
"type": "integer",
"description": "The average lead/prep time for an order, like 10 minutes, used for sorting and providing a single time estimate for an order",
"nullable": true
},
"catering_lead_time_cutoff": {
"type": "integer",
"description": "At what lead time should the system treat an order as a large/catering order, and apply special large-order time logic? This controls the first available order time for future orders. For future day orders with lead time greater than this value we are not considering lead time.",
"deprecated": true
},
"prep_start": {
"type": "integer",
"nullable": true,
"description": "The start of the prep time range, like 5-15 minutes"
},
"prep_end": {
"type": "integer",
"nullable": true,
"description": "The end of the prep time range, like 5-15 minutes"
},
"price_range": {
"type": "integer",
"nullable": true,
"description": "An integer to reflect the expected price (used to calculate dollar-sign ratings, etc.) - NOT an average calculation"
},
"price_start": {
"type": "integer",
"nullable": true,
"description": "An integer to reflect the start of a price range (used to calculate dollar-sign ratings, etc.)"
},
"price_end": {
"type": "integer",
"nullable": true,
"description": "An integer to reflect end of a price range (used to calculate dollar-sign ratings, etc.)"
},
"region": {
"type": "string",
"nullable": true,
"description": "The restaurant's region or location, which may be a district or a location within a shopping center"
},
"use_eta": {
"type": "boolean",
"nullable": true,
"description": "If present and True, then allow advance ordering (with a specified order_date and eta), otherwise all orders should be ASAP"
},
"images": {
"type": "array",
"items": {
"type": "string"
},
"nullable": true,
"description": "A list of URLs to other images for the restaurant, like promo shots"
},
"support_phone": {
"type": "string",
"nullable": true,
"description": "A phone number to provide to customers who need order support"
},
"support_email": {
"type": "string",
"nullable": true,
"description": "An email address to provide or use for customers who need order support"
},
"support_url": {
"type": "string",
"nullable": true,
"description": "A web URL to direct customers to when they need order support"
},
"hero_image": {
"type": "string",
"nullable": true,
"description": "A URL to a hero image for the restaurant"
},
"storefront_image": {
"type": "string",
"nullable": true,
"description": "A URL to a storefront image for the restaurant"
},
"allow_notes": {
"type": "boolean",
"description": "Allow customers to enter special instructions/notes when adding items to their order"
},
"notes_limit": {
"type": "integer",
"nullable": true,
"description": "Length limit for instructions/notes field for menuitem."
},
"ed": {
"type": "array",
"description": "Closed Days",
"items": {
"type": "string",
"description": "Date in format `MM:DD:YYYY`"
}
},
"max_amount": {
"type": "string",
"nullable": true,
"description": "Orders must be below this amount."
},
"takeout_min": {
"type": "string",
"nullable": true,
"description": "Orders must be above this amount to use takeout."
},
"dinein_min": {
"type": "number",
"nullable": true,
"description": "Orders must be above this amount to use dine in."
},
"fields": {
"type": "array",
"description": "[Custom Checkout Fields](#model-CustomCheckoutField)",
"items": {
"$ref": "#/components/schemas/CustomCheckoutField"
},
"nullable": true
},
"tip_prepay": {
"type": "boolean",
"description": "Require customers to enter upfront tips during order submission"
},
"tip_types": {
"type": "array",
"description": "An array of the order types where tips are enabled, like takeout or delivery. If the order type is contained in the array, tips are enabled; otherwise, tips are disabled.",
"items": {
"type": "string"
}
},
"tip_default": {
"type": "number",
"nullable": true,
"description": "Default tip amount"
},
"cards": {
"type": "array",
"nullable": true,
"description": "Credit Card types that restaurant accept: visa, master, discovery, american_express",
"items": {
"type": "string"
}
},
"req_cvv": {
"type": "boolean",
"description": "If true, CVV will be required for every use of a saved card"
},
"gt": {
"type": "string",
"nullable": true,
"description": "Restaurant payment gateway."
},
"opt_in_save_cc": {
"type": "boolean",
"description": "If true, customers can save their credit card for next usage",
"nullable": true
},
"billing_address": {
"type": "boolean",
"nullable": true,
"description": "Require Street Address"
},
"billing_zip": {
"type": "boolean",
"nullable": true,
"description": "Require Zip / Postal Code"
},
"billing_city": {
"type": "boolean",
"nullable": true,
"description": "Require City"
},
"billing_state": {
"type": "boolean",
"nullable": true,
"description": "Require State / Province"
},
"billing_country": {
"type": "boolean",
"nullable": true,
"description": "Require Country"
},
"hide_delivery_fee": {
"type": "boolean",
"nullable": true,
"description": "Hide delivery fee from user, if delivery is free."
},
"no_est": {
"type": "boolean",
"nullable": true,
"description": "Hide Estimation of order ready time after order submit"
},
"confirm_msg": {
"type": "string",
"nullable": true,
"description": "Message for display after order submit"
},
"confirm_orders": {
"type": "boolean",
"description": "Staff must confirm each order to make sure that orders are properly received"
},
"co_text": {
"type": "string",
"nullable": true,
"description": "Custom text that appears on the confirmation page, after checkout"
},
"odp_enabled": {
"type": "boolean",
"nullable": true,
"description": "Paytronix Payments Enabled"
},
"advance_only": {
"type": "boolean",
"description": "Disables \"ASAP\" ordering -- all orders must be placed with a date and time"
},
"test": {
"type": "boolean",
"nullable": true,
"description": "True, if the restaurant is in test mode"
},
"auto_enable": {
"type": "integer",
"nullable": true,
"description": "If the restaurant offline/disabled, but will be automatically re-enabled at a given time, this field will contain the UNIX timestamp when the restaurant will become available again"
},
"coming_soon": {
"type": "boolean",
"nullable": true,
"description": "True, if coming soon mode enabled"
},
"menu_delivery_url": {
"type": "string",
"nullable": true,
"description": "Custom delivery menu URL to use at location finder"
},
"menu_takeout_url": {
"type": "string",
"nullable": true,
"description": "Custom takeout menu URL to use at location finder"
},
"auto_start_order": {
"type": "boolean",
"nullable": true,
"description": "Enable automatic initialization order when opening a restaurant for the first time."
},
"calories": {
"type": "boolean",
"nullable": true,
"description": "Enable entry and display of calorie information, required for certain restaurants in the US"
},
"cal_label": {
"type": "string",
"nullable": true,
"description": "The label to show after the number of calories, that will be used in items description, usually \"cal\" or \"calories\""
},
"cal_prefix": {
"type": "string",
"nullable": true,
"description": "The label to show for options, before the number of calories, usually \"adds\""
},
"phone_ext": {
"type": "string",
"nullable": true,
"description": "Phone Ext."
},
"show_confirmation_ui": {
"type": "boolean",
"nullable": true,
"description": "Show Confirmation Status to Customers"
},
"alcohol_warning_title": {
"type": "string",
"nullable": true,
"description": "For orders containing alcoholic items, the title shown as a warning to customers at checkout"
},
"alcohol_warning_text": {
"type": "string",
"nullable": true,
"description": "For orders containing alcoholic items, the warning text shown to customers at checkout"
},
"hours_rules": {
"type": "array",
"nullable": true,
"items": {
"$ref": "#/components/schemas/HoursRule"
}
},
"hours_cutoff": {
"type": "object",
"nullable": true
},
"app_id": {
"type": "string",
"description": "Restaurant App ID"
},
"is_catering": {
"type": "boolean",
"nullable": true
},
"date_locale": {
"type": "string",
"description": "Locale code for date formatting (e.g. en_US, en_GB, en_AU)",
"nullable": true
},
"does_takeout": {
"type": "boolean",
"description": "True, if the restaurant accepts takeout orders"
},
"does_delivery": {
"type": "boolean",
"description": "True, if the restaurant accepts delivery orders"
},
"does_dinein": {
"type": "boolean",
"description": "True, if the restaurant accepts dine in orders"
},
"takeout_label": {
"type": "string",
"description": "Label for a takeout order type."
},
"delivery_label": {
"type": "string",
"description": "Label for a delivery order type."
},
"dinein_label": {
"type": "string",
"description": "Label for a Dine In order type."
},
"default_type": {
"type": "string"
},
"hide_from_picker": {
"type": "boolean",
"nullable": true
},
"disable_menu_accounts": {
"type": "boolean",
"nullable": true
},
"enable_forter": {
"type": "boolean"
},
"allow_coupons": {
"type": "boolean",
"description": "True, if the restaurant has coupons."
},
"gift_card_enabled": {
"type": "boolean",
"description": "True, if Gift Cards are enabled for the restaurant."
},
"gift_card_allows_tips": {
"type": "boolean",
"description": "True, if the restaurant allows pay tips by Gift Card."
},
"loyalty": {
"type": "boolean",
"description": "True, if the loyalty program is enabled for the restaurant."
},
"gift_card_provider": {
"type": "string",
"description": "Restaurant gift card provider.",
"nullable": true
},
"curbside": {
"$ref": "#/components/schemas/Curbside"
},
"category_groups": {
"type": "object",
"nullable": true,
"description": "Options for organizing menu categories by group",
"properties": {
"enabled": {
"type": "boolean",
"description": "True if this restaurant is using category groups"
},
"auto_expand": {
"type": "boolean",
"description": "True if the category group dropdowns should be open initially. May be irrelevant depending on menu presentation."
}
}
},
"restaurant_attributes": {
"type": "array",
"nullable": true
},
"menu_slug": {
"type": "string",
"nullable": true,
"description": "The restaurant's slug"
},
"hide_max_item_price": {
"type": "boolean",
"nullable": true,
"description": "True if max price of items should be hidden"
},
"disable_feedback": {
"type": "boolean",
"description": "True if feedback is disabled"
},
"feedback": {
"type": "object",
"description": "Detailed feedback configuration",
"properties": {
"item_level_feedback": {
"type": "boolean",
"description": "True if item level feedback is desired"
},
"thanks_title": {
"type": "string"
},
"thanks_message": {
"type": "string"
},
"fields": {
"type": "array",
"description": "Custom feedback fields"
}
}
},
"use_spreedly": {
"type": "boolean",
"description": "True if need to use Spreedly iframe for card tokenization"
},
"use_square_payments": {
"type": "boolean",
"description": "True if the Square iframe should be used for card tokenization, False if the Spreedly iframe should be used."
},
"use_stripe_link": {
"type": "boolean",
"description": "True if Stripe Link can be offered as an additional PXPay card checkout option for this restaurant."
},
"square_location_id": {
"type": "string",
"description": "Square location ID."
},
"pxp_enabled": {
"type": "boolean",
"nullable": true,
"description": "True if need to use WePay Apple Pay integration, False if need to use native Apple Pay integration"
},
"px_store_code": {
"type": "string",
"description": "The Paytronix store code for this location"
},
"enable_tracker": {
"type": "boolean",
"nullable": true,
"description": "True if the Enable Order Tracker setting is enabled for this restaurant"
},
"search_enabled": {
"type": "boolean",
"nullable": true,
"description": "True if the search in menu is enabled for this restaurant"
},
"google_analytics": {
"type": "string",
"nullable": true,
"description": "Google Analytics Tracking / Measurement ID for this restaurant"
},
"fb_pixel_id": {
"type": "string",
"nullable": true,
"description": "Facebook Pixel ID for this restaurant"
},
"allow_aws_tracking": {
"type": "boolean",
"nullable": true,
"description": "True if the AWS order Tracking is enabled for this restaurant"
},
"text": {
"description": "Text data to display for users",
"properties": {
"register_header": {
"type": "string",
"description": "Text to display on registration header"
},
"register_submit_text": {
"type": "string",
"description": "Text on the registration submit button"
},
"register_description": {
"type": "string",
"description": "Text to display on registration description section"
}
}
},
"enable_3ds": {
"type": "boolean",
"description": "If 3DS is enabled for restaurant, browser_info field should be sent on order submit."
},
"menu_alert_title": {
"nullable": true,
"type": "string",
"description": "Text to display as a title for menu alerts."
},
"menu_alert_text": {
"type": "string",
"nullable": true,
"description": "Text for a custom menu alert message."
},
"menu_footer": {
"type": "string",
"nullable": true,
"description": "Text to display in the footer."
},
"i18n": {
"type": "object",
"description": "Included when merchant is configured to support multiple languages",
"properties": {
"preferred_language_code": {
"type": "string",
"nullable": true,
"description": "Restaurants preferred language code or null if no preference is set"
},
"menu_source_language_code": {
"type": "string",
"description": "Default/source language code for menu content"
},
"enabled_languages": {
"type": "array",
"description": "Array of all languages supported by merchant.",
"items": {
"type": "object",
"properties": {
"code": {
"type": "string",
"description": "Language code"
},
"label": {
"type": "string",
"description": "Text label for language code"
}
}
}
}
}
},
"allow_auto_opt_in": {
"type": "boolean",
"description": "Flag indicating if the restaurant's country allows enabling Email Opt-In checkbox by default."
},
"api_request_id": {
"type": "string"
}
}
},
"FlatMenu": {
"description": "A restaurant's menu, containing a simple, flat list of the menu items",
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The ID of this restaurant"
},
"name": {
"type": "string",
"description": "Restaurant's name"
},
"menu": {
"type": "array",
"description": "The menu [items](#model-MenuItem) in this menu",
"items": {
"$ref": "#/components/schemas/MenuItem"
}
},
"hierarchy": {
"type": "array",
"description": "If the restaurant is using category groups, this field will contain the group hierarchy.",
"items": {
"$ref": "#/components/schemas/CategoryGroupNode"
}
},
"source": {
"type": "string",
"description": "If the menu is provided by a third party, that party will be identified here. See our Terms of Service for more information"
},
"menu_tagging": {
"$ref": "#/components/schemas/MenuTagging"
},
"omf": {
"type": "string",
"description": "If this restaurant has an OpenMenu, the URL to the OpenMenu will be listed here"
},
"unverified": {
"type": "boolean",
"description": "If this menu is not verified by the restaurant, this field will be true"
},
"can_order": {
"type": "boolean",
"description": "True if the restaurant is currently accepting orders; false otherwise. If false, you should hide ordering buttons and inform the user that the restaurant is view-only."
},
"expires": {
"type": "string"
},
"available_rewards": {
"type": "object",
"description": "A list of the user's available rewards. Only returned if include_reward_points is true.",
"properties": {
"wallets": {
"type": "array",
"description": "A list of wallets containing redeemable rewards.",
"items": {
"$ref": "#/components/schemas/Wallet"
}
}
}
},
"api_request_id": {
"type": "string"
}
}
},
"TierMenu": {
"description": "A restaurant's menu, containing items by categories",
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The ID of this restaurant"
},
"name": {
"type": "string",
"description": "Restaurant's name"
},
"menu": {
"type": "array",
"description": "The menu [categories](#model-MenuCategory) in this menu",
"items": {
"$ref": "#/components/schemas/MenuCategory"
}
},
"hierarchy": {
"type": "array",
"description": "If the restaurant is using category groups, this field will contain the group hierarchy.",
"items": {
"$ref": "#/components/schemas/CategoryGroupNode"
}
},
"source": {
"type": "string",
"description": "If the menu is provided by a third party, that party will be identified here. See our Terms of Service for more information"
},
"menu_tagging": {
"$ref": "#/components/schemas/MenuTagging"
},
"omf": {
"type": "string",
"description": "If this restaurant has an OpenMenu, the URL to the OpenMenu will be listed here"
},
"unverified": {
"type": "boolean",
"description": "If this menu is not verified by the restaurant, this field will be true"
},
"can_order": {
"type": "boolean",
"description": "True if the restaurant is currently accepting orders; false otherwise. If false, you should hide ordering buttons and inform the user that the restaurant is view-only."
},
"expires": {
"type": "string"
},
"available_rewards": {
"type": "object",
"description": "A list of the user's available rewards. Only returned if include_reward_points is true.",
"properties": {
"wallets": {
"type": "array",
"description": "A list of wallets containing redeemable rewards.",
"items": {
"$ref": "#/components/schemas/Wallet"
}
}
}
},
"api_request_id": {
"type": "string"
}
}
},
"CategoryGroupNode": {
"description": "An element of a restaurant's menu category hierarchy. May represent a group containing more nodes, or a base category, depending on type.",
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Category / Category group ID"
},
"type": {
"type": "string",
"description": "The element type; either \"group\" or \"category\"."
},
"name": {
"type": "string",
"description": "The name of the group; only present for category groups"
},
"desc": {
"type": "string",
"description": "Category group description; only present for category groups"
},
"image": {
"type": "string",
"description": "Category group image URL; only present for category groups"
},
"metadata": {
"description": "Key/value hash-map of metadata attached to menu item",
"type": "object",
"additionalProperties": {
"type": "string"
},
"example": {
"someField": "someValue",
"someOtherField": "someOtherValue"
}
},
"contents": {
"type": "array",
"description": "The contents of the group; only present for category groups",
"items": {
"title": "CategoryGroupNode",
"type": "object",
"description": "An element of a restaurant's menu category hierarchy. May represent a group or base category, depending on type.",
"properties": {
"id": {
"type": "string",
"description": "Category / Category group ID"
},
"type": {
"type": "string",
"description": "The element type; either \"group\" or \"category\"."
},
"name": {
"type": "string",
"description": "The name of the group; only present for category groups"
},
"contents": {
"type": "array",
"description": "The contents of the group; only present for category groups",
"items": {
"title": "CategoryGroupNode",
"type": "object",
"description": "Omitted for brevity"
}
}
}
}
}
},
"example": [
{
"id": "string",
"type": "string",
"name": "string",
"contents": [
{
"id": "string",
"type": "string",
"name": "string",
"contents": []
}
]
}
]
},
"MenuCategory": {
"description": "Description of restaurant menu category",
"type": "object",
"properties": {
"id": {
"description": "Category ID",
"oneOf": [
{
"type": "string"
},
{
"type": "object",
"properties": {
"$id": {
"type": "string",
"description": "Category ID"
}
}
}
]
},
"emid": {
"type": "object"
},
"name": {
"type": "string",
"description": "The name of this category"
},
"desc": {
"type": "string",
"description": "Category Description"
},
"image": {
"type": "string",
"description": "Category Image"
},
"price_list": {
"type": "array",
"description": "An array of strings with the names of prices used in the category. Example: `[ Small, Large ]`",
"items": {
"type": "string"
}
},
"option_groups": {
"type": "array",
"items": {
"$ref": "#/components/schemas/OptionGroup"
}
},
"pizza": {
"type": "object",
"description": "Use Half/Half Pizza Toppings for category",
"properties": {
"{main_topping_option_name}": {
"type": "array",
"description": "Array consists of three elements:
`[left_side_toppings_option_name, right_side_toppings_option_name, allow_double]`",
"items": {
"type": "string",
"description": "Example:
`{\"Veggie Toppings\": [\"Veggie Toppings - Left Half\", \"Veggie Toppings - Right Half\", true ],`
`\"Meat Toppings\": [\"Meat Toppings - Left Half\", \"Meat Toppings - Right Half\", true ] }`"
}
}
}
},
"items": {
"type": "array",
"description": "An array of [menu items](#model-MenuItem) in the given category",
"items": {
"$ref": "#/components/schemas/MenuItem"
}
},
"hours": {
"$ref": "#/components/schemas/Hours"
},
"can_order": {
"type": "boolean"
},
"call_center_only": {
"type": "boolean",
"description": "If true, this category is only available for call center orders"
},
"is_virtual": {
"type": "boolean",
"description": "If true, this is a virtual category containing items from other categories"
},
"is_most_popular": {
"type": "boolean",
"description": "If true, this is a dynamically generated category containing the most popular items at this location"
},
"display_type": {
"type": "string",
"enum": [
"carousel"
],
"nullable": true,
"description": "Desired display format for items within category"
},
"tag_selection": {
"type": "string",
"nullable": true,
"description": "Non-null if category items are dynamically populated from tags"
},
"metadata": {
"description": "Key/value hash-map of metadata attached to menu item",
"type": "object",
"additionalProperties": {
"type": "string"
},
"example": {
"someField": "someValue",
"someOtherField": "someOtherValue"
}
},
"i18n": {
"type": "object",
"description": "A set of content translations for each language, included when translations are enabled.",
"properties": {
"LangCodeN": {
"type": "object",
"description": "The set of translations for this language code.",
"properties": {
"name": {
"type": "string",
"nullable": true,
"description": "Translated category name, or null if no translation is available for this language code"
}
}
}
}
}
}
},
"MenuItem": {
"description": "A menu item",
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The ID of this item"
},
"name": {
"type": "string",
"description": "The name of this item"
},
"restaurant": {
"type": "string",
"description": "The restaurant ID that this item belongs to"
},
"restaurant_name": {
"type": "string",
"description": "The restaurant name that this item belongs to"
},
"category": {
"type": "string",
"description": "The name of the menu category to which this menu item belongs, like Sandwiches or Drinks."
},
"tags": {
"type": "array",
"description": "List of tag IDs enabled on this item. If this list includes 'ignore', then all tagging should be disabled for this item.",
"items": {
"type": "string"
}
},
"image_url": {
"type": "string",
"description": "A URL to an image for the item"
},
"images": {
"type": "array",
"description": "Full URLs to zero or more full-size item images",
"items": {
"type": "string"
}
},
"description": {
"type": "string",
"description": "The item's description"
},
"prices": {
"type": "array",
"items": {
"$ref": "#/components/schemas/MenuItemPrice"
},
"description": "The [sizes/prices](#model-MenuItemPrice) for this item. If an item only has one price, then this will contain a single item"
},
"pos_id": {
"type": "string",
"description": "The POS ID of this item, if it exists"
},
"pos_ids": {
"type": "array",
"items": {
"$ref": "#/components/schemas/MenuItemPosIds"
},
"description": "An additional POS IDs (#model-MenuItemPosIds) for this item"
},
"option_groups": {
"type": "array",
"description": "The [options/modifiers](#model-OptionGroup) selected for this ordered item",
"items": {
"$ref": "#/components/schemas/OptionGroup"
}
},
"active": {
"type": "integer",
"description": "Is this menuitem active?"
},
"can_order": {
"type": "boolean",
"description": "Returned from API queries. True if the item can currently be ordered; false otherwise"
},
"available_rewards": {
"type": "array",
"description": "A list of the user's available rewards that apply to this menuitem. Only returned if include_reward_points is true.",
"items": {
"type": "object",
"properties": {
"wallet_code": {
"type": "integer",
"description": "The ID of the applicable reward, referred to as a wallet."
},
"sizes": {
"type": "array",
"description": "A list of sizes/prices for this menuitem that apply to the reward.",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "The name of the price/size that applies to the reward."
},
"emid": {
"type": "string",
"description": "The ID of the price/size that applies to the reward."
}
}
}
}
}
}
},
"dates": {
"type": "array",
"description": "This item is only available on certain dates",
"items": {
"type": "array",
"description": "Two elements array, start date and end date in format `MM/DD/YYYY H:MM:SS am`",
"items": {
"type": "string"
}
}
},
"preview_only": {
"type": "boolean",
"description": "This item is not available to order yet at this date but a preview should be shown"
},
"preview_message": {
"type": "string",
"description": "For items with preview_only, the message that should be displayed with the item preview"
},
"hours": {
"$ref": "#/components/schemas/ItemHours"
},
"tz": {
"type": "string",
"description": "The restaurant's time zone (Olson time zone, like America/New_York)"
},
"pizza": {
"type": "object",
"description": "Deprecated, please see pizza_groups"
},
"pizza_groups": {
"type": "array",
"description": "For half/half pizza groupings, [configuration](#model-PizzaGroup) related to those pizza groups",
"items": {
"$ref": "#/components/schemas/PizzaGroup"
}
},
"is_featured": {
"type": "boolean",
"description": "Is this item featured for display?"
},
"featured_image": {
"type": "string",
"description": "Featured item image url"
},
"allergens": {
"type": "array",
"description": "List allergens if they are present in item",
"items": {
"type": "string"
}
},
"show_coupon": {
"type": "boolean",
"description": "For items that often come with a coupon code, pop up a reminder to remind customers to enter their coupon code."
},
"available_combos": {
"type": "array",
"description": "Menuitem IDs of combos with current item",
"items": {
"type": "string"
}
},
"item_slots": {
"type": "array",
"description": "[Item Slot](#model-ItemSlot)",
"items": {
"$ref": "#/components/schemas/ItemSlot"
}
},
"enable_quantity": {
"type": "boolean",
"description": "For combos, enable the combo to be ordered in multiples at a time."
},
"min_qty": {
"type": "integer",
"description": "Minimum item quantity required across order"
},
"default_qty": {
"type": "integer",
"description": "Quantity that will be set by default"
},
"qty_remaining": {
"type": "integer",
"description": "The quantity of this item remaining to be sold"
},
"skip_steps": {
"type": "boolean",
"description": "Skip all steps and use item defaults"
},
"skip_popup": {
"type": "boolean",
"description": "Skip popup with combo steps description"
},
"cal": {
"type": "string",
"description": "The calorie amount to display next to the price"
},
"order_type": {
"type": "string",
"description": "If this item is only available on certain order types. Example: An item is only available for delivery"
},
"is_sold_out": {
"type": "boolean",
"description": "Sold out"
},
"max_per_day": {
"type": "integer",
"description": "Number of an items that can be sold per day"
},
"use_step_description": {
"type": "boolean",
"description": "Replace the item's normal description with the description from the combo step"
},
"combo_only": {
"type": "boolean",
"description": "Use item only in combo"
},
"call_center_only": {
"type": "boolean",
"description": "If true, this item is only available via call center"
},
"limit_per_order": {
"type": "integer",
"description": "Limit how many times this item or combo can be used per order",
"nullable": true
},
"limit_per_guest_per_day": {
"type": "integer",
"description": "Maximum number of times a guest can order this item or combo within restaurant's operating day. Applies to combined quantity from all guest's orders for the day",
"nullable": true
},
"offline_only": {
"type": "boolean",
"description": "True, if item is not available for online ordering"
},
"alcohol": {
"type": "boolean",
"description": "True if this item contains alcohol and should trigger an ID warning at checkout."
},
"tobacco": {
"type": "boolean",
"description": "True if this item contains tobacco and should trigger an ID warning at checkout."
},
"display_price": {
"type": "string",
"description": "Prepared price to display"
},
"include_in_fed_headcount": {
"type": "boolean",
"description": "Field is present for catering locations only. True if item is a 'main item' that contributes to a catering order's total guests fed headcount."
},
"ignore_combo_fed_headcount": {
"type": "boolean",
"description": "Field is present for catering locations and combo items only. True if the fed headcount for this item should be calculated using headcount values from the items ordered from this combo."
},
"allow_photo_uploads": {
"type": "boolean",
"description": "True if photo uploads are supported for this menuitem."
},
"rating": {
"type": "object",
"description": "Item rating.",
"properties": {
"liked": {
"type": "integer",
"description": "Number of likes."
},
"disliked": {
"type": "integer",
"description": "Number of dislikes."
},
"count": {
"type": "integer",
"description": "Total likes + dislikes."
},
"most_liked": {
"type": "integer",
"nullable": true,
"description": "Integer ranking for most liked item - 1, 2, 3 or null if not ranked."
},
"liked_pct": {
"type": "integer",
"description": "Percent liked as integer value from 0 to 100."
}
}
},
"metadata": {
"description": "Key/value hash-map of metadata attached to menu item",
"type": "object",
"additionalProperties": {
"type": "string"
},
"example": {
"someField": "someValue",
"someOtherField": "someOtherValue"
}
},
"i18n": {
"type": "object",
"description": "A set of content translations for each language, included when translations are enabled.",
"properties": {
"LangCodeN": {
"type": "object",
"description": "The set of translations for this language code.",
"properties": {
"name": {
"type": "string",
"nullable": true,
"description": "Translated menu item name, or null if no translation is available for this language code"
},
"description": {
"type": "string",
"nullable": true,
"description": "Translated menu item description, or null if no translation is available for this language code"
},
"category": {
"type": "string",
"nullable": true,
"description": "Translated menu item category, or null if no translation is available for this language code"
}
}
}
}
},
"one_click": {
"type": "boolean",
"description": "True if this item supports one-click/quick-add ordering. Only included when the one_click query parameter is true."
}
}
},
"ItemSlot": {
"description": "Included Items / Combo Step",
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "The name of the menu combo"
},
"description": {
"type": "string",
"description": "The menu combo's description"
},
"qty": {
"type": "integer",
"description": "items quantity"
},
"base_price": {
"type": "number",
"description": "Compo Step price"
},
"use_item_price": {
"type": "boolean",
"description": "True if combo slot uses item price."
},
"items": {
"type": "array",
"description": "Array of slot [items](#model-ComboItem)",
"items": {
"$ref": "#/components/schemas/ComboItem"
}
}
}
},
"ComboItemList": {
"description": "Returns an object containing an array of the unique menu items that fill a combo items slots.",
"type": "object",
"properties": {
"comboitem_id": {
"type": "string",
"description": "The ID of the comboitem"
},
"items": {
"type": "array",
"description": "The unique menu items [items](#model-MenuItem) that fill the combo item slots.",
"items": {
"$ref": "#/components/schemas/MenuItem"
}
},
"api_request_id": {
"type": "string"
}
}
},
"ComboItem": {
"description": "Combo Item",
"type": "object",
"properties": {
"item": {
"oneOf": [
{
"type": "string"
},
{
"type": "object",
"properties": {
"$id": {
"type": "string",
"description": "Menu Item ID"
}
}
}
]
},
"sizes": {
"description": "Array of Sizes or null",
"type": "array",
"items": {},
"nullable": true
},
"opt_qty": {
"type": "number",
"description": "Free Option Qty"
},
"opt_credit": {
"type": "number",
"description": "Selected Options Credit"
},
"all_opt_credit": {
"type": "number",
"description": "All Options Credit"
},
"upcharge": {
"type": "number",
"description": "Upcharge"
},
"opt_groups_dist": {
"description": "Free Options",
"type": "array",
"items": {
"type": "string"
}
},
"opt_groups": {
"description": "Free Options",
"type": "array",
"items": {
"type": "string"
}
}
}
},
"PizzaGroup": {
"description": "A half/half pizza grouping, that encompasses configuration for 3 individual option groups into a single pizza group",
"type": "object",
"properties": {
"whole_group_name": {
"type": "string",
"description": "The name of the option group that contains the 'whole' toppings"
},
"left_group_name": {
"type": "string",
"description": "The name of the option group that contains the 'left side' toppings"
},
"right_group_name": {
"type": "string",
"description": "The name of the option group that contains the 'right side' toppings"
},
"allow_doubling": {
"type": "boolean",
"nullable": true,
"description": "Should double-toppings be allowed? To specify double toppings, send 'double' as the option level when ordering an option"
},
"i18n": {
"type": "object",
"description": "A set of content translations for each language, included when translations are enabled.",
"properties": {
"LangCodeN": {
"type": "object",
"description": "The set of translations for this language code.",
"properties": {
"whole_group_name": {
"type": "string",
"nullable": true,
"description": "Translated whole group name, or null if no translation is available for this language code"
},
"left_group_name": {
"type": "string",
"nullable": true,
"description": "Translated left group name, or null if no translation is available for this language code"
},
"right_group_name": {
"type": "string",
"nullable": true,
"description": "Translated right group name, or null if no translation is available for this language code"
}
}
}
}
}
}
},
"MenuItemPrice": {
"description": "A menu item size/price",
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "The name of this size/price. For items with only one size, this is often an empty string"
},
"price": {
"type": "number",
"description": "The cost of this size/price"
},
"pos": {
"type": "string"
},
"active": {
"type": "integer"
},
"is_default": {
"type": "boolean"
},
"weight": {
"type": "string"
},
"fed_headcount": {
"type": "integer",
"description": "Field is present for catering locations only. The number of guests this size will feed. Default is 1 if not set."
},
"i18n": {
"type": "object",
"description": "A set of content translations for each language, included when translations are enabled.",
"properties": {
"LangCodeN": {
"type": "object",
"description": "The set of translations for this language code.",
"properties": {
"name": {
"type": "string",
"nullable": true,
"description": "Translated price name, or null if no translation is available for this language code"
}
}
}
}
}
}
},
"MenuItemPosIds": {
"description": "An additional POS IDs by POS type for each size",
"type": "object",
"properties": {
"pos": {
"type": "string"
},
"size_pos": {
"type": "string"
}
}
},
"OptionGroup": {
"description": "An option group is a collection of related options, like sandwich toppings or salad dressing choices",
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "The name of this option group, like Toppings"
},
"display_name": {
"type": "string",
"description": "The name of this option group to display at UI. If available - need to use it instead of 'name' field"
},
"multiselect": {
"type": "boolean",
"description": "Can a customer select multiple options? If true, then a multiselect or checkbox list is appropriate; otherwise a single-select dropdown is typical"
},
"min": {
"type": "integer",
"description": "How many options must be selected at minimum? If this is greater than 1, the option is required"
},
"max": {
"type": "integer",
"description": "How many options can be selected, at most? This field is optional; if not present or set to a falsy value, assume that there is no maximum."
},
"max_unique": {
"type": "integer",
"description": "How many different options can be selected, at most, regardless of their quantities? Only applies when `quantities` is true. This field is optional; if not present or set to a falsy value, assume that there is no maximum."
},
"options": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Option"
},
"description": "The [option](#model-Option) values available within this option group"
},
"complex": {
"type": "boolean",
"description": "Size dependent option group"
},
"quantities": {
"type": "boolean",
"description": ""
},
"free_opts": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"call_center_only": {
"type": "boolean",
"description": "If true, this option group is only available via call center"
},
"level": {
"type": "string"
},
"option_levels": {
"$ref": "#/components/schemas/OptionLevelSet"
},
"option_conditions": {
"type": "array",
"items": {
"type": "array",
"items": {
"$ref": "#/components/schemas/OptionValueCondition"
}
},
"description": "If this option is dependent on other option values, an array of condition lists to match for this option group to become available. If any of the first-level arrays is completely matched, the option group should become available"
},
"size_conditions": {
"type": "array",
"items": {
"type": "string"
},
"description": "If this option group is only available on certain sizes, the sizes will be listed here. If any of the values is selected, the option group should become available"
},
"i18n": {
"type": "object",
"description": "A set of content translations for each language, included when translations are enabled.",
"properties": {
"LangCodeN": {
"type": "object",
"description": "The set of translations for this language code.",
"properties": {
"name": {
"type": "string",
"nullable": true,
"description": "Translated option group name, or null if no translation is available for this language code"
}
}
}
}
}
}
},
"OptionLevelSet": {
"description": "Option level configuration, for modifying individual options (e.g. 'Light', 'Normal', 'Extra', 'No'). It can be set for the whole option group or for each option separately.",
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The ID of the option level set"
},
"name": {
"type": "string",
"description": "The name of the option level set"
},
"levels": {
"type": "array",
"items": {
"$ref": "#/components/schemas/OptionLevel"
},
"description": "The available levels in the level set"
},
"sizes": {
"type": "array",
"items": {
"type": "string"
},
"description": "If this option level set applies to specific sizes (i.e. the level pricing varies by size), the list of all configured sizes for the level set"
},
"i18n": {
"type": "object",
"description": "A set of content translations for each language, included when translations are enabled.",
"properties": {
"LangCodeN": {
"type": "object",
"description": "The set of translations for this language code.",
"properties": {
"name": {
"type": "string",
"nullable": true,
"description": "Translated option level set name, or null if no translation is available for this language code"
}
}
}
}
}
}
},
"OptionLevel": {
"description": "A specific option level that is available within an option set (e.g. 'Light', 'Normal', 'Extra', 'No')",
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "The name of the option level"
},
"price_multiplier": {
"type": "number",
"description": "The price multiplier for the level, e.g. 2 to double the standard option price, or 0 to make the option free"
},
"count_as": {
"type": "integer",
"description": "How much an option selected at this level counts towards the option group's min and max, e.g. 2 for a 'Double' level. Defaults to 1, and is 0 for a none level"
},
"price": {
"type": "number",
"description": "The fixed price for the level, e.g. 1 to add $1 to the standard option price"
},
"is_default": {
"type": "boolean",
"description": "Is this the default level to apply?"
},
"prices": {
"type": "object",
"description": "An object mapping size names to option prices. The properties of this object are dynamic, depending on the size names. Example: { Small: 0.5, Large: 1 }"
},
"i18n": {
"type": "object",
"description": "A set of content translations for each language, included when translations are enabled.",
"properties": {
"LangCodeN": {
"type": "object",
"description": "The set of translations for this language code.",
"properties": {
"name": {
"type": "string",
"nullable": true,
"description": "Translated option level name, or null if no translation is available for this language code"
}
}
}
}
}
}
},
"OptionValueCondition": {
"description": "A group/value container for options that are dependent on other option values. The properties of this object are dynamic, depending on the size names. Example: { Small: 0.5, Large: 1 }",
"type": "object",
"properties": {
"option_group": {
"type": "string",
"description": "The name of the option group for the condition"
},
"option_value": {
"type": "string",
"description": "The name of the option value for the condition. If all of the values in a given OptionValueCondition list are met, the dependent option should be shown"
}
}
},
"Option": {
"description": "An option value is a choice from an option group (like a list of toppings)",
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "The name of this option value, like Onions or Tomatoes"
},
"pos": {
"type": "string"
},
"pos_ids": {
"type": "array",
"items": {
"$ref": "#/components/schemas/MenuItemPosIds"
},
"description": "An additional POS IDs (#model-MenuItemPosIds) for this option"
},
"cpos": {
"type": "array",
"description": "Complex POS",
"items": {}
},
"tags": {
"type": "array",
"description": "List of tag IDs enabled on this option. If this list includes 'ignore', then all tagging should be disabled for this option.",
"items": {
"type": "string"
}
},
"price": {
"oneOf": [
{
"type": "number"
},
{
"type": "string"
}
],
"description": "The price of this option value, if an extra charge would apply, otherwise 0"
},
"prices": {
"type": "object",
"description": "An object mapping size names to option prices. The properties of this object are dynamic, depending on the size names. Example: { Small: 0.5, Large: 1 }"
},
"is_default": {
"type": "boolean",
"description": "Is this a default option for the option group? If a group is multi-select, multiple options can be defaulted"
},
"is_disabled": {
"type": "boolean",
"description": "Is this option value disabled? Disabled options should not be presented to the customer"
},
"min_quantity": {
"type": "integer",
"description": "How many of this option must be taken once it is selected? Only applies when the option group has `quantities` set to true. This field is optional; if not present or set to a falsy value, assume that there is no minimum."
},
"size": {
"type": "string",
"description": "If this option is only available on a certain size, the size name will be present here. If present, this option should only be available when the given size is selected"
},
"cal": {
"type": "string",
"description": "The calorie amount to display next to the price"
},
"option_levels": {
"$ref": "#/components/schemas/OptionLevelSet"
},
"metadata": {
"description": "Key/value hash-map of metadata attached to menu item",
"type": "object",
"additionalProperties": {
"type": "string"
},
"example": {
"someField": "someValue",
"someOtherField": "someOtherValue"
}
},
"i18n": {
"type": "object",
"description": "A set of content translations for each language, included when translations are enabled.",
"properties": {
"LangCodeN": {
"type": "object",
"description": "The set of translations for this language code.",
"properties": {
"name": {
"type": "string",
"nullable": true,
"description": "Translated option name, or null if no translation is available for this language code"
}
}
}
}
}
}
},
"DeliveryHours": {
"description": "Describes the delivery hours/timing information for a given restaurant",
"type": "object",
"properties": {
"hours": {
"$ref": "#/components/schemas/Hours"
},
"hours_cutoff": {
"type": "object",
"nullable": true
},
"holiday_hours": {
"type": "array",
"items": {
"$ref": "#/components/schemas/HolidayHours"
}
},
"eh": {
"type": "array",
"items": {
"$ref": "#/components/schemas/ExceptionHours"
},
"description": "A list of any closed periods during the general open hours"
},
"tz": {
"type": "string",
"description": "Time zone"
}
}
},
"ExceptionHours": {
"description": "Describes a time period for a given day, usually where the restaurant is NOT open",
"type": "object",
"properties": {
"d": {
"oneOf": [
{
"type": "integer"
},
{
"type": "string"
}
],
"description": "Weekday. This integer represents the day of the week: 0 = Sunday, 1 = Monday, etc."
},
"st": {
"type": "integer",
"description": "Period start time. This integer represents the number of minutes past midnight, so 6 AM would be 360"
},
"end": {
"type": "integer",
"description": "Period end time. This integer represents the number of minutes past midnight, so 6 PM would be 1080. We use a 30 hour day to easily cover timespans through 6 AM the following day, so a 2 AM closing time would be recorded as 1560 (1440 + 120)"
}
}
},
"HolidayHours": {
"description": "Special working hours for specific days, like holidays.",
"type": "object",
"properties": {
"day": {
"type": "string",
"description": "Date in format: YYYY-MM-DD"
},
"open": {
"type": "integer",
"description": "Opening time. This integer represents the number of minutes past midnight, so 6 AM would be 360"
},
"close": {
"type": "integer",
"description": "Closing time. This integer represents the number of minutes past midnight, so 6 PM would be 1080. We use a 30 hour day to easily cover timespans through 6 AM the following day, so a 2 AM closing time would be recorded as 1560 (1440 + 120)"
}
}
},
"Hours": {
"description": "A set of weekly hours, used for a restaurant, menu item, or category.
It is hours for Online Ordering. To show real restaurant working hours need to add hours_cutoff from [restaurant](#model-Restaurant) object.",
"type": "object",
"properties": {
"m_open": {
"type": "integer",
"description": "Monday's opening time. This integer represents the number of minutes past midnight, so 6 AM would be 360"
},
"m_close": {
"type": "integer",
"description": "Monday's closing time. This integer represents the number of minutes past midnight, so 6 PM would be 1080. We use a 30 hour day to easily cover timespans through 6 AM the following day, so a 2 AM closing time would be recorded as 1560 (1440 + 120)"
},
"t_open": {
"type": "integer",
"description": "Tuesday's opening time. This integer represents the number of minutes past midnight, so 6 AM would be 360"
},
"t_close": {
"type": "integer",
"description": "Tuesday's closing time. This integer represents the number of minutes past midnight, so 6 PM would be 1080. We use a 30 hour day to easily cover timespans through 6 AM the following day, so a 2 AM closing time would be recorded as 1560 (1440 + 120)"
},
"w_open": {
"type": "integer",
"description": "Wednesday's opening time. This integer represents the number of minutes past midnight, so 6 AM would be 360"
},
"w_close": {
"type": "integer",
"description": "Wednesday's closing time. This integer represents the number of minutes past midnight, so 6 PM would be 1080. We use a 30 hour day to easily cover timespans through 6 AM the following day, so a 2 AM closing time would be recorded as 1560 (1440 + 120)"
},
"th_open": {
"type": "integer",
"description": "Thursday's opening time. This integer represents the number of minutes past midnight, so 6 AM would be 360"
},
"th_close": {
"type": "integer",
"description": "Thursday's closing time. This integer represents the number of minutes past midnight, so 6 PM would be 1080. We use a 30 hour day to easily cover timespans through 6 AM the following day, so a 2 AM closing time would be recorded as 1560 (1440 + 120)"
},
"f_open": {
"type": "integer",
"description": "Friday's opening time. This integer represents the number of minutes past midnight, so 6 AM would be 360"
},
"f_close": {
"type": "integer",
"description": "Friday's closing time. This integer represents the number of minutes past midnight, so 6 PM would be 1080. We use a 30 hour day to easily cover timespans through 6 AM the following day, so a 2 AM closing time would be recorded as 1560 (1440 + 120)"
},
"s_open": {
"type": "integer",
"description": "Saturday's opening time. This integer represents the number of minutes past midnight, so 6 AM would be 360"
},
"s_close": {
"type": "integer",
"description": "Saturday's closing time. This integer represents the number of minutes past midnight, so 6 PM would be 1080. We use a 30 hour day to easily cover timespans through 6 AM the following day, so a 2 AM closing time would be recorded as 1560 (1440 + 120)"
},
"su_open": {
"type": "integer",
"description": "Sunday's opening time. This integer represents the number of minutes past midnight, so 6 AM would be 360"
},
"su_close": {
"type": "integer",
"description": "Sunday's closing time. This integer represents the number of minutes past midnight, so 6 PM would be 1080. We use a 30 hour day to easily cover timespans through 6 AM the following day, so a 2 AM closing time would be recorded as 1560 (1440 + 120)"
}
}
},
"ItemHours": {
"description": "A set of weekly hours, used for a restaurant, menu item, or category.
It is hours for Online Ordering. To show real restaurant working hours need to add hours_cutoff from [restaurant](#model-Restaurant) object.",
"type": "object",
"properties": {
"m_open": {
"type": "string",
"description": "Monday's opening time. This integer represents the number of minutes past midnight, so 6 AM would be 360"
},
"m_close": {
"type": "string",
"description": "Monday's closing time. This integer represents the number of minutes past midnight, so 6 PM would be 1080. We use a 30 hour day to easily cover timespans through 6 AM the following day, so a 2 AM closing time would be recorded as 1560 (1440 + 120)"
},
"t_open": {
"type": "string",
"description": "Tuesday's opening time. This integer represents the number of minutes past midnight, so 6 AM would be 360"
},
"t_close": {
"type": "string",
"description": "Tuesday's closing time. This integer represents the number of minutes past midnight, so 6 PM would be 1080. We use a 30 hour day to easily cover timespans through 6 AM the following day, so a 2 AM closing time would be recorded as 1560 (1440 + 120)"
},
"w_open": {
"type": "string",
"description": "Wednesday's opening time. This integer represents the number of minutes past midnight, so 6 AM would be 360"
},
"w_close": {
"type": "string",
"description": "Wednesday's closing time. This integer represents the number of minutes past midnight, so 6 PM would be 1080. We use a 30 hour day to easily cover timespans through 6 AM the following day, so a 2 AM closing time would be recorded as 1560 (1440 + 120)"
},
"th_open": {
"type": "string",
"description": "Thursday's opening time. This integer represents the number of minutes past midnight, so 6 AM would be 360"
},
"th_close": {
"type": "string",
"description": "Thursday's closing time. This integer represents the number of minutes past midnight, so 6 PM would be 1080. We use a 30 hour day to easily cover timespans through 6 AM the following day, so a 2 AM closing time would be recorded as 1560 (1440 + 120)"
},
"f_open": {
"type": "string",
"description": "Friday's opening time. This integer represents the number of minutes past midnight, so 6 AM would be 360"
},
"f_close": {
"type": "string",
"description": "Friday's closing time. This integer represents the number of minutes past midnight, so 6 PM would be 1080. We use a 30 hour day to easily cover timespans through 6 AM the following day, so a 2 AM closing time would be recorded as 1560 (1440 + 120)"
},
"s_open": {
"type": "string",
"description": "Saturday's opening time. This integer represents the number of minutes past midnight, so 6 AM would be 360"
},
"s_close": {
"type": "string",
"description": "Saturday's closing time. This integer represents the number of minutes past midnight, so 6 PM would be 1080. We use a 30 hour day to easily cover timespans through 6 AM the following day, so a 2 AM closing time would be recorded as 1560 (1440 + 120)"
},
"su_open": {
"type": "string",
"description": "Sunday's opening time. This integer represents the number of minutes past midnight, so 6 AM would be 360"
},
"su_close": {
"type": "string",
"description": "Sunday's closing time. This integer represents the number of minutes past midnight, so 6 PM would be 1080. We use a 30 hour day to easily cover timespans through 6 AM the following day, so a 2 AM closing time would be recorded as 1560 (1440 + 120)"
}
}
},
"HoursRule": {
"description": "Time Window",
"type": "object",
"properties": {
"start_day": {
"type": "string",
"description": "Start day. String, represented day of week: m, t, w, th, f s, su"
},
"start_time": {
"type": "integer",
"description": "Start time. This integer represents the number of minutes past midnight, so 6 AM would be 360"
},
"end_day": {
"type": "string",
"description": "End day. String, represented day of week: m, t, w, th, f s, su"
},
"end_time": {
"type": "integer",
"description": "End time. This integer represents the number of minutes past midnight, so 6 AM would be 360"
},
"available_day": {
"type": "string",
"description": "Available day. String, represented day of week: m, t, w, th, f s, su"
},
"available_time": {
"type": "integer",
"description": "Available time. This integer represents the number of minutes past midnight, so 6 AM would be 360"
}
}
},
"MenuTagging": {
"type": "object",
"description": "The menu tagging settings.",
"properties": {
"en": {
"type": "boolean",
"description": "Is menu tagging enabled for this restaurant"
},
"tags": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Tag"
},
"description": "A list of tags created for this restaurant"
}
}
},
"NewOrderItem": {
"description": "Data used to add an item to a new order",
"type": "object",
"required": [
"id",
"size"
],
"properties": {
"id": {
"type": "string",
"description": "The menuitem ID to add"
},
"quantity": {
"type": "integer",
"description": "The quantity of items ordered (1+)"
},
"options": {
"type": "array",
"description": "The [options](#model-NewOrderOption) selected for this ordered item, only required if the item has required options.
Option *values* in the API can come in 3 ways:
Simple array of strings: `[\"Tomatoes\", \"Onions\"]`
Quantities array: `[\"Tomatoes\":2, \"Onions\":2]`
[Object format](#model-NewOrderOptionValue): `[{\"name\":\"Tomatoes\", \"quantity\": 2},{\"name\":\"Onions\", \"quantity\": 2}]`
**Do not send via this ui**",
"items": {
"$ref": "#/components/schemas/NewOrderOption"
}
},
"size": {
"type": "string",
"description": "The size name of this item; if an item only has one size, this is usually an empty string"
},
"force": {
"type": "boolean",
"description": "Normally, adding items are rejected if disabled or not currently being served. Set force to true to allow adding the item anyway, although submitting the order will fail if the contents are still invalid"
},
"for": {
"type": "string",
"description": "Recipient of the order item"
},
"notes": {
"type": "string",
"description": "Notes/special instructions for the item"
},
"combo_id": {
"type": "string",
"description": "Combo Item ID. Combo is an item object with array of [items](#model-NewOrderItem) it's contain"
},
"slot_index": {
"type": "integer",
"description": "ID of combo step"
},
"items": {
"type": "array",
"description": "Array of combo [items](#model-NewOrderItem). Will be ignored without combo_id.
**Do not send via this ui**",
"items": {
"type": "object"
}
}
}
},
"NewOrderOption": {
"description": "Key/value hash-map of option group name to string arrays of option values",
"type": "object",
"properties": {
"key": {
"type": "string",
"description": "The object's keys should be the option group names"
},
"value": {
"type": "array",
"description": "The object's values should be an array of selected option values. For simple cases, this can also be an array of strings containing the option values",
"items": {
"$ref": "#/components/schemas/NewOrderOptionValue"
}
}
}
},
"NewOrderOptionValue": {
"description": "Values for specifying a single option (or quantity of options) to add with an item",
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "The name of the selected option value, like 'Pepperoni' or 'Onions' for a list of pizza toppings"
},
"quantity": {
"type": "integer",
"description": "The quantity of values selected, usually 1"
}
}
},
"NewOptionLevels": {
"description": "Key/value map. Where key - name of option group that have Levels, value - array of levels.
How to send it? Curl example: `option_levels[Grinder][Mayo]=Normal&option_levels[Grinder][Onion]=No`
Where *Grinder* - option group name, *Mayo, Onion* - option names and *Normal, No* - option levels
For this option levels array of options must contain next: `options[Grinder][]=Mayo&options[Grinder][]=Onion`",
"type": "object",
"properties": {
"{option_group_name}": {
"type": "array",
"description": "",
"items": {
"type": "string",
"description": "Array key - option name, array value - option level"
}
}
}
},
"OrderOption": {
"description": "An instance of an ordered option, in a given order, for a given item",
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "The name of the option (usually includes the group name for easy display)"
},
"emid": {
"type": "object"
},
"pos": {
"type": "string",
"description": "The POS ID of the option, if configured"
},
"size": {
"type": "string"
},
"prices": {
"oneOf": [
{
"type": "object"
},
{
"type": "array"
}
],
"description": "An object mapping size names to option prices. The properties of this object are dynamic, depending on the size names. Example: { Small: 0.5, Large: 1 }"
},
"cpos": {},
"cal": {
"type": "string",
"description": "The calorie amount to display next to the price"
},
"is_default": {
"type": "boolean",
"description": "Is default option?"
},
"is_disabled": {
"type": "boolean",
"description": "Is disabled option?"
},
"call_center_only": {
"type": "boolean",
"description": "If true, this option is only available via call center"
},
"option_name": {
"type": "string",
"description": "Option name"
},
"quantity": {
"type": "integer",
"description": "The quantity of the option that was ordered. Usually 1, unless option quantities are enabled for special items, like a dozen donuts"
},
"group_name": {
"type": "string",
"description": "The option group name, examples: Toppings, Salad Dressing, Bread Choice"
},
"level": {
"type": "string"
},
"is_default_level": {
"type": "boolean"
},
"multiplier": {},
"category_pos": {},
"price": {
"type": "number",
"description": "The price of the option"
},
"base_price": {
"type": "number",
"description": ""
},
"i18n": {
"type": "object",
"description": "A set of content translations for each language, included when translations are enabled.",
"properties": {
"LangCodeN": {
"type": "object",
"description": "The set of translations for this language code.",
"properties": {
"name": {
"type": "string",
"nullable": true,
"description": "Translated name, or null if no translation is available for this language code"
},
"option_name": {
"type": "string",
"nullable": true,
"description": "Translated option name, or null if no translation is available for this language code"
},
"group_name": {
"type": "string",
"nullable": true,
"description": "Translated group name, or null if no translation is available for this language code"
}
}
}
}
}
}
},
"OrderItem": {
"description": "An instance of an ordered item, in a given order",
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The unique ID of this ordered item instance (not the menuitem ID)"
},
"emid": {
"type": "string"
},
"menuitem": {
"type": "string",
"description": "The menuitem ID of this ordered item"
},
"image_url": {
"type": "string",
"description": "A URL to an image for the item"
},
"images": {
"type": "array",
"description": "Full URLs to zero or more full-size item images",
"items": {
"type": "string"
}
},
"name": {
"type": "string",
"description": "The name of this item"
},
"quantity": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
}
],
"description": "The quantity of items ordered (1+)"
},
"options": {
"type": "array",
"description": "The options/modifiers selected for this ordered item",
"items": {
"$ref": "#/components/schemas/OrderOption"
}
},
"simplified_options": {
"type": "array",
"description": "Exists if the options can be simplified for display purposes",
"items": {
"$ref": "#/components/schemas/OrderOption"
}
},
"category": {
"type": "string",
"description": "The category name of this item"
},
"yes_sales_tax": {
"type": "boolean"
},
"tax": {
"type": "number",
"description": "The item tax amount"
},
"active_taxes": {
"type": "array",
"description": "If custom [taxes/fees](#model-OrderTax) are used, they will be specified here for certain item.",
"items": {
"$ref": "#/components/schemas/OrderTax"
}
},
"base_price": {
"type": "number"
},
"price": {
"type": "number",
"description": "The base price of this item, before options"
},
"total_price": {
"type": "number",
"description": "The total price of this item, including options"
},
"total_price_orig": {
"type": "number"
},
"opts_price": {
"type": "number"
},
"incl_options_price": {
"type": "number"
},
"size": {
"type": "string",
"description": "The size name of this item; if an item only has one size, this is usually an empty string"
},
"for": {
"type": "string",
"description": "Recipient of the order item"
},
"notes": {
"type": "string",
"description": "Notes/special instructions for the item"
},
"pos": {
"anyOf": [
{
"type": "integer"
},
{
"type": "string"
}
],
"description": "The POS ID of the item, if configured"
},
"order_type": {
"type": "string"
},
"alcohol": {
"type": "boolean"
},
"slot_index": {
"type": "string"
},
"combo_id": {
"oneOf": [
{
"type": "string"
},
{
"type": "object"
}
]
},
"favorite": {
"type": "boolean",
"description": "Is this item favorite?"
},
"favorite_name": {
"type": "string",
"description": "Favorite item alias"
},
"sharing_url": {
"type": "string",
"description": "Url to share favorite item"
},
"include_in_fed_headcount": {
"type": "boolean",
"description": "Field is present for catering locations only. True if item is a 'main item' that contributes to a catering order's total guests fed headcount."
},
"ignore_combo_fed_headcount": {
"type": "boolean",
"description": "Field is present for catering locations and combo items only. True if the fed headcount for this item should be calculated using headcount values from the items ordered from this combo."
},
"fed_headcount": {
"type": "integer",
"description": "Field is present for catering locations only. The number of guests this size will feed. Default is 1 if not set."
},
"hours": {
"$ref": "#/components/schemas/ItemHours"
},
"custom_images": {
"type": "array",
"description": "Custom images uploaded and associated with the order item.",
"items": {
"$ref": "#/components/schemas/CustomImage"
}
},
"i18n": {
"type": "object",
"description": "A set of content translations for each language, included when translations are enabled.",
"properties": {
"LangCodeN": {
"type": "object",
"description": "The set of translations for this language code.",
"properties": {
"name": {
"type": "string",
"nullable": true,
"description": "Translated menu item name, or null if no translation is available for this language code"
},
"category": {
"type": "string",
"nullable": true,
"description": "Translated category name, or null if no translation is available for this language code"
}
}
}
}
}
}
},
"OrderTax": {
"description": "A specific custom tax/fee applied to an order",
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string",
"description": "The name of the tax/fee"
},
"tax_id": {
"type": "string",
"nullable": true,
"description": "A tax ID to print along with the tax name (for legal purposes, not a system ID)"
},
"rate": {
"type": "string",
"description": "The tax rate, like 0.10 for 10% (only present on percentage orders)"
},
"order_type": {
"type": "string",
"description": "The order type to which the tax applies (takeout, delivery)"
},
"amount": {
"type": "number",
"description": "The calculated amount of the tax for the order"
},
"incl": {
"type": "boolean",
"description": "Is this an 'inclusive' tax, such as GST / VAT, where the tax is already included in the sales price?"
},
"incl_in_sales_tax": {
"type": "boolean"
},
"is_rounding": {
"type": "boolean",
"description": "If true, this entry represents a rounding adjustment rather than a traditional tax or fee."
}
}
},
"RefundRecord": {
"description": "Data pertaining to a refund for an order",
"required": [
"amount"
],
"type": "object",
"properties": {
"amount": {
"type": "number",
"description": "The amount of the refund"
},
"reason": {
"type": "string",
"description": "The reason for the refund"
},
"payment_type": {
"type": "string"
},
"fault": {
"type": "string"
},
"date": {
"type": "string",
"description": "The date and time that the refund was issued"
},
"success": {
"type": "boolean"
}
}
},
"Reward": {
"description": "Reward information",
"required": [
"id",
"name",
"wallet_code",
"quantity_redeemed",
"discount_type",
"apply_automatically",
"key"
],
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The reward's unique ID"
},
"_id": {
"type": "object"
},
"name": {
"type": "string",
"description": "The reward's name/description"
},
"wallet_code": {
"type": "integer",
"description": "Paytronix issued reward wallet code"
},
"quantity_redeemed": {
"type": "string",
"description": "Actual number of points in the Paytronix wallet which will be redeemed when the transaction is finalized."
},
"discount_type": {
"type": "string",
"enum": [
"Percent",
"Dollar",
"ReducePrice",
"PerUnit"
],
"description": "Paytronix issued Discount Type"
},
"apply_automatically": {
"type": "boolean",
"description": "Automatically apply discounts"
},
"key": {
"type": "string",
"description": "Reward key to be used for redeem_rewards endpoint"
},
"amount": {
"type": "number"
},
"item_rewards": {
"type": "array"
},
"cost_points": {
"type": "integer",
"description": "The point cost to redeem this reward. 0 if the reward does not cost points."
}
}
},
"CouponList": {
"description": "A list of coupons",
"type": "object",
"properties": {
"items": {
"$ref": "#/components/schemas/Coupon"
}
}
},
"Coupon": {
"description": "Coupon information",
"required": [
"code",
"name"
],
"properties": {
"id": {
"type": "string",
"description": "The coupon's unique ID"
},
"name": {
"type": "string",
"description": "The coupon's name/description"
},
"code": {
"type": "string",
"description": "The coupon's code"
},
"restaurant": {
"type": "string",
"description": "The Restaurant ID"
},
"active": {
"type": "boolean",
"description": "Is this coupon active?"
},
"item_level": {
"type": "boolean"
},
"auto_apply": {
"type": "boolean",
"description": "True, if the coupon should be applied automatically to each order"
},
"store_discount": {
"type": "boolean",
"description": "True, if the coupon is a passively-applied store discount instead of a standard coupon"
},
"percent": {
"type": "number",
"description": "A percent for the coupon to discount"
},
"free_items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"items": {
"type": "array",
"description": "[MenuItem](#model-MenuItem) IDs",
"items": {
"type": "string"
}
},
"sizes": {
"type": "array",
"description": "[MenuItem](#model-MenuItem) sizes",
"items": {
"type": "string"
}
},
"qty": {
"type": "integer"
}
}
}
},
"discount_items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"items": {
"type": "array",
"description": "[MenuItem](#model-MenuItem) IDs",
"items": {
"type": "string"
}
},
"size": {
"type": "string"
},
"price": {
"type": "number",
"description": "Override Price"
},
"amt": {
"type": "number",
"description": "Flat Amount Off"
},
"pct": {
"type": "number",
"description": "Percent Off"
},
"batch": {
"type": "number",
"description": "If greater than 1, apply discounts only to full batches (e.g. full groups of 3)"
}
}
}
},
"require": {
"type": "array",
"description": "Required Items",
"items": {
"type": "object",
"properties": {
"items": {
"type": "array",
"description": "Required [MenuItem](#model-MenuItem) IDs",
"items": {
"type": "string"
}
},
"sizes": {
"type": "array",
"description": "Required [MenuItem](#model-MenuItem) sizes",
"items": {
"type": "string"
}
},
"qty": {
"type": "integer",
"description": "Item Quantity"
},
"opt_groups": {
"type": "array",
"description": "Required Options",
"items": {
"type": "string",
"description": "Option Group Name"
}
},
"opt_qty": {
"type": "integer",
"description": "Option Quantity"
},
"price": {
"type": "number",
"description": "Override Total Price"
}
}
}
},
"order_type": {
"type": "string",
"description": "Order types available for this coupon: both, delivery, takeout"
},
"discount": {
"type": "number",
"description": "The total amount that was discounted for the coupon"
},
"check_discount": {
"type": "number",
"description": "The portion of the total amount discounted for the coupon at the check level. If not present, the entire discount is to be applied to the full check."
},
"item_discount": {
"type": "number",
"description": "The sum of amounts discounted for the coupon for individual items. See also \"itemized_discounts\"."
},
"itemized_discounts": {
"type": "array",
"description": "A list of discount amounts applied, listed by line item.",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The unique ID matching the id field of an [order line item](#model-OrderItem)"
},
"menuitem": {
"type": "string",
"description": "The menuitem ID matching the id field of a [menu item](#model-MenuItem)"
},
"quantity": {
"type": "number",
"description": "The quantity of items being discounted"
},
"discount": {
"type": "number",
"description": "The amount discounted for this item"
}
}
}
},
"still_tax": {
"type": "boolean",
"description": "True if the coupon does NOT reduce the taxable amount of the order"
},
"flat": {
"type": "string",
"description": "If the coupon is configured for a flat amount, the maximum flat discount that the coupon would provide"
}
}
},
"Feedback": {
"description": "Data from feedback left for an order",
"type": "object",
"properties": {
"food": {
"type": "integer",
"description": "The rating of how good the food was"
},
"foodwhy": {
"type": "string",
"description": "Explanation for the food rating"
},
"service": {
"type": "integer",
"description": "The rating of the service"
},
"servicewhy": {
"type": "string",
"description": "Explanation for the service rating"
},
"value": {
"type": "integer",
"description": "The rating of how good the value was"
},
"valuewhy": {
"type": "string",
"description": "Explanation for the value rating"
},
"recommend": {
"type": "integer",
"description": "The rating of the recommend question"
},
"repeat": {
"type": "integer",
"description": "The rating of the repeat question"
},
"repeatwhy": {
"type": "string",
"description": "Explanation for the repeat rating"
},
"comments": {
"type": "string",
"description": "General comments"
},
"items": {
"type": "array",
"description": "Item level feedback",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Order item id"
},
"liked": {
"type": "boolean",
"nullable": true,
"description": "True for liked, false for disliked, null for no rating provided"
}
}
}
}
}
},
"CustomImage": {
"description": "An uploaded image assocated with the order item",
"properties": {
"id": {
"type": "string"
},
"url": {
"type": "string",
"description": "URL for image display"
},
"name": {
"type": "string",
"description": "Original uploaded file name"
},
"type": {
"type": "string",
"description": "Mime type of image"
},
"width": {
"type": "integer",
"description": "Width of image"
},
"height": {
"type": "integer",
"description": "Height of image"
}
}
},
"Order": {
"description": "Order data as returned by the REST API (e.g. `GET /orders`). Order webhook notifications send a different representation in `order_data`; see [WebhookOrder](#model-WebhookOrder).",
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Order ID"
},
"name": {
"type": "string",
"description": "The restaurant name to which this order belongs"
},
"restaurant": {
"type": "string",
"description": "The restaurant ID for the given order"
},
"px_store_code": {
"type": "string"
},
"status": {
"type": "string",
"description": "Textual order status, suitable for display"
},
"delivery_status": {
"type": "string",
"description": "Third-party delivery status: 'delivery_created', 'delivery_canceled', 'delivery_cancel_failed', 'courier_confirmed', 'courier_ht_pickup', 'courier_pickup_arrival', 'courier_picked_up', 'courier_ht_dropoff', 'courier_dropoff_arrival', 'courier_dropped_off', 'courier_attempted_dropoff', 'delivery_return_start', 'delivery_return_cancel', 'courier_ht_return', 'courier_return_arrival', 'delivery_returned', 'delivery_abandoned', 'other'"
},
"s": {
"type": "integer",
"description": "Integer Order Status: 0 - created, 1 - submitted, 2 - done successful, 3 - pending confirmation, 4 - done unsuccessful"
},
"c": {
"type": "integer",
"description": "Integer Order Confirmation Status: 0 - submitted, 1 - confirmed, 2 - adjusted, 3 - rejected, 4 - done successful"
},
"paid": {
"type": "integer",
"description": "1 - Paid, 0 - Not Prepaid"
},
"type": {
"type": "string",
"description": "The order type, either takeout, delivery or dinein"
},
"display_type": {
"type": "string"
},
"curbside": {
"type": "boolean"
},
"payment_type": {
"type": "string",
"nullable": true,
"enum": [
"cc",
"pip",
"ap",
"gp",
"gc"
],
"description": "The payment type set on the order, if any. Null if no payment type has been set yet."
},
"order_state_key": {
"type": "string",
"description": "UUID v4 representing a version of the order. When this value changes, there may have been a change in the contents or pricing of the order."
},
"submit_url": {
"type": "string"
},
"items": {
"type": "array",
"description": "The [items](#model-MenuItem) that were ordered",
"items": {
"$ref": "#/components/schemas/OrderItem"
}
},
"fee": {
"type": "string",
"description": "Order fee amount"
},
"total_amount": {
"type": "number",
"description": "The total amount of the order, including taxes and fees"
},
"tax": {
"type": "number",
"description": "The order tax amount"
},
"active_taxes": {
"type": "array",
"description": "If custom [taxes/fees](#model-OrderTax) are used, they will be specified here. These are in addition to the standard sales tax value (tax field)",
"items": {
"$ref": "#/components/schemas/OrderTax"
}
},
"subtotal": {
"type": "number",
"description": "The order subtotal"
},
"delivery_fee": {
"type": "number",
"description": "Delivery fee amount"
},
"base_lead_time": {
"type": "integer"
},
"time": {
"type": "integer",
"description": "The promised and required lead time, usually displayed if not an advance order (with order_date and eta)"
},
"active_coupons": {
"type": "array",
"description": "The [coupons](#model-Coupon) that are applied to the order",
"items": {
"$ref": "#/components/schemas/Coupon"
}
},
"inactive_coupons": {
"type": "array",
"description": "Inactive [coupons](#model-Coupon) that are added to the order",
"items": {
"$ref": "#/components/schemas/Coupon"
}
},
"coupons": {
"type": "array",
"description": "All [coupons](#model-Coupon) that are added to the order (it is not applied coupons)",
"items": {
"$ref": "#/components/schemas/Coupon"
}
},
"comps": {
"type": "array"
},
"ordering_for": {
"type": "string",
"enum": [
"now",
"later"
],
"description": "Possible values: now, later. For order for later you must provide order_date and eta"
},
"order_date": {
"type": "string",
"description": "For advance orders, the date to use, in `MM/DD/YYYY` format; empty for ASAP orders"
},
"eta": {
"type": "string",
"description": "For advance orders, the time to use, in `H:MM AM` format, like `9:30 PM`"
},
"short_id": {
"type": "integer",
"description": "The human-friendly order number"
},
"u": {
"type": "string",
"description": "The customer ID"
},
"uid": {
"type": "object"
},
"customer_name": {
"type": "string",
"description": "The full name of the customer"
},
"is_catering": {
"type": "boolean",
"description": "Indicates whether the order contains an item that is catered.",
"deprecated": true
},
"catering": {
"$ref": "#/components/schemas/Catering"
},
"customer_phone": {
"type": "string",
"description": "The customer's phone number"
},
"customer_address": {
"type": "string",
"description": "The full delivery address of the customer (only for delivery orders)"
},
"address": {
"type": "string",
"description": "The street address"
},
"address2": {
"type": "string"
},
"address_line_2": {
"type": "string",
"description": "Additional information for given address, like room number, floor number etc."
},
"city": {
"type": "string"
},
"state": {
"type": "string"
},
"zip": {
"type": "string",
"description": "The zip/post code"
},
"latitude": {
"type": "number"
},
"longitude": {
"type": "number"
},
"special_instructions": {
"type": "string",
"description": "Delivery instructions for delivery orders"
},
"card": {
"$ref": "#/components/schemas/Card"
},
"refunded": {
"type": "boolean",
"description": "True if the order has received a refund (partial or complete)"
},
"refund_records": {
"type": "array",
"description": "If refunds have been issued for the order, a list of [refund records](#model-RefundRecord)",
"items": {
"$ref": "#/components/schemas/RefundRecord"
}
},
"company": {
"type": "string",
"description": "The company name, if ordering for a company"
},
"tip": {
"type": "number",
"description": "The total tip amount, if one was provided. tip = tip_third_party + tip_merchant"
},
"tip_third_party": {
"type": "number",
"description": "The tip amount allocated to 3rd parties, such as delivery drivers. tip = tip_third_party + tip_merchant"
},
"tip_merchant": {
"type": "number",
"description": "The tip amount allocated to the merchant. tip = tip_third_party + tip_merchant"
},
"feedback": {
"$ref": "#/components/schemas/Feedback"
},
"events": {
"type": "array",
"description": "Tracking info. Not included in the [WebhookOrder](#model-WebhookOrder) payload.",
"items": {
"type": "object",
"properties": {
"time": {
"type": "string",
"description": "Event time, in format `MM/DD/YYYY H:MM AM`"
},
"desc": {
"type": "string",
"description": "Event description"
}
}
}
},
"delivery_exp": {
"type": "number"
},
"delivery_exp_display": {
"type": "string"
},
"delivery_ttl": {
"type": "integer",
"description": "Remaining time-to-live (in seconds) until the delivery quote expiration"
},
"courier_due_ts": {
"type": "integer",
"description": "If a delivery courier is used, the time that the courier should deliver the order by, expressed as seconds since UNIX epoch"
},
"app_id": {
"type": "string",
"description": "App ID"
},
"fields": {
"type": "array",
"description": "Custom Checkout field values",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Field name"
},
"value": {
"type": "string",
"description": "Value"
}
}
}
},
"favorite": {
"type": "boolean",
"description": "Is this order user favourite?"
},
"submit_now": {
"type": "boolean",
"description": "Can the order be submitted now, as an ASAP order? If false, you will need to specify order_date and eta parameters"
},
"rewards": {
"type": "array",
"description": "User's rewards",
"items": {}
},
"gc_number": {
"type": "string",
"description": "Gift Card number"
},
"currency": {
"type": "string",
"description": "The currency used for this order"
},
"combos": {
"type": "array",
"description": "Combos is order",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Combo Id in order"
},
"name": {
"type": "string",
"description": "Combo name"
},
"combo_item_id": {
"type": "string",
"description": "Combo [Menu Item](#model-MenuItem) ID"
},
"fed_headcount": {
"type": "integer",
"description": "Field is present for catering orders only. The number of guests this combo will feed. Default is 1 if not set."
},
"ignore_combo_fed_headcount": {
"type": "boolean",
"description": "Field is present for catering orders only. True if the fed headcount for this combo should be calculated using headcount values from the items ordered from this combo."
},
"include_in_fed_headcount": {
"type": "boolean",
"description": "Field is present for catering orders only. True if combo is a 'main item' that contributes to a catering order's total guests fed headcount."
}
}
}
},
"donation": {
"type": "number",
"description": "Donation amount"
},
"total_fed_headcount": {
"type": "integer",
"description": "Field is present for catering locations only. The total number of guests this order will feed."
},
"location": {
"$ref": "#/components/schemas/UserLocation"
},
"courier": {
"type": "object",
"description": "Courier info. Not all couriers support it",
"properties": {
"name": {
"type": "string",
"description": "Courier name"
},
"phone": {
"type": "string",
"description": "Courier phone"
}
}
},
"tracking_url": {
"type": "string",
"description": "URL to track delivery"
},
"dsp": {
"type": "string",
"enum": [
"doordash",
"uber",
"skip"
],
"description": "If an order is delivered by a delivery service provider (dsp), the name of the dsp that was used for delivery."
},
"delivery_type": {
"type": "string",
"enum": [
"own",
"dsp"
],
"description": "Indicates whether an order was delivered by the restaurant (own) or a 3rd party delivery service provider (dsp)."
},
"due_timestamp": {
"type": "integer",
"description": "The time that the restaurant should have the order ready, expressed as seconds since UNIX epoch"
},
"creation_timestamp": {
"type": "integer",
"description": "The time that the order was originally created (initiated by the customer), as a UNIX timestamp. Not included in the [WebhookOrder](#model-WebhookOrder) payload. Use `creation_time` instead."
},
"creation_time": {
"type": "string",
"description": "The time that the order was originally created (initiated by the customer), in format `MM/DD/YYYY H:MM:SS am`. In the [WebhookOrder](#model-WebhookOrder) payload this field is an integer UNIX timestamp."
},
"submit_timestamp": {
"type": "integer",
"description": "The date and time that the order was submitted, as a UNIX timestamp. Not included in the [WebhookOrder](#model-WebhookOrder) payload. Use `submit_time` instead."
},
"submit_time": {
"type": "string",
"description": "The date and time that the order was submitted, in format `MM/DD/YYYY H:MM:SS am`. In the [WebhookOrder](#model-WebhookOrder) payload this field is an integer UNIX timestamp."
},
"confirm_time": {
"type": "string",
"description": "Time, when restaurant confirmed order, in format `MM/DD/YYYY H:MM:SS am`. In the [WebhookOrder](#model-WebhookOrder) payload this field is an integer UNIX timestamp."
},
"confirm_timestamp": {
"type": "string",
"description": "Time, when restaurant confirmed order, as a UNIX timestamp. Not included in the [WebhookOrder](#model-WebhookOrder) payload. Use `confirm_time` instead."
},
"cancel_time": {
"type": "string",
"description": "Time, when order was canceled, in format `MM/DD/YYYY H:MM:SS am`. In the [WebhookOrder](#model-WebhookOrder) payload this field is an integer UNIX timestamp."
},
"cancel_timestamp": {
"type": "string",
"description": "Time, when order was canceled, as a UNIX timestamp. Not included in the [WebhookOrder](#model-WebhookOrder) payload. Use `cancel_time` instead."
},
"asap_lead_time": {
"type": "integer",
"description": "The soonest time that the order could be ready (either as ASAP or advance order), in minutes"
},
"asap_submit_datetime_iso": {
"type": "string",
"description": "If the order cannot be submitted now, the next available time that the order could be submitted, in ISO format (we currently check the current and next day)"
},
"asap_submit_order_date": {
"type": "string",
"description": "If the order cannot be submitted now, the next date that the order could be submitted for. Can be used to fill the order_date parameter upon submission"
},
"asap_submit_eta": {
"type": "string",
"description": "If the order cannot be submitted now, the next time that the order could be submitted for. Can be used to fill the eta parameter upon submission"
},
"auto_gc": {
"$ref": "#/components/schemas/GiftCard"
},
"gcs": {
"type": "array",
"description": "Array of applied Gift Cards.",
"items": {
"$ref": "#/components/schemas/GiftCard"
}
},
"payments": {
"type": "object",
"description": "If the order has a gift card, shows how much is paid by the gift card and how much by the user",
"properties": {
"gc": {
"type": "number",
"description": "Amount paid by the gift card"
},
"user": {
"type": "number",
"description": "Amount paid by the user"
}
}
},
"total_payments": {
"type": "object",
"description": "If the order has a gift card, shows how much is paid by the gift card and how much by the user",
"properties": {
"gc": {
"type": "number",
"description": "Amount paid by the gift card"
},
"user": {
"type": "number",
"description": "Amount paid by the user"
}
}
},
"tips": {
"type": "object",
"description": "If the order has a gift card, shows how much of the tip is paid by the user and how much by the gift card",
"properties": {
"gc": {
"type": "number",
"description": "Amount paid by the gift card"
},
"user": {
"type": "number",
"description": "Amount paid by the user"
}
}
},
"total_tips": {
"type": "object"
},
"vehicle": {
"type": "object",
"description": "The make, model, and color of the vehicle for a curbside pickup order",
"properties": {
"make": {
"type": "string",
"description": "The make of the vehicle"
},
"model": {
"type": "string",
"description": "The model of the vehicle"
},
"color": {
"type": "string",
"description": "The color of the vehicle"
}
}
},
"third_party_marketplace": {
"type": "string",
"description": "String with a set of options: ubereats, doordash, postmates, google. First party orders have a null value."
},
"handoff": {
"type": "object",
"description": "Settings for overriding POS price and tax values on handoff orders",
"properties": {
"override_pos_prices": {
"type": "boolean",
"description": "If true the POS should accept our prices as passed, if false the POS rejects the order if these values don't match the POS."
},
"override_pos_taxes": {
"type": "boolean",
"description": "If true the POS should accept our taxes as passed, if false the POS rejects the order if these values don't match the POS."
}
}
},
"checkout_behaviors": {
"type": "object",
"description": "Rules for checkout page UI.",
"properties": {
"allowed_payment_types": {
"type": "array",
"description": "Allowed payment types for this order (lu, cc, gc, ap, gp, pip, handoff).",
"items": {
"type": "string"
}
},
"allowed_order_types": {
"type": "array",
"description": "Possible order types for this order (takeout, delivery, delivery_by_provider, curbside, dine_in).",
"items": {
"type": "string"
}
},
"order_types_optional_telephone_number": {
"type": "array",
"description": "Order types that do not require telephone number to be provided to complete an order, empty if phone required for any order type.",
"items": {
"type": "string"
}
},
"tips": {
"type": "object",
"description": "Restrictions for order tips.",
"properties": {
"allowed": {
"type": "boolean",
"description": "True, if tips are allowed for this order."
},
"required": {
"type": "boolean",
"description": "If true, user must specify a tip, if false, you can add 'No tip' option."
},
"max_value": {
"type": "number",
"description": "Max tip value."
},
"percents": {
"type": "array",
"description": "Array of percents that should be shown to user.",
"items": {
"type": "integer"
}
},
"default_percent": {
"type": "integer",
"nullable": true,
"description": "Default percent value."
},
"allowed_payment_types": {
"type": "array",
"description": "List of payment types that allow tips.",
"items": {
"type": "string"
}
}
}
}
}
},
"pending_validation": {
"type": "boolean",
"description": "If true, the order details have been submitted to the POS for validation and pricing overrides but the POS hasn't yet responded with its update. Pricing, tax and fees should not be considered final when this field is true."
},
"api_request_id": {
"type": "string"
}
}
},
"WebhookOrder": {
"description": "The order object sent as `order_data` in order webhook notifications (`new_order`, `order_updated`, `order_dsp_event`, `validate_order` and `calculate_order`). This differs from the [Order](#model-Order) object returned by `GET /orders`: all `*_time` fields are integer UNIX timestamps rather than formatted datetime strings, the `*_timestamp` duplicates (`creation_timestamp`, `submit_timestamp`, etc.) are not sent, and API-response-only fields such as `events`, `payment_type`, `order_state_key`, `checkout_behaviors`, and `pending_validation` are not included. Fields without a value on the order are omitted; values may be `null`. Nested objects with no properties may be serialized as an empty JSON array (`[]`). For orders paid through a third-party marketplace (handoff) without card details, `new_order`, `order_updated` and `order_dsp_event` send a placeholder `card` (`type` `visa`, `digits` `1111`, `token` `handoff`, `zip` `null`); `validate_order` and `calculate_order` do not.",
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Order ID"
},
"name": {
"type": "string",
"description": "The restaurant name to which this order belongs"
},
"restaurant": {
"type": "string",
"description": "The restaurant ID for the given order"
},
"status": {
"type": "string",
"description": "Textual order status, suitable for display"
},
"s": {
"type": "integer",
"description": "Integer Order Status: 0 - created, 1 - submitted, 2 - done successful, 3 - pending confirmation, 4 - done unsuccessful"
},
"c": {
"type": "integer",
"description": "Integer Order Confirmation Status: 0 - submitted, 1 - confirmed, 2 - adjusted, 3 - rejected, 4 - done successful"
},
"paid": {
"type": "integer",
"description": "1 - Paid, 0 - Not Prepaid",
"enum": [
0,
1
]
},
"type": {
"type": "string",
"description": "The order type, either takeout, delivery or dinein",
"nullable": true
},
"submit_url": {
"type": "string",
"description": "URL used to submit the order"
},
"items": {
"type": "array",
"description": "The items that were ordered",
"items": {
"$ref": "#/components/schemas/WebhookOrderItem"
}
},
"fee": {
"type": "number",
"description": "Order fee amount. Sent as a number (GET /orders documents this as a string)"
},
"total_amount": {
"type": "number",
"description": "The total amount of the order, including taxes and fees"
},
"tax": {
"type": "number",
"description": "The order tax amount"
},
"active_taxes": {
"type": "array",
"description": "Custom taxes/fees applied to the order, in addition to the standard sales tax value (tax field)",
"items": {
"$ref": "#/components/schemas/WebhookOrderTax"
}
},
"subtotal": {
"type": "number",
"description": "The order subtotal"
},
"delivery_fee": {
"type": "number",
"description": "Delivery fee amount"
},
"delivery_min": {
"type": "number",
"description": "Delivery order minimum (delivery orders only)"
},
"time": {
"type": "integer",
"description": "The promised and required lead time in minutes, usually displayed if not an advance order (with order_date and eta)"
},
"active_coupons": {
"type": "array",
"description": "The coupons that are applied to the order",
"items": {
"$ref": "#/components/schemas/WebhookCoupon"
}
},
"inactive_coupons": {
"type": "array",
"description": "Inactive coupons that are added to the order",
"items": {
"$ref": "#/components/schemas/WebhookCoupon"
}
},
"coupons": {
"type": "array",
"description": "All coupons that are added to the order (applied or not)",
"items": {
"$ref": "#/components/schemas/WebhookCoupon"
}
},
"ordering_for": {
"type": "string",
"description": "Possible values: now, later. Orders for later include order_date and eta",
"enum": [
"now",
"later"
]
},
"order_date": {
"type": "string",
"description": "For advance orders, the date to use, in `MM/DD/YYYY` format"
},
"eta": {
"type": "string",
"description": "For advance orders, the time to use, in `H:MM AM` format, like `9:30 PM`"
},
"short_id": {
"type": "integer",
"description": "The human-friendly order number"
},
"u": {
"type": "string",
"description": "The customer ID"
},
"customer_name": {
"type": "string",
"description": "The full name of the customer"
},
"customer_phone": {
"type": "string",
"description": "The customer's phone number",
"nullable": true
},
"customer_address": {
"type": "string",
"description": "The full delivery address of the customer (not sent for takeout orders)"
},
"address": {
"type": "string",
"description": "The street address (not sent for takeout orders)"
},
"address_line_2": {
"type": "string",
"description": "Additional information for given address, like room number, floor number etc. (not sent for takeout orders)"
},
"zip": {
"type": "string",
"description": "The zip/post code (not sent for takeout orders)",
"nullable": true
},
"special_instructions": {
"type": "string",
"description": "Delivery instructions for delivery orders"
},
"card": {
"$ref": "#/components/schemas/WebhookOrderCard"
},
"refunded": {
"type": "boolean",
"description": "True if the order has received a refund (partial or complete)"
},
"refund_records": {
"type": "array",
"description": "If refunds have been issued for the order, a list of refund records",
"items": {
"$ref": "#/components/schemas/WebhookRefundRecord"
}
},
"company": {
"type": "string",
"description": "The company name, if ordering for a company"
},
"tip": {
"type": "number",
"description": "The total tip amount, if one was provided. tip = tip_third_party + tip_merchant"
},
"tip_third_party": {
"type": "number",
"description": "The tip amount allocated to 3rd parties, such as delivery drivers"
},
"tip_merchant": {
"type": "number",
"description": "The tip amount allocated to the merchant"
},
"feedback": {
"oneOf": [
{
"$ref": "#/components/schemas/WebhookFeedback"
},
{
"type": "array",
"description": "Empty array, sent when the feedback has no values",
"maxItems": 0
}
]
},
"courier_due_ts": {
"type": "number",
"description": "If a delivery courier is used, the time that the courier should deliver the order by, as a UNIX timestamp (seconds since epoch). Sent as a number"
},
"app_id": {
"type": "string",
"description": "App ID",
"nullable": true
},
"fields": {
"type": "array",
"description": "Custom Checkout field values",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Field name"
},
"value": {
"type": "string",
"description": "Field value",
"nullable": true
}
}
}
},
"favorite": {
"type": "boolean",
"description": "Is this order a user favourite?"
},
"submit_now": {
"type": "boolean",
"description": "Whether the order could be submitted as an ASAP order"
},
"rewards": {
"type": "array",
"description": "Loyalty rewards applied to the order",
"items": {
"$ref": "#/components/schemas/WebhookReward"
}
},
"comps": {
"type": "array",
"description": "Comps applied to the order",
"items": {
"$ref": "#/components/schemas/WebhookReward"
}
},
"gc_number": {
"type": "string",
"description": "Gift Card number"
},
"currency": {
"type": "string",
"description": "The currency used for this order"
},
"combos": {
"type": "array",
"description": "Combos in order",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Combo ID in order"
},
"name": {
"type": "string",
"description": "Combo name"
},
"combo_item_id": {
"type": "string",
"description": "Combo item ID"
},
"pos": {
"type": "string",
"description": "Combo POS ID"
}
}
}
},
"donation": {
"type": "number",
"description": "Donation amount"
},
"location": {
"$ref": "#/components/schemas/UserLocation"
},
"courier": {
"type": "object",
"description": "Courier info. Not all couriers support it",
"properties": {
"name": {
"type": "string",
"description": "Courier name"
},
"phone": {
"type": "string",
"description": "Courier phone"
}
}
},
"tracking_url": {
"type": "string",
"description": "URL to track delivery"
},
"delivery_type": {
"type": "string",
"description": "Indicates whether an order was delivered by the restaurant (own) or a 3rd party delivery service provider (dsp). Not sent for takeout orders"
},
"due_timestamp": {
"type": "integer",
"description": "The time that the restaurant should have the order ready, as an integer UNIX timestamp (seconds since epoch). Not a formatted datetime string.",
"format": "int64"
},
"creation_time": {
"type": "integer",
"description": "The time that the order was originally created (initiated by the customer), as an integer UNIX timestamp (seconds since epoch). Not a formatted datetime string.",
"format": "int64"
},
"submit_time": {
"type": "integer",
"description": "The time that the order was submitted, as an integer UNIX timestamp (seconds since epoch). Not a formatted datetime string.",
"format": "int64"
},
"confirm_time": {
"type": "integer",
"description": "The time that the restaurant confirmed the order, as an integer UNIX timestamp (seconds since epoch). Not a formatted datetime string.",
"format": "int64"
},
"cancel_time": {
"type": "integer",
"description": "The time that the order was canceled, as an integer UNIX timestamp (seconds since epoch). Not a formatted datetime string.",
"format": "int64"
},
"asap_lead_time": {
"type": "integer",
"description": "The soonest time that the order could be ready, in minutes"
},
"asap_submit_datetime_iso": {
"type": "string",
"description": "If the order cannot be submitted now, the next available time that the order could be submitted, in ISO format"
},
"asap_submit_eta": {
"type": "string",
"description": "If the order cannot be submitted now, the next time that the order could be submitted for"
},
"auto_gc": {
"$ref": "#/components/schemas/WebhookGiftCard"
},
"gcs": {
"type": "array",
"description": "Applied Gift Cards",
"items": {
"$ref": "#/components/schemas/WebhookGiftCard"
}
},
"payments": {
"type": "object",
"description": "If the order has a gift card, shows how much is paid by the gift card and how much by the user",
"properties": {
"gc": {
"type": "number",
"description": "Amount paid by gift card"
},
"user": {
"type": "number",
"description": "Amount paid by user"
}
}
},
"tips": {
"type": "object",
"description": "If the order has a gift card, shows how much of the tip is paid by the gift card and how much by the user",
"properties": {
"gc": {
"type": "number",
"description": "Tip amount paid by gift card"
},
"user": {
"type": "number",
"description": "Tip amount paid by user"
}
}
},
"vehicle": {
"type": "object",
"description": "The make, model, and color of the vehicle for a curbside pickup order",
"properties": {
"make": {
"type": "string",
"description": "The make of the vehicle"
},
"model": {
"type": "string",
"description": "The model of the vehicle"
},
"color": {
"type": "string",
"description": "The color of the vehicle"
}
}
},
"third_party_marketplace": {
"type": "string",
"description": "The third-party marketplace the order came from, such as ubereats, doordash, postmates, google. Omitted for first party orders"
},
"handoff": {
"type": "object",
"description": "Settings for overriding POS price and tax values on handoff orders",
"properties": {
"override_pos_prices": {
"type": "boolean",
"description": "If true the POS should use the prices sent in the order"
},
"override_pos_taxes": {
"type": "boolean",
"description": "If true the POS should use the taxes sent in the order"
}
}
},
"restaurant_tax_to_pay": {
"type": "number",
"description": "For marketplace orders, the tax amount the restaurant is responsible for remitting"
},
"marketplace_tax_to_pay": {
"type": "number",
"description": "For marketplace orders, the tax amount the marketplace is responsible for remitting"
},
"is_catering": {
"type": "boolean",
"description": "Indicates whether the order contains an item that is catered.",
"deprecated": true
},
"contactless_delivery": {
"type": "boolean",
"description": "Whether the customer requested contactless delivery"
},
"additional_reference_ids": {
"type": "array",
"description": "Additional external reference IDs for the order",
"items": {
"type": "string"
}
},
"kiosk": {
"type": "string",
"description": "Kiosk identifier, for kiosk orders"
},
"catering": {
"$ref": "#/components/schemas/WebhookOrderCatering"
},
"total_fed_headcount": {
"type": "integer",
"description": "Present for catering locations only. The total number of guests this order will feed."
}
}
},
"WebhookOrderItem": {
"description": "An ordered item as sent in [WebhookOrder](#model-WebhookOrder) `items`",
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Unique ID of this item within the order"
},
"menuitem": {
"type": "string",
"description": "Menu item ID"
},
"name": {
"type": "string",
"description": "Item name"
},
"quantity": {
"type": "string",
"description": "Quantity ordered. Sent as a string"
},
"options": {
"type": "array",
"description": "Selected options",
"items": {
"$ref": "#/components/schemas/WebhookOrderOption"
},
"nullable": true
},
"category": {
"type": "string",
"description": "Menu category name"
},
"tax": {
"type": "number",
"description": "Tax amount for this item"
},
"active_taxes": {
"type": "array",
"description": "Custom taxes/fees applied to this item",
"items": {
"$ref": "#/components/schemas/WebhookOrderTax"
}
},
"price": {
"type": "number",
"description": "Unit price of the item",
"nullable": true
},
"total_price": {
"type": "number",
"description": "Total price of the item including options and quantity, rounded to 2 decimal places"
},
"size": {
"type": "string",
"description": "Selected size"
},
"notes": {
"type": "string",
"description": "Special instructions for the item"
},
"hours": {
"type": "object",
"description": "Item availability hours. Each value is the number of minutes past midnight, as an integer",
"properties": {
"m_open": {
"type": "integer"
},
"m_close": {
"type": "integer"
},
"t_open": {
"type": "integer"
},
"t_close": {
"type": "integer"
},
"w_open": {
"type": "integer"
},
"w_close": {
"type": "integer"
},
"th_open": {
"type": "integer"
},
"th_close": {
"type": "integer"
},
"f_open": {
"type": "integer"
},
"f_close": {
"type": "integer"
},
"s_open": {
"type": "integer"
},
"s_close": {
"type": "integer"
},
"su_open": {
"type": "integer"
},
"su_close": {
"type": "integer"
}
}
},
"pos": {
"type": "string",
"description": "POS ID of the item"
},
"combo_id": {
"type": "string",
"description": "ID of the combo this item belongs to, if any"
}
}
},
"WebhookOrderOption": {
"description": "A selected option on a [WebhookOrderItem](#model-WebhookOrderItem)",
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Option name"
},
"pos": {
"type": "string",
"description": "POS ID of the option"
},
"prices": {
"description": "Option price by item size, keyed by size name. Serialized as a JSON array when the keys are sequential, and as an empty JSON array (`[]`) when there are no prices",
"oneOf": [
{
"type": "object",
"additionalProperties": {
"type": "number"
}
},
{
"type": "array",
"items": {
"type": "number"
}
}
]
},
"cal": {
"type": "string",
"description": "Calories"
},
"is_default": {
"type": "boolean"
},
"is_disabled": {
"type": "boolean"
},
"call_center_only": {
"type": "boolean"
},
"option_name": {
"type": "string",
"description": "Display name of the selected option"
},
"quantity": {
"type": "integer",
"description": "Option quantity"
},
"group_name": {
"type": "string",
"description": "Option group name"
},
"level": {
"description": "Selected option level, e.g. Light or Extra. An empty value is sent as an empty JSON object (`{}`)",
"oneOf": [
{
"type": "string"
},
{
"type": "object",
"description": "Empty object, sent when the value is empty",
"maxProperties": 0
}
]
},
"is_default_level": {
"type": "boolean"
},
"multiplier": {
"description": "Option level price multiplier, e.g. `1`, `2` or `1.5`. A multiplier of `0` is sent as an empty JSON object (`{}`)",
"oneOf": [
{
"type": "number"
},
{
"type": "object",
"description": "Empty object, sent when the value is empty",
"maxProperties": 0
}
]
},
"category_pos": {
"description": "Option group POS ID, sent as-is from the order. Usually a string (numeric or a POS GUID), but some POS integrations send an integer. An empty value is sent as an empty JSON object (`{}`)",
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
},
{
"type": "object",
"description": "Empty object, sent when the value is empty",
"maxProperties": 0
}
]
},
"price": {
"type": "number",
"description": "Option price"
},
"base_price": {
"type": "number",
"description": "Option base price"
}
}
},
"WebhookOrderTax": {
"description": "A custom tax/fee applied to an order or item in a [WebhookOrder](#model-WebhookOrder)",
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "The name of the tax/fee"
},
"tax_id": {
"type": "string",
"description": "A tax ID to print along with the tax name (for legal purposes, not a system ID)",
"nullable": true
},
"rate": {
"type": "number",
"description": "The tax rate, like 0.10 for 10%. Sent as a number"
},
"order_type": {
"type": "string",
"description": "The order type to which the tax applies (takeout, delivery)"
},
"amount": {
"type": "number",
"description": "The calculated amount of the tax"
},
"incl": {
"type": "boolean",
"description": "Is this an 'inclusive' tax, such as GST / VAT, where the tax is already included in the sales price?"
}
}
},
"WebhookCoupon": {
"description": "A coupon added to a [WebhookOrder](#model-WebhookOrder)",
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Coupon ID"
},
"name": {
"type": "string",
"description": "Coupon name"
},
"code": {
"type": "string",
"description": "Coupon code"
},
"restaurant": {
"type": "string",
"description": "Restaurant ID"
},
"active": {
"type": "boolean"
},
"auto_apply": {
"type": "boolean"
},
"percent": {
"type": "number",
"description": "Percent discount"
},
"free_items": {
"type": "array",
"description": "Free item rules",
"items": {
"type": "object",
"properties": {
"items": {
"type": "array",
"items": {
"type": "string"
}
},
"sizes": {
"type": "array",
"items": {
"type": "string"
}
},
"qty": {
"type": "integer"
}
}
}
},
"discount_items": {
"type": "array",
"description": "Discounted item rules",
"items": {
"type": "object",
"properties": {
"items": {
"type": "array",
"items": {
"type": "string"
}
},
"size": {
"type": "string"
},
"price": {
"type": "number",
"nullable": true
},
"amt": {
"type": "number",
"nullable": true
},
"pct": {
"type": "number"
},
"batch": {
"type": "integer"
}
}
}
},
"require": {
"description": "Coupon requirements. Serialized as an empty JSON array (`[]`) when there are none",
"oneOf": [
{
"type": "object",
"properties": {
"items": {
"type": "array",
"items": {
"type": "string"
}
},
"sizes": {
"type": "array",
"items": {
"type": "string"
}
},
"qty": {
"type": "integer"
},
"opt_groups": {
"type": "array",
"items": {
"type": "string"
}
},
"opt_qty": {
"type": "integer"
},
"price": {
"type": "number"
}
}
},
{
"type": "array",
"maxItems": 0
}
]
},
"order_type": {
"type": "string"
},
"discount": {
"type": "number",
"description": "Discount amount"
},
"still_tax": {
"type": "boolean"
},
"flat": {
"type": "number",
"description": "Flat discount amount"
}
}
},
"WebhookOrderCard": {
"description": "Payment card info sent in a [WebhookOrder](#model-WebhookOrder)",
"type": "object",
"properties": {
"type": {
"type": "string"
},
"digits": {
"type": "string"
},
"month": {
"type": "string"
},
"year": {
"type": "string"
},
"token": {
"type": "string"
},
"email": {
"type": "string"
},
"first_name": {
"type": "string"
},
"last_name": {
"type": "string"
},
"address1": {
"type": "string"
},
"address2": {
"type": "string"
},
"city": {
"type": "string"
},
"state": {
"type": "string"
},
"zip": {
"type": "string",
"nullable": true
},
"country": {
"type": "string"
},
"phone_number": {
"type": "string"
}
}
},
"WebhookRefundRecord": {
"description": "A refund record sent in a [WebhookOrder](#model-WebhookOrder)",
"type": "object",
"properties": {
"amount": {
"type": "number",
"description": "Refund amount"
},
"reason": {
"type": "string",
"description": "Refund reason",
"nullable": true
},
"fault": {
"type": "string",
"description": "Party at fault"
},
"date": {
"type": "string",
"description": "Refund time, as a UNIX timestamp (seconds since epoch) sent as a numeric string"
},
"success": {
"type": "boolean",
"description": "Whether the refund succeeded"
}
}
},
"WebhookFeedback": {
"description": "Customer feedback sent in a [WebhookOrder](#model-WebhookOrder)",
"type": "object",
"properties": {
"food": {
"type": "integer"
},
"foodwhy": {
"type": "string"
},
"service": {
"type": "integer"
},
"servicewhy": {
"type": "string"
},
"value": {
"type": "integer"
},
"valuewhy": {
"type": "string"
},
"recommend": {
"type": "integer"
},
"repeat": {
"type": "integer"
},
"repeatwhy": {
"type": "string"
},
"comments": {
"type": "string"
}
}
},
"WebhookGiftCard": {
"description": "A gift card sent in a [WebhookOrder](#model-WebhookOrder)",
"type": "object",
"properties": {
"gc_number": {
"type": "string",
"description": "Gift card number"
},
"balance": {
"type": "number",
"description": "Gift card balance"
},
"reg_code": {
"type": "string",
"description": "Registration code",
"nullable": true
},
"amount": {
"type": "number",
"description": "Amount applied to the order"
},
"auto": {
"type": "boolean",
"description": "Whether the gift card was applied automatically"
}
}
},
"WebhookReward": {
"description": "A loyalty reward sent in a [WebhookOrder](#model-WebhookOrder)",
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Reward ID"
},
"name": {
"type": "string",
"description": "Reward name"
},
"wallet_code": {
"type": "integer"
},
"quantity_redeemed": {
"type": "number"
},
"discount_type": {
"type": "string"
},
"apply_automatically": {
"type": "boolean"
},
"key": {
"type": "string"
},
"amount": {
"type": "number",
"description": "Reward discount amount"
},
"item_rewards": {
"type": "array",
"description": "Per-item reward discounts",
"items": {
"type": "object",
"properties": {
"ordered_item_id": {
"type": "string",
"description": "ID of the discounted item within the order"
},
"amount": {
"type": "number"
},
"quantity_discounted": {
"type": "integer"
},
"unit_discount": {
"type": "number"
}
}
}
}
}
},
"WebhookOrderCatering": {
"description": "Catering details sent in a [WebhookOrder](#model-WebhookOrder)",
"type": "object",
"properties": {
"status": {
"type": "string",
"description": "Current status of the catering order.",
"enum": [
"started",
"pending",
"approved",
"rejected",
"locked",
"done"
]
},
"payment_status": {
"type": "string",
"description": "Current payment status of the catering order",
"enum": [
"not_paid",
"partially_paid",
"paid",
"failed"
]
},
"partial_payment_amount": {
"type": "number",
"description": "The amount paid by the guest when submitting the order."
},
"remaining_amount": {
"type": "number",
"description": "The amount remaining to be paid by the guest.",
"nullable": true
},
"required_fed_headcount": {
"type": "integer",
"description": "The number of people the guest indicated this order should serve."
},
"occasion": {
"type": "string",
"description": "A description of the event being catered inputted by the guest."
},
"last_edit_at": {
"type": "string",
"description": "The time that this order was last edited after original submission, as a UNIX timestamp (seconds since epoch) sent as a numeric string",
"nullable": true
},
"lock_timestamp": {
"type": "integer",
"description": "The time this order was locked, as an integer UNIX timestamp",
"nullable": true
},
"send_timestamp": {
"type": "integer",
"description": "The time this order was sent to the POS, as an integer UNIX timestamp",
"nullable": true
}
}
},
"SuggestedOrder": {
"description": "Suggested Order data",
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "ID of the Suggested Order"
},
"original_order_id": {
"type": "string",
"description": "ID of original Order that this Suggested Order is based off of"
},
"name": {
"type": "string",
"description": "Name of the Suggested Order"
},
"description": {
"type": "string",
"description": "Description of the Suggested Order"
},
"image": {
"type": "string",
"description": "URL of the image for the Suggested Order"
},
"items": {
"type": "array",
"description": "The [items](#model-MenuItem) that were ordered",
"items": {
"$ref": "#/components/schemas/OrderItem"
}
},
"catering": {
"$ref": "#/components/schemas/Catering"
},
"subtotal": {
"type": "number",
"description": "The order subtotal"
},
"restaurant": {
"type": "string",
"description": "The restaurant ID for the given order"
},
"app_id": {
"type": "string",
"description": "App ID"
},
"total_fed_headcount": {
"type": "integer",
"description": "Field is present for catering locations only. The total number of guests this order will feed."
}
}
},
"Rewards": {
"description": "Applicable Rewards for user selection, Auto-redemption rewards will NOT be included",
"type": "array",
"items": {
"$ref": "#/components/schemas/Reward"
}
},
"Tag": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "ID of the tag, which links this tag to menu items"
},
"name": {
"type": "string",
"description": "The tag name that will be displayed"
},
"visible": {
"type": "boolean",
"description": "Is this tag visible to guests (can only be enabled if 'dietary' is enabled)"
},
"dietary": {
"type": "boolean",
"description": "Is this tag a dietary option i.e. Gluten Free"
},
"bulk_disable": {
"type": "boolean",
"description": "Can all items with this tag be bulk disabled in the tablet app"
},
"turned_off": {
"type": "boolean",
"default": false,
"description": "Have the items with this tag been set to active/inactive via this tag"
}
}
},
"DeliveryArea": {
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": [
"p",
"r"
],
"description": "Shape of area, p - polygon, r - rectangle"
},
"bounds": {
"description": "Boundary points.",
"type": "array",
"items": {
"type": "array",
"description": "Two elements array. Coordinates of boundary points.",
"items": {
"type": "number"
}
}
},
"fee": {
"type": "integer",
"description": "Delivery fee for this area"
},
"lead": {
"type": "integer",
"description": "Delivery Time (In Addition to Lead Time)"
},
"min_tip": {
"type": "number",
"description": "Minimum tip amount"
}
}
},
"CustomCheckoutField": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "This is used as the field label on the checkout form"
},
"label": {
"type": "string",
"description": " The text that will appear to customers at checkout instead of the Field Name. Learn more by [visiting here](http://support.opendining.net/article/227-creating-a-custom-checkout-field)."
},
"help_text": {
"type": "string",
"description": "Descriptive help text for users"
},
"type": {
"type": "string",
"description": "The field type to display: text - Single-line Text, textarea - Multi-line Text, select - Dropdown List"
},
"required": {
"type": "string",
"description": "True, if this field is required"
},
"order_type": {
"type": "string",
"description": "What order types should this field be shown on? Values: both, delivery, takeout "
},
"character_limit": {
"type": "string",
"description": "Number of characters customers may enter for this field"
},
"form_name": {
"type": "string",
"description": "Name of form field"
},
"options": {
"type": "array",
"items": {
"type": "string"
}
},
"default_option": {
"type": "string"
}
}
},
"CrossSell": {
"type": "object",
"description": "Cross-selling automatically prompts customers to add related items to their order, like a drink or a side item",
"properties": {
"cs_cats": {
"type": "object",
"nullable": true,
"description": "Specific cross-sells for each category",
"properties": {
"{category_name}": {
"type": "array",
"items": {
"type": "string",
"description": "[Menu item](#model-MenuItem) ID"
}
}
}
},
"cs_auto": {
"type": "boolean",
"description": "Price-Based Cross-Sells enabled.
Auto-suggest items by price -- suggest \"cheaper\" items when \"more expensive\" items are ordered"
},
"cs_min": {
"type": "integer",
"description": "Min. Price to do Cross-Sell.
Only show automatic cross-sells when the item ordered is priced above this amount"
},
"cs_freq": {
"type": "integer",
"description": "Frequency to Show.
Frequency to show the cross-sell prompt when the customer adds items to their order (to avoid annoying them with popups each time)"
},
"cs_max_show": {
"type": "integer",
"description": "Max. Times to Show.
The maximum number of times to try cross-selling for a given order"
},
"api_request_id": {
"type": "string"
}
}
},
"OrderReport": {
"type": "object",
"properties": {
"restaurant_id": {
"type": "string",
"description": "Restaurant ID"
},
"restaurant_name": {
"type": "string",
"description": "Restaurant Name"
},
"order_id": {
"type": "string",
"description": "Order ID"
},
"order_number": {
"type": "integer",
"description": "Order number / short ID (not unique)"
},
"customer_name": {
"type": "string",
"description": "Customer name"
},
"customer_email": {
"type": "string",
"description": "Customer email"
},
"customer_phone": {
"type": "string",
"description": "Customer phone number"
},
"item_count": {
"type": "integer",
"description": "Number of items in the order"
},
"is_guest": {
"type": "boolean",
"description": "Is this user registered with an account?"
},
"is_reorder": {
"type": "boolean",
"description": "Is this a reorder?"
},
"order_type": {
"type": "string",
"enum": [
"takeout",
"delivery"
],
"description": "Order type (takeout or delivery)"
},
"subtotal": {
"type": "number",
"description": "Order Subtotal"
},
"total_amount": {
"type": "number",
"description": "Order Total"
},
"coupon_discount": {
"type": "number",
"description": "Coupon discount amount, if an"
},
"coupon_code": {
"type": "string",
"description": "Coupon code, if any"
},
"submit_time": {
"type": "integer",
"description": "Time submitted by the customer, in UNIX timestamp format"
},
"confirm_time": {
"type": "integer",
"description": "Time confirmed by the restaurant, in UNIX timestamp format"
},
"due_time": {
"type": "integer",
"description": "Time due by the restaurant, in UNIX timestamp format"
},
"courier_due_time": {
"type": "integer",
"description": "Time due by the courier, in UNIX timestamp format"
},
"ready_time": {
"type": "integer",
"description": "Time ready for pick up, in UNIX timestamp format"
},
"time_delivered": {
"type": "number",
"description": "Time delivered, in UNIX timestamp format"
},
"correct_score": {
"type": "boolean",
"description": "Order correctness - Either true, false, or null if no value was provided"
},
"food_score": {
"type": "integer",
"description": "Order score out of 5"
},
"service_score": {
"type": "integer",
"description": "Service score out of 5"
},
"comments": {
"type": "string",
"description": "Comments"
},
"user_app": {
"type": "string",
"description": "The 'app' used to submit the order, like web, mobile. Corresponds to the 'app' parameter when creating orders"
},
"source": {
"type": "string",
"description": "The 'source' of the order, like a marketing campaign. Corresponds to the 'source' parameter when creating orders"
},
"ua": {
"type": "string",
"description": "The user agent string for the user's browser or device"
},
"status": {
"type": "integer",
"description": "The numeric status of the order. Values: 0: Created; 1: Submitted; 2: Completed Successfully; 3: Pending Confirmation; 4: Completed Unsuccessfully"
},
"status_desc": {
"type": "string",
"description": "Text status of the order -- this is a more flexible field and can contain customer-specific values. Values are like Created, Submitted, Received, Processing, Delivered, Canceled, but may contain any other free text configured by the restaurant"
},
"confirmation_status": {
"type": "integer",
"description": "The numeric confirmation status of the order. Values: 0: Submitted; 1: Confirmed; 2: Unused for data purposes; 3: Rejected; 4: Completed Successfully"
},
"is_refunded": {
"type": "boolean",
"description": "Does the order have one or more refunds associated with it?"
},
"refund_records": {
"type": "array",
"description": "Refund records for the order",
"items": {
"$ref": "#/components/schemas/RefundRecord"
}
},
"cancel_time": {
"type": "integer",
"description": "UNIX timestamp of the order cancellation time, for canceled orders"
},
"reject_time": {
"type": "integer",
"description": "UNIX timestamp of the order rejection time, for orders that were rejected by the restaurant"
},
"marketing_vouchers": {
"type": "number",
"description": "Amount of marketing vouchers applied to the order"
},
"marketing_vouchers_reversed": {
"type": "number",
"description": "Amount of marketing vouchers reversed for order refunds"
},
"is_checkout_started": {
"type": "boolean",
"description": "Did the customer start checkout?"
},
"checkout_start_time": {
"type": "integer",
"description": "UNIX timestamp of the checkout start time"
},
"amount_refunded": {
"type": "number",
"description": "Total amount of all refunds on the order"
},
"refund_fault": {
"type": "string",
"description": "Refund faulting party / payer"
},
"refund_date": {
"type": "integer",
"description": "UNIX timestamp of the first refund time"
},
"refund_reason": {
"type": "string",
"description": "Reason for the refund"
},
"marketing_revenue": {
"type": "number",
"description": "Amount of marketing revenue for the order"
},
"marketing_delivery_revenue": {
"type": "number",
"description": "Amount of marketing delivery revenue for the order"
},
"is_prepaid": {
"type": "boolean",
"description": "Was the order prepaid with a credit card?"
},
"card_type": {
"type": "string",
"description": "The credit card type, for prepaid orders"
},
"tax": {
"type": "number",
"description": "Tax amount"
},
"tip": {
"type": "number",
"description": "Tip amount"
},
"delivery_fee": {
"type": "number",
"description": "Delivery fee amount"
},
"convenience_fee": {
"type": "number",
"description": "Convenience fee amount, if charged"
},
"new_registrant": {
"type": "boolean",
"description": "Was the order placed by a new registrant? In other words, is this a first order for a non-guest user?"
},
"is_first_order": {
"type": "boolean",
"description": " Is this the first order for this user?"
},
"items": {
"$ref": "#/components/schemas/OrderItemReport"
},
"is_abandoned": {
"type": "boolean",
"description": "Is this order abandoned?"
},
"is_fraud_auto_approved": {
"type": "boolean",
"description": "Was this order automatically approved by fraud scoring?"
},
"is_fraud_auto_rejected": {
"type": "boolean",
"description": "Was this order automatically rejected by fraud scoring?"
},
"is_fraud_manual_reviewed": {
"type": "boolean",
"description": "Was this order manually reviewed for fraud?"
},
"is_fraud_manual_approved": {
"type": "boolean",
"description": "Was this order manually approved during fraud review?"
},
"is_fraud_manual_rejected": {
"type": "boolean",
"description": "Was this order manually rejected during fraud review?"
},
"authorization_transaction_id": {
"type": "string",
"description": "The ID of the authorization transaction for the order, if the order was authorized before it was paid/captured"
},
"payment_transaction_id": {
"type": "string",
"description": "The ID for the payment (capture) transaction for the order"
}
}
},
"OrderItemReport": {
"type": "object",
"properties": {
"restaurant_name": {
"type": "string"
},
"name": {
"type": "string"
},
"quantity": {
"type": "integer"
},
"base_price": {
"type": "number"
},
"price_with_selected_options": {
"type": "number"
},
"category": {
"type": "string"
},
"size": {
"type": "string"
},
"first_item": {
"type": "boolean"
},
"is_secret_menu_item": {
"type": "boolean"
},
"time_added": {
"type": "integer"
},
"is_abandoned": {
"type": "boolean"
}
}
},
"App": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "App Name"
},
"r": {
"type": "array",
"description": "Restaurants witch belong to this App",
"items": {
"type": "string"
}
},
"restaurants": {
"type": "array",
"description": "Restaurants witch belong to this App",
"items": {
"type": "string"
}
},
"donations": {
"type": "object",
"description": "Donation Settings",
"properties": {
"en": {
"type": "boolean",
"description": "True, if donations is enabled."
},
"open_amount": {
"type": "boolean",
"description": "Ability to show input for entering donation amount."
},
"help_msg": {
"type": "string",
"description": "Help Message for Donations input."
},
"amounts": {
"type": "array",
"items": {
"type": "object",
"description": "Coupons that correspond to order amounts.",
"properties": {
"amount": {
"type": "number"
},
"coupon": {
"type": "string"
}
}
}
}
}
},
"currency": {
"type": "string",
"description": "App currency"
},
"loyalty": {
"type": "object",
"properties": {
"enabled": {
"type": "boolean",
"description": "Allow customers to use loyalty program."
},
"allow_multiple": {
"type": "boolean",
"description": "Allow customers to redeem multiple rewards on a single order."
},
"allow_with_coupons": {
"type": "boolean",
"description": "Allow customers to redeem rewards and coupons on the same order."
},
"points_enabled": {
"type": "boolean",
"description": "Enable reward point display / redemption on items."
},
"size_suffix": {
"type": "boolean",
"description": "When sending rewards to the loyalty system, add size names to the reward IDs, in the format: \"Item-Size\"."
},
"allow_show_applicable_rewards": {
"type": "boolean",
"description": "Enable show applicable rewards redemption mode. Guests will be presented with all rewards applicable to their cart, even if they can’t all be applied together. This feature is currently supported only in Order Experience Builder and the OXB embedded mobile app. It is not compatible with modifier rewards at this time. We're working on expanding its functionality and will provide updates as soon as these restrictions are lifted."
},
"delivery_fee_item_id": {
"type": "string",
"description": "The delivery fee item id when sending rewards to the loyalty system."
},
"guest_account_px_url": {
"type": "string",
"description": "The custom domain guests will visit to edit their loyalty accounts. This should match what is configured in the PXS."
},
"guest_account_px_client_id": {
"type": "string",
"description": "Loyalty Client ID provided."
}
}
},
"rewards": {
"type": "object"
},
"forter": {
"type": "object"
},
"apple_pay_merchant_id": {
"type": "string",
"description": "App Apple Pay merchant ID"
},
"slug": {
"type": "string",
"description": "App slug"
},
"login_by_email": {
"type": "boolean"
},
"api_request_id": {
"type": "string"
}
}
},
"AppUserRegDetails": {
"type": "object",
"properties": {
"registered_count": {
"type": "integer",
"description": "Count of users who have registered for this app"
},
"ordered_count": {
"type": "integer",
"description": "Count of users who have ordered for this app"
},
"registered_but_not_ordered": {
"type": "integer",
"description": "Count of users who have registered but not ordered for this app"
},
"ordered_but_not_registered": {
"type": "integer",
"description": "Count of users who have ordered but not registered for this app"
},
"ordered_and_registered": {
"type": "integer",
"description": "Count of users who have ordered and registered for this app"
}
}
},
"GiftCard": {
"type": "object",
"properties": {
"gc_number": {
"type": "string",
"description": "Gift Card number."
},
"type": {
"type": "string"
},
"balance": {
"type": "number",
"description": "Gift Card balance."
},
"reg_code": {
"type": "string",
"description": "Reg Code"
},
"amount": {
"type": "number",
"description": "Amount will be paid by Gift Card"
},
"auto": {
"type": "boolean",
"description": "True, if the gift card was applied automatically. Used for PX Stored Value."
}
}
},
"CheckIn": {
"type": "object",
"properties": {
"timestamp": {
"type": "integer",
"description": "The date/time of the check-in, as a UNIX timestamp"
},
"application": {
"type": "string",
"description": "The application that provided the check-in"
},
"location": {
"type": "string",
"description": "The guest's location"
},
"message": {
"type": "string",
"description": "The check-in message"
},
"order_id": {
"type": "string",
"description": "The order ID"
},
"customer_name": {
"type": "string",
"description": "The customer's name"
},
"short_id": {
"type": "integer",
"description": "The order number"
},
"vehicle": {
"type": "string",
"description": "The make, model, and color of the customer's vehicle, if applicable"
}
}
},
"Curbside": {
"type": "object",
"description": "Curbside allows customers to select curbside on takeout/pick-up orders. If a customer selects curbside, need ask them for their vehicle make/model/color at checkout.",
"nullable": true,
"properties": {
"en": {
"type": "boolean",
"description": "True, if curbside is enabled for takeout/pick-up orders."
},
"label_text": {
"type": "string",
"description": "Curbside Label Text"
},
"label_help_text": {
"type": "string",
"description": "Help text below the curbside field on the order submit view, to help customers decide whether to select curbside."
},
"pick_up_instructions": {
"type": "string",
"description": "Pick-up instructions to give to customers. If customers should do anything special for curbside orders, enter those instructions here."
},
"show_call_button": {
"type": "boolean",
"description": "Show a button to allow guests to quickly call the store, using the phone number configured in General Settings."
},
"call_button_label": {
"type": "string",
"description": "The text to display on the call-store button."
},
"hide_takeout": {
"type": "boolean",
"description": "If a restaurant only offers curbside pick-up, but no other form of pick-up, this setting is enabled to hide the standard 'takeout' option at a start-order flow. Instead of showing separate options for takeout and curbside, a start-order flow should only show curbside."
},
"prepaid_only": {
"type": "boolean",
"description": "Enabling this setting will hide pay in person payment options and only allow prepaid payment options when checking out using curbside."
},
"check_in_enabled": {
"type": "boolean",
"description": "True, if the restaurant allows customers to check in for curbside orders when they arrive. This will typically be indicated via a check-in button on the order confirmation page."
},
"check_in_button_text": {
"type": "string",
"description": "The text to display on the check-in button."
},
"check_in_page_heading": {
"type": "string",
"description": "The heading on the check-in form."
},
"check_in_page_message": {
"type": "string",
"description": "The message on the check-in form."
},
"check_in_page_success_heading": {
"type": "string",
"description": "The heading that is displayed when a customer completes check-in."
},
"check_in_page_success_message": {
"type": "string",
"description": "The message that is displayed when a customer completes check-in."
},
"location_type": {
"type": "string",
"description": "A check-in location field type. Can be 'text' for free-text, 'numbered' for a numbered dropdown, or 'none' for no location field."
},
"location_number": {
"type": "integer",
"description": "If `location_type` is 'numbered', the number of spaces to display in the dropdown."
}
}
},
"OptionImage": {
"type": "object",
"description": "Option Image",
"properties": {
"name": {
"type": "string",
"description": "Image name"
},
"url": {
"type": "string",
"description": "Image url (required if groups array is empty)"
},
"groups": {
"type": "array",
"items": {
"type": "object",
"description": "Redefined group image",
"properties": {
"name": {
"type": "string",
"description": "Group name"
},
"url": {
"type": "string",
"description": "Image url"
}
}
}
}
}
},
"FavoriteMenuitem": {
"type": "object",
"description": "Favorite menuitem",
"properties": {
"name": {
"type": "string",
"description": "Menuitem name"
},
"category": {
"type": "string",
"description": "Menuitem category"
},
"favorite_name": {
"type": "string",
"description": "Saved name"
},
"menuitem": {
"type": "string",
"description": "Item ID in the menu"
},
"item": {
"type": "object",
"description": "Menuitem information",
"$ref": "#/components/schemas/MenuItem"
},
"size": {
"type": "string",
"description": "Saved item size"
},
"options": {
"type": "array",
"description": "List of saved options",
"items": {
"$ref": "#/components/schemas/Option"
}
},
"id": {
"type": "object",
"description": "Favorite item ID",
"properties": {
"$id": {
"type": "string",
"description": "ID"
}
}
},
"reorder_price": {
"type": "integer",
"description": "Item reorder price"
},
"order": {
"type": "string",
"description": "Order ID from which the item was saved"
},
"order_type": {
"type": "string",
"description": "Type of order to which you can add an item"
},
"sharing_url": {
"type": "string",
"description": "Link to share an item"
},
"active_taxes": {
"type": "array",
"items": {
"$ref": "#/components/schemas/OrderTax"
}
},
"capacity_group": {
"type": "string"
},
"combo_only": {
"type": "boolean"
},
"favorite": {
"type": "boolean",
"description": "Always true"
},
"key": {
"type": "string"
},
"ordered_count": {
"type": "integer"
},
"reorder_type": {
"type": "string"
},
"pos": {
"type": "string"
},
"price": {
"type": "integer"
},
"quantity": {
"type": "string"
},
"tax": {
"type": "integer"
},
"total_price": {
"type": "integer"
},
"incl_options_price": {
"type": "integer"
},
"new_price": {
"type": "integer"
},
"opts_price": {
"type": "integer"
}
}
},
"FavoriteCombo": {
"type": "object",
"description": "Favorite combo",
"properties": {
"name": {
"type": "string",
"description": "Combo name"
},
"favorite_name": {
"type": "string",
"description": "Saved name"
},
"menuitem": {
"type": "object",
"description": "Item ID in the menu",
"properties": {
"$id": {
"type": "string",
"description": "ID"
}
}
},
"combo_item_id": {
"type": "object",
"description": "Item ID in the menu",
"properties": {
"$id": {
"type": "string",
"description": "ID"
}
}
},
"item": {
"type": "object",
"description": "Combo information",
"$ref": "#/components/schemas/ComboItem"
},
"combo_items": {
"type": "array",
"description": "Short information of items included in the combo with saved options",
"items": {
"type": "object",
"description": "Menuitem info",
"properties": {
"active_taxes": {
"type": "array",
"items": {
"$ref": "#/components/schemas/OrderTax"
}
},
"base_price": {
"type": "integer"
},
"category": {
"type": "string"
},
"combo_id": {
"type": "object",
"properties": {
"$id": {
"type": "string"
}
}
},
"combo_only": {
"type": "boolean"
},
"id": {
"type": "object",
"properties": {
"$id": {
"type": "string"
}
}
},
"incl_options_price": {
"type": "integer"
},
"menuitem": {
"type": "string"
},
"name": {
"type": "string"
},
"new_price": {
"type": "integer"
},
"options": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Option"
}
},
"opts_price": {
"type": "integer"
},
"order_type": {
"type": "string"
},
"pos": {
"type": "string"
},
"price": {
"type": "integer"
},
"quantity": {
"type": "integer"
},
"reorder_price": {
"type": "integer"
},
"reorder_type": {
"type": "string"
},
"size": {
"type": "string"
},
"slot_index": {
"type": "string"
},
"tax": {
"type": "integer"
},
"total_price": {
"type": "integer"
}
}
}
},
"order": {
"type": "object",
"description": "Order ID from which the item was saved",
"properties": {
"$id": {
"type": "string",
"description": "ID"
}
}
},
"id": {
"type": "object",
"description": "Favorite item ID",
"properties": {
"$id": {
"type": "string",
"description": "ID"
}
}
},
"reorder_price": {
"type": "integer",
"description": "Item reorder price"
},
"order_type": {
"type": "string",
"description": "Type of order to which you can add an item"
},
"sharing_url": {
"type": "string",
"description": "Link to share an item"
},
"favorite": {
"type": "boolean",
"description": "Always true"
},
"key": {
"type": "string"
},
"ordered_count": {
"type": "integer"
},
"reorder_type": {
"type": "string"
}
}
},
"Wallet": {
"type": "object",
"description": "A wallet contains reward information including applicable menu items, requirements, and the value of the reward.",
"properties": {
"auto_redeem": {
"type": "boolean",
"description": "If true, the reward will be automatically redeemed if it's requirements are met."
},
"category_item_codes": {
"type": "array",
"description": "A list of menu items that apply to this reward, if it uses a category.",
"items": {
"type": "object",
"properties": {
"category_code": {
"type": "string",
"description": "The POS ID of menu item."
},
"item_type": {
"type": "string",
"description": "The menu item's type. Typically Item or Promo."
}
}
}
},
"discount_object_number": {
"type": "integer",
"description": "POS discount number to apply when redeeming this wallet as a reward."
},
"menu_items": {
"type": "array",
"description": "List of menu items that are applicable for the reward.",
"items": {
"type": "string",
"description": "The ID of the menu item."
}
},
"minimum_spend_amount": {
"type": "string",
"description": "The minimum dollar value the order must exceed to apply this reward."
},
"pos_item_id": {
"type": "string",
"description": "The POS Id of the menu item this reward applies to. It can be a category (denoted CAT###), meaning the reward applies to all items in the categoryItemCodes field."
},
"product_definition": {
"type": "string",
"description": "POS-specific definition for POSes or applications where productType and productId are not flexible enough."
},
"product_id": {
"type": "string",
"description": "Identifier for product(s). See productType for how to interpret this field."
},
"product_type": {
"type": "integer",
"description": "Type of POS product associated with wallet."
},
"reward_type": {
"type": "integer",
"description": "Type of reward."
},
"scale": {
"type": "integer",
"description": "Number of digits after the decimal place for balances of this wallet."
},
"value_amount": {
"type": "string",
"description": "Percentage off, dollar off, or particular POS discount as defined by valueType."
},
"value_type": {
"type": "integer",
"description": "Value type of reward."
},
"wallet_code": {
"type": "integer",
"description": "Identifying code for the wallet."
},
"wallet_bogo_configuration": {
"type": "object",
"description": "If present, the reward can be redeemed as a buy-one-get-one combo with one or more ways to complete the combo.",
"properties": {
"allow_discounted_qualifiers": {
"type": "boolean",
"description": "Flag to allow discounted items to be used in a combo."
},
"wallet_bogo_conditions": {
"type": "array",
"items": {
"type": "object",
"description": "The reward can contain multiple combos that each have their own conditions.",
"properties": {
"category_item_codes": {
"type": "array",
"description": "A list of menu items that apply to this combo, if it uses a category.",
"items": {
"type": "object",
"properties": {
"category_code": {
"type": "string",
"description": "The POS ID of menu item."
},
"item_type": {
"type": "string",
"description": "The menu item's type. Typically Item or Promo."
}
}
}
},
"menu_items": {
"type": "array",
"description": "List of menu items that are applicable for the combo condition.",
"items": {
"type": "string",
"description": "The ID of the menu item."
}
},
"pos_item_id": {
"type": "string",
"description": "The POS Id of the menu item this combo applies to. It can be a category (denoted CAT###), meaning the combo applies to all items in the categoryItemCodes field."
},
"product_type": {
"type": "integer",
"description": "Type of POS product associated with combo."
},
"quantity": {
"type": "string",
"description": "The quantity of items required to fulfill the combo."
}
}
}
},
"wallet_bogo_order": {
"type": "integer",
"description": "Used to control the order in which items are prioritised for BOGO rewards. (1) is the highest priced item and (2) is for the lowest."
}
}
},
"wallet_combo_conditions": {
"type": "array",
"description": "If present, the reward can be redeemed as a combo with one or more ways to complete the combo.",
"items": {
"type": "object",
"description": "Conditions required to fulfill the reward if it is a combo.",
"properties": {
"category_item_codes": {
"type": "array",
"description": "A list of menu items that apply to this combo, if it uses a category.",
"items": {
"type": "object",
"properties": {
"categoryCode": {
"type": "string",
"description": "The POS ID of menu item."
},
"itemType": {
"type": "string",
"description": "The menu item's type. Typically Item or Promo."
}
}
}
},
"menu_items": {
"type": "array",
"description": "List of menu items that are applicable for the combo condition.",
"items": {
"type": "string",
"description": "The ID of the menu item."
}
},
"pos_item_id": {
"type": "string",
"description": "The POS Id of the menu item this combo applies to. It can be a category (denoted CAT###), meaning the combo applies to all items in the categoryItemCodes field."
},
"product_type": {
"type": "integer",
"description": "Type of POS product associated with combo."
},
"quantity": {
"type": "string",
"description": "The quantity of items required to fulfill the combo."
}
}
}
},
"wallet_contents": {
"type": "integer",
"description": "Contents of wallet. Either (1) products, (2) points, (3)rewards, or (4) products and rewards."
},
"wallet_name": {
"type": "string",
"description": "Name of the wallet."
},
"wallet_tags": {
"type": "array",
"description": "A list of tags representing additional information regarding a given wallet.",
"items": {
"type": "object",
"properties": {
"label": {
"type": "string",
"description": "Human-readable label for this wallet tag."
},
"code": {
"type": "integer",
"description": "Numeric code for this wallet tag."
},
"data": {
"type": "string",
"description": "String data for this wallet tag."
}
}
}
},
"wallet_type": {
"type": "integer",
"description": "Type of wallet. Can be (1) internal, (2) add, (3) redeem, (4) stored value, (5) charge, or (6) member reward."
},
"available_combos": {
"type": "array",
"description": "List of combo menu items that that satisfy all combo conditions.",
"items": {
"type": "string",
"description": "The ID of the menu item."
}
}
}
},
"Catering": {
"properties": {
"status": {
"type": "string",
"enum": [
"started",
"pending",
"approved",
"rejected",
"locked",
"done"
],
"description": "Current status of the catering order."
},
"payment_status": {
"type": "string",
"enum": [
"not_paid",
"partially_paid",
"paid",
"failed"
],
"description": "Current payment status of the catering order"
},
"partial_payment_amount": {
"type": "number",
"description": "The amount paid by the guest when submitting the order."
},
"remaining_amount": {
"type": "number",
"description": "The amount remaining to be paid by the guest.",
"nullable": true
},
"required_fed_headcount": {
"type": "integer",
"description": "The number of people the guest indicated this order should serve."
},
"occasion": {
"type": "string",
"description": "A description of the event being catered inputted by the guest."
},
"last_edit_at": {
"type": "string",
"description": "The time that this order was last edited after original submission, in format `MM/DD/YYYY H:MM:SS am`",
"nullable": true
},
"lock_timestamp": {
"type": "integer",
"description": "A UNIX timestamp denoting what time this order was locked.",
"nullable": true
},
"send_timestamp": {
"type": "integer",
"description": "A UNIX timestamp denoting what time this order was sent to the POS.",
"nullable": true
}
}
}
},
"securitySchemes": {
"ApiKey": {
"type": "apiKey",
"in": "query",
"name": "key"
}
},
"parameters": {
"RestaurantIdPath": {
"in": "path",
"name": "restaurant_id",
"description": "Restaurant id",
"schema": {
"type": "string",
"pattern": "^[a-f\\d]{24}$"
},
"required": true
},
"OrderIdPath": {
"in": "path",
"name": "order_id",
"description": "Order Id",
"required": true,
"schema": {
"type": "string",
"pattern": "^[a-f\\d]{24}$"
}
},
"RecommendationIdPath": {
"in": "path",
"name": "recommendation_id",
"description": "Recommendation Id",
"required": true,
"schema": {
"type": "string",
"pattern": "^[a-f\\d]{24}$"
}
},
"AccessToken": {
"in": "query",
"name": "access_token",
"description": "Paytronix Authorization Grant or O&D Access Token for user. A Paytronix Authorization Grant is required for integrations that include loyalty, O&D Access Token for integrations without loyalty.",
"schema": {
"type": "string"
},
"required": true
},
"Provider": {
"description": "External authentication provider, must be set to 'px' when Paytronix Authorization Grant is used. Can be set to 'odn' or omitted when O&D Access Token is token",
"in": "query",
"name": "provider",
"required": false,
"schema": {
"type": "string",
"enum": [
"px",
"odn"
]
}
},
"ProviderEnv": {
"description": "Paytronix authentication environment override when using Paytronix Authorization Grant. For staging and development use only.",
"in": "query",
"name": "provider_env",
"required": false,
"schema": {
"type": "string",
"enum": [
"production",
"train",
"staging",
"test",
"demo"
]
}
},
"ProviderEnvMerchant": {
"description": "The Paytronix Environment",
"in": "query",
"name": "provider_env",
"schema": {
"type": "string",
"enum": [
"production",
"train",
"staging",
"test",
"demo"
]
},
"required": false
},
"MerchantId": {
"description": "Paytronix issued Merchant Id. Required when Paytronix Authorization Grant is used.",
"in": "query",
"name": "merchant_id",
"required": false,
"schema": {
"type": "string"
}
},
"PrintedCardNumber": {
"description": "Paytronix issued Printed Card Number. Required when Paytronix Authorization Grant is used.",
"in": "query",
"name": "printed_card_number",
"required": false,
"schema": {
"type": "string"
}
},
"IntegratorKey": {
"in": "query",
"name": "integrator_key",
"description": "The integrator_key used to authenticate the request",
"schema": {
"type": "string"
},
"required": true
},
"Secret": {
"in": "query",
"name": "secret",
"description": "The secret used to authenticate the restaurant associated with the request. Can be an integrator secret, a restaurant secret or a user secret.\n\nWhen an integrator secret is used, the integrator must have access to the app associated with the restaurant.\n\nWhen a user secret is used, the user must have access to the restaurant.",
"schema": {
"type": "string"
},
"required": true
},
"ExternalStoreId": {
"in": "query",
"name": "external_store_id",
"description": "The integrator's external id for the restaurant. Can replace `restaurant_id`",
"schema": {
"type": "string"
},
"required": false
},
"LangCode": {
"in": "query",
"name": "lang",
"description": "Limits i18n translation results to only include the specified language code instead of all enabled language translations. Only relevant for merchants that have translations enabled.",
"schema": {
"type": "string"
},
"required": false
}
},
"responses": {
"400MissingParameters": {
"description": "Validation error. One or more required parameters were missing or invalid.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"401AccessToken": {
"description": "The access token provided was invalid",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"403AccessDenied": {
"description": "Access denied",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"404Restaurant": {
"description": "The restaurant could not be found.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"404Order": {
"description": "The order could not be found.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
}
}
}