# Royal Opera House Muscat Scraper (`aboo.script/rohmuscat-org-om-scraper`) Actor

⚡ Fast Royal Opera House Muscat scraper. No login, no API key. Get opera, ballet, concerts, jazz and Arabic music performances by list or performance URL: every show date, venue, genre, OMR ticket prices per seating category and seat availability, with genre and date filters.

- **URL**: https://apify.com/aboo.script/rohmuscat-org-om-scraper.md
- **Developed by:** [Aboo Script](https://apify.com/aboo.script) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.80 / 1,000 results

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Royal Opera House Muscat Scraper

![Royal Opera House Muscat Scraper](https://i.ibb.co/bMrvnNVy/rohmuscat-org-om-banner.png)

**Royal Opera House Muscat Scraper** extracts performances from [Royal Opera House Muscat](https://www.rohmuscat.org.om/en) into clean, structured data you can download as JSON, CSV, Excel, or HTML. Paste the upcoming performances page or a performance page, and get the title, genre, venue, every show date, ticket prices per seating category, and seat availability. No account or login required.

### Introduction

[Royal Opera House Muscat](https://www.rohmuscat.org.om/en) is Oman's leading venue for opera, ballet, concerts, jazz, Arabic music, and world music, with a full season of international and local performances every year.

This actor collects the same public information you see in your browser, including the prices and availability shown when you start booking, and turns it into a ready-to-use dataset. You can run it once, schedule it to run daily, or connect it to your own tools.

### What data can you extract from Royal Opera House Muscat?

- 🎭 Title, subtitle, and description of each performance
- 🎼 Genre, season, and production code
- 📍 Venue (Royal Opera House Muscat, House of Musical Arts, or the outdoor Maidan)
- 📅 Every show date and time in ISO format, plus the first and last date
- 💲 Ticket prices in OMR per seating area, seat category, and ticket type, with the lowest and highest price
- 🎟️ Sale status per date (on sale, sold out) and availability per seat category (available, nearly full, sold out)
- 🖼️ Poster image
- 🔗 Links to the performance page and to the booking pages

### Use Cases

- 📈 **Market research**: compare ticket prices across genres, venues, and dates in Oman's cultural scene.
- 🕵️ **Competitor monitoring**: follow what the opera house programs and how fast shows sell out.
- 🎫 **Ticketing and travel apps**: show upcoming Muscat performances with dates, prices, and booking links.
- 🗂️ **Database building**: keep an up-to-date calendar of every performance of the season.
- 🤖 **AI and automation**: feed clean, structured data into spreadsheets, dashboards, or AI workflows.

### How to scrape Royal Opera House Muscat step by step

1. Paste one or more Royal Opera House Muscat URLs into **Start URLs**.
2. Optionally pick a **Genre** and a **Date from** / **Date to** range.
3. Set **Maximum number of results** to how many performances you want per URL.
4. Click **Start** and wait for the run to finish.
5. Download your data in JSON, CSV, Excel, or HTML from the **Output** tab.

### Input

- **Start URLs**: Royal Opera House Muscat URLs to scrape. Supported pages: the upcoming performances page in English or Arabic (for example `https://rohmuscat.org.om/en/performance/upcoming-performances`) and single performance pages (for example `https://www.rohmuscat.org.om/en/performance/performance-detail?i=634`).
- **Maximum number of results**: how many performances to collect for each start URL.
- **Genre**: only collect performances of one genre (Opera, Concerts, Ballets, Arabic Music, Jazz, World Music, or Show). Works on the upcoming performances page.
- **Date from** and **Date to**: only collect performances with at least one show date in this range, just like the date filter on the website. Works on the upcoming performances page.

### Input Examples

Scrape the upcoming performances page:

```json
{
  "startUrls": [
    { "url": "https://rohmuscat.org.om/en/performance/upcoming-performances" }
  ],
  "maxResults": 3
}
```

Only opera performances between January and March 2027:

```json
{
  "startUrls": [
    { "url": "https://rohmuscat.org.om/en/performance/upcoming-performances" }
  ],
  "maxResults": 3,
  "genre": "Opera",
  "dateFrom": "2027-01-01",
  "dateTo": "2027-03-31"
}
```

### Output

Each performance is saved as one item in the dataset. Here is an example of a single item:

```json
{
  "url": "https://www.rohmuscat.org.om/en/performance/performance-detail?i=634",
  "id": 634,
  "productionCode": "NAWL",
  "title": "NAWAL",
  "subtitle": null,
  "description": "Celebrated singer and music icon Nawal, known as Qitharat al Khaleej, is one of the most successful performers in the Arabic music world...",
  "genre": "Arabic Music",
  "venue": "ROHM MAIDAN",
  "season": "2026-27",
  "imageUrl": "https://www.rohmuscat.org.om/PublishingImages/Lists/PerformanceMaster/AllItems/SEASON26-27/nawal2.png?RenditionID=7",
  "language": "en",
  "bookingUrl": "https://om.web.patrontools.com/_RoyalOperaHouseMuscat/Productions/NAWL/Performances",
  "firstDate": "2026-11-12T19:00:00+04:00",
  "lastDate": "2026-11-12T19:00:00+04:00",
  "priceMin": 35,
  "priceMax": 150,
  "currency": "OMR",
  "performances": [
    {
      "date": "2026-11-12T19:00:00+04:00",
      "dateText": "November 12 2026 7:00 PM",
      "performanceId": 1,
      "bookingUrl": "https://om.web.patrontools.com/_RoyalOperaHouseMuscat/Sections/Choose?prod_id=NAWL&perf_id=1",
      "status": "On sale",
      "tickets": [
        {
          "section": "All",
          "seatType": "Diamond",
          "ticketType": "Adult",
          "price": 150,
          "priceText": "OMR 150.000",
          "currency": "OMR",
          "availability": "Available"
        },
        {
          "section": "All",
          "seatType": "Platinum",
          "ticketType": "Adult",
          "price": 90,
          "priceText": "OMR 90.000",
          "currency": "OMR",
          "availability": "Nearly full"
        },
        {
          "section": "All",
          "seatType": "Gold",
          "ticketType": "Adult",
          "price": 70,
          "priceText": "OMR 70.000",
          "currency": "OMR",
          "availability": "Available"
        },
        {
          "section": "All",
          "seatType": "Silver",
          "ticketType": "Adult",
          "price": 35,
          "priceText": "OMR 35.000",
          "currency": "OMR",
          "availability": "Available"
        }
      ]
    }
  ]
}
```

You can download the dataset in JSON, CSV, Excel, XML, or HTML, or access it through the Apify API.

### Notes

- Only the upcoming performances page and single performance pages are supported; other pages (calendar, exhibitions, library) are skipped.
- Sold-out performances do not show prices on the booking site, so their `tickets` list is empty and `priceMin` / `priceMax` are `null`.
- Performances from past seasons can still be scraped from their performance page, but they have no booking information and no genre.
- Arabic pages return titles, genres, and venues in Arabic; dates are always converted to the same ISO format with the Muscat time zone (+04:00).
- Prices are shown in Omani rial (OMR) and include VAT, as on the website.
- Venue names are returned exactly as the website writes them, so the same outdoor venue can appear with slightly different spellings.

### Why use the Royal Opera House Muscat Scraper?

- ✅ **No login needed**: works with public data only, so there is no account to manage.
- 🎟️ **Full price list**: every seating area and seat category per show date, not just a "from" price.
- 🧹 **Clean data**: numbers are real numbers, dates use one standard format, and text is free of HTML.
- 💸 **Pay for what you need**: set a result limit per URL and keep every run small and cheap.
- 🔄 **Ready for automation**: schedule runs, export to Google Sheets, or connect to Make, Zapier, and n8n.

### FAQ

#### How many results can I scrape?

You can set any number in **Maximum number of results**. The actor keeps going until it reaches your limit or has collected every performance of the current season.

#### Do I need a Royal Opera House Muscat account?

No. The actor only collects publicly available data. You do not need to log in or provide any account details.

#### Can I scrape data on a schedule?

Yes. Use Apify Schedules to run the actor every hour, day, or week, and get fresh prices and availability automatically.

#### Why are some fields empty?

Some performances do not show every piece of information, such as a subtitle. When a field is not available on the website, it is returned as `null`.

#### Can I request a new feature or filter?

Yes. Right now the actor supports start URLs with genre and date filters. If you need other filters or inputs, such as venue, get in touch and they can be added.

#### Can I get a custom or private version?

Yes. The actor can be customized for your workflow, delivered as a private version, or a new scraper can be built for a different website. Use the contact details below.

### Need to scrape other event and ticketing platforms?

- [Etihad Arena Scraper](https://apify.com/aboo.script/etihadarena-ae-scraper): Abu Dhabi events with dates, venues, and ticket details.
- [Virgin Megastore Tickets Scraper](https://apify.com/aboo.script/tickets-virginmegastore-me-scraper): concerts, shows, and sports events across the Middle East.
- [The Agenda Scraper - Dubai Concerts & Shows](https://apify.com/aboo.script/theagenda-scraper): Dubai concerts and live shows with dates and descriptions.
- [Webook Scraper - Events & Experiences](https://apify.com/aboo.script/webook-scraper): events, concerts, matches, and experiences in Saudi Arabia and the Gulf.
- [Ticketmaster Scraper](https://apify.com/aboo.script/ticketmaster-scraper): events, venues, and ticket prices from Ticketmaster.

***

**Need help or want a custom solution?**

- 📧 Email: aboo.script@gmail.com
- 🧩 More scrapers: [Apify profile](https://apify.com/aboo.script)

### Image Credit

Image credit: [Royal Opera House Muscat](https://www.rohmuscat.org.om/en)

# Actor input Schema

## `startUrls` (type: `array`):

Royal Opera House Muscat upcoming performances list URLs (English or Arabic) or performance detail URLs.

## `maxResults` (type: `integer`):

Maximum number of performances to scrape per start URL.

## `genre` (type: `string`):

Only scrape performances of this genre. Applies to performances list URLs.

## `dateFrom` (type: `string`):

Only scrape performances with at least one date on or after this day. Applies to performances list URLs.

## `dateTo` (type: `string`):

Only scrape performances with at least one date on or before this day. Applies to performances list URLs.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://rohmuscat.org.om/en/performance/upcoming-performances"
    }
  ],
  "maxResults": 3,
  "genre": "All"
}
```

# 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 = {
    "startUrls": [
        {
            "url": "https://rohmuscat.org.om/en/performance/upcoming-performances"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("aboo.script/rohmuscat-org-om-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 = { "startUrls": [{ "url": "https://rohmuscat.org.om/en/performance/upcoming-performances" }] }

# Run the Actor and wait for it to finish
run = client.actor("aboo.script/rohmuscat-org-om-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 '{
  "startUrls": [
    {
      "url": "https://rohmuscat.org.om/en/performance/upcoming-performances"
    }
  ]
}' |
apify call aboo.script/rohmuscat-org-om-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,aboo.script/rohmuscat-org-om-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/15FvUE5v6NSapZ9GY/builds/Ga0dq170hfvnRa2of/openapi.json
