# Nahdi Online نهدي Pharmacy Scraper – Prices, Stock & Discounts (`boring_internet_explorer/nahdi-scraper`) Actor

Scrape product data from Nahdi Online (نهدي أونلاين) in Saudi Arabia and the UAE, in English and Arabic. Get prices, discounts, stock status, brands, categories, images and attributes from any category, filtered or search URL.

- **URL**: https://apify.com/boring\_internet\_explorer/nahdi-scraper.md
- **Developed by:** [Boring Internet Explorer](https://apify.com/boring_internet_explorer) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.50 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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

## 💊 Nahdi Online Pharmacy Scraper — نهدي أونلاين

### ❓ What is this scraper?

This scraper extracts structured product data from **Nahdi Online (نهدي أونلاين)** (`www.nahdionline.com`) — the leading pharmacy and health-and-beauty retailer in Saudi Arabia and the UAE. Given a category or search URL, it collects product information such as names, brands, prices, discounts, stock availability, categories, images, and product attributes, in both English and Arabic.

Nahdi's catalog covers medicines, vitamins and supplements, skin care, hair care, baby and mom care, personal care, and devices, making it a valuable source for pricing and market data in the GCC health and beauty sector.

The extracted data is normalized into a structured format, making it easy to use for analysis, integrations, or storage.

***

### ⚡ Why this scraper?

Nahdi Online offers a powerful way to explore pharmacy and beauty products, and this scraper allows you to:

- 💰 Monitor prices, discounts, and promotions across Saudi Arabia (SAR) and the UAE (AED).
- 📦 Track stock availability across categories and brands.
- 🏷️ Compare brands and product ranges in any category or search result.
- 🌍 Collect product data in English and Arabic from the KSA and UAE storefronts.
- 🤖 Feed price-intelligence dashboards, catalog sync, and AI enrichment pipelines.
- 🔍 Research supply and demand for any keyword, from "lotion" to "vitamin C".

Perfect for:

- E-commerce and pricing analysts
- Pharmacy and retail market researchers
- Brand and category managers
- Price comparison and aggregator platforms
- Data teams building GCC health and beauty datasets

***

### 🔗 Supported URL types

| Type      | Example                                                                                                                                 |
| --------- | --------------------------------------------------------------------------------------------------------------------------------------- |
| Category  | `https://www.nahdionline.com/en-sa/bath-body/body-lotion/indulging-lotion/plp/87660`                                                    |
| Search    | `https://www.nahdionline.com/en-ae/search?query=lotion`                                                                                 |
| Filtered  | `https://www.nahdionline.com/en-sa/bath-body/body-lotion/indulging-lotion/plp/87660?refinementList%5Bmanufacturer%5D%5B0%5D=Enchanteur` |
| Paginated | `https://www.nahdionline.com/en-sa/bath-body/body-lotion/indulging-lotion/plp/87660?page=2`                                             |

Supported storefronts: `en-sa`, `ar-sa`, `en-ae`, `ar-ae`.

***

### 📥 Input

| Field                | Type   | Description                                                           |
| -------------------- | ------ | --------------------------------------------------------------------- |
| `startUrls`          | array  | Nahdi Online category or search URLs to scrape.                       |
| `maxItems`           | number | Maximum number of products to scrape **per start URL**. Default: `5`. |
| `proxyConfiguration` | object | Optional proxy settings. Not required for typical runs.               |

```json
{
  "maxItems": 5,
  "startUrls": [
    {
      "url": "https://www.nahdionline.com/en-sa/bath-body/body-lotion/indulging-lotion/plp/87660"
    },
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

***

### 📤 Output

Each product is returned as a structured JSON object:

```json
{
  "scrapedAt": "2026-10-02T14:19:04.397Z",
  "url": "https://www.nahdionline.com/en-sa/vaseline-lotion-even-tone-radiance-200ml/pdp/102632615",
  "id": "243074",
  "sku": "102632615",
  "gtin": "6281006606081",
  "name": "VASELINE Essential Even Tone Body Lotion, Smooth Radiance, Gluta-Hya Serum Burst, 200ml",
  "brand": "Vaseline",
  "price": 20.96,
  "originalPrice": 34.95,
  "discountPercent": 40,
  "currency": "SAR",
  "inStock": true,
  "isPrescription": false,
  "hasOffer": true,
  "promoMessages": ["Save 40%"],
  "categories": ["Body Moisturizer", "Body Lotion", "Indulging Lotion", "Regular Lotion"],
  "imageUrl": "https://ecombe.nahdionline.com/media/catalog/product/1/0/102632615_small_image_64fec1ea1b2a0c31f_8729.jpg?width=265&height=265&canvas=265,265&optimize=high&bg-color=255,255,255&fit=bounds",
  "attributes": { "productForm": "Body Lotion", "size": "200 ml" },
  "country": "SA",
  "language": "en",
  "locale": "en-sa"
}
```

#### Field reference

| Field             | Type    | Description                                                                         |
| ----------------- | ------- | ----------------------------------------------------------------------------------- |
| `scrapedAt`       | string  | Timestamp of when the product was scraped (ISO 8601).                               |
| `url`             | string  | Product page URL on Nahdi Online.                                                   |
| `id`              | string  | Internal Nahdi product identifier.                                                  |
| `sku`             | string  | Product SKU.                                                                        |
| `gtin`            | string  | Barcode (GTIN/EAN). `null` if not available.                                        |
| `name`            | string  | Product name in the storefront language.                                            |
| `brand`           | string  | Brand / manufacturer name in the storefront language.                               |
| `price`           | number  | Current selling price. `null` if not available.                                     |
| `originalPrice`   | number  | Price before discount. `null` if the product is not discounted.                     |
| `discountPercent` | number  | Discount percentage, rounded. `null` if not discounted.                             |
| `currency`        | string  | `SAR` for Saudi Arabia, `AED` for the UAE.                                          |
| `inStock`         | boolean | Whether the product is in stock. `null` if unknown.                                 |
| `isPrescription`  | boolean | Whether the product requires a prescription.                                        |
| `hasOffer`        | boolean | Whether the product currently has an offer.                                         |
| `promoMessages`   | array   | Promotion labels shown for the product, e.g. `"Save 40%"`.                          |
| `categories`      | array   | Category names the product belongs to.                                              |
| `imageUrl`        | string  | Main product image URL.                                                             |
| `attributes`      | object  | Product attributes when available, e.g. `productForm`, `skinType`, `scent`, `size`. |
| `country`         | string  | `SA` or `AE`.                                                                       |
| `language`        | string  | `en` or `ar`.                                                                       |
| `locale`          | string  | Storefront locale, e.g. `en-sa`.                                                    |

***

### ❓ FAQ

**What types of URLs can I provide?**

Category pages (URLs containing `/plp/<id>`) and search pages (`/search?query=...`) from `www.nahdionline.com`. Product detail pages are not supported.

**Which countries and languages are supported?**

Saudi Arabia (`en-sa`, `ar-sa`) and the UAE (`en-ae`, `ar-ae`). The storefront in the URL decides the language, currency, and catalog of the results.

**Can I use filtered URLs?**

Yes. Apply filters on Nahdi Online (brand, size, gender, availability, price range, and more) and paste the resulting URL. The filters in the URL are applied to the results. Multiple values of the same filter are combined with OR, and different filters with AND, exactly like on the website.

**How does `maxItems` work?**

It limits the number of products scraped for each start URL separately, not across the whole run.

**Can I start from a specific page?**

Yes. Add `?page=N` (or `&page=N`) to the URL and scraping begins from that page and continues until `maxItems` is reached or results run out.

**Why is `originalPrice` empty for some products?**

It is only provided when the product is discounted. Otherwise `originalPrice` and `discountPercent` are `null`.

**Why are some categories in English on the Arabic UAE storefront?**

The Arabic UAE catalog returns English category names for many products. Product names and brands are still in Arabic.

**How many results can I get for one search or category?**

Up to the number of products Nahdi Online shows for that URL. Very large searches may be capped by the website's own result limit, so use narrower category or search URLs for complete coverage.

**Is a proxy required?**

No. The scraper works without a proxy by default. You can enable Apify Proxy in the input if needed.

***

### 🔗 Want More Data in the MENA Market?

#### If you found this scraper useful, check out our other scrapers:

[Carrefour Scraper](https://apify.com/boring_internet_explorer/carrefour-scraper) - Scrape product data from Carrefour كارفور across 7 markets — KSA, UAE, Egypt, Qatar, Pakistan, Lebanon, and Kenya.

[Lulu Hypermarket Scraper](https://apify.com/boring_internet_explorer/lulu-scraper) - Extract rich product data from Lulu Hypermarket لولو هايبرماركت across KSA, UAE, Qatar, Oman, Kuwait & Bahrain.

[Panda Groceries Scraper](https://apify.com/boring_internet_explorer/panda-scraper) - Scrape product data from Panda بنده (panda.sa), Saudi Arabia's grocery and retail chain.

[Ninja Product Scraper](https://apify.com/boring_internet_explorer/Ninja-product-scraper) - Extract product data from ananinja.com across groceries, pharmacy, beauty, and household products in Saudi Arabia, Bahrain, Qatar, and Kuwait.

[eXtra Product Scraper](https://apify.com/boring_internet_explorer/extra-scraper) - Extract product data from extra.com across Saudi Arabia, Oman, and Bahrain in both English and Arabic.

***

### 🛠️ Need a custom extension?

Need this scraper adapted to your use case — extra fields, additional filters, a different output format, or a new category? Just reach out and we'll be happy to help.

# Actor input Schema

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

Nahdi Online category or search URLs (en-sa, ar-sa, en-ae, ar-ae), e.g. https://www.nahdionline.com/en-sa/bath-body/body-lotion/indulging-lotion/plp/87660 or https://www.nahdionline.com/en-ae/search?query=lotion

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

The maximum number of products to scrape per start URL

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

Your proxy configuration from Apify

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.nahdionline.com/en-sa/bath-body/body-lotion/indulging-lotion/plp/87660"
    }
  ],
  "maxItems": 5,
  "proxyConfiguration": {
    "useApifyProxy": 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 = {
    "startUrls": [
        {
            "url": "https://www.nahdionline.com/en-sa/bath-body/body-lotion/indulging-lotion/plp/87660"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("boring_internet_explorer/nahdi-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://www.nahdionline.com/en-sa/bath-body/body-lotion/indulging-lotion/plp/87660" }] }

# Run the Actor and wait for it to finish
run = client.actor("boring_internet_explorer/nahdi-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://www.nahdionline.com/en-sa/bath-body/body-lotion/indulging-lotion/plp/87660"
    }
  ]
}' |
apify call boring_internet_explorer/nahdi-scraper --silent --output-dataset

```

## MCP server setup

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