# Webook Scraper - Events & Experiences (`aboo.script/webook-scraper`) Actor

⚡ Fast Webook scraper. No login, no API key. Get events, concerts, matches, experiences and restaurants in Saudi Arabia, UAE and 8 more countries by keyword or URL: dates, venue, GPS, starting price and every ticket type with VAT, stock and sale status. Ideal for price tracking.

- **URL**: https://apify.com/aboo.script/webook-scraper.md
- **Developed by:** [Aboo Script](https://apify.com/aboo.script) (community)
- **Stats:** 3 total users, 2 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

## Webook Scraper

![Webook Scraper](https://i.ibb.co/gbrCrsP2/webook-banner.png)

**Webook Scraper** extracts events, experiences, restaurants and season tickets from [webook.com](https://webook.com/) into clean, structured data you can download as JSON, CSV, Excel, or HTML. Paste a Webook explore or event URL, or type a few keywords, and get the title, date, venue, city, starting price and **every ticket type with its price and availability** for each result. No account or login required.

### Introduction

[Webook](https://webook.com/) is the leading ticketing platform in Saudi Arabia and the wider region. It sells tickets for concerts, football matches, Riyadh Season and Jeddah Season events, theater, experiences, restaurants and season passes in Saudi Arabia, the UAE, Bahrain, Kuwait, Morocco, Turkey and parts of Europe.

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

### What data can you extract from Webook?

- 🎫 Title, type (event, experience, restaurant, season), category, tags and status
- 📅 Start and end date, schedule text, sold-out flag
- 📍 Country, city, venue, address, latitude and longitude, zone and season
- 💲 Starting price, discounted price, deal price and currency
- 🎟️ Every ticket type: price with and without VAT, VAT, remaining stock, order limits, sale period, sale status, seated or not
- 🔄 Optional prices converted to a display currency of your choice
- ⚽ Organizer, home and away team, match round, events included in a season ticket
- 🧭 Experience details: duration, age range, what is included, what to bring, refund policy
- 📝 Description in plain text
- 🖼️ Main image and gallery
- 🔗 Direct URL to each listing

### Use Cases

- 📈 **Market research**: see which concerts, matches and experiences are on sale across Saudi cities and how they are priced.
- 🕵️ **Price and availability monitoring**: track ticket prices, sold-out ticket types and remaining stock over time.
- 🤝 **Lead generation**: build a list of organizers, venues and restaurants active on Webook.
- 🗂️ **Event database building**: create your own calendar of upcoming events in Riyadh, Jeddah, AlUla, Dubai and more.
- 🤖 **AI and automation**: feed clean, structured event data into spreadsheets, dashboards, travel apps, or AI workflows.

### How to scrape Webook step by step

1. Paste one or more Webook URLs into **Start URLs**, or type keywords into **Search queries**.
2. Optionally pick a **Country**, **City**, **Type**, **Category**, dates, price range or **Sort by** for your search queries.
3. Set **Maximum number of results** to how many listings you want per URL or per query.
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**: Webook URLs to scrape. Supported pages: the explore page (with or without a country or city, for example `https://webook.com/en/explore/SA/RUH`), search pages, zone pages, season pages, and single event, experience, restaurant or season ticket pages. Any filters you apply on the website (tab, category, date, price, sort order, search text) are kept in the results.
- **Search queries**: keywords to search on Webook, such as an artist, team or venue, one per line. Each query is scraped separately.
- **Maximum number of results**: how many listings to collect for each start URL or search query. Use 0 for no limit.
- **Country**: country to search in, or all countries. Default is Saudi Arabia, like on the website.
- **City**: a city name or Webook city code within the selected country, for example Riyadh, Jeddah, AlUla, Dubai or Casablanca.
- **Type**: only events, only experiences, or only dining.
- **Category**: only one category, such as Music Events, Sports, Theater or Restaurants.
- **Date**: today, tomorrow, this week or this weekend.
- **From date** and **To date**: a custom date range. When set, it replaces **Date**.
- **Minimum price** and **Maximum price**: starting price range, in each listing's own currency.
- **Sort by**: most popular, latest, oldest, or price.
- **Display currency**: adds prices converted to this currency with Webook's own exchange rates. Original prices stay in the data.

Country, city, type, category, dates, prices and sort apply to search queries only; start URLs keep their own filters. **Display currency** applies to everything. You can use start URLs, search queries, or both in the same run.

### Input Examples

Scrape upcoming events from the explore page:

```json
{
  "startUrls": [{ "url": "https://webook.com/en/explore?tab=events" }],
  "maxResults": 5
}
```

Search by keyword in Saudi Arabia:

```json
{
  "searchQueries": ["concert"],
  "country": "SA",
  "maxResults": 5
}
```

### Output

Each listing is saved as one item in the dataset. Here is an example of a single item (ticket list shortened):

```json
{
  "url": "https://webook.com/en/SA/RUH/music-events/events/the-return-night-concert-rs27-tickets-784736",
  "id": "7qyI0CxZNg2452RQgJgyWP",
  "slug": "the-return-night-concert-rs27-tickets-784736",
  "title": "The Return Night",
  "type": "Event",
  "category": "Music Events",
  "status": "upcoming",
  "isSoldOut": false,
  "startDate": "2026-10-22T19:00:00.000Z",
  "endDate": "2026-10-22T23:00:00.000Z",
  "scheduleText": "October 22, 2026 - 7:00 PM",
  "country": "SA",
  "city": "Riyadh",
  "venue": "Abu Bakr Salem Theater",
  "address": "Abu Bakr Salem Stage",
  "latitude": 24.768007299999997,
  "longitude": 46.6030727,
  "zone": null,
  "season": "Discover webook.com",
  "organizer": "Benchmark",
  "matchGroup": null,
  "homeTeam": null,
  "awayTeam": null,
  "description": "After a long wait, the voice that never left our memories returns.\n🎶✨Fadel Chaker reunites with his audience for The Return Night, opening the concerts of Riyadh Season 2026–2027 at Abu Bakr Salem Stage...",
  "startingPrice": 475,
  "discountedPrice": null,
  "currency": "SAR",
  "deal": null,
  "dealPrice": null,
  "dealEndsAt": null,
  "tickets": [
    {
      "name": "C",
      "description": null,
      "price": 475,
      "priceExclVat": 413.043,
      "vat": 61.957,
      "currency": "SAR",
      "soldOut": false,
      "remaining": 6,
      "minPerOrder": 1,
      "maxPerOrder": 5,
      "saleStatus": "ongoing",
      "saleStart": "2026-10-07T11:00:02.000Z",
      "saleEnd": "2026-10-22T22:55:02.000Z",
      "seated": true
    },
    {
      "name": "B",
      "description": null,
      "price": 695,
      "priceExclVat": 604.348,
      "vat": 90.652,
      "currency": "SAR",
      "soldOut": false,
      "remaining": 6,
      "minPerOrder": 1,
      "maxPerOrder": 5,
      "saleStatus": "ongoing",
      "saleStart": "2026-10-07T11:00:02.000Z",
      "saleEnd": "2026-10-22T22:55:02.000Z",
      "seated": true
    }
  ],
  "includedEvents": [],
  "seated": true,
  "gender": "mixed",
  "durationMinutes": null,
  "ageFrom": null,
  "ageTo": null,
  "included": [],
  "notIncluded": [],
  "whatToBring": [],
  "refundPolicy": null,
  "tags": ["Things to do", "Concerts", "Music"],
  "image": "https://images.cmscloud.ai/d56e1636-11c2-4a8b-8195-2256d8cea670/10dd8be0-9ff1-4624-938a-185e5040686e/i5SSra1ZSNRcPfRttSwUBb/e794a56c-df6f-42ff-8ece-96103dd5a8d6/WEBOOK_v.jpg",
  "images": [
    "https://images.cmscloud.ai/d56e1636-11c2-4a8b-8195-2256d8cea670/10dd8be0-9ff1-4624-938a-185e5040686e/i5SSra1ZSNRcPfRttSwUBb/e794a56c-df6f-42ff-8ece-96103dd5a8d6/WEBOOK_v.jpg",
    "https://images.cmscloud.ai/d56e1636-11c2-4a8b-8195-2256d8cea670/10dd8be0-9ff1-4624-938a-185e5040686e/DwAJDwhOwu7Wx0iTVvdm0M/52350aa2-269c-4333-a4bc-8a30a83886d0/WEBOOK-02.jpg"
  ]
}
```

When **Display currency** is set, each item also has `convertedCurrency` and `convertedStartingPrice`, and each ticket has `convertedPrice`.

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

### Notes

- Ticket prices include VAT in `price`; `priceExclVat` and `vat` show the split, just like the checkout page.
- Experiences are booked by time slot on Webook, so they have no ticket list. Their starting price, duration, age range and what is included are returned instead.
- Listings whose sales have closed are not shown on Webook and are not returned.
- Explore and search URLs without a country show results for Saudi Arabia, like the website. Use `https://webook.com/en/explore/anywhere` or set **Country** to All countries for every country.
- Custom collection pages (`/en/page/...`), flights and hotels are not supported and are skipped.
- `remaining` is the number of tickets Webook lets you pick for that ticket type, not the venue's full stock.
- Some text, such as addresses of experiences, is shown in Arabic on Webook and is returned as it is.

### Why use the Webook Scraper?

- ✅ **No login needed**: works with public data only, so there is no account to manage.
- 🎟️ **All ticket types**: get every ticket category with prices, VAT and availability, not only the cheapest price.
- 🎯 **Keeps your filters**: paste any explore URL from your browser and get exactly what you see there.
- 🧹 **Clean data**: numbers are real numbers, dates use one standard format, and descriptions are free of HTML.
- 💸 **Pay for what you need**: set a result limit per URL or query 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**, or 0 for no limit. The actor keeps going until it reaches your limit or runs out of listings.

#### Do I need a Webook 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 follow ticket prices and availability automatically.

#### Why are some fields empty?

Not every listing shows every piece of information. For example, team names only exist for matches and duration only for experiences. When a field is not available, it is returned as `null` or an empty list.

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

Yes. Right now the actor supports start URLs, search queries and the filters above. If you need other inputs or data, 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 platforms?

- [Ticketmaster Scraper](https://apify.com/aboo.script/ticketmaster-scraper): concerts, sports and theater events from Ticketmaster with prices and venues.

***

**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: [Webook](https://webook.com/)

# Actor input Schema

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

Webook explore, search, zone, season or event/experience/restaurant URLs. Filters in the URL (city, tab, category, date, price, sort, search text) are kept.

## `searchQueries` (type: `array`):

Keywords to search on Webook, e.g. an artist, team or venue. Each query is scraped separately with the filters below.

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

Maximum number of events, experiences or restaurants to scrape per start URL or search query. Use 0 for no limit. Event and experience URLs always return one result.

## `country` (type: `string`):

Country to search in. Applies to search queries only; start URLs keep their own location.

## `city` (type: `string`):

City name or Webook city code within the selected country, e.g. Riyadh, Jeddah, AlUla, Dubai, Casablanca. Applies to search queries only.

## `productType` (type: `string`):

Only return one type of listing. Applies to search queries only.

## `category` (type: `string`):

Only return listings from this category. Applies to search queries only.

## `date` (type: `string`):

Only return listings taking place in this period (Saudi time). Ignored when a start date is set. Applies to search queries only.

## `startDate` (type: `string`):

Only return listings taking place on or after this date. Applies to search queries only.

## `endDate` (type: `string`):

Only return listings taking place on or before this date. Needs a from date; defaults to the from date. Applies to search queries only.

## `minPrice` (type: `integer`):

Minimum starting price in the listing's own currency. Applies to search queries only.

## `maxPrice` (type: `integer`):

Maximum starting price in the listing's own currency. Applies to search queries only.

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

Order of the results. Applies to search queries only.

## `currency` (type: `string`):

Adds prices converted to this currency with Webook's own exchange rates. Original prices and currencies are always included. Applies to all inputs.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://webook.com/en/explore?tab=events"
    }
  ],
  "searchQueries": [
    "concert"
  ],
  "maxResults": 5,
  "country": "SA",
  "sortBy": ""
}
```

# 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://webook.com/en/explore?tab=events"
        }
    ],
    "searchQueries": [
        "concert"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("aboo.script/webook-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://webook.com/en/explore?tab=events" }],
    "searchQueries": ["concert"],
}

# Run the Actor and wait for it to finish
run = client.actor("aboo.script/webook-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://webook.com/en/explore?tab=events"
    }
  ],
  "searchQueries": [
    "concert"
  ]
}' |
apify call aboo.script/webook-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,aboo.script/webook-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/J9mjNCcPjiqBbojzm/builds/kjsmRq0jfnXtMggld/openapi.json
