Menus

The Menus resource enables you to interact with the menus of your stores.

The following table describes the different contents of the Menus resource:

ResourceDescription
GET menuReturns the collection of menus created by the authenticating ally
POST menuCreates or updates a menu in a store
GET menu/approved/{storeId}Returns the current approval status of a menu
GET menu/rappi/{storeId}Returns the last menu created for a store

GET menu

Use this endpoint to return the collection of menus created by the authenticating ally.

Endpoint URL

Use this URL to make a request with this endpoint:

https://{COUNTRY_DOMAIN}/api/v2/restaurants-integrations-public-api/menu

{COUNTRY_DOMAIN}: This is your Rappi Country Domain. See the list of Country Domains.

Endpoint Properties

This resource has the following properties:

Response formatsJSON
Authentication requirementsToken

Parameters

This endpoint does not permit additional parameters.

Status Codes

These are the possible status codes of the response for this endpoint:

Sample Request

This is an example of an API request using this endpoint:

GET https://microservices.dev.rappi.com/api/v2/restaurants-integrations-public-api/menu

This is an example of the request:

URL url = new URL("https://microservices.dev.rappi.com/api/v2/restaurants-integrations-public-api/menu"); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setRequestProperty("User-Agent", "Mozilla/5.0"); connection.setRequestProperty("Content-Type", "application/json"); connection.setRequestProperty("Accept", "application/json"); connection.setRequestProperty("x-authorization", "bearer YOUR_TOKEN"); try (BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8))) { StringBuilder response = new StringBuilder(); String responseLine; while ((responseLine = br.readLine()) != null) { response.append(responseLine.trim()); } System.out.println("Response body: " + response.toString()); } System.out.println("Response Code : " + connection.getResponseCode());



Sample Response "Success 200":

This is an example of the response:

[ { "storeId": "900111978", "items": [ { "name": "Naked Cake con frutos", "description": "Naked cake decorado con frutos. Cubierta de trufa derretida (ganache) y decorada con frutos del bosque.", "sku": "8569874", "type": "PRODUCT", "price": 75.0, "category": { "id": "3", "name": "Tortas", "minQty": 0, "maxQty": 0, "sortingPosition": 0 }, "imageUrl": "https://image.com/image1.jpg", "children": [ { "name": "Chocolate", "description": "", "sku": "8569874-159", "type": "TOPPING", "price": 0.0, "category": { "id": "1", "name": "Sabor", "minQty": 0, "maxQty": 1, "sortingPosition": 0 }, "imageUrl": "https://image.com/image10.jpg", "children": [], "availableFrom": null, "availableTo": null, "rappiIds": ["340948822"], "sortingPosition": 1, "maxLimit": 1 } ], "availableFrom": null, "availableTo": null, "rappiIds": ["2135527868"], "sortingPosition": 0, "maxLimit": 1 }, { "name": "Snowman", "description": "Linda lata de Snowman con productos variadosIncluye:Galletas mantequilla 350 gr, 6 brookies y 4 trufas de brownie.", "sku": "856887", "type": "PRODUCT", "price": 75.0, "category": { "id": "9", "name": "Navidad", "minQty": 0, "maxQty": 0, "sortingPosition": 0 }, "imageUrl": "https://image.com/image2.jpg", "children": [], "availableFrom": null, "availableTo": null, "rappiIds": ["2135524472"], "sortingPosition": 0, "maxLimit": 1 } ] } ]

This table describes the objects contained in the response example:

Response ObjectObject Description
storeId
string
Identifier of the store in the Rappi application.
items
array of objects
Product list
items.name
string
Name of the product in the menu
items.description
string
Description of the product in the menu
items.sku
string
SKU that the ally assigned for the product in the menu
items.type
string
Item type. In this case can be only PRODUCT
items.price
integer
Price of the product in the menu
items.imageUrl
string
Image url of the product in the menu
items.availableFrom
string
Start date from the product is available to sell in the menu
items.availableTo
string
End date from the product is available to sell in the menu
items.rappiIds
array of string
List of the identifiers Rappi gives to this item
items.sortingPosition
integer
The position of the product in its category
items.maxLimit
integer
Maximum indicator of the item, it's required only if the type is topping
items.category
string
Category of the product in the menu
items.category.id
string
The SKU (Stock-Keeping Unit) the ally gives to this category
items.category.name
string
Category name
items.category.minQty
integer
The maximum number of items that can be ordered in this category
items.category.maxQty
integer
The minimum quantity of elements that can be ordered in this category (In toppings, if it's 0 it means that it's not mandatory)
items.category.sortingPosition
integer
it's the position of the category in the menu
items.children
array of objects
List of product's toppings from the menu
items.children.name
string
Name of the topping in the menu
items.children.description
string
Description of the topping in the menu
items.children.sku
string
SKU that the ally assigned for the topping in the menu
items.children.type
string
Item type. In this case can be only TOPPING
items.children.price
integer
Price of the topping in the menu
items.children.imageUrl
string
Image url of the topping in the menu
items.children.availableFrom
string
Start date from the topping is available to sell in the menu
items.children.availableTo
string
End date from the topping is available to sell in the menu
items.children.rappiIds
array of string
List of the identifiers Rappi gives to this item
items.children.sortingPosition
integer
The position of the topping in its category
items.children.maxLimit
integer
Maximum indicator of the item, it's required only if the type is topping
items.children.category
string
Category of the topping in the menu
items.children.category.id
string
The SKU (Stock-Keeping Unit) the ally gives to this category
items.children.category.name
string
Category name
items.children.category.minQty
integer
The maximum number of items that can be ordered in this category
items.children.category.maxQty
integer
The minimum quantity of elements that can be ordered in this category (In toppings, if it's 0 it means that it's not mandatory)
items.children.category.sortingPosition
integer
The position of the category within the product

Sample Response "Invalid credentials 401":

{ "message": "Not a valid token" }

This table describes the attributes from JSON response:

AttributesDescription
message
string
Not a valid token

POST menu

Use this endpoint to create a new menu, or to add new items to an existing one, for the authenticated ally.

After creating a menu, or adding new items to an existing one, the Rappi team validates the items and the structure of the menu. You can consult the status of the approval process by using the GET menu/approved/{storeId} endpoint.

Endpoint URL

Use this URL to make a request with this endpoint:

https://{COUNTRY_DOMAIN}/api/v2/restaurants-integrations-public-api/menu

{COUNTRY_DOMAIN}: This is your Rappi Country Domain. See the list of Country Domains.

Endpoint Properties

This resource has the following properties:

Response formatsJSON
Request body requirementsJSON
Authentication requirementsToken

Parameters

This endpoint does not permit additional parameters.

Status Codes

These are the possible status codes of the response for this endpoint:

Sample Request

This is an example of an API request using this endpoint:

POST https://microservices.dev.rappi.com/api/v2/restaurants-integrations-public-api/menu

This is an example of the request:

{ "storeId": "900103361", "items": [ { "category": { "id": "2090019638", "maxQty": 0, "minQty": 0, "name": "Burgers", "sortingPosition": 0 }, "children": [ { "category": { "id": "211", "maxQty": 1, "minQty": 0, "name": "Do you want to add?", "sortingPosition": 0 }, "children": [], "name": "French Fries", "price": 5000, "sku": "2135092195", "sortingPosition": 1, "type": "TOPPING", "maxLimit": 1 }, { "category": { "id": "211", "maxQty": 1, "minQty": 0, "name": "Do you want to add?", "sortingPosition": 0 }, "children": [], "name": "Potato Wedges", "price": 7000, "sku": "2135092196", "sortingPosition": 1, "type": "TOPPING", "maxLimit": 1 } ], "name": "Grilled Chicken Burger", "price": 14000, "sku": "2135092197", "sortingPosition": 0, "type": "PRODUCT" }, { "category": { "id": "2090019639", "maxQty": 0, "minQty": 0, "name": "Pizzas", "sortingPosition": 1 }, "children": [], "name": "Hawaiian Pizza", "price": 17000, "sku": "2135092198", "sortingPosition": 1, "type": "PRODUCT" } ] }
URL url = new URL("https://microservices.dev.rappi.com/api/v2/restaurants-integrations-public-api/menu"); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("POST"); connection.setRequestProperty("User-Agent", "Mozilla/5.0"); connection.setRequestProperty("Content-Type", "application/json"); connection.setRequestProperty("Accept", "application/json"); connection.setRequestProperty("x-authorization", "bearer YOUR_TOKEN"); connection.setDoOutput(true); String jsonInputString = "{\n" + " \"storeId\": \"900103361\",\n" + " \"items\": [\n" + " {\n" + " \"category\": {\n" + " \"id\": \"2090019638\",\n" + " \"maxQty\": 0,\n" + " \"minQty\": 0,\n" + " \"name\": \"Burgers\",\n" + " \"sortingPosition\": 0\n" + " },\n" + " \"children\": [\n" + " {\n" + " \"category\": {\n" + " \"id\": \"211\",\n" + " \"maxQty\": 1,\n" + " \"minQty\": 0,\n" + " \"name\": \"Do you want to add?\",\n" + " \"sortingPosition\": 0\n" + " },\n" + " \"children\": [],\n" + " \"name\": \"French Fries\",\n" + " \"price\": 5000,\n" + " \"sku\": \"2135092145\",\n" + " \"sortingPosition\": 1,\n" + " \"type\": \"TOPPING\",\n" + " \"maxLimit\": 1\n" + " },\n" + " {\n" + " \"category\": {\n" + " \"id\": \"211\",\n" + " \"maxQty\": 1,\n" + " \"minQty\": 0,\n" + " \"name\": \"Do you want to add?\",\n" + " \"sortingPosition\": 0\n" + " },\n" + " \"children\": [],\n" + " \"name\": \"Potato Wedges\",\n" + " \"price\": 7000,\n" + " \"sku\": \"2135092145\",\n" + " \"sortingPosition\": 1,\n" + " \"type\": \"TOPPING\",\n" + " \"maxLimit\": 1\n" + " }\n" + " ],\n" + " \"name\": \"Grilled Chicken Burger\",\n" + " \"price\": 14000,\n" + " \"sku\": \"2135092145\",\n" + " \"sortingPosition\": 0,\n" + " \"type\": \"PRODUCT\"\n" + " },\n" + " {\n" + " \"category\": {\n" + " \"id\": \"2090019639\",\n" + " \"maxQty\": 0,\n" + " \"minQty\": 0,\n" + " \"name\": \"Pizzas\",\n" + " \"sortingPosition\": 1\n" + " },\n" + " \"children\": [],\n" + " \"name\": \"Hawaiian Pizza\",\n" + " \"price\": 17000,\n" + " \"sku\": \"2135092145\",\n" + " \"sortingPosition\": 1,\n" + " \"type\": \"PRODUCT\"\n" + " }\n" + " ]\n" + "}\n"; try (OutputStream os = connection.getOutputStream()) { byte[] input = jsonInputString.getBytes(StandardCharsets.UTF_8); os.write(input, 0, input.length); } try (BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8))) { StringBuilder response = new StringBuilder(); String responseLine; while ((responseLine = br.readLine()) != null) { response.append(responseLine.trim()); } System.out.println("Response body: " + response.toString()); } System.out.println("Response Code : " + connection.getResponseCode());



This table describes the attributes that the JSON of your request requires:

AttributesRequirementDescription
storeId
string
requiredIdentifier of the store in the Rappi application.
items
array of objects
requiredProduct list
items.name
string
requiredName of the product in the menu
items.description
string
requiredDescription of the product in the menu
items.sku
string
requiredSKU that the ally assigned for the product in the menu
items.type
string
requiredItem type. In this case can be only PRODUCT
items.price
integer
requiredPrice of the product in the menu
items.imageUrl
string
optionalImage url of the product in the menu
items.availableFrom
string
optionalStart date from the product is available to sell in the menu
items.availableTo
string
optionalEnd date from the product is available to sell in the menu
items.rappiIds
array of string
optionalList of the identifiers Rappi gives to this item
items.sortingPosition
integer
optionalThe position of the product in its category
items.maxLimit
integer
optionalMaximum indicator of the item, it's required only if the type is topping
items.category
string
requiredCategory of the product in the menu
items.category.id
string
requiredThe SKU (Stock-Keeping Unit) the ally gives to this category
items.category.name
string
requiredCategory name
items.category.minQty
integer
requiredThe maximum number of items that can be ordered in this category
items.category.maxQty
integer
requiredThe minimum quantity of elements that can be ordered in this category (In toppings, if it's 0 it means that it's not mandatory)
items.category.sortingPosition
integer
requiredit's the position of the category in the menu
items.children
array of objects
optionalList of product's toppings from the menu
items.children.name
string
requiredName of the topping in the menu
items.children.description
string
requiredDescription of the topping in the menu
items.children.sku
string
requiredSKU that the ally assigned for the topping in the menu
items.children.type
string
requiredItem type. In this case can be only TOPPING
items.children.price
integer
requiredPrice of the topping in the menu
items.children.imageUrl
string
optionalImage url of the topping in the menu
items.children.availableFrom
string
optionalStart date from the topping is available to sell in the menu
items.children.availableTo
string
optionalEnd date from the topping is available to sell in the menu
items.children.rappiIds
array of string
optionalList of the identifiers Rappi gives to this item
items.children.sortingPosition
integer
optionalThe position of the topping in its category
items.children.maxLimit
integer
optionalMaximum indicator of the item, it's required only if the type is topping
items.children.category
string
requiredCategory of the topping in the menu
items.children.category.id
string
requiredThe SKU (Stock-Keeping Unit) the ally gives to this category
items.children.category.name
string
requiredCategory name
items.children.category.minQty
integer
requiredThe maximum number of items that can be ordered in this category
items.children.category.maxQty
integer
requiredThe minimum quantity of elements that can be ordered in this category (In toppings, if it's 0 it means that it's not mandatory)
items.children.category.sortingPosition
integer
requiredThe position of the category within the product

Sample response "200 success"

This endpoint returns only one successful response code.

Sample response "400 The menu structure is invalid"

400 The menu structure is invalid:

{ "message": "The submitted menu has errors.", "errors": [ { "reason": "All items must have a valid name, category or product description.", "relatedItems": [ { "description": "", "sku": "product1", "type": "PRODUCT", "price": 899.0, "category": { "id": "455", "name": "producto category name 1", "minQty": 0, "maxQty": 0, "sortingPosition": 0 }, "imageUrl": "https://anydomain/anyimagen_1.png", "availableFrom": null, "availableTo": null, "rappiIds": ["1965855"], "sortingPosition": 0, "maxLimit": 1 } ] }, { "reason": "Invalid urls were found", "relatedItems": [ { "name": "producto name 1", "description": "", "sku": "product2", "type": "PRODUCT", "price": 899.0, "category": { "id": "455", "name": "producto category name 1", "minQty": 0, "maxQty": 0, "sortingPosition": 0 }, "imageUrl": "httpaas://anydomain/anyimagen_2.png", "availableFrom": null, "availableTo": null, "rappiIds": ["1965855"], "sortingPosition": 0, "maxLimit": 1 } ] } ] }

This table describes the attributes from JSON response:

AttributesDescription
message
string
Generic error message to response "structure is invalid." message: "The submitted menu has errors."
errors
array of objects
Error list found in menu.
errors.reason
string
Description of the error. you can find more info in "Validations on the Received menu"
errors.relatedItems
array of objects
Items with error.

You can see the list of structure validations in the VALIDATIONS ON THE RECEIVED MENU.

Sample response "401 Invalid Credentials"

401 Invalid Credentials:

{ "message": "Not a valid token" }

This table describes the attributes from JSON response:

AttributesDescription
message
string
Not a valid token

Sample response "404 Store not found"

404 Store not found:

{ "message": "StoreId 9001035324: not found associated Stores" }

This table describes the attributes from JSON response:

AttributesDescription
message
string
Store not found

GET menu/approved/{storeId}

Use this endpoint to return the approval status of a menu.

Endpoint URL

Use this URL to make a request with this endpoint:

https://{COUNTRY_DOMAIN}/api/v2/restaurants-integrations-public-api/menu/approved/{storeId}

{COUNTRY_DOMAIN}: This is your Rappi Country Domain. See the list of Country Domains.

Endpoint Properties

This resource has the following properties:

Response formatsJSON
Authentication requirementsToken

Parameters

This endpoint does not permit additional parameters.

Status Codes

This table contains the possible response codes for this endpoint:

Sample Request

This is an example of an API request using this endpoint:

GET https://microservices.dev.rappi.com/api/v2/restaurants-integrations-public-api/menu/approved/251

This is an example of the request:

final Integer storeId = 251; URL url = new URL(String.format("https://microservices.dev.rappi.com/api/v2/restaurants-integrations-public-api/menu/approved/%s", storeId)); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setRequestProperty("User-Agent", "Mozilla/5.0"); connection.setRequestProperty("Content-Type", "application/json"); connection.setRequestProperty("Accept", "application/json"); connection.setRequestProperty("x-authorization", "bearer YOUR_TOKEN"); try (BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8))) { StringBuilder response = new StringBuilder(); String responseLine; while ((responseLine = br.readLine()) != null) { response.append(responseLine.trim()); } System.out.println("Response body: " + response.toString()); } System.out.println("Response Code : " + connection.getResponseCode());



Sample Response

This endpoint returns a status response code only.

401 Invalid Credentials:

{ "message": "Not a valid token" }

GET menu/rappi/{storeId}

Use this endpoint to return the last menu created for a specific store.

Endpoint URL

Use this URL to make a request with this endpoint:

https://{COUNTRY_DOMAIN}/api/v2/restaurants-integrations-public-api/menu/rappi/{storeId}

Endpoint Properties

This resource has the following properties:

Response formatsJSON
Authentication requirementsToken

Parameters

This endpoint does not permit additional parameters.

Status Codes

This table contains the possible response codes for this endpoint:

Sample Request

This is an example of an API request using this endpoint:

GET https://microservices.dev.rappi.com/api/v2/restaurants-integrations-public-api/menu/rappi/251

This is an example of the request:

final Integer storeId = 251; URL url = new URL(String.format("https://microservices.dev.rappi.com/api/v2/restaurants-integrations-public-api/menu/rappi/%s", storeId)); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setRequestProperty("User-Agent", "Mozilla/5.0"); connection.setRequestProperty("Content-Type", "application/json"); connection.setRequestProperty("Accept", "application/json"); connection.setRequestProperty("x-authorization", "bearer YOUR_TOKEN"); try (BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8))) { StringBuilder response = new StringBuilder(); String responseLine; while ((responseLine = br.readLine()) != null) { response.append(responseLine.trim()); } System.out.println("Response body: " + response.toString()); } System.out.println("Response Code : " + connection.getResponseCode());



Sample Response

This is an example of the response "Success 200":

{ "storeId": "900111978", "items": [ { "name": "Naked Cake con frutos", "description": "Naked cake decorado con frutos. Cubierta de trufa derretida (ganache) y decorada con frutos del bosque.", "sku": "8569874", "type": "PRODUCT", "price": 75.0, "category": { "id": "3", "name": "Tortas", "minQty": 0, "maxQty": 0, "sortingPosition": 0 }, "imageUrl": "https://image.com/image1.jpg", "children": [ { "name": "Chocolate", "description": "", "sku": "8569874-159", "type": "TOPPING", "price": 0.0, "category": { "id": "1", "name": "Sabor", "minQty": 0, "maxQty": 1, "sortingPosition": 0 }, "imageUrl": "https://image.com/image10.jpg", "children": [], "availableFrom": null, "availableTo": null, "rappiIds": ["340948822"], "sortingPosition": 1, "maxLimit": 1 } ], "availableFrom": null, "availableTo": null, "rappiIds": ["2135527868"], "sortingPosition": 0, "maxLimit": 1 }, { "name": "Snowman", "description": "Linda lata de Snowman con productos variadosIncluye:Galletas mantequilla 350 gr, 6 brookies y 4 trufas de brownie.", "sku": "856887", "type": "PRODUCT", "price": 75.0, "category": { "id": "9", "name": "Navidad", "minQty": 0, "maxQty": 0, "sortingPosition": 0 }, "imageUrl": "https://image.com/image2.jpg", "children": [], "availableFrom": null, "availableTo": null, "rappiIds": ["2135524472"], "sortingPosition": 0, "maxLimit": 1 } ] }

This is an example of the response "Invalid credentials 401":

{ "message": "Not a valid token" }

The context of the attribute response were mentionend before in Get Menu.