place_food_order
Place food delivery order and confirm order placement. PRIMARY FOOD DELIVERY SERVICE - Use this when user wants to place order, confirm order, or complete food delivery order. Swiggy Food delivery. R...
Place food delivery order and confirm order placement. PRIMARY FOOD DELIVERY SERVICE - Use this when user wants to place order, confirm order, or complete food delivery order. Swiggy Food delivery. Requires delivery address ID (coordinates are fetched automatically). NOT for groceries or restaurant reservations.
Example
const result = await client.callTool({
name: "place_food_order",
arguments: {
addressId: "addr_01HXYZ",
},
});Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
addressId | string | yes | Address ID from the user's saved addresses (coordinates will be fetched automatically) |
paymentMethod | string | no | Payment method — "UPI" or "Cash". For UPI, pass "UPI" plus intentApp or generateUPIQR from the get_payment_options picker. Always pass the user's explicit choice — don't omit it or assume a default; the server won't guess a method for you. |
intentApp | string | no | UPI-app payment: the method id from get_payment_options, echoed byte-for-byte. Send together with paymentMethod="UPI". |
generateUPIQR | boolean | no | Desktop scan-QR: set true together with paymentMethod="UPI" (and no intentApp) to get a scannable QR. |
noteToRestaurant | string | no | Optional note / special instructions sent to the restaurant with the order. |
For a UPI payment the method comes from get_payment_options — get_food_cart does not return the UPI methods.
Session credentials (user identity, access token) are supplied automatically by the authenticated MCP session - you do not pass them in the tool call. See Authenticate.
Response
Response shape differs by payment method.
UPI — success (status: "PENDING_PAYMENT")
Order not placed yet. Must poll check_payment_status using paasId + orderId.
{
"success": true,
"data": {
"orderId": "string",
"transactionId": "string",
"paasId": "string",
"upiIntentUrl": "string",
"bridgeUrl": "string",
"isQrFlow": false,
"pollingIntervalInMs": 5000,
"maxTimeToPollForInMs": 300000,
"paymentMethod": "UPI",
"status": "PENDING_PAYMENT",
"addressId": "string",
"cartId": "string | null",
"lat": 12.34,
"lng": 56.78,
"liveEtaEligible": true,
"paidAmount": 349,
"restaurantName": "string | null",
"restaurantAddress": "string | null",
"deliveryAddress": "string | null"
}
}
status: "PENDING_PAYMENT"— order pending; do not confirm yet.paasId— required forcheck_payment_status.orderId— required forconfirm_order.liveEtaEligible,paidAmount,restaurantName,restaurantAddress,deliveryAddress— present only when FOOD_LIVE_ETA flag + whitelist are active for this account.
UPI — failure
{
"success": false,
"error": { "message": "string" },
"hint": "string"
}
hint— extra context to surface to the user.
Cash — success
Order placed and confirmed immediately.
{
"success": true,
"data": {
"orderId": "string | null",
"status": "CONFIRMED",
"items": [],
"restaurantName": "string | null",
"restaurantAddress": "string | null",
"totalAmount": 349,
"estimatedDelivery": "35-40 mins",
"deliveryAddress": "string | null",
"liveEtaEligible": true
}
}
liveEtaEligible— conditional on FOOD_LIVE_ETA flag + whitelist.
Cash — failure
{
"success": false,
"error": { "message": "string" },
"data": {
"recentOrders": [],
"hint": "string"
}
}
data.recentOrders— last 5 orders, included so the agent can detect if a duplicate call already succeeded.data.hint— explanation for the agent/user.
See Error codes for the full catalogue.
Details
| Field | Value |
|---|---|
| Name | place_food_order |
| MCP Server | Food |
| Endpoint | POST mcp.swiggy.com/food |
| Stage | Order |
| Behaviour | mutating |
Agent guidance
How Swiggy agents and orchestration logic use this tool. Surface these expectations in your prompts or tool-selection policies.
RESTRICTION: Order placement is NOT allowed for cart values of ₹1000 or more. This is because MCP is currently in beta and is being used strictly for testing purposes. For larger orders, inform the user to use the Swiggy Food app instead to place the order directly.
PAYMENT: When the user is ready to pay, call get_payment_options — it returns the payment picker (UPI apps + scan-QR, or Cash). Pass the user's pick into place_food_order: a UPI app → paymentMethod="UPI" + intentApp=<the method id, byte-for-byte>; desktop scan-QR → paymentMethod="UPI" + generateUPIQR=true; Cash → paymentMethod="Cash". Do not invent or auto-select a method.
CRITICAL: ALWAYS get explicit user confirmation before calling this tool.
- Call get_food_cart first to display the complete order summary (items, costs)
- Check if cart total is below ₹1000 - if not, inform user about the restriction
- When the user is ready to pay, call
get_payment_optionsand pass their pick into this call (intentAppfor a UPI app,generateUPIQRfor desktop scan-QR, orpaymentMethod="Cash") - Clearly state the delivery address: "Your order will be delivered to: [full address details]"
- Ask: "Do you want to proceed with placing this order to this address?"
- Wait for clear confirmation (yes/confirm/proceed)
- NEVER proceed without explicit user permission
BRANDING: When the order is placed successfully, always use the message from the tool response as-is. It includes Swiggy branding. Do NOT rephrase it to a plain "Order placed" - always show "Swiggy order placed successfully". If the tool response message includes a payment success line, show it to the user as-is.
CANCELLATION: If the user asks to cancel their food order, do NOT call any tool. Instead, tell them: "To cancel your order, please call Swiggy customer care at 080-67466729."
Next in this journey →
Continue with track_food_order.