name: grab-merchant version: 1.0.0 description: Manage GrabFood/GrabMart orders, menus, and store hours via the Merchant API. author: ZeptoClaw license: MIT tags:
- grab
- food-delivery
- sea
- ecommerce env_needed:
- name: GRAB_CLIENT_ID description: OAuth2 client ID from Grab Developer Portal required: true
- name: GRAB_CLIENT_SECRET description: OAuth2 client secret required: true
- name: GRAB_MERCHANT_ID description: Your Grab merchant ID required: true metadata: {"zeptoclaw":{"emoji":"🏍️","requires":{"anyBins":["curl","jq"]}}}
Grab Merchant Skill
Manage GrabFood and GrabMart operations — orders, menus, and store availability.
Setup
- Register at developer.grab.com
- Create an app with
food.partner_apiscope - Get OAuth2 credentials
export GRAB_CLIENT_ID="your_client_id"
export GRAB_CLIENT_SECRET="your_client_secret"
export GRAB_MERCHANT_ID="your_merchant_id"
Get Access Token
export GRAB_ACCESS_TOKEN=$(curl -s -X POST "https://partner-api.grab.com/grabid/v1/oauth2/token" \
-H "Content-Type: application/json" \
-d "{
\"client_id\": \"$GRAB_CLIENT_ID\",
\"client_secret\": \"$GRAB_CLIENT_SECRET\",
\"grant_type\": \"client_credentials\",
\"scope\": \"food.partner_api\"
}" | jq -r '.access_token')
List Recent Orders
curl -s "https://partner-api.grab.com/merchant/v2/orders?merchantID=$GRAB_MERCHANT_ID&limit=20" \
-H "Authorization: Bearer $GRAB_ACCESS_TOKEN" \
| jq '.orders[] | {id: .orderID, status, total: .price.totalPrice, items: [.items[].name]}'
Get Store Hours
curl -s "https://partner-api.grab.com/merchant/v2/store/hours?merchantID=$GRAB_MERCHANT_ID" \
-H "Authorization: Bearer $GRAB_ACCESS_TOKEN" \
| jq '.schedules[] | {day: .dayOfWeek, open: .openTime, close: .closeTime}'
Pause/Resume Store
curl -s -X POST "https://partner-api.grab.com/merchant/v2/store/pause" \
-H "Authorization: Bearer $GRAB_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d "{\"merchantID\": \"$GRAB_MERCHANT_ID\", \"duration\": 60}" \
| jq '.success'
Cancel an Order
ORDER_ID="order-id"
curl -s -X POST "https://partner-api.grab.com/merchant/v2/orders/cancel" \
-H "Authorization: Bearer $GRAB_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d "{\"orderID\": \"$ORDER_ID\", \"merchantID\": \"$GRAB_MERCHANT_ID\", \"cancelCode\": 1001}" \
| jq '.success'
Tips
- OAuth2 access tokens expire in 1 hour — refresh using client_credentials flow
- Cancel codes: 1001 (can't fulfill), 1002 (out of stock), 1003 (store closed)
- API is region-scoped — base URL may vary by country
- Rate limit depends on partnership tier
- Custom MCP server planned for
qhkm/zeptoclaw-searepo