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

The whole Jumia catalogue of a country through its sitemaps: hundreds of thousands of products with price, discount, stock, brand, seller and specs. Incremental mode reopens only what changed, so a daily refresh takes minutes not hours. Example: Morocco, 1,000 products, then schedule it.

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

## Pricing

from $1.00 / 1,000 results

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?

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

![Jumia All Products Scraper](https://api.apify.com/v2/key-value-stores/paDGjcmD1ZMsRJLZS/records/jumia-all-banner.png?signature=ku7qRiqUvODZfrZXWygV)

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

Countries: Morocco · Côte d'Ivoire · Senegal · Nigeria · Kenya · Egypt · Ghana · Uganda

### Why this Actor

- **Complete catalog**, not a keyword sample: it reads Jumia's official product sitemaps, up to roughly 1.1 million products for Kenya.
- **Rich product data**: price, old price, discount %, currency, stock, rating, review count, categories and breadcrumbs, badges, Jumia Express, seller name and score, images, specifications.
- **Price tracking**: previous price, change in value and percent, new products and stock changes, remembered from one run to the next.
- **Ethical by design**: identified bot, Jumia's `robots.txt` respected, speed limited, no fake browser identity and no proxy needed — which also makes runs cheap and stable.

### What you can do with it

- **Mirror a whole market**: up to roughly 1.1 million products for a single country, in one dataset.
- **Run price intelligence**: previous price, change in value and percent, on every product, every run.
- **Fill a product database**: SKU, brand, categories, images, specifications and seller for each item.
- **Catch stock movements**: back-in-stock and new-product flags, with optional e-mail alerts.
- **Compare countries**: the same brand's pricing in Morocco, Nigeria and Kenya side by side.

### Four ways to read a catalog

A million-product catalog does not have to be read the same way every day. Pick the mode that matches what you need:

| Mode | What it does | Measured |
|---|---|---|
| **Full crawl** | Opens every product page for complete data | the default |
| **Incremental** | Jumia dates each product in its sitemap; only what changed since your last run is reopened | a daily refresh becomes minutes instead of hours |
| **URL index** (`listUrlsOnly`) | Lists every product URL with its modification date, without opening a single page | **300 URLs in 10 seconds for $0.002** |
| **Sampling** (`sampleEveryNth`) | Keeps one product out of N, to study a huge catalog cheaply | 10 products sampled across 310,000 in 18 seconds |

#### Searching a brand without reading the whole catalog

Product URLs on Jumia contain the product name, so usually the brand. With **Brand contains** set to `samsung`, the Actor skips every page whose address does not carry the word. Measured on the Moroccan catalog: **23 Samsung products found in 4 minutes**, where the same search without the URL pre-filter scanned 400 pages in 8 minutes and found none.

Switch **Search keywords in the URL first** off if you would rather open every page — slower, but it catches products whose address omits the brand.

### How it works

1. The Actor downloads Jumia's public sitemaps for the countries you selected.
2. Each product page is read and parsed from its structured data, not from fragile CSS classes.
3. Prices are compared with the previous run, stored in a named key-value store that survives runs.
4. Filters are applied before saving, so you only pay for rows you asked for.

### Step-by-step tutorial

1. Pick one or more **Countries**.
2. Set **Max products per country** — `0` means the whole catalog. Start with `1000` to see the shape of the data.
3. Optionally add **Filters**: price range, minimum discount, in stock only, category keywords, name keywords, excluded words.
4. Optionally switch on **Reviews** or **E-mail alerts**.
5. Press **Start**, then export as Excel, CSV or JSON.

#### Daily price monitoring

Switch on *Only changed products* and *E-mail alerts*, then create an Apify **Schedule** (for example every day at 08:00). Keep the same *Max products* value on every run so comparisons stay meaningful.

### Input example

```json
{
  "countries": ["ma", "ng"],
  "maxItems": 1000,
  "minDiscountPercent": 20,
  "onlyInStock": true,
  "brandKeywords": ["samsung"],
  "onlyUpdatedSinceLastRun": true,
  "trackPriceChanges": true,
  "includeReviews": false
}
```

A daily price watch on one brand, in two countries, reading only what moved since yesterday.

### Output example

![Sample output](https://api.apify.com/v2/key-value-stores/paDGjcmD1ZMsRJLZS/records/jumia-all-output.png?signature=1mCI80LaC2CQhQbompBAS)

Every row as JSON:

```json
{
  "sku": "AP009MP15D0X4NAFAMZ",
  "name": "Apple iPhone 17 Pro 256GB Silver",
  "url": "https://www.jumia.ma/apple-iphone-17-pro-256gb-silver-67917496.html",
  "price": 15499,
  "oldPrice": 19999,
  "discountPercent": 23,
  "currency": "MAD",
  "inStock": true,
  "rating": 4.6,
  "reviewsCount": 212,
  "seller": { "name": "Jumia", "score": "92%" },
  "categories": ["Phones & Tablets", "Smartphones"],
  "previousPrice": 15999,
  "priceChangePercent": -3.1
}
```

### Pricing

Pay per product returned, shown on the Actor's pricing tab. Proxy and compute are included — nothing else to pay. Because the Actor reads sitemaps and needs no proxy, it is one of the cheapest ways to watch a large catalog: a 1,000-product run finishes in a couple of minutes.

### FAQ

**How do I refresh a big catalog every day without paying for it twice?** Switch on **Incremental resume**. The first run reads everything and remembers the newest date Jumia published; the next runs only reopen products that changed.

**I set a brand filter and got nothing.** *Max products per country* caps the pages the Actor opens, not the rows it saves. With a narrow filter and a small cap, everything can be filtered out. Raise the cap, or keep the URL pre-filter on so the budget is spent only on matching products.

**Can I just get the list of products without the details?** Yes — **List URLs only**. You get every product URL with its modification date, for a fraction of a cent per thousand. Useful to size a catalog, or to detect new products before deciding what to open.

**Can I get the whole catalog?** Yes — set *Max products per country* to `0`. Expect a long run and a large dataset; start smaller to size it first.

**Does it need a proxy?** No. Jumia allows identified crawlers on product pages, and the Actor stays under the rate limit.

**How does price tracking work?** Each product's last price is stored under its SKU in a named key-value store. On the next run, the Actor fills `previousPrice`, `priceChange` and `priceChangePercent`, and can e-mail you only what moved.

**Why did an e-mail alert not arrive?** Actors started from Apify Store run with limited permissions and cannot send mail on your behalf. Copy the Actor into your account and switch it to full permissions, or connect a Slack, webhook or Zapier integration; the changed products are always in the dataset regardless.

**Do you collect customer names?** No. Reviews are returned without the reviewer's name.

### Integrations

- **Schedules**: a nightly catalog refresh, with *Only changed products* to keep datasets small.
- **API**: JSON, CSV or Excel exports, or a direct pull into your warehouse.
- **Webhooks**: fire your pipeline the moment the catalog is refreshed.
- **No-code tools**: Google Sheets, Slack, Zapier and Make from the Integrations tab.

### Support

Open an issue on the Actor's **Issues** tab for bugs, missing fields or a new country.

**Did this Actor do the job?** Leaving a short review on its Store page takes a minute and helps other people find it — and tells me which feature to build next.

### Legal

This Actor reads **public** product pages and sitemaps, follows Jumia's `robots.txt`, identifies itself honestly in its user agent, 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

Extrait **tout le catalogue Jumia** dans 8 pays africains : prix, promotions, stock, notes, vendeurs, catégories, images, caractéristiques et avis clients. L'Actor lit les sitemaps officiels de Jumia, respecte son `robots.txt`, se présente sous une identité de robot honnête et limite sa vitesse — d'où un coût faible et des runs stables. Il mémorise les prix d'un run à l'autre et peut n'envoyer que ce qui a changé, avec alertes e-mail. Filtres : prix, remise minimum, en stock, mots-clés de catégorie ou de nom, exclusions.

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

## `onlyUpdatedSinceLastRun` (type: `boolean`):

Jumia date chaque produit dans son sitemap. Activé, l'Actor ne rouvre que les fiches modifiées depuis le run précédent : un rafraîchissement quotidien devient quelques minutes au lieu de plusieurs heures. Le premier run parcourt tout et retient la date de référence.

## `updatedSince` (type: `string`):

Date au format 2026-09-01 pour ne relire que ce que Jumia a retouché depuis. Prioritaire sur la reprise incrémentale.

## `listUrlsOnly` (type: `boolean`):

Produit un index du catalogue — URL, date de modification, pays — sans charger une seule page produit. C'est la façon la moins chère de mesurer la taille d'un catalogue ou de surveiller les nouveautés.

## `sampleEveryNth` (type: `integer`):

10 signifie un produit sur dix. Pour étudier un catalogue de plusieurs centaines de milliers de références sans tout lire.

## `brandKeywords` (type: `array`):

Ne garder que les produits dont la marque contient un de ces mots (ex. samsung, apple).

## `prefilterByUrl` (type: `boolean`):

L'adresse d'un produit Jumia contient son nom, donc le plus souvent sa marque. Activé, l'Actor n'ouvre que les fiches dont l'adresse contient un de vos mots-clés de marque ou de nom : la recherche devient cent fois plus rapide. Désactivez-le si vous préférez ouvrir chaque fiche au risque d'un run très long.

## `sellerKeywords` (type: `array`):

Ne garder que les produits vendus par un vendeur dont le nom contient un de ces mots (ex. jumia, official store).

## `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 changements à l'adresse e-mail de votre compte Apify. ⚠ Limite d'Apify : un Actor lancé depuis l'Apify Store tourne en « Limited permissions » et n'a pas le droit d'envoyer d'e-mails — l'envoi échouera et le run le dira dans son journal. Les changements restent de toute façon dans les résultats (champs priceChange, priceChangePercent, stockChanged, isNewProduct). Pour vraiment recevoir les e-mails, copiez cet Actor dans votre compte et passez-le en permissions complètes, ou branchez une intégration Apify (Slack, webhook, Zapier).

## `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,
  "onlyUpdatedSinceLastRun": false,
  "listUrlsOnly": false,
  "sampleEveryNth": 1,
  "prefilterByUrl": true,
  "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-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-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-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-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/w6SSOxZqhuqhNOGK7/openapi.json
