{
  "openapi": "3.0.1",
  "info": {
    "title": "Grab Scraper - GrabFood Menus & GrabMart Data",
    "description": "Extract GrabFood restaurants, menus, and GrabMart products across eight Southeast Asian markets. Get merchant IDs, public URLs, ratings, and prices when available. Pay per delivered row plus a start fee.",
    "version": "0.1",
    "x-build-id": "h1iUADRz5xGgrdWaX"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/adamdd~grab-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-adamdd-grab-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/adamdd~grab-scraper/runs": {
      "post": {
        "operationId": "runs-sync-adamdd-grab-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/adamdd~grab-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-adamdd-grab-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "mode": {
            "title": "Mode",
            "enum": [
              "auto",
              "search",
              "restaurant",
              "mart",
              "mart_items",
              "mart_item",
              "mart_merchants",
              "chain",
              "cuisine",
              "recommended",
              "startUrls",
              "discoverCategories",
              "directory"
            ],
            "type": "string",
            "description": "Leave on Auto: the mode is picked from the field you fill (Start URLs, Restaurant URL, Merchant ID, Mart item ID, Chain name, Cuisine slug or Keyword). Pick a mode to run feeds that need no target (recommended, discoverCategories, directory, mart_items, mart_merchants).",
            "default": "auto"
          },
          "countryCode": {
            "title": "Country",
            "enum": [
              "sg",
              "my",
              "ph",
              "th",
              "vn",
              "id",
              "kh",
              "mm"
            ],
            "type": "string",
            "description": "Grab market country code",
            "default": "ph"
          },
          "keyword": {
            "title": "Keyword",
            "type": "string",
            "description": "What to search for, for example pizza or milk tea. With mode Auto a keyword runs a restaurant search; mart mode uses it for groceries; cuisine mode uses it when Cuisine slug is empty."
          },
          "startUrls": {
            "title": "Start URLs",
            "type": "array",
            "description": "food.grab.com / mart.grab.com links (restaurants, cuisine pages, mart pages). One target per line.",
            "items": {
              "type": "string"
            }
          },
          "restaurantUrl": {
            "title": "Restaurant URL",
            "pattern": "^\\s*(https?://)?([A-Za-z0-9-]+\\.)*grab\\.com(/|\\?|$).*",
            "type": "string",
            "description": "Paste a full GrabFood restaurant link, or a complete GrabMart product link with mode mart_item. Keep the item and merchant identifiers and URL text in the link."
          },
          "merchantId": {
            "title": "Merchant ID",
            "type": "string",
            "description": "Grab merchant identifier. In Auto mode, this selects restaurant details."
          },
          "itemId": {
            "title": "Mart item ID",
            "type": "string",
            "description": "GrabMart product identifier for mart_item mode. Also supply itemSlug, or use a complete product link in restaurantUrl."
          },
          "chainName": {
            "title": "Chain name",
            "type": "string",
            "description": "For mode=chain — brand / chain keyword or slug"
          },
          "cuisineSlug": {
            "title": "Cuisine slug",
            "type": "string",
            "description": "For mode=cuisine — e.g. pizza, chicken, mart-delivery"
          },
          "maxResults": {
            "title": "Max results per keyword, URL, or target",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "Most rows for each keyword, start URL, restaurant, cuisine, chain, or directory target. Default 70; larger numbers are collected in parts of 70. Restaurants, menu items, branch merchants, categories, promos, and labels all count together. The whole run stops at your maximum total charge. Free Apify plan: up to 200 rows per run and 10 runs of this Actor (limits set by the Actor developer).",
            "default": 70
          },
          "city": {
            "title": "City slug",
            "type": "string",
            "description": "Optional delivery city slug (e.g. makati, cebu, chiang-mai, hanoi, bali). Leave empty to use the market's main city. Ignored when latlng is set; restaurant/startUrls URLs from another market use their own market's location."
          },
          "latlng": {
            "title": "Lat,Lng",
            "pattern": "^\\s*$|^\\s*-?\\d{1,2}(\\.\\d+)?\\s*,\\s*-?\\d{1,3}(\\.\\d+)?\\s*$",
            "type": "string",
            "description": "Optional delivery pin as \"latitude,longitude\" (e.g. 14.5547,121.0244). Overrides city."
          },
          "businessType": {
            "title": "Business type",
            "enum": [
              "ALL",
              "FOOD",
              "MART"
            ],
            "type": "string",
            "description": "Filter search/recommended results",
            "default": "ALL"
          },
          "includeMenuItems": {
            "title": "Include menu items (restaurant pages)",
            "type": "boolean",
            "description": "For restaurant mode and restaurant links in startUrls, add menu items as separate billed rows within maxResults. Listing modes return merchants without menu items.",
            "default": false
          },
          "maxMenuItemsPerRestaurant": {
            "title": "Menu items per restaurant",
            "minimum": 1,
            "maximum": 200,
            "type": "integer",
            "description": "Per-restaurant cap. Menu items still count within that input's maxResults budget.",
            "default": 25
          },
          "expandBranches": {
            "title": "Expand branch merchants",
            "type": "boolean",
            "description": "Include additional branch merchants when available. Each branch is a separately billed row within maxResults.",
            "default": false
          },
          "emitCuisines": {
            "title": "Emit cuisine categories",
            "type": "boolean",
            "description": "Include available cuisine tags as separate category rows. Each category row is billed and counts toward maxResults.",
            "default": false
          },
          "emitPromoLabels": {
            "title": "Emit promo / labels",
            "type": "boolean",
            "description": "Include available promotions and labels as separate rows. Each row is billed and counts toward maxResults.",
            "default": false
          },
          "merchantSlug": {
            "title": "Merchant slug",
            "type": "string",
            "description": "URL slug for restaurant or mart merchant detail"
          },
          "itemSlug": {
            "title": "Mart item slug",
            "type": "string",
            "description": "For mode=mart_item — product slug in the item URL path"
          },
          "cuisineId": {
            "title": "Cuisine ID",
            "type": "string",
            "description": "Optional cuisine numeric/string id for /cuisines/{slug}/{id}"
          },
          "lang": {
            "title": "Language path",
            "type": "string",
            "description": "Path locale (en/th/vi/id/ms/zh/km depending on market)",
            "default": "en"
          },
          "pageSize": {
            "title": "Merchants per page",
            "minimum": 1,
            "maximum": 32,
            "type": "integer",
            "description": "Number of merchants requested per page, from 1 to 32. Continuing with a cursor retains its saved page size.",
            "default": 32
          },
          "cursor": {
            "title": "Resume cursor",
            "type": "object",
            "description": "Paste nextCursor from a previous RUN_SUMMARY to continue with the same mode, market, location, and query. Live listings can change, so deduplicate identifiers across runs."
          },
          "sitemapCity": {
            "title": "Directory / mart sitemap city",
            "pattern": "^[a-z0-9-]*$",
            "type": "string",
            "description": "Published city slug for directory, mart_items, or mart_merchants, such as singapore. Directory mode without a city includes published cities; GrabMart directory modes can use the delivery city."
          },
          "sitemapShard": {
            "title": "Directory / mart shard index",
            "minimum": 0,
            "type": "integer",
            "description": "Zero-based sitemap file index for directory modes. Continue from the position in RUN_SUMMARY.nextCursor.",
            "default": 0
          },
          "sitemapOffset": {
            "title": "Directory / mart entry offset",
            "minimum": 0,
            "maximum": 200000,
            "type": "integer",
            "description": "Zero-based entry position within a sitemap file for directory modes. Continue from the position in RUN_SUMMARY.nextCursor.",
            "default": 0
          },
          "sitemapMaxShards": {
            "title": "Directory / mart shard budget",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "Maximum sitemap shards read in this run.",
            "default": 1
          },
          "modifiedSince": {
            "title": "Directory modified since",
            "pattern": "^\\s*$|^\\d{4}-\\d{2}-\\d{2}$",
            "type": "string",
            "description": "Optional inclusive sitemap lastmod date (YYYY-MM-DD), not a menu or price-change timestamp. A filtered slice may return zero results."
          },
          "enrichDetails": {
            "title": "Enrich directory details",
            "type": "boolean",
            "description": "In directory mode, check up to maxEnrich merchant pages for public details. Pages without confirmed merchant data remain directoryOnly=true.",
            "default": false
          },
          "maxEnrich": {
            "title": "Max directory detail pages",
            "minimum": 0,
            "maximum": 50,
            "type": "integer",
            "description": "Directory mode with enrichDetails: maximum public merchant pages to inspect.",
            "default": 5
          },
          "useSeedPool": {
            "title": "Use previously discovered URLs",
            "type": "boolean",
            "description": "In restaurant or mart_item mode, select previously discovered URLs when no target identifier or URL is supplied. Empty or expired saved URLs cannot provide a detail target.",
            "default": false
          },
          "seedCount": {
            "title": "Previously discovered URL count",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "Maximum number of previously discovered URLs to select when useSeedPool is enabled.",
            "default": 3
          },
          "seedFamily": {
            "title": "Saved URL group",
            "pattern": "^[a-z0-9_-]*$",
            "type": "string",
            "description": "Choose mart_items, mart_merchants, or food_merchants. Leave empty to use the group selected by the detail mode."
          },
          "seedPoolMaxAge": {
            "title": "Maximum saved URL age (seconds)",
            "minimum": 60,
            "type": "integer",
            "description": "Saved URL collections older than this limit are treated as unavailable. Supply an explicit target if no recent URLs exist.",
            "default": 86400
          },
          "persistSeen": {
            "title": "Remember delivered rows",
            "type": "boolean",
            "description": "Remember delivered row identifiers so a later run of the same mode, market, city, and keyword can skip them. Leave off when you want to collect updated values for the same entities.",
            "default": false
          },
          "proxyCountry": {
            "title": "Chain request country",
            "type": "string",
            "description": "Optional country code for chain requests. Leave empty to use the selected market."
          },
          "workerBaseUrl": {
            "title": "Developer test option",
            "type": "string",
            "description": "Leave empty. Used only by the developer for testing."
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}