GoFood Merchant data API
GoFood Merchant is the restaurant console for Gojek's GoFood network in Indonesia. Behind the home inbox and wallet screens it calls private HTTPS endpoints — /v1/wallet/balance for overall / effectiveBalance / cuttoffBalance, and /v1/orders for live tickets with shoppingPrice, otpCode and secondsToAccept.
Settlement uses /v1/payouts plus /v1/payout-settings for the destination bank account. Catalogue SKUs live under /v1/menus/{mg_id}/items/{common_id}, quality cards at /v1/quality/scores, and menu photos go through /v1/catalog/ocr. Every call carries a Bearer access_token from merchant identity together with Gojek-Country-Code.
GoFood Merchant is Gojek's outlet console for Indonesian restaurants on GoFood: accept live tickets, keep the menu in stock, and cash out the GoPay merchant wallet. Behind the home inbox, catalogue, quality score and wallet screens the app talks to a merchant data API — wallet balances (overall, effectiveBalance, cuttoffBalance), ledger search and bank payouts, live tickets with shoppingPrice and otpCode, accept/reject, menu SKUs keyed by commonId, quality-score cards, and OCR that predicts menus from a photo.
Screenshots
API surface
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
Illustrative example reconstructed from the app's interface — not a live capture.
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 } }Derived from the app's interface; endpoint details are illustrative, not a live capture.
reconstructed from the outlet wallet home showing overall, effectiveBalance and cuttoffBalancefield set matches the wallet-balance card on the merchant console
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
Illustrative example reconstructed from the app's interface — not a live capture.
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} } }Derived from the app's interface; endpoint details are illustrative, not a live capture.
reconstructed from the wallet-home chart that plots opening vs closing balancesSummaryBalance fields nett, pending, reserve, overall, effective
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
Illustrative example reconstructed from the app's interface — not a live capture.
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 } ] }Derived from the app's interface; endpoint details are illustrative, not a live capture.
reconstructed from the wallet cash-out / payout action on the merchant consolePayoutResponse fields payoutId, referenceNo, source, amount
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
Illustrative example reconstructed from the app's interface — not a live capture.
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 }Derived from the app's interface; endpoint details are illustrative, not a live capture.
reconstructed from the Wallet Balance History list on the merchant consoleactivity rows expose id, amount, time, status, type, category
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
Illustrative example reconstructed from the app's interface — not a live capture.
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"} } }Derived from the app's interface; endpoint details are illustrative, not a live capture.
reconstructed from the payout-settings screen listing the destination bank accountBankAccount fields bankName, accountNumber, accountName, bankCode, id
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
Illustrative example reconstructed from the app's interface — not a live capture.
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 }Derived from the app's interface; endpoint details are illustrative, not a live capture.
reconstructed from the home ticket inbox on the merchant consoleOrderResponse fields orderNo, shoppingPrice, finalPrice, status, customerName, otpCode
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
Illustrative example reconstructed from the app's interface — not a live capture.
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"} ] }Derived from the app's interface; endpoint details are illustrative, not a live capture.
reconstructed from the ticket-detail screen (line items, customer/driver, OTP)OrderItem fields itemId, itemUUID, name, note, quantity, price
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
Illustrative example reconstructed from the app's interface — not a live capture.
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 }Derived from the app's interface; endpoint details are illustrative, not a live capture.
reconstructed from the Accept control on a pending ticketmoves status to MERCHANT_ACCEPTED with secondsToPrepare
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
Illustrative example reconstructed from the app's interface — not a live capture.
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" }Derived from the app's interface; endpoint details are illustrative, not a live capture.
reconstructed from the Reject sheet on a pending ticketRejectOrderRequestBody fields cancelReasonCode, cancelReasonText, outOfStockItemList, outOfStockVariants
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
Illustrative example reconstructed from the app's interface — not a live capture.
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"} ] }Derived from the app's interface; endpoint details are illustrative, not a live capture.
reconstructed from the My Outlet profile editorprofile fields name, image, collections, operationalHoursJson, cuisineJson, brand, address
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
Illustrative example reconstructed from the app's interface — not a live capture.
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" }Derived from the app's interface; endpoint details are illustrative, not a live capture.
reconstructed from the store-open toggle on home/settingsopen_status / status_type fields on the outlet card
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
Illustrative example reconstructed from the app's interface — not a live capture.
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}] }Derived from the app's interface; endpoint details are illustrative, not a live capture.
reconstructed from the catalogue item editor (multi-outlet SKU)FoodItem fields active, commonId, name, price, catalogAvailabilities
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
Illustrative example reconstructed from the app's interface — not a live capture.
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"} ] } }Derived from the app's interface; endpoint details are illustrative, not a live capture.
reconstructed from the merchant quality-score dashboardheader.level badge plus cards for acceptance_rate / cancellation_rate / preparation_time
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
Illustrative example reconstructed from the app's interface — not a live capture.
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"} ] } ] }Derived from the app's interface; endpoint details are illustrative, not a live capture.
reconstructed from the photograph-a-menu onboarding flowScanFoodMenuResponse fields llmTime, loadTime, menus
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
Illustrative example reconstructed from the app's interface — not a live capture.
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" } ] }Derived from the app's interface; endpoint details are illustrative, not a live capture.
reconstructed from the dine-in / buffet voucher inboxorderNumber, voucherName, voucherValue, voucherPrice on each redeemed ticket
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.
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