{"ok":true,"site":{"host":"zomato.com","url":"https://www.zomato.com/ncr","type":"live","desc":"Looking for Best Food in Delhi NCR? Checkout the highest-rated restaurants in Delhi NCR and satisfy your food cravings now!","tools":[{"name":"zomato_get_session","kind":"answer","impl":"imperative","description":"Start here. Reports whether the user is logged in, the delivery address state, the restaurant open on the page and the cart, plus the next step to take. Changes nothing.","annotations":{"readOnlyHint":true,"consequentialHint":false,"untrustedContentHint":true,"debugging":false},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/ncr","pages":["/ncr","/ncr/collections","/ncr/insta-worthy","/ncr/omakase-bars","/ncr/secret-speakeasy-bars","/ncr/great-cafes"]},{"name":"zomato_request_login_otp","kind":"act","impl":"imperative","description":"Send a login OTP by SMS to the phone number the user gave you. Then ask the user to read the code back and call zomato_verify_login_otp. If the user would rather not share their number or OTP, or wants email or Google, use zomato_open_login_dialog instead. Returns \"logged_in\" without sending anything when the session is already valid.","annotations":{"readOnlyHint":false,"consequentialHint":false,"untrustedContentHint":true,"debugging":false},"inputSchema":{"type":"object","properties":{"phone":{"type":["string","number"],"description":"The phone number the user gave you in this conversation. Never guess it. Indian numbers can include or omit +91.","examples":["9876543210"]}},"required":["phone"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/ncr","pages":["/ncr","/ncr/collections","/ncr/insta-worthy","/ncr/omakase-bars","/ncr/secret-speakeasy-bars","/ncr/great-cafes"]},{"name":"zomato_verify_login_otp","kind":"act","impl":"imperative","description":"Finish the OTP login started by zomato_request_login_otp, using the code the user read out. The phone number is remembered from that call. On success the user is logged in and the page reloads.","annotations":{"readOnlyHint":false,"consequentialHint":true,"untrustedContentHint":true,"debugging":false},"inputSchema":{"type":"object","properties":{"otp":{"type":["string","number"],"description":"The OTP the user read out in this conversation. Never guess it.","examples":["123456"]}},"required":["otp"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/ncr","pages":["/ncr","/ncr/collections","/ncr/insta-worthy","/ncr/omakase-bars","/ncr/secret-speakeasy-bars","/ncr/great-cafes"]},{"name":"zomato_open_login_dialog","kind":"act","impl":"imperative","description":"Open the Zomato login dialog on the page so the user signs in themselves, by phone, email or Google. Offer it to anyone who would rather not share their number or OTP with you. The page reloads when they finish, which ends this conversation.","annotations":{"readOnlyHint":false,"consequentialHint":false,"untrustedContentHint":true,"debugging":false},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/ncr","pages":["/ncr","/ncr/collections","/ncr/insta-worthy","/ncr/omakase-bars","/ncr/secret-speakeasy-bars","/ncr/great-cafes"]},{"name":"zomato_list_addresses","kind":"answer","impl":"imperative","description":"List the saved delivery addresses with \"canDeliver\" and \"isSelected\", and say which one would be picked automatically. Changes nothing.","annotations":{"readOnlyHint":true,"consequentialHint":false,"untrustedContentHint":true,"debugging":false},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/ncr","pages":["/ncr","/ncr/collections","/ncr/insta-worthy","/ncr/omakase-bars","/ncr/secret-speakeasy-bars","/ncr/great-cafes"]},{"name":"zomato_select_address","kind":"act","impl":"imperative","description":"Select the delivery address. With \"addressId\", selects that saved address. With no arguments, keeps a valid current address or picks the default: the one last used on this browser, or the only deliverable one. When several could apply it selects nothing and returns \"no_address_selected\" with all the ids.","annotations":{"readOnlyHint":false,"consequentialHint":false,"untrustedContentHint":true,"debugging":false},"inputSchema":{"type":"object","properties":{"addressId":{"type":["string","number"],"description":"Optional. A saved address id.","examples":["123456"]}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/ncr","pages":["/ncr","/ncr/collections","/ncr/insta-worthy","/ncr/omakase-bars","/ncr/secret-speakeasy-bars","/ncr/great-cafes"]},{"name":"zomato_add_address","kind":"act","impl":"imperative","description":"Save a new delivery address to the account and select it. Step 1: pass { \"locationQuery\" } (an area, street or landmark) to get matching locations. Step 2: once the user confirms one, call again with its \"placeId\" and the address details. A single unambiguous match is used directly. Missing required fields come back in \"missingFields\".","annotations":{"readOnlyHint":false,"consequentialHint":false,"untrustedContentHint":true,"debugging":false},"inputSchema":{"type":"object","properties":{"locationQuery":{"type":"string","description":"Area, street or landmark to look up.","examples":["Connaught Place"]},"placeId":{"type":"string","description":"A placeId from an earlier zomato_add_address call."},"address":{"type":"string","description":"House or flat number and building."},"floor":{"type":"string","description":"Optional floor."},"landmark":{"type":"string","description":"Optional landmark."},"locality":{"type":"string","description":"Area, sector or locality."},"tag":{"type":"string","description":"How to label it, e.g. Home, Work, Hotel or Other."},"otherTag":{"type":"string","description":"A custom label when tag is \"Other\"."},"select":{"type":"boolean","description":"Select the new address for this order. Defaults to true."}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/ncr","pages":["/ncr","/ncr/collections","/ncr/insta-worthy","/ncr/omakase-bars","/ncr/secret-speakeasy-bars","/ncr/great-cafes"]},{"name":"zomato_search_restaurants","kind":"act","impl":"imperative","description":"Find restaurants for a dish, cuisine or restaurant name near the delivery address. \"pizza\" returns restaurants that serve pizza as well as ones named after it. Each result has restaurantId, rating, etaMinutes, costForTwo, isOpen and canOrder. deliveryFee is null because it is only known once the cart is priced (zomato_quote_cart or zomato_prepare_checkout). If no address is selected it picks the default first, and reports the outcome in \"address\".","annotations":{"readOnlyHint":false,"consequentialHint":false,"untrustedContentHint":true,"debugging":false},"inputSchema":{"type":"object","properties":{"query":{"type":"string","description":"A dish, cuisine or restaurant name.","examples":["pizza","butter chicken","Dominos"]},"context":{"type":"string","enum":["delivery","dineout","takeaway","nightlife","all"],"description":"Optional. Defaults to \"delivery\" (or \"takeaway\" on a takeaway page). Pass \"dineout\" or \"nightlife\" only when the user wants to go out rather than order."},"limit":{"type":"integer","minimum":1,"maximum":20,"description":"Maximum restaurants to return (default and maximum 20)."}},"required":["query"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/ncr","pages":["/ncr","/ncr/collections","/ncr/insta-worthy","/ncr/omakase-bars","/ncr/secret-speakeasy-bars","/ncr/great-cafes"]},{"name":"zomato_get_restaurant_menu","kind":"act","impl":"imperative","description":"Open a restaurant and return its menu in one call. Pass \"restaurantId\" from zomato_search_restaurants; leave it out to read the restaurant already open. The result names the active restaurant, so check it before adding items. A dish with hasAddOns true needs zomato_get_dish_options before it can be added.","annotations":{"readOnlyHint":false,"consequentialHint":false,"untrustedContentHint":true,"debugging":false},"inputSchema":{"type":"object","properties":{"restaurantId":{"type":["string","number"],"description":"From zomato_search_restaurants.","examples":["20424478"]},"orderUrl":{"type":"string","description":"Optional. The orderUrl of a search result, for a restaurant not returned by search in this conversation."},"search":{"type":"string","description":"Optional text to match against dish names, descriptions and categories.","examples":["paneer"]},"category":{"type":"string","description":"Optional category name. The result lists every category."},"limit":{"type":"integer","description":"Optional cap on how many dishes to return. Leave it out to get the whole menu."}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/ncr","pages":["/ncr","/ncr/collections","/ncr/insta-worthy","/ncr/omakase-bars","/ncr/secret-speakeasy-bars","/ncr/great-cafes"]},{"name":"zomato_get_dish_options","kind":"answer","impl":"imperative","description":"Get the add-on groups for a dish on the open restaurant. This is the only source of add-on ids. \"min\" above 0 means the group is required; \"selectionType\" single takes exactly one. Nested groups have \"parentOptionId\" and apply only when that option is chosen.","annotations":{"readOnlyHint":true,"consequentialHint":false,"untrustedContentHint":true,"debugging":false},"inputSchema":{"type":"object","properties":{"itemId":{"type":["string","number"],"description":"A dish id from zomato_get_restaurant_menu."},"restaurantId":{"type":["string","number"],"description":"Optional. The restaurantId you expect to be open. The call fails instead of acting on a different restaurant."}},"required":["itemId"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/ncr","pages":["/ncr","/ncr/collections","/ncr/insta-worthy","/ncr/omakase-bars","/ncr/secret-speakeasy-bars","/ncr/great-cafes"]},{"name":"zomato_add_item_to_cart","kind":"act","impl":"imperative","description":"Add a dish to the cart. This increments: the same dish with the same add-ons goes onto the same line and raises its quantity by \"quantity\". Different add-ons make a new line. The result returns the \"lineItemId\"; to make a line an exact quantity, use zomato_set_item_quantity instead of adding again.","annotations":{"readOnlyHint":false,"consequentialHint":false,"untrustedContentHint":true,"debugging":false},"inputSchema":{"type":"object","properties":{"itemId":{"type":["string","number"],"description":"A dish id from zomato_get_restaurant_menu."},"quantity":{"type":"integer","minimum":1,"maximum":20,"description":"How many to add (default 1)."},"addOnIds":{"type":"array","items":{"type":["string","number"]},"description":"Option ids from zomato_get_dish_options. Include the parent option when choosing nested add-ons."},"restaurantId":{"type":["string","number"],"description":"Optional. The restaurantId you expect to be open. The call fails instead of acting on a different restaurant."}},"required":["itemId"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/ncr","pages":["/ncr","/ncr/collections","/ncr/insta-worthy","/ncr/omakase-bars","/ncr/secret-speakeasy-bars","/ncr/great-cafes"]},{"name":"zomato_set_item_quantity","kind":"act","impl":"imperative","description":"Set a cart line to an exact quantity. Calling it twice with the same value changes nothing the second time. 0 removes the line. Use a \"lineItemId\" from zomato_get_cart or zomato_add_item_to_cart.","annotations":{"readOnlyHint":false,"consequentialHint":false,"untrustedContentHint":true,"debugging":false},"inputSchema":{"type":"object","properties":{"lineItemId":{"type":["string","number"],"description":"From zomato_get_cart."},"quantity":{"type":"integer","minimum":0,"maximum":20,"description":"The quantity the line should have."},"restaurantId":{"type":["string","number"],"description":"Optional. The restaurantId you expect to be open. The call fails instead of acting on a different restaurant."}},"required":["lineItemId","quantity"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/ncr","pages":["/ncr","/ncr/collections","/ncr/insta-worthy","/ncr/omakase-bars","/ncr/secret-speakeasy-bars","/ncr/great-cafes"]},{"name":"zomato_remove_cart_line","kind":"act","impl":"imperative","description":"Delete one whole cart line, whatever its quantity. To reduce a quantity instead, use zomato_set_item_quantity.","annotations":{"readOnlyHint":false,"consequentialHint":false,"untrustedContentHint":true,"debugging":false},"inputSchema":{"type":"object","properties":{"lineItemId":{"type":["string","number"],"description":"From zomato_get_cart."},"restaurantId":{"type":["string","number"],"description":"Optional. The restaurantId you expect to be open. The call fails instead of acting on a different restaurant."}},"required":["lineItemId"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/ncr","pages":["/ncr","/ncr/collections","/ncr/insta-worthy","/ncr/omakase-bars","/ncr/secret-speakeasy-bars","/ncr/great-cafes"]},{"name":"zomato_get_cart","kind":"answer","impl":"imperative","description":"Read the cart as the user sees it: one entry per line with lineItemId, quantity, add-ons and line total, plus the restaurant it belongs to. The subtotal excludes taxes and fees; zomato_quote_cart or zomato_prepare_checkout return the full bill.","annotations":{"readOnlyHint":true,"consequentialHint":false,"untrustedContentHint":true,"debugging":false},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/ncr","pages":["/ncr","/ncr/collections","/ncr/insta-worthy","/ncr/omakase-bars","/ncr/secret-speakeasy-bars","/ncr/great-cafes"]},{"name":"zomato_clear_cart","kind":"act","impl":"imperative","description":"Empty the cart, including one saved for another restaurant. Destructive, so only call it when the user asks to start over.","annotations":{"readOnlyHint":false,"consequentialHint":true,"untrustedContentHint":true,"debugging":false},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/ncr","pages":["/ncr","/ncr/collections","/ncr/insta-worthy","/ncr/omakase-bars","/ncr/secret-speakeasy-bars","/ncr/great-cafes"]},{"name":"zomato_quote_cart","kind":"act","impl":"imperative","description":"Optional. Price the current cart with Zomato without leaving the page: every bill line (item total, taxes, delivery fee and so on) and the grand total. Use it when the user asks what the order will cost before deciding. It is not a required step: zomato_prepare_checkout prices the cart itself.","annotations":{"readOnlyHint":true,"consequentialHint":false,"untrustedContentHint":true,"debugging":false},"inputSchema":{"type":"object","properties":{"restaurantId":{"type":["string","number"],"description":"Optional. The restaurantId you expect to be open. The call fails instead of acting on a different restaurant."}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/ncr","pages":["/ncr","/ncr/collections","/ncr/insta-worthy","/ncr/omakase-bars","/ncr/secret-speakeasy-bars","/ncr/great-cafes"]},{"name":"zomato_prepare_checkout","kind":"act","impl":"imperative","description":"Open the Zomato checkout page with the cart, once it has what the user asked for and a delivery address is selected. It runs the site's own continue-to-checkout flow, so the cart is priced once, by that flow, and returns that bill when the flow provides one (otherwise the checkout page shows it). It does not place the order or take payment: the user reviews the bill on the checkout page and presses the place order button themselves. Optional \"quoteId\" from zomato_quote_cart makes it refuse if the cart or address changed after the user saw that quote.","annotations":{"readOnlyHint":false,"consequentialHint":true,"untrustedContentHint":true,"debugging":false},"inputSchema":{"type":"object","properties":{"quoteId":{"type":"string","description":"Optional. From zomato_quote_cart, when the user was shown that quote."},"restaurantId":{"type":["string","number"],"description":"Optional. The restaurantId you expect to be open. The call fails instead of acting on a different restaurant."}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/ncr","pages":["/ncr","/ncr/collections","/ncr/insta-worthy","/ncr/omakase-bars","/ncr/secret-speakeasy-bars","/ncr/great-cafes"]}],"category":"Commerce","favicon":"/favicons/zomato.com.png","apiSurface":"spec","toolCount":17}}