GoFood Merchant data API
GoFood Merchant is the restaurant-side app from PT. GoTo Gojek Tokopedia Tbk, the GoTo group formed by Gojek and Tokopedia, for outlets that sell on GoFood, Gojek's food-delivery service in Indonesia. Its home screen is a live ticket inbox of active and scheduled delivery orders: staff accept each new ticket before the acceptance countdown runs out or reject it with a reason such as an out-of-stock dish, open the ticket to check line items and cooking notes, and hand the food to the Gojek driver against a PIN code at pickup. A store toggle pauses or reopens the outlet to new orders, My Outlet edits the public restaurant card (photo, address, cuisines and opening hours), and a catalogue editor keeps one menu of signature dishes and variant options in sync across a brand's outlets, with a photograph-a-menu flow that turns paper menus into listings. A quality dashboard grades the outlet with a badge level such as GOLD and cards for acceptance rate, cancellation rate and preparation time that decide promotion eligibility, while a separate inbox lists redeemed dine-in and buffet vouchers. Money runs through the GoPay merchant wallet: a balance chart, Wallet Balance History, on-demand cash-out and a daily auto-payout to the registered bank account. It serves Indonesian food businesses from single warungs to multi-outlet restaurant brands, competing with GrabMerchant and ShopeeFood Merchant for the same kitchens.
GoFood order tickets land in the outlet's inbox carrying orderNo, orderType, status, the shoppingPrice and finalPrice in IDR, the secondsToAccept countdown and the otpCode handed to the driver; opened up, each ticket adds orderedAt, estimatedDriverPickupAt, netPrice, paymentMethods, customer and driver contacts, and line items keyed by itemUUID with quantity, price and note. A rejection records a cancelReasonCode with the outOfStockItemList, and an acceptance returns secondsToPrepare.
The money side follows each order into the GoPay merchant wallet: spendable effectiveBalance against cuttoffBalance held past the settlement cutoff, opening and closing balances for any time window split into nett, pending and reserve, journal rows with amount, type and category (ORDER_SETTLEMENT, PAYOUT, ADJUSTMENT), payouts identified by payoutId and referenceNo, and the destination account (bankName, bankCode, accountNumber) with its daily auto-payout option.
Around the tickets sit the outlet's catalogue and standing: menu SKUs shared across outlets by commonId with price, a signature flag, variantCategoryCommonIds and per-outlet catalogAvailabilities; menuItems with name, price and description predicted from photographed paper menus; the restaurant card with cuisineJson and operationalHoursJson; the open_status flag; quality cards scoring each qualityType against a target under a header.level badge; and redeemed dine-in vouchers with voucherValue, voucherPrice and campaign start and end dates.
Finance bots match live tickets' shoppingPrice to ORDER_SETTLEMENT and PAYOUT journal rows every night so unpaid GoFood days surface before the 15:00 auto-payout; kitchen display systems poll the live inbox, pull line items and notes, accept before secondsToAccept hits zero and pass the otpCode to the pickup counter; head-office menu services sync prices and availability across outlets and seed new SKUs from photographed paper menus; and growth tools watch the GOLD badge and the acceptance and cancellation cards, pausing ad spend when a run of OUT_OF_STOCK rejections puts the outlet's level at risk. openData Studio makes this order, wallet, catalogue and quality data callable open data for exactly those integrations.
Screenshots
API surface
The endpoints and request/response examples below are reconstructed from the app's interface — illustrative, not a live capture.
Outlet wallet balance
GET
/v1/wallet/balanceopenbankingReads the signed-in outlet's GoPay merchant wallet: overall balance, spendable effectiveBalance, and cuttoffBalance held past the settlement cutoff.
Auth: Bearer access_token from merchant identity sign-in; X-AppVersion, X-UniqueId, X-User-Locale, Gojek-Country-Code, X-User-Type
- data.overall
- data.effectiveBalance
- data.cuttoffBalance
GET /v1/wallet/balance?merchant_id=MCH-88100214 HTTP/1.1 Authorization: Bearer eyJhbGciOi... X-AppVersion: 5.51 X-UniqueId: 7c2a9f11-4b8e-4d21 Gojek-Country-Code: ID X-User-Locale: id_ID{ "data": { "overall": 18425000.0, "effectiveBalance": 17240000.0, "cuttoffBalance": 1185000.0 } }Wallet balance summary window
GET
/v1/wallet/summaryopenfinanceReturns opening and closing wallet balances for a time window, split into nett, pending, reserve, overall and effective IDR amounts used on the wallet-home chart.
Auth: Bearer access_token from merchant identity sign-in; X-AppVersion, X-UniqueId, X-User-Locale, Gojek-Country-Code, X-User-Type
- merchantId
- currency
- startTime
- endTime
- startBalance.nett
- startBalance.pending
- startBalance.reserve
- startBalance.overall
- startBalance.effective
- endBalance.nett
- endBalance.pending
- endBalance.reserve
- endBalance.overall
- endBalance.effective
GET /v1/wallet/summary?merchant_id=MCH-88100214&start_time=2026-09-21T00:00:00Z&end_time=2026-09-28T00:00:00Z HTTP/1.1 Authorization: Bearer eyJhbGciOi... Gojek-Country-Code: ID{ "data": { "merchantId": "MCH-88100214", "currency": "IDR", "startTime": "2026-09-21T00:00:00Z", "endTime": "2026-09-28T00:00:00Z", "startBalance": {"nett": 15120000.0, "pending": 840000.0, "reserve": 250000.0, "overall": 16210000.0, "effective": 15120000.0}, "endBalance": {"nett": 17240000.0, "pending": 935000.0, "reserve": 250000.0, "overall": 18425000.0, "effective": 17240000.0} } }Create merchant payout
POST
/v1/payoutsopenbankingStarts a settlement payout of the outlet wallet into the registered bank account and returns payoutId, referenceNo, source and amount.
Auth: Bearer access_token from merchant identity sign-in; X-AppVersion, X-UniqueId, X-User-Locale, Gojek-Country-Code, X-User-Type
- payouts.payoutId
- payouts.referenceNo
- payouts.source
- payouts.amount
- merchantId
POST /v1/payouts HTTP/1.1 Authorization: Bearer eyJhbGciOi... Content-Type: application/json Gojek-Country-Code: ID {"merchantId": "MCH-88100214"}{ "payouts": [ { "payoutId": "PO-20260928-4419", "referenceNo": "REF-GOFOOD-992188", "source": "GOPAY_WALLET", "amount": 17240000.0 } ] }Search wallet journal activities
POST
/v1/ledger/searchopenfinancePages the outlet wallet ledger used by Wallet Balance History: each activity has id, amount, time, status, type and category, plus aggregations.total.
Auth: Bearer access_token from merchant identity sign-in; X-AppVersion, X-UniqueId, X-User-Locale, Gojek-Country-Code, X-User-Type
- activitiesResponse.id
- activitiesResponse.amount
- activitiesResponse.time
- activitiesResponse.status
- activitiesResponse.type
- activitiesResponse.category
- activitiesResponse.metadata
- aggregations
- total
- timeRange
- from
- size
POST /v1/ledger/search HTTP/1.1 Authorization: Bearer eyJhbGciOi... Content-Type: application/json {"timeRange":{"from":"2026-09-21T00:00:00Z","to":"2026-09-28T23:59:59Z"},"sort":{"time":"desc"},"from":0,"size":20,"includedCategories":{"include":["PAYOUT","ORDER_SETTLEMENT","ADJUSTMENT"]}}{ "activitiesResponse": [ { "id": "JNL-88912001", "amount": 48500.0, "time": "2026-09-27T14:22:11Z", "status": "POSTED", "type": "CREDIT", "category": "ORDER_SETTLEMENT", "metadata": { "orderNo": "F-1234567890", "gopayMetadata": {"channel": "GOPAY"} } } ], "aggregations": {"aggregationsResponse": {"total": {"sum": 17240000.0}}}, "total": 86 }Auto-payout bank settings
POST
/v1/payout-settingsopenbankingLooks up the outlet's auto-payout cadence and destination bank account (bankName, bankCode, accountName, accountNumber) shown on payout-settings.
Auth: Bearer access_token from merchant identity sign-in; X-AppVersion, X-UniqueId, X-User-Locale, Gojek-Country-Code, X-User-Type
- query.ownerId
- query.ownerType
- data.bankAccount.id
- data.bankAccount.bankName
- data.bankAccount.bankCode
- data.bankAccount.accountName
- data.bankAccount.accountNumber
- data.option
- data.meta
POST /v1/payout-settings HTTP/1.1 Authorization: Bearer eyJhbGciOi... Content-Type: application/json {"query":{"ownerId":"MCH-88100214","ownerType":"MERCHANT"}}{ "data": { "bankAccount": { "id": "BA-44012", "bankName": "Bank Central Asia", "bankCode": "014", "accountName": "Warung Nasi Padang Sederhana", "accountNumber": "1234567890" }, "option": "DAILY", "meta": {"payoutTime": "15:00"} } }List live GoFood orders
GET
/v1/ordersopendataPages the merchant order inbox (active and scheduled) with orderNo, prices, status, customer and driver fields used on the home ticket list.
Auth: Bearer access_token from merchant identity sign-in; X-AppVersion, X-UniqueId, X-User-Locale, Gojek-Country-Code, X-User-Type
- orders.orderNo
- orders.restaurantId
- orders.currency
- orders.shoppingPrice
- orders.finalPrice
- orders.takeawayCharges
- orders.status
- orders.statusType
- orders.orderType
- orders.customerName
- orders.customerPhone
- orders.secondsToAccept
- orders.otpCode
- currentPage
- nextPage
- previousPage
GET /v1/orders?restaurant_id=RST-77a1c2&page=1&per_page=20 HTTP/1.1 Authorization: Bearer eyJhbGciOi... X-User-Type: merchant Gojek-Country-Code: ID{ "orders": [ { "orderNo": "F-1234567890", "restaurantId": "RST-77a1c2", "currency": "IDR", "shoppingPrice": 48500, "finalPrice": 45200, "takeawayCharges": 2000, "status": "AWAITING_ACCEPTANCE", "statusType": "ACTIVE", "orderType": "DELIVERY", "customerName": "Budi S.", "customerPhone": "+62812****901", "secondsToAccept": 45, "otpCode": "4421" } ], "currentPage": "1", "nextPage": "2", "previousPage": null }GoFood order detail
GET
/v1/orders/{order_number}opendataLoads a single ticket: line items (itemUUID, name, quantity, price, note), customer/driver contacts, OTP pin-exchange code and estimatedDriverPickupAt.
Auth: Bearer access_token from merchant identity sign-in; X-AppVersion, X-UniqueId, X-User-Locale, Gojek-Country-Code, X-User-Type
- orderNo
- restaurantId
- currency
- shoppingPrice
- finalPrice
- netPrice
- status
- orderType
- orderedAt
- customerName
- customerPhone
- driverName
- driverPhone
- driverPhotoUrl
- otpCode
- estimatedDriverPickupAt
- paymentMethods
- orderItems.itemId
- orderItems.itemUUID
- orderItems.name
- orderItems.quantity
- orderItems.price
- orderItems.note
GET /v1/orders/F-1234567890 HTTP/1.1 Authorization: Bearer eyJhbGciOi... Gojek-Country-Code: ID{ "orderNo": "F-1234567890", "restaurantId": "RST-77a1c2", "currency": "IDR", "shoppingPrice": 48500, "finalPrice": 45200, "netPrice": 41000, "status": "DRIVER_ASSIGNED", "orderType": "DELIVERY", "orderedAt": "2026-09-28T07:14:02Z", "customerName": "Budi S.", "customerPhone": "+62812****901", "driverName": "Agus W.", "driverPhone": "+62813****220", "driverPhotoUrl": "https://cdn.example.com/driver.jpg", "otpCode": "4421", "estimatedDriverPickupAt": "2026-09-28T07:28:00Z", "paymentMethods": ["GOPAY"], "orderItems": [ {"itemId": 9011, "itemUUID": "mi-nasi-padang", "name": "Nasi Padang Komplit", "quantity": 2, "price": 22000, "note": "Pedas sedang"} ] }Accept incoming order
POST
/v1/orders/{order_id}/acceptopendataAccepts an AWAITING_ACCEPTANCE ticket before the acceptanceDeadlineSecs timer expires, moving it into preparation.
Auth: Bearer access_token from merchant identity sign-in; X-AppVersion, X-UniqueId, X-User-Locale, Gojek-Country-Code, X-User-Type
- success
- orderNo
- status
- secondsToPrepare
POST /v1/orders/F-1234567890/accept HTTP/1.1 Authorization: Bearer eyJhbGciOi... X-AppVersion: 5.51 Gojek-Country-Code: ID{ "success": true, "orderNo": "F-1234567890", "status": "MERCHANT_ACCEPTED", "secondsToPrepare": 900 }Reject incoming order
POST
/v1/orders/{order_id}/rejectopendataRejects a ticket with a coded reason (stock-out items and variants) that feeds merchant quality scoring.
Auth: Bearer access_token from merchant identity sign-in; X-AppVersion, X-UniqueId, X-User-Locale, Gojek-Country-Code, X-User-Type
- cancelReasonCode
- cancelReasonText
- outOfStockItemList
- outOfStockVariants
- success
- orderNo
- status
POST /v1/orders/F-1234567890/reject HTTP/1.1 Authorization: Bearer eyJhbGciOi... Content-Type: application/json {"cancelReasonCode":"OUT_OF_STOCK","cancelReasonText":"Nasi Padang habis","outOfStockItemList":[{"itemUUID":"mi-nasi-padang"}],"outOfStockVariants":[]}{ "success": true, "orderNo": "F-1234567890", "status": "MERCHANT_REJECTED", "cancelReasonCode": "OUT_OF_STOCK" }Restaurant profile
GET
/v1/outlets/{restaurant_uuid}/profileopendataReturns the public-facing restaurant card: name, image, address, cuisine list, brand and operationalHoursJson edited on My Outlet.
Auth: Bearer access_token from merchant identity sign-in; X-AppVersion, X-UniqueId, X-User-Locale, Gojek-Country-Code, X-User-Type
- name
- image
- address
- collections
- shareableMessage
- brand
- cuisineJson
- operationalHoursJson
GET /v1/outlets/RST-77a1c2/profile HTTP/1.1 Authorization: Bearer eyJhbGciOi... Gojek-Country-Code: ID{ "name": "Warung Nasi Padang Sederhana", "image": "https://cdn.example.com/resto.jpg", "address": "Jl. Sabang No. 12, Jakarta Pusat", "collections": "PADANG,HALAL", "shareableMessage": "Pesan di GoFood: Warung Nasi Padang Sederhana", "brand": {"id": "BR-padang-sederhana", "name": "Sederhana"}, "cuisineJson": [{"id": "padang", "name": "Padang"}], "operationalHoursJson": [ {"day": "MON", "open": "10:00", "close": "22:00"} ] }Toggle restaurant open status
PUT
/v1/outlets/{id}/open-statusopendataFlips the outlet between open and paused so the consumer app stops or resumes dispatching new GoFood tickets.
Auth: Bearer access_token from merchant identity sign-in; X-AppVersion, X-UniqueId, X-User-Locale, Gojek-Country-Code, X-User-Type
- id
- open_status
- status_type
PUT /v1/outlets/RST-77a1c2/open-status HTTP/1.1 Authorization: Bearer eyJhbGciOi... Content-Type: application/json {"open_status": true}{ "id": "RST-77a1c2", "open_status": true, "status_type": "OPEN" }Menu item in a menu group
GET
/v1/menus/{mg_id}/items/{common_id}opendataReads one catalogue SKU shared across outlets: commonId, price, image, signature flag, variant categories and per-restaurant catalogAvailabilities.
Auth: Bearer access_token from merchant identity sign-in; X-AppVersion, X-UniqueId, X-User-Locale, Gojek-Country-Code, X-User-Type
- active
- commonId
- menuCommonId
- name
- description
- price
- image
- signature
- weight
- variantCategoryCommonIds
- ids
- catalogAvailabilities
GET /v1/menus/MG-88/items/mi-nasi-padang HTTP/1.1 Authorization: Bearer eyJhbGciOi... Gojek-Country-Code: ID{ "active": true, "commonId": "mi-nasi-padang", "menuCommonId": "cat-nasi", "name": "Nasi Padang Komplit", "description": "Nasi, rendang, gulai ayam, sambal", "price": 22000.0, "image": "https://cdn.example.com/menu.jpg", "signature": true, "weight": 10, "variantCategoryCommonIds": ["vc-level-pedas"], "ids": [{"restaurantId": "RST-77a1c2", "menuItemId": "9011"}], "catalogAvailabilities": [{"restaurantId": "RST-77a1c2", "available": true}] }Merchant quality scores
GET
/v1/quality/scoresopendataReturns the GoFood quality dashboard: a header.level badge plus per-attribute cards (acceptance, cancellation, prep time) that gate promotions.
Auth: Bearer access_token from merchant identity sign-in; X-AppVersion, X-UniqueId, X-User-Locale, Gojek-Country-Code, X-User-Type
- data.header.level
- data.header.cta
- data.cards.qualityType
- data.cards.score
- data.cards.target
- data.cards.status
GET /v1/quality/scores?restaurant_id=RST-77a1c2 HTTP/1.1 Authorization: Bearer eyJhbGciOi... Gojek-Country-Code: ID{ "data": { "header": {"level": "GOLD", "cta": {"text": "See how to improve", "deeplink": "gofoodmerchant://food/analytics/reviews"}}, "cards": [ {"qualityType": "acceptance_rate", "score": 97.2, "target": 95.0, "status": "HEALTHY"}, {"qualityType": "cancellation_rate", "score": 1.4, "target": 5.0, "status": "HEALTHY"}, {"qualityType": "preparation_time", "score": 11.5, "target": 15.0, "status": "HEALTHY"} ] } }OCR predict menu from photo
POST
/v1/catalog/ocropendataRuns catalogue OCR on uploaded menu photos (imageLinks) and returns predicted menus/menuItems with name, price and description for bulk onboarding.
Auth: Bearer access_token from merchant identity sign-in; X-AppVersion, X-UniqueId, X-User-Locale, Gojek-Country-Code, X-User-Type
- imageLinks
- llmTime
- loadTime
- menus.name
- menus.menuItems.name
- menus.menuItems.price
- menus.menuItems.description
POST /v1/catalog/ocr HTTP/1.1 Authorization: Bearer eyJhbGciOi... Content-Type: application/json {"imageLinks":["https://cdn.example.com/menu-scan/2026-09-28/page1.jpg"]}{ "llmTime": 1.84, "loadTime": 0.42, "menus": [ { "name": "Nasi", "menuItems": [ {"name": "Nasi Padang Komplit", "price": 22000.0, "description": "Nasi, rendang, gulai"} ] } ] }Dine-in voucher orders
GET
/v1/dine-in/ordersopendataLists redeemed dine-in voucher tickets (bundle + voucher value/price and campaign window) shown on the buffet/dine-in inbox.
Auth: Bearer access_token from merchant identity sign-in; X-AppVersion, X-UniqueId, X-User-Locale, Gojek-Country-Code, X-User-Type
- orders.orderNumber
- orders.createdAt
- orders.bundleId
- orders.bundleName
- orders.voucherId
- orders.voucherName
- orders.voucherValue
- orders.voucherPrice
- orders.benefitsDescriptions
- orders.campaignStartDate
- orders.campaignEndDate
- orders.tnc
GET /v1/dine-in/orders?restaurant_id=RST-77a1c2&limit=20 HTTP/1.1 Authorization: Bearer eyJhbGciOi... Gojek-Country-Code: ID{ "orders": [ { "orderNumber": "DI-20260928-019", "createdAt": "2026-09-28T11:05:00Z", "bundleId": "BND-lunch", "bundleName": "Paket Makan Siang", "voucherId": "VCH-9981", "voucherName": "Diskon 20%", "voucherValue": 15000.0, "voucherPrice": 12000.0, "benefitsDescriptions": "Potongan 20% max Rp15.000", "campaignStartDate": "2026-09-01T00:00:00Z", "campaignEndDate": "2026-09-30T23:59:59Z", "tnc": "Berlaku dine-in saja" } ] }
Data categories
- wallet balances
- payouts
- order tickets
- menus
- restaurant profile
- quality scores
- dine-in vouchers
Where teams use this data
Nightly outlet-ledger reconciliation
Finance bots pull GET /v1/wallet/balance and /v1/wallet/summary, then POST /v1/ledger/search for ORDER_SETTLEMENT and PAYOUT rows, matching shoppingPrice on live tickets to journal amount so unpaid GoFood days surface before the 15:00 auto-payout.
Kitchen display from the live inbox
A KDS polls GET /v1/orders, opens /v1/orders/{order_number} for itemUUID / quantity / note, then POST /v1/orders/{order_id}/accept before secondsToAccept hits zero — handing otpCode to the pass for pin-exchange with the driver.
Multi-outlet catalogue sync
A head-office menu service reads /v1/menus/{mg_id}/items/{common_id} (price, catalogAvailabilities, variantCategoryCommonIds) and can seed new SKUs via POST /v1/catalog/ocr from photographed paper menus.
Promo eligibility from quality cards
Growth tools watch GET /v1/quality/scores (header.level plus acceptance_rate / cancellation_rate cards) and pause ad spend when a reject storm of cancelReasonCode=OUT_OF_STOCK would drop the outlet below GOLD.
Frequently asked questions
What wallet fields does GoFood Merchant expose?
GET /v1/wallet/balance returns data.overall, data.effectiveBalance and data.cuttoffBalance. The summary endpoint adds nett / pending / reserve splits for a time window, and POST /v1/ledger/search pages each ledger row by id, amount, status, type and category.
How do live GoFood tickets look on the wire?
GET /v1/orders pages OrderResponse objects (orderNo, shoppingPrice, finalPrice, status, customerName, otpCode). Detail is GET /v1/orders/{order_number}; merchants accept or reject via /v1/orders/{order_id}/accept and /reject with cancelReasonCode.
Where is the menu catalogue?
Each SKU is GET /v1/menus/{mg_id}/items/{common_id} with commonId, price, image, variantCategoryCommonIds and catalogAvailabilities. Paper menus can be predicted first at POST /v1/catalog/ocr.
How does the app authenticate?
After merchant identity sign-in every data call sends Authorization: Bearer plus X-AppVersion, X-UniqueId, X-User-Locale, X-User-Type and Gojek-Country-Code: ID. These are first-party merchant endpoints, not a public developer API.
Apps similar to GoFood Merchant
- GrabMerchant — Grab's restaurant partner app for Indonesian and SEA merchants to accept GrabFood orders, update menus and track payouts.
- ShopeeFood Merchant — Shopee's merchant console for Indonesian restaurants on ShopeeFood, covering live tickets, menu stock and settlement.
- Uber Eats Manager — Uber's restaurant manager app for accepting delivery tickets, pausing items and reviewing payouts.
- DoorDash for Merchants — DoorDash's merchant app for US restaurants to manage incoming orders and store availability.
- Maxim for Partners — Maxim's partner app used by Indonesian food merchants to receive delivery orders alongside its ride-hailing network.
- Moka POS — An Indonesian point-of-sale app used by restaurants that also connect to GoFood, GrabFood and ShopeeFood.
More Food Delivery apps
Topics
- gofood merchant api
- gobiz wallet balance
- gofood live orders
- merchant payouts
- gofood menu items
- merchant quality score
- indonesia food delivery merchant
Need this app's data API integrated?
We deliver scoped integrations for any named app — from USD 500 with source-code handoff, or hosted access billed per call. Tell us the data you need.
- NDA + SOW on every engagement
- Delivery in 3–7 days
- Payment only after acceptance
- Work scoped to authorized use