# Oddle Eats Scraper - Singapore Restaurants, Menus & Prices (`lofomachines/oddle-eats-scraper`) Actor

Scrape the Oddle Eats Singapore restaurant directory: 1400+ restaurants with cuisines, halal and vegetarian labels, delivery fees, minimum orders, full menus, outlet addresses and prices.

- **URL**: https://apify.com/lofomachines/oddle-eats-scraper.md
- **Developed by:** [Lofomachines](https://apify.com/lofomachines) (community)
- **Categories:** E-commerce, Lead generation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.80 / 1,000 restaurants

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Oddle Eats Scraper – Singapore Restaurants, Menus & Prices

**Turn Singapore's Oddle Eats food directory into a clean dataset: every restaurant, its cuisines, halal and vegetarian labels, islandwide delivery fee, minimum order, full menu, and — on request — outlet addresses, opening hours and menu prices.**

Around **1,400 Singapore restaurants, cafés and bakeries in a single run that finishes in seconds.** 52 fields per restaurant.

No login. No API key. No cookies. Paste nothing and get the whole directory.

***

### Built for speed

This Actor reads the directory **once** and answers every keyword and filter from that one read. Ten keywords cost the same as one.

| Run | Restaurants | Time | Requests |
| --- | --- | --- | --- |
| Whole Singapore directory | 1,469 | **~2 s** | **1** |
| Keyword search | any | ~2 s | 1 |
| With outlet addresses & prices | 12 | ~4 s | 13 |

That is the whole design: light by default, complete when you ask for it.

***

### What you get for every restaurant

**Identity** — name, directory handle, its own Oddle ordering link, cover photo

**Ordering terms** — islandwide delivery fee in SGD, minimum order, free-delivery flag

**Cuisines** — Singaporean/Local, Chinese, Japanese, Korean, Thai, Indian, Malay, Peranakan, Western, Italian and more, split out of the directory's flat tag list

**Dietary labels** — Halal, Halal-Friendly, Muslim-Owned, Vegetarian, Vegetarian Options, Vegan, Vegan-Friendly, Gluten-Free

**Dishes & categories** — laksa, chicken rice, nasi lemak, chilli crab, zi char, dim sum, ramen, biryani, satay, prata and hundreds more

**Venue types** — casual dining, family dining, hawker/coffee shop, café, bakery, fine dining, bentos, party sets, office catering

**Occasions** — Chinese New Year yu sheng and pen cai, Christmas, Hari Raya and Ramadan, Deepavali, Mid-Autumn mooncakes, Mother's and Father's Day, National Day

**Promotions** — Oddle Insider deals, first-order promos, pickup promos, flash sales, SAFRA and Amex campaigns, free-delivery offers

**Ready-made flags** — `isHalal`, `isVegetarianFriendly`, `isGlutenFree`, `isMichelinListed`, `isInsiderMerchant`, `isNewOnOddle`, `isTrending`, `isExclusiveToOddle`, `isEditorsPick`, `doesCatering`, `hasPickupPromo`, `hasFirstTimePromo`

**Full menu** — every item name, reference and photo, plus an item count

**Optional outlet detail** — every outlet with street address, Singapore postal code, phone and opening hours per day, plus menu prices in SGD, logo, Facebook and Instagram

***

### Who it is for

| Role | What they get |
| --- | --- |
| **F\&B operators** | What comparable restaurants charge for delivery, and their minimum orders |
| **Food delivery & logistics** | A full merchant list with fees, postal codes and coverage |
| **Market researchers** | Cuisine mix, halal and vegetarian penetration, price bands across Singapore |
| **Restaurant tech & SaaS sales** | Every Oddle merchant with its ordering site, contact number and outlet count |
| **Marketing agencies** | Which restaurants run promotions, and which are new or trending |
| **Food media & bloggers** | MICHELIN-listed and editor's-pick restaurants with menus and photos |
| **Corporate catering buyers** | Restaurants doing catering, buffets, party sets and office bentos |
| **Consumers & foodies** | The whole directory sorted by delivery fee instead of scrolling a feed |

***

### Use cases

**1. Benchmark delivery fees across Singapore**
Pull the whole directory and compare islandwide delivery fees and minimum orders by cuisine. You immediately see where your own terms sit.

**2. Build a halal restaurant list**
Filter to Halal, Halal-Friendly or Muslim-Owned and export the lot, with menus and ordering links.

**3. Find vegetarian and vegan delivery in Singapore**
Filter on the dietary labels and get every restaurant offering vegetarian or vegan options.

**4. Track festive menus before the season**
Filter to Chinese New Year, Christmas, Hari Raya or Mid-Autumn and see who has launched, and what they publish.

**5. Prospect Singapore F\&B merchants**
Every row carries the restaurant's own ordering site; turn on outlet details and you also get phone numbers, addresses and postal codes.

**6. Research a dish**
Search "laksa", "chicken rice", "chilli crab" or "nasi lemak" — matching runs across names, tags *and* menu items, so you find restaurants that serve it even when it is not in their name.

**7. Monitor who is new or trending**
Sort by newest, or filter on `isNewOnOddle` and `isTrending`, to see which restaurants just joined.

**8. Price a menu**
Turn on outlet details for a shortlist and get real SGD prices per item, so you can position your own pricing.

***

### Input

Only what you actually need — everything technical is handled for you.

| Field | Description |
| --- | --- |
| **Search keywords** | Dishes, names or cuisines. Matched against names, tags and menu items. Empty = whole directory. |
| **Cuisines** | Keep only these cuisines. |
| **Dietary requirements** | Halal, vegetarian, vegan, gluten-free and more. |
| **Maximum delivery fee (SGD)** | Cap the islandwide delivery fee. Set `0` for free delivery only. |
| **Maximum restaurants** | Upper limit of rows returned. |
| **Sort results by** | Directory order, name, delivery fee, minimum order, most menu items, newest, recently updated. |
| **Include menu items** | On by default and free. |
| **Include outlet addresses, hours and prices** | Off by default — one extra request per restaurant. |

```json
{
  "searchTerms": ["laksa", "chicken rice"],
  "cuisines": ["Singaporean/Local"],
  "dietary": ["Halal"],
  "maxDeliveryFee": 6,
  "maxItems": 500,
  "sortBy": "delivery_fee_low",
  "includeMenuItems": true,
  "includeOutletDetails": false
}
```

***

### Output

One clean row per restaurant. Abridged below — the real row carries **52 fields**.

```json
{
  "restaurantId": "ckry4lehsfe7u0b91t4doyjiy",
  "name": "Keng Eng Kee Seafood",
  "slug": "keng-eng-kee",
  "orderingUrl": "https://kengengkee.oddle.me",
  "coverImageUrl": "https://ap-northeast-1.graphassets.com/...",

  "deliveryFeeSgd": 5.45,
  "minimumOrderSgd": 50,
  "offersFreeDelivery": true,

  "cuisines": ["Singaporean/Local", "Chinese", "Seafood"],
  "dietary": ["Vegetarian & Vegan - Vegetarian Options"],
  "dishes": ["Crabs", "Zi Char", "Hokkien", "Soup"],
  "venueTypes": ["Casual Dining", "Family Dining", "Party Sets"],
  "occasions": ["Chinese New Year Bundles - Yu Sheng", "Christmas", "Mother's Day"],
  "promotions": ["Free Delivery", "Pickup Promo", "Insider - $8 off $60 Weekday Lunch"],
  "tagCount": 41,

  "isHalal": false,
  "isVegetarianFriendly": true,
  "isMichelinListed": false,
  "isInsiderMerchant": true,
  "doesCatering": true,

  "menuItemCount": 42,
  "menuItems": [
    {
      "name": "Premium Reunion Set (5 pax)",
      "reference": "PremiumReunionSet5paxca4493",
      "imageUrl": "https://s3-ap-southeast-1.amazonaws.com/.../PremiumReunionSet5paxca4493.jpg"
    }
  ],

  "outletCount": 3,
  "phone": "+65 6979 3668",
  "streetAddress": "1A Tampines St 92 #01-K2 SAFRA (TAMPINES)",
  "postalCode": "528882",
  "outlets": [
    {
      "name": "Keng Eng Kee Seafood (Tampines)",
      "phone": "+65 6979 3668",
      "postalCode": "528882",
      "openingHours": [{ "days": ["Friday"], "opens": "17:15", "closes": "21:30" }]
    }
  ],
  "menuPriceMinSgd": 78,
  "menuPriceMaxSgd": 188,
  "instagramUrl": "https://www.instagram.com/kengengkee/",

  "addedAt": "2021-08-04T23:32:52.095Z",
  "updatedAt": "2026-07-21T08:55:20.353Z",
  "matchedTerm": "laksa",
  "detailLevel": "with_outlets",
  "scrapedAt": "2026-07-29T09:00:00.000Z"
}
```

All money is in **Singapore dollars** and all timestamps are **ISO 8601**, so the dataset drops straight into a spreadsheet or database.

Export to **JSON, CSV, Excel, XML or HTML** in one click, or pull it from the API.

***

### Pricing

This Actor charges per restaurant record delivered, and the price depends on how much detail you asked for:

| Event | When it is charged | What you get |
| --- | --- | --- |
| **`restaurant-basic`** | One per record when **Include outlet addresses, hours and prices** is off | Name, cuisines, dietary labels, dishes, delivery fee, minimum order, promotions, full menu items and photos |
| **`restaurant-with-outlets`** | One per record when that option is on | Everything above **plus** every outlet's address, Singapore postal code, phone and opening hours, menu prices in SGD, logo and social links |

You only ever pay for records that were actually saved to your dataset. Records are charged in batches as they are produced, so an interrupted run bills only for what it delivered.

If you set a maximum cost for the run, the Actor reads it **before** doing the expensive work: it trims the job to what your budget covers rather than fetching outlet pages for records it cannot deliver.

***

### Integrations & automation

- **Make (Integromat)** — run weekly and append the directory to a Google Sheet for fee tracking
- **n8n** — alert when a new restaurant appears in your cuisine or postal district
- **Zapier** — push new halal or vegetarian listings into Airtable or Slack
- **Google Sheets / Airtable** — build a live Singapore restaurant comparison table
- **API / webhooks** — call the Actor from your own stack and read the dataset endpoint
- **AI agents / MCP** — a documented output schema makes this easy to chain

**Popular workflow:** schedule a weekly full-directory run, then diff `restaurantId` against last week to get a clean feed of new Singapore restaurants, and diff `deliveryFeeSgd` to catch fee changes across the market.

***

### FAQ

**Do I need an Oddle account?**
No. The Actor uses only publicly listed directory data and needs no credentials.

**How many restaurants are there?**
Around 1,400 at the time of writing, and the Actor returns whatever the directory currently lists.

**Why is it so fast?**
The directory publishes its catalogue in one document, so a full run is a single request. Adding keywords or filters costs no extra requests.

**Can I search by dish rather than restaurant name?**
Yes. Keywords are matched against restaurant names, directory tags **and** menu item names, so "chilli crab" finds restaurants serving it even if the dish is not in their name.

**How do I get addresses and phone numbers?**
Turn on **Include outlet addresses, hours and prices**. Each restaurant then costs one extra request, so use it with a keyword or a `maxItems` cap rather than on all 1,400 at once.

**Are menu prices included?**
Item names and photos come free with every run. Actual SGD prices arrive with the outlet-details option, taken from the restaurant's own ordering site.

**Does it cover pickup as well as delivery?**
Yes — pickup promotions and self-collect restaurants are flagged, and `promotions` lists the offer.

**Is the halal information reliable?**
It reflects exactly how the directory labels each restaurant: Halal, Halal-Friendly or Muslim-Owned, kept in the source's own wording rather than merged into one flag. Always confirm certification with the restaurant for compliance purposes.

***

### More tools by Lofomachines

- [Google Maps Scraper – Contacts](https://apify.com/lofomachines/google-maps-places-contact-scraper) — cross-check restaurants with Maps listings, phones and emails
- [Universal E-commerce Scraper](https://apify.com/lofomachines/universal-ecommerce-scraper) — the same treatment for any online store
- [Website Contact Extractor](https://apify.com/lofomachines/website-contact-extractor) — turn restaurant sites into contactable leads
- [Website Tech Profiler](https://apify.com/lofomachines/website-tech-profiler) — see which ordering and marketing tools each merchant runs
- [AI Media Monitor – Brand, News & Sentiment Tracker](https://apify.com/lofomachines/ai-media-monitor) — track what Singapore media says about these brands

Browse everything at [apify.com/lofomachines](https://apify.com/lofomachines).

***

*Keywords: Oddle Eats scraper, Singapore food delivery data, Singapore restaurant directory scraper, islandwide delivery Singapore, halal food delivery Singapore, vegetarian food delivery Singapore, Singapore restaurant list, food delivery Singapore API, Singapore F\&B market data, chicken rice delivery, laksa delivery Singapore, chilli crab delivery, zi char delivery, dim sum delivery Singapore, CNY yu sheng delivery, pen cai Singapore, Hari Raya catering Singapore, Christmas catering Singapore, mooncake delivery Singapore, corporate catering Singapore, bento delivery Singapore, party food catering Singapore, best restaurants in Singapore, Singapore takeaway directory, Oddle merchant list, restaurant delivery fees Singapore, MICHELIN Singapore delivery.*

# Actor input Schema

## `searchTerms` (type: `array`):

Dishes, restaurant names or cuisines to look for — matched against restaurant names, tags and menu items. Leave empty to get every restaurant in the Singapore directory.

## `cuisines` (type: `array`):

Keep only restaurants listed under these cuisines. Leave empty for all.

## `dietary` (type: `array`):

Keep only restaurants carrying these dietary labels. Leave empty for all.

## `maxDeliveryFee` (type: `integer`):

Keep only restaurants whose islandwide delivery fee is at or below this amount. Leave empty for any fee, or set 0 for free delivery only.

## `maxItems` (type: `integer`):

Upper limit of restaurants returned. The directory holds around 1,400.

## `sortBy` (type: `string`):

How the returned restaurants should be ordered.

## `includeMenuItems` (type: `boolean`):

On by default and free: adds every menu item name and image for each restaurant. Turn off for a slimmer dataset.

## `includeOutletDetails` (type: `boolean`):

Off by default. Adds each outlet's address, postal code, phone and opening hours, plus menu prices and social links — at one extra request per restaurant.

## Actor input object example

```json
{
  "searchTerms": [
    "laksa"
  ],
  "cuisines": [],
  "dietary": [],
  "maxItems": 500,
  "sortBy": "relevance",
  "includeMenuItems": true,
  "includeOutletDetails": false
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchTerms": [
        "laksa",
        "chicken rice"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("lofomachines/oddle-eats-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "searchTerms": [
        "laksa",
        "chicken rice",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("lofomachines/oddle-eats-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchTerms": [
    "laksa",
    "chicken rice"
  ]
}' |
apify call lofomachines/oddle-eats-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,lofomachines/oddle-eats-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/d2q1JqDySwXGYhsqd/builds/z6Drnd9jCT9NufzVA/openapi.json
