# theQapp Scraper (`aboo.script/theqapp-scraper`) Actor

⚡ Fast theQapp scraper. No login, no API key. Scrape family activities, attractions, classes and events in 21 cities across the UAE, Saudi Arabia, Qatar, Bahrain, Spain and the UK by city, collection, URL or keyword. Get every ticket option with adult and child prices, hours, GPS and reviews.

- **URL**: https://apify.com/aboo.script/theqapp-scraper.md
- **Developed by:** [Aboo Script](https://apify.com/aboo.script) (community)
- **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

## theQapp Scraper

![theQapp Scraper](https://i.ibb.co/s9HTvmFP/theqapp-banner.png)

**theQapp Scraper** extracts family activities, attractions, classes, and events from [theQapp](https://theqapp.com/) into clean, structured data you can download as JSON, CSV, Excel, or HTML. Paste a theQapp city, collection, search, or activity URL, or type a few keywords, and get the name, every ticket option with adult and child prices, discounts, opening hours, location, rating, and reviews of each activity. No account or login required.

### Introduction

[theQapp](https://theqapp.com/) (formerly QiDZ) is a family activity app and website for the Middle East and Europe. Parents use it to find and book theme parks, play areas, classes, camps, tours, and events in 21 cities, including Dubai, Abu Dhabi, Riyadh, Jeddah, Doha, Manama, London, Madrid, and Barcelona.

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, or connect it to your own tools.

### What data can you extract from theQapp?

- 🏷️ Activity name, categories, tags (Best Seller, Limited Offer, ...), and type (event, free, class or workshop)
- 💲 Starting price, original price, discount, and currency
- 🎟️ Every ticket option with adult and child prices, original prices, discount, start time, and ticket limits
- 👶 Prices by age range and the age groups the activity is suited for
- 📅 Start and end dates, opening hours per day, and all schedules
- 📍 Location name, branch, area, address, and GPS coordinates
- ⭐ Rating, number of reviews, and the latest reviews
- 🏢 Provider name and website, phone, and booking link
- 📝 Summary, description, deal info, tips, facilities, and ticket terms
- 🖼️ Images, video, and a direct link to each activity

### Use Cases

- 📈 **Market research**: compare family activity prices and offers across Gulf and European cities.
- 🕵️ **Competitor monitoring**: track which attractions, deals, and discounts are listed and at what price.
- 🤝 **Lead generation**: build a list of activity providers, venues, and their websites.
- 🗂️ **Database building**: create your own catalog of kids' activities with opening hours, ages, and locations.
- 🤖 **AI and automation**: feed clean, structured data into spreadsheets, dashboards, or AI workflows.

### How to scrape theQapp step by step

1. Paste one or more theQapp URLs into **Start URLs**, or type keywords into **Search queries**.
2. Choose the **City** for your search, and optionally **Indoor or outdoor** and **Free activities only**.
3. Set **Maximum number of results** to how many activities 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**: theQapp URLs to scrape. Supported pages: city pages (`https://theqapp.com/dubai`), indoor or outdoor pages (`https://theqapp.com/kids-activities/dubai/indoors`), collection pages (`https://theqapp.com/kids-activities/dubai/collection/6933`), search pages (`https://theqapp.com/search?q=water`, including a category filter), and activity pages (`https://theqapp.com/booking/...`).
- **Search queries**: keywords to search on theQapp (activity, venue, or brand name), one per line. Each query is scraped separately.
- **City**: the city to search in, one of the 21 theQapp cities. Applies to search queries and search page URLs; city, indoor/outdoor, and collection URLs use the city in their address.
- **Indoor or outdoor**: only return indoor or outdoor activities. Applies to search queries only.
- **Free activities only**: only return free activities. Applies to search queries only.
- **Maximum number of results**: how many activities to collect for each start URL or search query.

You can use start URLs, search queries, or both in the same run.

### Input Examples

Scrape activities in a city:

```json
{
  "startUrls": [{ "url": "https://theqapp.com/dubai" }],
  "maxResults": 5
}
```

Search by keywords in one city:

```json
{
  "searchQueries": ["water park", "museum"],
  "city": "dubai",
  "environment": "both",
  "freeOnly": false,
  "maxResults": 5
}
```

### Output

Each activity is saved as one item in the dataset. Here is an example of a single item (long texts and lists are shortened):

```json
{
  "url": "https://theqapp.com/booking/flash-sale-ski-dubai-snow-pass-31791",
  "id": 31791,
  "name": "FLASH SALE: Ski Dubai Snow Pass",
  "city": "Dubai",
  "country": "UAE",
  "currency": "AED",
  "categories": ["Family Fun", "Thrilling & Adventurous Activities", "Theme Parks & Attractions"],
  "tags": ["Best Seller"],
  "isEvent": true,
  "isFree": false,
  "isClassOrWorkshop": false,
  "priceFrom": 210,
  "originalPriceFrom": 240,
  "discountPercentage": 16,
  "rating": 4,
  "reviewCount": 61,
  "provider": "Ski Dubai",
  "providerWebsite": "http://www.theplaymania.com/skidubai/welcome",
  "summary": "Swap the Dubai sunshine for a snowy adventure at Ski Dubai! Located inside Mall of the Emirates, this incredible indoor winter wonderland...",
  "description": "Swap the Dubai sunshine for a snowy adventure at Ski Dubai! Located inside Mall of the Emirates, this incredible indoor winter wonderland...",
  "dealInfo": "Bring the whole family and hit the slopes at Ski Dubai!",
  "topTip": null,
  "notes": null,
  "ageGroups": ["3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "Over 13"],
  "facilities": ["Adult supervision required", "Lockers Available", "Changing Facilities"],
  "locationName": "Ski Dubai",
  "branch": "Mall of The Emirates",
  "area": "Al Barsha",
  "address": "Sheikh Zayed Rd - Dubai - United Arab Emirates",
  "latitude": 25.117204,
  "longitude": 55.1983112,
  "phone": null,
  "website": "http://www.theplaymania.com/skidubai/welcome",
  "ticketUrl": null,
  "startDate": "2024-06-06",
  "endDate": "2028-12-31",
  "startTime": "10:00",
  "endTime": "23:00",
  "openingHours": [
    { "day": "Sunday", "startTime": "10:00", "endTime": "23:00" },
    { "day": "Monday", "startTime": "10:00", "endTime": "23:00" }
  ],
  "adultPrice": 275,
  "agePrices": [],
  "schedules": [
    {
      "startDate": "2024-06-06",
      "endDate": "2028-12-31",
      "startTime": "10:00",
      "endTime": "23:00",
      "openingHours": [{ "day": "Sunday", "startTime": "10:00", "endTime": "23:00" }],
      "adultPrice": 275,
      "agePrices": []
    }
  ],
  "ticketOptions": [
    {
      "ticketName": "Ski Dubai Tickets",
      "optionName": "Ski Dubai - Snow Classic Pass",
      "adultPrice": 210,
      "childPrice": 210,
      "originalAdultPrice": 240,
      "originalChildPrice": 240,
      "discountPercentage": 12,
      "startTime": null,
      "minTickets": null,
      "maxTickets": null,
      "description": "Price per 1 person. Includes 1 day access to Ski Dubai with Snow Classic Pass. For detailed information and inclusions please check T&Cs."
    }
  ],
  "ticketTerms": [
    "Entry pass for Ski Dubai and Snow Park",
    "No fee is applicable for tours cancelled or amended within 48 hours prior to the scheduled tour date."
  ],
  "latestReviews": [
    {
      "rating": 1,
      "text": "المكان جميل لكن الفوضى والوساخة لن تكن مرضية",
      "author": "Afnan Kadu",
      "date": "2026-10-19T13:04:53.652Z"
    }
  ],
  "images": [
    "https://d2342wg3tt9kta.cloudfront.net/production/production_original_tE-Q5iMBU_2945_da03.webp?width=700&height=467"
  ],
  "videoUrl": null
}
```

Activities priced by age have an `agePrices` list, for example `{ "ageFrom": 4, "ageTo": 99, "price": 240, "per": "person" }`.

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

### Notes

- theQapp search pages do not include the city in their address, so search URLs and search queries use the **City** input (Dubai by default).
- Only city, indoor/outdoor, collection, search, and activity pages are supported. Other theQapp pages (blog, help, account pages) are skipped with a warning.
- Prices are in each activity's local currency (AED, SAR, QAR, BHD, EUR, or GBP).
- `priceFrom` is the lowest adult price among the ticket options; free activities and activities booked on the provider's own website may have no price.
- Reviews are written by theQapp users and keep their original language (often Arabic). Only the latest reviews shown on the activity page are included.
- Some activities belong to a different city than the page you scraped (for example a park near Dubai listed under Dubai), and `city` always follows the activity itself.

### Why use the theQapp Scraper?

- ✅ **No login needed**: works with public data only, so there is no account to manage.
- 🎟️ **Full price detail**: every ticket option with adult, child, and original prices, not just one "from" price.
- 🌍 **21 cities**: UAE, Saudi Arabia, Qatar, Bahrain, Spain, and the United Kingdom.
- 🧹 **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 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**. The actor keeps going until it reaches your limit or runs out of activities. A city page covers every activity listed for that city.

#### Do I need a theQapp account?

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

#### Can I filter by category?

Yes. Pick a category on the theQapp search page and paste that search URL into **Start URLs**; the category is kept in the results.

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

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

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

Yes. Right now the actor supports start URLs, search queries, city, indoor or outdoor, and free activities. If you need other filters or inputs, such as age range or date, 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 activity and event platforms?

- [Webook Scraper](https://apify.com/aboo.script/webook-scraper): events, concerts, matches, and experiences in Saudi Arabia and the Gulf.
- [The Agenda Scraper](https://apify.com/aboo.script/theagenda-scraper): Dubai concerts and live shows with dates and descriptions.
- [Tiqets Scraper](https://apify.com/aboo.script/tiqets-scraper): attractions, tours, and tickets from Tiqets with prices.
- [GetYourGuide Scraper](https://apify.com/aboo.script/getyourguide-scraper): activities and attractions from GetYourGuide with prices and ratings.
- [Fever Scraper](https://apify.com/aboo.script/feverup-scraper): events and experiences from Fever by city, category, or keyword.

***

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

# Actor input Schema

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

theQapp URLs: a city page (https://theqapp.com/dubai), an indoor/outdoor page (https://theqapp.com/kids-activities/dubai/indoors), a collection page (https://theqapp.com/kids-activities/dubai/collection/6933), a search page (https://theqapp.com/search?q=water), or an activity page (https://theqapp.com/booking/...). Search pages use the City below.

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

Keywords to search for activities (activity, venue, or brand name). Each query is scraped separately.

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

City to search in. Applies to search queries and search page URLs; city, indoor/outdoor and collection URLs use the city in their path.

## `environment` (type: `string`):

Only return indoor or outdoor activities. Applies to search queries only.

## `freeOnly` (type: `boolean`):

Only return free activities. Applies to search queries only.

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

Maximum number of activities to scrape per start URL or search query.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://theqapp.com/dubai"
    }
  ],
  "city": "dubai",
  "environment": "both",
  "freeOnly": false,
  "maxResults": 5
}
```

# 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://theqapp.com/dubai"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("aboo.script/theqapp-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://theqapp.com/dubai" }] }

# Run the Actor and wait for it to finish
run = client.actor("aboo.script/theqapp-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://theqapp.com/dubai"
    }
  ]
}' |
apify call aboo.script/theqapp-scraper --silent --output-dataset

```

## MCP server setup

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