# Talabat Scraper \[Only $0.50💰] | Menus | Prices | 9 Countries (`ahmed_jasarevic/talabat-scraper`) Actor

Extract Talabat restaurants, menus, prices and meal choice trees for food delivery market research, competitor price monitoring and restaurant databases across UAE, Saudi Arabia, Kuwait, Qatar, Bahrain, Oman, Jordan, Egypt, Iraq. No browser or proxy — Talabat's own API from $0.50/1k.

- **URL**: https://apify.com/ahmed\_jasarevic/talabat-scraper.md
- **Developed by:** [Ahmed Jasarevic](https://apify.com/ahmed_jasarevic) (community)
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.47 / 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/actors/running/actors-in-store.md#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

## Talabat Scraper \[Only $0.50/1k 💰] — Restaurants, Menus & Price Data Across the Middle East

Extract Talabat restaurants, full menus and item prices for food delivery market research, competitor price monitoring and restaurant database building across UAE, Saudi Arabia, Kuwait, Qatar, Bahrain, Oman, Jordan, Egypt and Iraq — using Talabat's own internal API. No browser, no proxy, no login required.

### Main Use Cases

- **Talabat restaurant menu monitoring** — track menu item prices, discounts and old prices on a daily schedule
- **MENA food delivery market research** — analyze cuisine mix, restaurant ratings and delivery economics per country
- **Competitor price intelligence** — monitor what chains (McDonald's, KFC, Pizza Hut, local brands) charge per item in each city
- **Building structured restaurant databases** — bulk-export restaurant listings, GPS coordinates, delivery fees and minimum orders for UAE, KSA, Kuwait, Qatar, Bahrain, Oman, Jordan, Egypt, Iraq
- **Food delivery app & aggregation development** — power menus, price comparisons and delivery coverage views with live Talabat data
- **Cloud kitchen & franchise location scouting** — map restaurant density by area and cuisine before entering a new market

### How It Works

The actor talks directly to Talabat's public Next.js search and menu endpoints (`/nextSearchApi/v3/vendor`, `/nextMenuBff/branch-menus/…/choices`), so it needs **no browser, no proxy and no CAPTCHA solving**. You choose a country, then search by cuisine/restaurant keywords, crawl a full area/city catalogue, or paste specific Talabat URL(s). The actor auto-paginates, retries politely and paces requests to stay well under rate limits.

### Extract Talabat Restaurants With Ratings, Delivery Info & GPS

Every restaurant record includes structured location data, delivery economics and payment methods:

- Restaurant name, branch, vendor/branch IDs and menu URL
- Cuisine tags + numeric IDs
- Rating, total ratings/reviews
- Delivery fee, minimum order amount, average delivery time
- Accepted payment methods (credit card, debit card, cash)
- Latitude/longitude, area, city, country and currency
- Logo and hero image URLs
- Search context (query, sponsored, price tag, delivery charges) when found via keyword

### Collect Full Talabat Menus With Item Prices & Discounts

Enable `scrapeMenu` to also pull every restaurant's full menu, parsed from the server-rendered page data:

- Menu categories and sections (e.g. Sandwiches, Mains, Desserts)
- Item name, price, old price (pre-discount), rating, image, description
- Discount flags, top-rated flags, section names

### Extract Meal Choice Trees (Sizes, Add-ons, Extras)

Enable `scrapeMenuChoices` to fetch the complete customization tree for every customizable item — the same options a customer sees at checkout:

- Choice groups (e.g. "Size", "Extra Sauce", "Cook Level")
- Each option's name, price, old price and pre-selected state
- Selection rules: min/max quantity, single vs. multiple selection, mandatory sections
- Nested sub-options

### Countries Covered

UAE, Saudi Arabia, Kuwait, Qatar, Bahrain, Oman, Jordan, Egypt, Iraq.

> Note: as of 2026 talabat.com serves active restaurants only in some of these countries (Saudi Arabia appears discontinued on the web). Countries with no live results are skipped automatically.

### Input

All fields below come from the actor's input schema. Only `country` has a default; everything else is optional.

| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
| `country` | string (enum) | No | `uae` | Target country: `uae`, `saudi_arabia`, `kuwait`, `qatar`, `bahrain`, `oman`, `jordan`, `egypt`, `iraq` |
| `area` | string | No | `""` | Area name, slug or ID (e.g. `"Abu Hail"`, `"abu-hail"`, `1169`). Crawls the area's full restaurant catalogue. |
| `searchKeywords` | array | No | `[]` | Cuisine/restaurant keywords (e.g. `"pizza"`, `"burger"`, `"koshari"`). One query per keyword, paginated. |
| `startUrls` | array | No | `[]` | Direct talabat.com listing or restaurant menu URLs. |
| `scrapeMenu` | bool | No | `true` | Fetch the full menu (categories, items, prices) per restaurant. One extra request per restaurant. |
| `scrapeMenuChoices` | bool | No | `false` | Fetch choice trees (sizes, add-ons, extras with prices). One request per customizable item. |
| `maxVendors` | int | No | `0` | Cap on restaurants per keyword/area. `0` = unlimited. |
| `maxItemsPerVendor` | int | No | `0` | Cap on menu items saved per restaurant. `0` = unlimited. |
| `requestDelayMillis` | int | No | `0` | Extra per-request pause. Prefer `maxRequestsPerSecond` for pacing. |
| `maxConcurrency` | int | No | `10` | Parallel workers for listing/menu/choice requests (max `50`). |
| `maxRequestsPerSecond` | int | No | `10` | Global request rate cap shared by all workers (max `100`). |
| `extendOutputFunction` | string (JS fn) | No | `""` | Custom output transform: `(object, input, context) => object`. |
| `proxyConfiguration` | object | No | Apify datacenter | Optional. Use RESIDENTIAL for large scrapes to avoid per-IP throttling (429). 429/503 are auto-handled with global backoff either way. |

### Output

One dataset record per restaurant. Includes location, delivery info, payment methods, menu URL, and (when enabled) the full menu and choice trees.

```json
{
  "source": "talabat-scraper",
  "scrapedAt": "2026-09-10T15:20:49Z",
  "country": { "id": 4, "code": "AE", "slug": "uae", "name": "UAE", "currency": "AED" },
  "area": { "id": 1169, "name": "Abu Hail", "slug": "abu-hail" },
  "city": { "id": 35, "name": "Dubai", "slug": "dubai" },
  "vendorId": 390,
  "branchId": 728306,
  "name": "Noon & Kabab, Dubai Festival City",
  "branchName": "Noon & Kabab, Dubai Festival City",
  "cuisine": "Grills, Iranian, Arabic, Chicken, Kebab",
  "cuisines": [{ "id": 101, "name": "Grills", "slug": "grills" }],
  "rate": 4.1,
  "totalRatings": 1000,
  "deliveryFee": 0,
  "minimumOrderAmount": 20,
  "avgDeliveryTime": "Within 65 mins",
  "accepts": { "creditCard": true, "debitCard": false, "cash": true },
  "flags": { "isTalabatGO": true, "isGrocery": false, "verticalType": 0 },
  "location": { "lat": "25.2229", "lng": "55.3515" },
  "images": { "logo": "https://talabat.dhmedia.io/...", "heroImage": "https://talabat.dhmedia.io/..." },
  "menuUrl": "https://www.talabat.com/uae/restaurant/728306/noon-kabab-dubai-festival-city?aid=1169",
  "menu": {
    "count": 80,
    "categories": [
      { "id": 1001, "name": "Sandwiches", "items": [{ "id": 5001, "name": "Falafel Sandwich", "price": 5.5, "hasChoices": false }] }
    ]
  }
}
```

Full field reference (from the dataset schema): `source`, `scrapedAt`, `country` (id/code/slug/name/currency), `area` (id/name/slug), `city` (id/name/slug), `listingUrl`, `vendorId`, `branchId`, `name`, `branchName`, `cuisine`, `cuisines[]`, `rate`, `totalReviews`, `totalRatings`, `deliveryFee`, `minimumOrderAmount`, `avgDeliveryTime`, `deliveryEstimate`, `accepts` (creditCard/debitCard/cash), `status`, `flags` (isTalabatGO/isTalabatPro/isGrocery/isDarkStore/isNew/preOrder/contactlessDelivery/verticalType), `location` (lat/lng), `images` (logo/heroImage), `promotions` (text/discountText), `menuUrl`, `search` (query/exactMatch/sponsored/priceTag/deliveryIconType/timeToDelivery/deliveryChargesType), `menu` (count/categories\[] → items\[] with id/name/price/oldPrice/image/rating/hasChoices/section/isDiscounted/isTopRated/isWithImage/category/choices\[]).

### Example Input

```json
{
  "country": "uae",
  "area": "dubai",
  "searchKeywords": ["pizza", "burger", "shawarma"],
  "scrapeMenu": true,
  "scrapeMenuChoices": false,
  "maxVendors": 200,
  "maxConcurrency": 10,
  "maxRequestsPerSecond": 10
}
```

This run searches the whole of Dubai for pizza/burger/shawarma restaurants, scrapes their full menus and stops after 200 restaurants per keyword.

### Example Output

```json
{
  "country": { "id": 4, "code": "AE", "slug": "uae", "name": "UAE", "currency": "AED" },
  "area": { "id": 36, "name": "Dubai Marina", "slug": "dubai-marina" },
  "city": { "id": 35, "name": "Dubai", "slug": "dubai" },
  "vendorId": 45079,
  "branchId": 726523,
  "name": "Al Farooj Al Shami",
  "branchName": "Al Farooj Al Shami - Dubai Marina",
  "cuisine": "Arabic, Grills, Shawarma, Lebanese",
  "rate": 4.4,
  "totalRatings": 5234,
  "deliveryFee": 3,
  "minimumOrderAmount": 20,
  "menuUrl": "https://www.talabat.com/uae/restaurant/726523/al-farooj-al-shami-dubai-marina",
  "menu": {
    "count": 68,
    "categories": [
      {
        "id": 1001,
        "name": "Shawarma",
        "items": [
          {
            "id": 5001,
            "name": "Chicken Shawarma Plate",
            "price": 18.5,
            "oldPrice": 22,
            "hasChoices": true,
            "choices": [
              {
                "choiceId": 12,
                "sectionName": "Add Extra Sauce",
                "isSingleSelection": true,
                "isMandatory": false,
                "options": [
                  { "id": 99, "name": "Garlic Sauce", "price": 1.5 },
                  { "id": 100, "name": "Hot Sauce", "price": 1 }
                ]
              }
            ]
          }
        ]
      }
    ]
  }
}
```

### Integrations & Automation

- **Apify API** — run the actor programmatically from JavaScript, Python or any language via the Apify REST API.
- **Webhooks** — fire a webhook when each run completes to pipe results into your own pipeline.
- **Google Sheets / Excel** — export any dataset as JSON, CSV or Excel with one click in Apify Console.
- **Scheduling** — recommend a **daily** schedule for menu price monitoring (menus change multiple times a day), a **weekly** schedule for market research snapshots, and **on-demand** for one-off database builds. Recurring schedules also improve the actor's Store recommendations.

### Related Actors

For broader MENA food-delivery and restaurant data coverage:

- [Noon Food Scraper](https://apify.com/thirdwatch/noon-food-scraper) — restaurants and menus from food.noon.com (UAE, Saudi Arabia)
- [Noon.com Scraper](https://apify.com/thirdwatch/noon-scraper) — products and food delivery data from noon.com (UAE, Saudi Arabia, Egypt)
- [Google Maps Scraper](https://apify.com/compass/crawler-google-places) — restaurant density, reviews and GPS for total-market analysis

### FAQ

#### Why use this actor instead of the official Talabat API?

Talabat's official Partner API is restricted to registered restaurant partners — you must request API keys through your account manager, and it manages your own catalogue and orders, not public restaurant/menu data across the marketplace. There is no public API for browsing all Talabat restaurants, menus and prices. The actor uses Talabat's own public Next.js data endpoints without login, so you can extract the same data any visitor sees, at scale, without approval.

#### What are the alternatives to this Talabat scraper / Talabat data source?

Competing options include the official Talabat Partner API (partners only), generic scraping APIs such as ScrapingBee, Bright Data or Actowiz, and other Apify Talabat actors. This actor's edge: **pure HTTP via Talabat's internal API — no browser, no proxy, no per-item surcharges** — with menu items billed at only $0.0002 and restaurants at $0.0005, roughly half the price of comparable actors.

#### Does this actor scrape Talabat menus without login?

Yes. All data comes from publicly visible pages and Talabat's public Next.js endpoints. No login, no session, no API key required.

#### Can I monitor Talabat menu prices on a schedule?

Yes. Run the actor with `scrapeMenu: true` on a daily schedule via Apify's scheduler, then diff prices between runs. `oldPrice` is populated when an item is discounted, so promotional pricing is easy to detect (filter `oldPrice > price`).

#### Can I scrape Talabat in Saudi Arabia, Kuwait, Qatar or Egypt?

Yes. `country` accepts `saudi_arabia`, `kuwait`, `qatar`, `bahrain`, `oman`, `jordan`, `egypt` and `iraq` in addition to `uae`. Some countries (notably Saudi Arabia on the web) return no active restaurants and are skipped automatically.

#### Does this actor generate merchant or B2B leads?

It returns every field a lead-scoring pipeline needs — restaurant name, area, city, GPS, cuisine, rating, popularity (total ratings), delivery economics and payment methods — structured per restaurant. Lead scoring can be built on top of the dataset; the actor itself does not compute a lead score.

#### Which currency are menu prices in?

Prices are returned in the country's local currency as displayed on Talabat — AED (UAE), SAR (Saudi Arabia), KWD (Kuwait), QAR (Qatar), BHD (Bahrain), OMR (Oman), JOD (Jordan), EGP (Egypt), IQD/IQD-equivalent (Iraq). The `country.currency` field on every record tells you which currency applies.

### SEO Keywords

talabat scraper, talabat api alternative, talabat menu scraper, scrape talabat restaurants, talabat data extraction, uae restaurant data, dubai restaurant menus, saudi arabia restaurant data, kuwait restaurant data, qatar restaurant data, mena food delivery data, gcc restaurant database, talabat menu prices, restaurant price monitoring, food delivery market research, talabat restaurant ratings, talabat delivery fees, talabat dataset, scrape talabat menus, middle east food delivery api

### For AI Agents & LLM Apps

**Purpose:** Returns one dataset record per Talabat restaurant, including structured location/delivery/payment metadata and, when enabled, the full menu with item prices and choice trees.

**Minimal working input:**

```json
{
  "country": "uae",
  "searchKeywords": ["pizza"],
  "maxVendors": 10
}
```

**Variant inputs:**

- Area catalogue (no keyword): `{ "country": "uae", "area": "dubai", "maxVendors": 50 }`
- Direct URLs: `{ "startUrls": [{ "url": "https://www.talabat.com/uae/restaurant/45079/al-farooj-al-shami-al-muraqqabat" }] }`
- With menus + choice trees: `{ "country": "kuwait", "searchKeywords": ["burger"], "scrapeMenu": true, "scrapeMenuChoices": true }`

**Output fields (dataset):** `source`, `scrapedAt`, `country{id,code,slug,name,currency}`, `area{id,name,slug}`, `city{id,name,slug}`, `listingUrl`, `vendorId`, `branchId`, `name`, `branchName`, `cuisine`, `cuisines[]`, `rate`, `totalReviews`, `totalRatings`, `deliveryFee`, `minimumOrderAmount`, `avgDeliveryTime`, `deliveryEstimate`, `accepts{creditCard,debitCard,cash}`, `status`, `flags{...}`, `location{lat,lng}`, `images{logo,heroImage}`, `promotions{text,discountText}`, `menuUrl`, `search{...}`, `menu{count,categories[]}`.

**Behaviors an agent should know:**

- `searchKeywords` and `area` both trigger searches; `startUrls` skip search entirely and go straight to the given URLs. If `startUrls` is set, the other modes are not used.
- With no `maxVendors`, the actor scrapes **all** matching restaurants — set `maxVendors` explicitly to bound cost and runtime.
- `scrapeMenu` (default `true`) adds one request per restaurant; `scrapeMenuChoices` (default `false`) adds one request per customizable item and is billed per item — enable only when choice-level data is actually needed.
- `area` accepts a name, slug, or numeric ID (e.g. `"Abu Hail"`, `"abu-hail"`, `1169`).
- Some countries (e.g. Saudi Arabia on the web) currently return no active restaurants; runs that find none complete with zero records rather than erroring.

**Billing:** pay-per-event — $0.0005 per restaurant record + $0.0002 per menu item + $0.0002 per choice tree fetched + a one-time actor-start event per run.

### Legal & Compliance Disclaimer

This actor is an independent tool and is **not affiliated with, endorsed by, or sponsored by Talabat, Delivery Hero, or any of their brands.** It accesses only publicly available pages and public Next.js API endpoints on talabat.com — it does not bypass login, does not solve CAPTCHAs, and does not access non-public data.

Users are solely responsible for their own compliance with Talabat's Terms of Service and with applicable data-protection and competition law (including GDPR and the UAE/CCPA-equivalent regimes where relevant) when using extracted data. Scraping data about identifiable restaurants or individuals may be subject to data-protection obligations. This tool is for legitimate research, monitoring, and analysis purposes.

***

### Development

```bash
npm install
apify login
apify run
```

# Actor input Schema

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

Country to scrape. Talabat no longer serves restaurants in some countries on its website - runs that return no restaurants are simply skipped.

## `area` (type: `string`):

Optional. Area name, area slug or area ID (e.g. "Abu Hail", "abu-hail", or 1169). When set, the actor crawls the area's full restaurant catalogue and uses the area location for keyword search. Leave empty to search the whole country.

## `searchKeywords` (type: `array`):

Optional. Search cuisine/restaurant keywords (e.g. "pizza", "burger", "koshari"). One keyword per query, paginated until no more results. Leave empty when using an area catalogue.

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

Optional. Direct talabat.com listing or restaurant menu URLs, e.g. https://www.talabat.com/uae/restaurants/1169/abu-hail or https://www.talabat.com/uae/restaurant/45079/al-farooj-al-shami-al-muraqqabat

## `scrapeMenu` (type: `boolean`):

Fetch the full menu (categories, items, prices) for every restaurant. Adds one page request per restaurant.

## `scrapeMenuChoices` (type: `boolean`):

Fetch the complete meal choice trees (sizes, add-ons, extras with prices) for items that have choices. One request per customizable item.

## `maxVendors` (type: `integer`):

Maximum number of restaurants to process per search keyword or area. Leave 0 for unlimited.

## `maxItemsPerVendor` (type: `integer`):

Cap on the number of menu items saved per restaurant. Leave 0 for unlimited.

## `requestDelayMillis` (type: `integer`):

Optional extra pause after each request, on top of the global rate limit. Leave 0 and use maxRequestsPerSecond for pacing instead.

## `maxConcurrency` (type: `integer`):

How many restaurant pages / listing pages to process in parallel. Higher is faster but more aggressive.

## `maxRequestsPerSecond` (type: `integer`):

Global request rate cap shared by all parallel workers. 0 = no limit. Prevents hammering the site while keeping speed.

## `extendOutputFunction` (type: `string`):

Optional JS function to modify or augment the output objects. Signature: (object, input, context) => object. Note: after reaching the maximum number of results, the results will not be overwritten using this function.

## `proxyConfiguration` (type: `object`):

Apify proxy to spread requests across IPs. Usually not required (clean IPs handle menus at 8+ rps), but for large scrapes or if your IP gets flagged by Talabat's WAF, rotate with RESIDENTIAL (best) or DATACENTER (cheaper, sometimes pre-flagged). 429s are auto-handled with global backoff either way.

## Actor input object example

```json
{
  "country": "uae",
  "area": "Dubai",
  "searchKeywords": [],
  "startUrls": [],
  "scrapeMenu": false,
  "scrapeMenuChoices": false,
  "maxVendors": 10,
  "maxItemsPerVendor": 10,
  "requestDelayMillis": 0,
  "maxConcurrency": 10,
  "maxRequestsPerSecond": 10,
  "extendOutputFunction": "",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

Dataset containing all scraped restaurants and menus

# 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 = {
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("ahmed_jasarevic/talabat-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 = { "proxyConfiguration": { "useApifyProxy": True } }

# Run the Actor and wait for it to finish
run = client.actor("ahmed_jasarevic/talabat-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 '{
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call ahmed_jasarevic/talabat-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,ahmed_jasarevic/talabat-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/ejbqaJ1Tw4ft2rHNU/builds/ZdpdISp951q2pqMnA/openapi.json
