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.

See place_food_order in actionComing soon

Example

const result = await client.callTool({
  name: "place_food_order",
  arguments: {
    addressId: "addr_01HXYZ",
  },
});

Parameters

ParameterTypeRequiredDescription
addressIdstringyesAddress ID from the user's saved addresses (coordinates will be fetched automatically)
paymentMethodstringnoPayment 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.
intentAppstringnoUPI-app payment: the method id from get_payment_options, echoed byte-for-byte. Send together with paymentMethod="UPI".
generateUPIQRbooleannoDesktop scan-QR: set true together with paymentMethod="UPI" (and no intentApp) to get a scannable QR.
noteToRestaurantstringnoOptional note / special instructions sent to the restaurant with the order.

For a UPI payment the method comes from get_payment_optionsget_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 for check_payment_status.
  • orderId — required for confirm_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

FieldValue
Nameplace_food_order
MCP ServerFood
EndpointPOST mcp.swiggy.com/food
StageOrder
Behaviourmutating

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.

  1. Call get_food_cart first to display the complete order summary (items, costs)
  2. Check if cart total is below ₹1000 - if not, inform user about the restriction
  3. When the user is ready to pay, call get_payment_options and pass their pick into this call (intentApp for a UPI app, generateUPIQR for desktop scan-QR, or paymentMethod="Cash")
  4. Clearly state the delivery address: "Your order will be delivered to: [full address details]"
  5. Ask: "Do you want to proceed with placing this order to this address?"
  6. Wait for clear confirmation (yes/confirm/proceed)
  7. 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.