Marjane Mall Scraper avatar

Marjane Mall Scraper

Pricing

from $1.25 / 1,000 results

Go to Apify Store
Marjane Mall Scraper

Marjane Mall Scraper

All Marjane Mall products from Morocco's official sitemaps: name, brand, price, previous price, discount, stock, seller, categories, specs and images. Prices are compared between runs, so a daily schedule reports only what moved. Example: leave the input empty for a 1,000-product sample.

Pricing

from $1.25 / 1,000 results

Rating

5.0

(2)

Developer

Badr Bouargan

Badr Bouargan

Maintained by Community

Actor stats

1

Bookmarked

3

Total users

1

Monthly active users

9 days ago

Last modified

Security

Limited permissions

Share

Marjane Mall Scraper – Morocco Product Prices, Promotions & Stock

Marjane Mall Scraper

Get any Marjane Mall product (or the whole catalogue) as a clean spreadsheet in one click: price in MAD, regular price, discount, stock, brand, seller, category, barcode and images, with price tracking between runs.

Marjane Mall is Morocco's hypermarket marketplace. This Actor is built for e-commerce price monitoring, competitor intelligence and promotion alerts in Morocco. You don't need an API key or a login, and you don't configure anything: the Moroccan residential proxy is included.

How to use it in 3 steps

  1. Choose what to scrape. Leave Marjane Mall links empty to read the catalogue, or paste product, category, official store or search links. A plain keyword like machine à café also works.
  2. Set Maximum products. Use 100 for a first test, or 0 for no limit. You can add filters if you need them: price range, minimum discount, in stock only, words in the category or name.
  3. Click Start. Export the results as Excel, CSV or JSON, or send them to Google Sheets, Make, Zapier, n8n or your own code.

The default input (100 catalogue products) runs in about a minute and costs about $0.25.

What you can do with it

  • Track specific products: paste the product links you care about and schedule a daily run.
  • Monitor Moroccan retail prices: follow thousands of products, refreshed daily or weekly.
  • Catch promotions the day they start: every row has the price, regular price and discount percent, and there is a Minimum discount filter.
  • Benchmark against your own catalogue: match products by barcode (gtin) or SKU and compare prices.
  • Compare marketplace sellers: Marjane's own listings against partner sellers (sellerName).
  • Watch one department or brand: paste a category link (/electromenager) or an official store link (/boutique-officielle/samsung).
  • Get alerted on price drops: each run adds the previous price and the change in MAD and in percent.
You pasteWhat happens
https://www.marjanemall.ma/p/… (product page)The product is scraped directly, which is fast.
https://www.marjanemall.ma/electromenager/cuisine-et-cuisson/airfryer (category)You get the products of that category, collected from the catalogue.
https://www.marjanemall.ma/boutique-officielle/dyson (official store)You get the products of that brand.
https://www.marjanemall.ma/search?q=airfryer or just airfryerYou get the products whose name contains all the words.

You can paste links any way you like. Links without https://, other subdomains such as m. or payment., tracking parameters (?utm_source=…), #anchors, several links on one line separated by commas or spaces, and duplicates are all cleaned up automatically. A link that can't be used (another website, a flash-sale or information page) is skipped with a warning and listed in FAILED_INPUTS. You are never billed for it.

Why this Actor

  • You pay only for results. The dataset holds only products that were read successfully, and the dataset is the only thing you're billed for. Removed products, unusable links, pages that fail after retries and filtered-out products are never billed. Failures are listed in FAILED_INPUTS.
  • Exact limits, even with filters. Maximum products is exactly the number of products you get. With filters, the Actor keeps reading product pages until that many match. The run also stops cleanly when it reaches your Max cost per run.
  • Complete catalogue available. The Actor reads Marjane Mall's official product sitemaps, around 380,000 product pages.
  • Rich, flat rows. Prices are numbers, currency is "MAD", sellerName, category and categoryPath are flat columns, and dates are ISO 8601. The rows are ready for Excel, Google Sheets or a database.
  • Reliable. Blocked requests are retried automatically from a fresh residential IP. Progress is saved if the run is migrated, and RUN_SUMMARY records the totals and why the run stopped.
  • Respectful crawling. The Actor follows robots.txt: it reads sitemaps and product pages only, and never /api/, cart or account pages. The bot identifies itself and its speed is limited.

How it works

  1. Product links are read directly. For everything else, the Actor reads the public product sitemaps of Marjane Mall.
  2. It queues just enough product pages to reach Maximum products, more when filters, category, store or search links are used, and tops up the queue as it goes.
  3. Each product page is parsed from its embedded structured data, not from the page layout. A visual redesign therefore doesn't silently break the output.
  4. Products are de-duplicated by SKU, compared with the previous run for price tracking, filtered, and saved.

Daily price monitoring

  1. Keep Track prices between runs on.
  2. Switch on Only changed products.
  3. Create an Apify Schedule.

Each run then returns, and bills, only the products whose price or stock changed. Keep the same links, filters and Maximum products on every run so the comparison stays consistent.

Input examples

Specific products, one per line:

{
"startUrls": [
"https://www.marjanemall.ma/p/tapis-receveur-de-douche-anti-derapant-blanc-aaaaa32198",
"https://www.marjanemall.ma/p/montre-casio-mq-24uc-2bdf-resistante-a-l-eau-bracelet-en-silicone-cadran-noir-aaaab02642"
]
}

A department with filters:

{
"startUrls": ["https://www.marjanemall.ma/electromenager"],
"maxItems": 1000,
"minDiscountPercent": 15,
"onlyInStock": true,
"trackPriceChanges": true
}

The whole catalogue: { "maxItems": 0 }.

Output example

Sample output

This is one real product from a local test run on 9 October 2026. The description is shortened:

{
"id": 616657,
"sku": "AAAAF07695",
"name": "Stylo Plume Faber-Castell School+ Bleu - Avec 6 Cartouches d'Encre Effaçable",
"url": "https://www.marjanemall.ma/p/stylo-a-plume-school-bleu-avec-6-cartouches-a-encre-bleu-roi-effacable-aaaaf07695",
"image": "https://cdnprd.marjanemall.ma/cn0picture0products0mm/AAAAF07695_img1.webp",
"price": 65,
"regularPrice": 70,
"discountPercent": 7,
"isOnSale": true,
"currency": "MAD",
"inStock": false,
"stockQuantity": 0,
"rating": 5,
"reviewsCount": 1,
"brand": "FABER-CASTELL",
"sellerId": "705665",
"sellerName": "DAR EL HIJRA",
"category": "Peinture",
"categoryPath": "Brico - Jardin - Animalerie > Aménagement > Peinture",
"categories": ["Brico - Jardin - Animalerie", "Aménagement", "Peinture", "Loisirs créatifs"],
"attributes": { "Marque": "FABER-CASTELL" },
"description": "Idéal pour l'apprentissage de l'écriture, le stylo plume Faber-Castell School+ offre …",
"gtin": "4005401498117",
"deliveryInformation": "Livraison entre le Lundi 12 octobre 2026 et le Mardi 13 octobre 2026",
"isEnabled": true,
"createdAt": "2025-10-04T21:57:20+00:00",
"updatedAt": "2026-09-15T01:04:59+00:00",
"sitemapLastmod": "2025-12-25T05:00:07+00:00",
"scrapedAt": "2026-10-09T16:55:30.401664+00:00",
"isNewProduct": true,
"previousPrice": null,
"priceChange": null,
"priceChangePercent": null,
"previousInStock": null,
"stockChanged": false,
"lastSeenAt": null
}

Every row also has images (all pictures), shortDescription and the seller object (id, name). The price-tracking fields (isNewProduct, previousPrice, priceChange, priceChangePercent, previousInStock, stockChanged, lastSeenAt) appear when Track prices between runs is on. From the second run onwards they hold the previous values. For products saved from a product link, sitemapLastmod is null.

The dataset has an Overview view (image, name, brand, price, regular price, discount, stock, rating, reviews, seller, category, link) and a Price changes view. The key-value store holds:

  • RUN_SUMMARY: products saved, why the run stopped, products filtered out, removed and failed, and the amount charged.
  • FAILED_INPUTS: every link or page that gave nothing, with the reason.

Pricing

You pay per result: each product saved to the dataset is charged, and nothing else. The residential proxy and compute are included.

Apify planPrice per 1,000 products
Free$2.50
Starter$2.00
Scale$1.625
Business and above$1.25

There is also a tiny start fee of $0.00005 per run (per GB of memory). For example, 1,000 products on the Free plan cost about $2.50. Set Max cost per run in the run options and the Actor stops cleanly at that amount.

What it can and cannot do

It can:

  • Scrape any public product page.
  • Read the whole catalogue (around 380,000 product pages).
  • Filter by category, official store, words in the name, price, discount and stock.
  • Track price and stock changes between runs.
  • Send e-mail alerts when the run has full permissions.

It cannot:

  • Read customer reviews' text, cart or checkout data, or anything behind a login.
  • Open category, store or search pages themselves. Marjane Mall loads their product lists through /api/, which robots.txt forbids, so these links are turned into filters applied while the catalogue is read. Results are equivalent, but a very narrow category or rare keyword can take longer to collect than a broad one.
  • Scrape flash-sale or campaign pages (/ventes-flash, /destockage…). These are listed in FAILED_INPUTS.

FAQ

Can I get the whole catalogue? Yes. Leave the links empty and set Maximum products to 0. There are around 380,000 product pages, so run a smaller job first to size the dataset and the duration.

I pasted 500 product links but got 300 products. Why? Maximum products also caps a list of links. Set it to 0, or to the number of links you pasted.

Why a residential proxy? Marjane Mall refuses datacenter IP addresses and many foreign IPs. The default setting already selects the RESIDENTIAL group in Morocco. Changing it usually results in empty runs. Its cost is included in the price per product.

Do I pay for products that are filtered out, unusable links or pages that fail? No. Only saved products are billed. Everything else is listed in FAILED_INPUTS with the reason.

Will I get exactly the number of products I ask for? Yes, as long as enough products match. The run stops at exactly Maximum products.

How does price tracking work? Each product's last price and stock status are stored under its SKU in a named key-value store that survives between runs. The next run adds previousPrice, priceChange and priceChangePercent, plus flags for new products and stock changes.

Why did an e-mail alert not arrive? Actors started from Apify Store run with limited permissions and can't send e-mail on your behalf. Use a Slack, webhook, Make or Zapier integration instead. The changed products are always in the dataset.

Can I follow only one category? Yes. Paste its link, for example https://www.marjanemall.ma/informatique-gaming, or use Category contains with a word like électroménager. Accents and capitals are ignored.

Troubleshooting

  • The run finished with 0 products. Open FAILED_INPUTS. If your links are listed there, check that they come from marjanemall.ma. If you see blocked requests, put the proxy back to RESIDENTIAL, country Morocco (MA).
  • A category run is slow. Narrow categories are matched while reading the catalogue, so add a Maximum products limit or use a broader parent category.
  • A product link gave "Produit introuvable". The product was removed from Marjane Mall. It isn't billed.
  • The log warns about "Champ(s) d'entrée inconnu(s)". Your input contains a setting from another Actor, and that setting has no effect. Remove it in the JSON tab.

Use it via API

Replace <YOUR_APIFY_TOKEN> with your token from Settings → API & Integrations.

Python (pip install apify-client):

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("badr_xba/marjane-mall-scraper").call(run_input={
"startUrls": ["https://www.marjanemall.ma/electromenager"],
"maxItems": 100,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["name"], item["price"], item["currency"])

JavaScript (npm install apify-client):

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('badr_xba/marjane-mall-scraper').call({
startUrls: ['https://www.marjanemall.ma/electromenager'],
maxItems: 100,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

cURL (runs the Actor and returns the products in one call):

curl -X POST "https://api.apify.com/v2/acts/badr_xba~marjane-mall-scraper/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>" \
-H "Content-Type: application/json" \
-d '{"startUrls": ["https://www.marjanemall.ma/electromenager"], "maxItems": 100}'

Integrations

  • Google Sheets: send every run to a spreadsheet from the Integrations tab to keep a live Moroccan price board.
  • Make, Zapier and n8n: when a run finishes, post price drops to Slack, update your ERP or feed a comparison site.
  • MCP (AI agents): use the Actor from Claude, Cursor or any MCP client through the Apify MCP server (https://mcp.apify.com). Ask it to "get the prices of these Marjane Mall products".
  • Webhooks: call your endpoint when a run succeeds or fails.
  • Schedules: a daily run with Only changed products turns into a promotions feed.

Support

Open an issue on the Actor's Issues tab for bugs, missing fields, or a filter you need. Include the run link.

Did this Actor do the job? A short review on its Store page helps other people find it and tells me what to build next.

This Actor reads public product pages and sitemaps, respects robots.txt, identifies itself honestly and limits its request rate. It collects product data, not personal data. How you reuse prices and product information is your responsibility.

En français

Marjane Mall Scraper extrait les prix, promotions et stocks de Marjane Mall, la marketplace de l'hypermarché marocain. Pour chaque produit, vous obtenez :

  • le prix en dirhams (MAD), le prix normal et le pourcentage de remise ;
  • le stock et la quantité ;
  • la marque et le vendeur (Marjane ou vendeur partenaire) ;
  • la catégorie et le chemin de catégories ;
  • le code-barres (GTIN/EAN), les images et les caractéristiques.

Pour démarrer :

  1. Laissez Marjane Mall links vide pour parcourir le catalogue, ou collez des liens : fiche produit, catégorie, boutique officielle, recherche, ou un simple mot-clé. Les liens mal formatés, en double ou avec des paramètres de suivi sont nettoyés automatiquement.
  2. Indiquez Maximum products : 100 pour un essai, 0 pour ne fixer aucune limite.
  3. Cliquez sur Start.

Suivi quotidien des prix : laissez Track prices between runs activé, activez Only changed products et créez un Schedule. Chaque run ne renvoie, et ne facture, que les produits dont le prix ou le stock a changé.

Vous ne payez que les résultats réussis. Les liens inutilisables, les fiches retirées, filtrées ou en échec ne sont pas facturés : ils sont listés dans FAILED_INPUTS.

Tarif pour 1 000 produits : 2,50 $ sur le plan gratuit, 2,00 $ (Starter), 1,625 $ (Scale), 1,25 $ (Business). Le proxy résidentiel est inclus.