# Salla Store Scraper — Products, Prices & Stock (SAR) (`muraqib/salla-store-scraper`) Actor

Scrape any Salla store's full product catalog — name, price, currency, stock, SKU and URL — with prices pinned to Saudi riyals. No login, no API key, no proxy. Built for competitor price monitoring and repricing in Saudi Arabia and the Gulf.

- **URL**: https://apify.com/muraqib/salla-store-scraper.md
- **Developed by:** [muraqib aswaq](https://apify.com/muraqib) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-usage

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

## Salla Store Scraper — Products, Prices & Stock (SAR)

**Salla Store Scraper** extracts a Salla store's complete product catalog — product name, price, currency,
stock status, SKU and product URL — as a clean JSON dataset you can diff, monitor or feed into a dashboard.

It reads each product page's structured data (JSON-LD `Offer`), the same machine-readable data search
engines use, and can **pin the price to the store's native currency** (for example SAR) so a US or EU
server never gets prices converted to USD.

No login, no API key, no browser, no proxy. Just a store URL.

Salla (سلة) is the leading e-commerce platform in Saudi Arabia, used by 50,000+ merchants across
Saudi Arabia, the UAE, Kuwait, Bahrain, Qatar and Oman.

### What data do you get?

One dataset item per product:

| Field | Example | Meaning |
|---|---|---|
| `name` | `عباية كاجوال سوداء` | Product title in the store's language |
| `price` | `189.0` | Current selling price |
| `currency` | `SAR` | Currency as quoted by the storefront |
| `inStock` | `true` | Availability flag |
| `sku` | `AB-1024` | Merchant SKU when published |
| `url` | `https://store.com/product/123456` | Canonical product URL |
| `store` | `https://store.com` | Source store |

### How do I use it?

```json
{
  "stores": ["https://starsshop1.com"],
  "maxProducts": 200,
  "currency": "SAR",
  "requestDelaySecs": 0.4
}
```

- **stores** — one or more Salla store URLs on the merchant's own domain (required).
- **maxProducts** — cap per store; leave empty to walk the whole catalog from the sitemap.
- **currency** — pins the storefront currency (`SAR`, `AED`, `KWD`, `BHD`, `QAR`, `OMR`).
- **requestDelaySecs** — politeness delay between product requests.

Typical run: a 300-product Salla store finishes in about 2 minutes.

### Use cases

- **Competitor price monitoring** — run daily, diff the results, alert on any price change.
- **Price-drop and stock-out alerts** — detect a competitor discount or a sold-out bestseller.
- **Catalog and assortment research** — brands, price bands, new launches across Salla merchants.
- **Repricing feeds** — export to Google Sheets, a PIM or your own repricing rules.
- **Arabic market intelligence** — native Arabic product names, no translation loss.

### Frequently asked questions

**Does this Actor work without an API key or login?**
Yes. It only reads publicly available storefront pages; no account, cookie or token is needed.

**Which Salla URLs are supported?**
Stores hosted on their own domain (`https://store.com`). Salla's shared storefronts
(`salla.sa/<store>`) are client-side rendered and publish no sitemap, so they are not scrapable by
any HTTP-based tool — almost every active merchant uses a custom domain, and you can check the
store's own domain from its Salla admin or its social profile.

**Why do prices sometimes come back in USD instead of SAR?**
Salla localizes prices to the visitor's country. Set the `currency` input to `SAR` and every request is
pinned to Saudi riyals, regardless of where the Actor runs.

**Does it scrape product images and descriptions?**
The dataset focuses on the fields needed for price intelligence: name, price, currency, stock, SKU and
URL. Images and long descriptions are out of scope by design, which keeps runs fast and cheap.

**How many products can it handle?**
The whole catalog. Large stores (5,000+ products) are best handled with `maxProducts` first, then scaled.

**Is it legal to scrape public storefronts?**
The Actor reads publicly available pages only, at a polite request rate. You are responsible for
complying with the target site's terms and local law when using the data.

### Limitations

- The store must expose a sitemap — Salla stores on their own domain do by default.
- Products with hidden prices ("contact us for price") are skipped.
- Very large catalogs: use `maxProducts` for the first run, then scale up.

### Pricing

Free to run while the Actor builds its public track record. Commercial and high-volume use:
**muraqib.aswaq@gmail.com**.

***

#### بالعربية

**كاشط متاجر سلة** — استخرج كتالوج أي متجر سلة كاملاً (الاسم، السعر، العملة، التوفر، SKU، الرابط) بصيغة
JSON نظيفة، مع تثبيت العملة على الريال السعودي حتى لو شُغّل من سيرفر خارج السعودية. بلا تسجيل، بلا
مفتاح API، بلا بروكسي. مناسب لمراقبة أسعار المنافسين، وتنبيهات تغيّر السعر، وتقارير السوق الخليجي.

# Actor input Schema

## `stores` (type: `array`):

Salla store homepages on a custom domain, e.g. https://example.com

## `maxProducts` (type: `integer`):

Leave empty to scrape every product found in the store sitemap.

## `requestDelaySecs` (type: `number`):

Politeness delay. Increase if the store returns errors.

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

e.g. SAR. Salla auto-converts displayed prices based on the visitor's country; set this to pin the store's native currency.

## Actor input object example

```json
{
  "stores": [
    "https://example.com"
  ],
  "requestDelaySecs": 0.4
}
```

# Actor output Schema

## `dataset` (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 = {
    "stores": [
        "https://example.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("muraqib/salla-store-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 = { "stores": ["https://example.com"] }

# Run the Actor and wait for it to finish
run = client.actor("muraqib/salla-store-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 '{
  "stores": [
    "https://example.com"
  ]
}' |
apify call muraqib/salla-store-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,muraqib/salla-store-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/fQ9DF9bYeaJwtMVjK/builds/xE5ZlXcYtB6zPWVz4/openapi.json
