# Jumia All Products Scraper (`badr_xba/jumia-all-products-scraper`) Actor

Collecte tous les produits de Jumia (Maroc, Côte d'Ivoire, Sénégal, Nigeria, Kenya, Égypte, Ghana, Ouganda) via les sitemaps officiels, en respectant les règles robots.txt du site.

- **URL**: https://apify.com/badr\_xba/jumia-all-products-scraper.md
- **Developed by:** [Badr Bouargan](https://apify.com/badr_xba) (community)
- **Categories:** E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.00005 / actor start

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## Jumia All Products Scraper

Extract **the entire product catalog of Jumia** in 8 African countries — prices, discounts, stock, ratings, sellers, categories, images, specifications and customer reviews — and **track price changes between runs** with optional e-mail alerts.

Countries: 🇲🇦 Morocco · 🇨🇮 Côte d'Ivoire · 🇸🇳 Senegal · 🇳🇬 Nigeria · 🇰🇪 Kenya · 🇪🇬 Egypt · 🇬🇭 Ghana · 🇺🇬 Uganda

### ✨ What you get

- **Complete catalog**: reads Jumia's official product sitemaps (up to ~1.1M products for Kenya).
- **Rich product data**: price, old price, discount %, currency, in stock, rating, reviews count, categories and breadcrumbs, badges, Jumia Express, seller name and score, images, description, specifications.
- **Customer reviews** (optional): rating, title, text, date, verified purchase — no customer names.
- **Filters**: price range, minimum discount, in stock only, category keywords, name keywords, excluded words.
- **Price tracking**: previous price, price change (value and %), new products, stock changes — remembered across runs.
- **E-mail alerts**: price drops and back-in-stock products sent to your Apify account e-mail.
- **Ethical by design**: follows Jumia's robots.txt rules (identified bot, < 200 requests/minute, no fake browser, no proxy needed) → cheap and reliable.

### 🚀 How to use

1. Pick one or more **countries**.
2. Set **Max products per country** (`0` = whole catalog). Start with `1000`.
3. Optionally add **filters**, enable **reviews** or **e-mail alerts**.
4. Click **Start**, then export the results as Excel, CSV or JSON.

**Daily price monitoring**: enable *Only changed products* + *E-mail alerts*, then create a **Schedule** (e.g. every day at 8:00). Keep the same *Max products* value on every run.

### 📦 Output example

```json
{
    "sku": "AP009MP15D0X4NAFAMZ",
    "name": "Apple iPhone 17 Pro 256GB Silver",
    "url": "https://www.jumia.ma/apple-iphone-17-pro-256gb-silver-neuf-2-ans-garantie-67917496.html",
    "price": 15499,
    "oldPrice": 19999,
    "discountPercent": 23,
    "currency": "MAD",
    "inStock": true,
    "rating": 4.6,
    "reviewsCount": 12,
    "categories": ["Phones & Tablets", "Mobile Phones", "Smartphones", "iOS Phones"],
    "seller": { "name": "Jumia", "score": "100%" },
    "isJumiaExpress": true,
    "country": "ma",
    "isNewProduct": false,
    "previousPrice": 16990,
    "priceChange": -1491,
    "priceChangePercent": -8.8,
    "stockChanged": false,
    "reviews": [{ "rating": 5, "title": "Top", "text": "Very good phone", "date": "2026-08-17", "verifiedPurchase": true }]
}
```

### 💰 Cost

About **$0.04 per 1,000 products** on the Apify platform (no proxy required), at ~180 products/minute. Reviews add one request per 10 reviews.

| Country | Approx. products | Full run |
|---|---|---|
| Morocco | ~310,000 | ~29 h |
| Côte d'Ivoire | ~440,000 | ~41 h |
| Senegal | ~100,000 | ~9 h |
| Nigeria | ~390,000 | ~36 h |
| Kenya | ~1,100,000 | ~4 days |
| Egypt | ~590,000 | ~2.3 days |
| Ghana | ~100,000 | ~9 h |
| Uganda | ~260,000 | ~24 h |

Tip: run **one country per run** in parallel — the speed limit applies per website.

### ⚖️ Compliance

Jumia's robots.txt allows crawling by bots that identify themselves with a contact and stay below 200 requests per minute. This Actor only visits allowed URLs (robots.txt, sitemaps, product pages and the explicitly allowed reviews pages), sends `JumiaCatalogBot/1.0 (+contact)` as User-Agent, and limits its speed. Add your e-mail in **Bot contact** so Jumia can reach you. Customer names are never collected.

### ❓ FAQ

**Why do some sitemap products not appear?** Products that were removed or permanently out of stock redirect to a category page and are skipped.

**Can I get only products that changed since yesterday?** Yes: enable *Only changed products* and schedule the Actor daily.

**Who receives the e-mail alerts?** The e-mail address of the Apify account running the Actor (Apify only allows sending to your own address).

***

### 🇫🇷 En français

Collecte **tout le catalogue Jumia** (8 pays) via les sitemaps officiels : prix, promotions, stock, notes, vendeurs, catégories, images, caractéristiques et **avis clients**. **Filtres** (prix, remise, stock, catégorie, mots-clés), **suivi des prix entre les runs** (ancien prix, variation, nouveautés, ruptures) et **alertes e-mail** (baisses de prix, retours en stock). Respecte le robots.txt de Jumia : robot identifié, moins de 200 requêtes/minute, sans proxy. Coût : environ 0,04 $ pour 1 000 produits.

# Actor input Schema

## `countries` (type: `array`):

Sites Jumia dont on collecte tout le catalogue. Taille approximative : Maroc ~310 000 produits, Côte d'Ivoire ~440 000, Sénégal ~100 000, Nigeria ~390 000, Kenya ~1 100 000, Égypte ~590 000, Ghana ~100 000, Ouganda ~260 000.

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

Mettez 0 pour collecter TOUT le catalogue (cela peut prendre plusieurs jours et dépasser le crédit gratuit Apify). Commencez par un petit nombre pour tester.

## `minPrice` (type: `integer`):

Ne garder que les produits à ce prix ou plus (dans la devise du site).

## `maxPrice` (type: `integer`):

Ne garder que les produits à ce prix ou moins.

## `minDiscountPercent` (type: `integer`):

Ne garder que les produits en promotion d'au moins ce pourcentage (ex. 30).

## `onlyInStock` (type: `boolean`):

Exclure les produits en rupture de stock.

## `categoryKeywords` (type: `array`):

Garder les produits dont une catégorie contient un de ces mots (ex. téléphone, électroménager). Accents et majuscules ignorés.

## `nameKeywords` (type: `array`):

Garder les produits dont le nom contient un de ces mots (ex. samsung, iphone).

## `excludeKeywords` (type: `array`):

Exclure les produits dont le nom contient un de ces mots (ex. coque, reconditionné).

## `trackPriceChanges` (type: `boolean`):

Mémorise le prix et le stock de chaque produit pour les comparer au run suivant : ancien prix, variation, nouveaux produits, changement de stock.

## `onlyChangedProducts` (type: `boolean`):

N'enregistrer que les nouveaux produits et ceux dont le prix ou le stock a changé depuis le dernier run. Idéal avec un run programmé chaque jour.

## `sendEmailAlerts` (type: `boolean`):

À la fin du run, envoie un récapitulatif des baisses de prix et retours en stock à l'adresse e-mail de votre compte Apify (seule adresse autorisée par Apify). Nécessite le suivi des prix.

## `alertMinPriceDropPercent` (type: `integer`):

Signaler les produits dont le prix a baissé d'au moins ce pourcentage depuis le dernier run.

## `alertBackInStock` (type: `boolean`):

Signaler les produits qui étaient en rupture et sont de nouveau disponibles.

## `alertNewProducts` (type: `boolean`):

Signaler aussi les produits jamais vus. Attention : au premier run, tous les produits sont nouveaux.

## `includeReviews` (type: `boolean`):

Ajoute les avis de chaque produit (note, titre, texte, date, achat vérifié — sans le nom des clients). Page autorisée par robots.txt de Jumia. Ajoute 1 requête par page de 10 avis.

## `maxReviewsPerProduct` (type: `integer`):

Les avis les plus récents d'abord.

## `botContact` (type: `string`):

E-mail ou URL permettant à Jumia de vous contacter (recommandé). Jumia demande dans son robots.txt que chaque robot indique un contact : il est ajouté au User-Agent (ex. JumiaCatalogBot/1.0 (+votre@email.com)). Si vous laissez vide, l'adresse de l'Actor sur Apify est utilisée.

## `maxRequestsPerMinute` (type: `integer`):

Vitesse maximale, tous pays confondus. Jumia autorise au plus 200 requêtes par minute ; la valeur est plafonnée à 190. Environ 1 requête = 1 produit.

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

Par défaut aucun proxy : Jumia demande de ne pas multiplier les adresses IP. N'en activez un que si le robot est bloqué.

## Actor input object example

```json
{
  "countries": [
    "ma"
  ],
  "maxItems": 500,
  "onlyInStock": false,
  "trackPriceChanges": true,
  "onlyChangedProducts": false,
  "sendEmailAlerts": false,
  "alertMinPriceDropPercent": 10,
  "alertBackInStock": true,
  "alertNewProducts": false,
  "includeReviews": false,
  "maxReviewsPerProduct": 20,
  "maxRequestsPerMinute": 120,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

Tableau des produits avec image, prix, remise, stock, note et lien.

## `allFields` (type: `string`):

Données complètes de chaque produit, y compris description, images et caractéristiques.

# 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 = {
    "countries": [
        "ma"
    ],
    "maxItems": 500,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("badr_xba/jumia-all-products-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 = {
    "countries": ["ma"],
    "maxItems": 500,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("badr_xba/jumia-all-products-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 '{
  "countries": [
    "ma"
  ],
  "maxItems": 500,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call badr_xba/jumia-all-products-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,badr_xba/jumia-all-products-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/97viEvsQRsVfqqivP/builds/HhbIow8lsMKZYXHxp/openapi.json
