OuedKniss Multi Scraper avatar

OuedKniss Multi Scraper

Pricing

from $0.50 / 1,000 results

Go to Apify Store
OuedKniss Multi Scraper

OuedKniss Multi Scraper

Scrape ouedkniss.com, Algeria's largest classifieds marketplace. Five modes cover every common workflow: search by keyword, browse a category, walk the full category menu, fetch a hand-picked list of listing URLs, or pull the sponsored-listing banner the site shows at the top of every page.

Pricing

from $0.50 / 1,000 results

Rating

0.0

(0)

Developer

Hamza Abbad

Hamza Abbad

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

3 hours ago

Last modified

Categories

Share

OuedKniss Multi-Scraper

Scrape ouedkniss.com — Algeria's largest classifieds marketplace — directly through the site's own API. Every record is a normalized Listing ready to feed straight into a spreadsheet, a database, or another Actor downstream.

What you can scrape

The Actor drives seven modes from a single What to scrape input. Pick the one that matches what you want.

ModeWhat it returnsBest for
search — Search by keywordUp to N listings matching a free-text query, paginated and optionally filteredMarket research, price tracking, lead lists
category — Browse a categoryAll listings in one category, paginated (same engine path as search)Browsing a niche (cars, phones, real estate…)
directUrls — Specific listing URLsA specific list of listing pages, fully enrichedResuming a previous run, following up on alerts
categories — Category menu (full tree)The full menu tree (top-level + recursive sub-trees)Building a category→id map, discovering wilaya IDs
topAnnounList — Sponsored listings (banner)The paid cross-listing banner — different response shape (store metadata only). Scope with Category page URL to get the category-specific banner instead of the site-wide one.Tracking which listings the site is promoting in a given category
seller — Seller listingsEvery listing one seller has published, paginated — works the same for business stores (/store/… URLs) and personal accounts (/membre/… URLs)Tracking a shop's inventory, monitoring a seller's listings, building seller histories
similar — Similar productsProducts algorithmically similar to each listing URL you provideDiscovering alternatives, competitive research

The topAnnounList mode produces banner rows. The categories mode produces category-tree rows. The seller mode produces organic-shaped listing rows. The similar mode produces organic-shaped listing rows tagged with attributes.slot = "similar". All modes share the same flat row shape; each mode populates only the fields it has data for (the others are null or empty).

The banner is heavily category-dependent. The top-30 banner entries for the cars category (/automobiles_vehicules) and real estate (/immobilier) share 0 items with each other, and only 2/30 overlap with the unfiltered cross-listing banner. Always pass a category URL to get a meaningful banner for a niche.

Why this Actor

  • Fast and lightweight. Direct API requests. Fast on cold start, gentle on memory, cheap to run at scale.
  • Flat, normalized output. Every record is a Listing with no nested objects (except the free-form specs map). Same shape every run, ready to feed into a spreadsheet, a database, or another Actor downstream.
  • Contact info that actually works. When Include real phone + email is on, the Actor fetches contact data in the one mode that carries it: Specific listing URLs reveals the real phone numbers and emails the site gates behind a click on each listing. The toggle does nothing in the other modes — search, category, categories, topAnnounList, and seller runs always produce empty phone/email arrays regardless.
  • You only ever paste URLs. Every reference field takes a full page URL, straight from the browser's address bar: a category page into Category page URL, a seller's store/profile page into Seller page URL, listing pages into Listing URLs. No IDs, no slugs, no values copied out of the address bar — and the Actor tells you exactly what it expected if a URL points at the wrong kind of page.

Quick start

  1. Open this Actor in Apify Console.

  2. Click Try actor and set at minimum:

    { "What to scrape": "Search by keyword", "searchQuery": "iphone" }
  3. Click Start. Results land in the Dataset tab, one JSON object per listing. If you ran Category menu, switch the dataset view to Category menu so the rows render meaningfully.

The smallest valid input runs a keyword search across the whole site, with sensible defaults for everything else.

Tutorial: a real workflow

1. Find a niche you care about

Pick a category. The easiest way to discover them is to first run the Actor in Category menu mode:

{ "What to scrape": "Category menu (full tree)", "maxDepth": 3 }

The dataset will contain one record per category node. Look at the Slug column of the leaf you want — for example automobiles_vehicules — and build the category page URL from it: https://www.ouedkniss.com/automobiles_vehicules/1.

2. Scrape that category, filtered

{
"What to scrape": "Browse a category",
"Category page URL": "https://www.ouedkniss.com/automobiles_vehicules/1",
"Filter by wilaya (region)": ["16"],
"Only listings with a price": true,
"Maximum results": 500,
"Maximum pages": 20
}

This walks up to 20 pages of the cars category, filtered to Algiers (16), skipping listings without a price. Roughly 960 listings.

3. Enrich a hand-picked set

Take the listing IDs you want from the previous dataset and re-run with Specific listing URLs + contact info on:

{
"What to scrape": "Specific listing URLs",
"Listing URLs": [
"https://www.ouedkniss.com/renault-clio-d57354225",
"https://www.ouedkniss.com/peugeot-208-d59321100"
],
"Include real phone + email": true
}

Each listing is returned fully enriched: real phone numbers (with WhatsApp / Viber / Telegram flags), real email, gallery images, seller profile URL. Switch the dataset view to Listing details to see all the enriched fields at once.

4. Check the sponsored banner

{ "What to scrape": "Sponsored listings (banner)", "Maximum results": 30 }

Returns whatever the site is currently promoting in the site-wide cross-listing banner. Banner rows carry store metadata and one image, so they don't get confused with organic rows if you ever union this dataset with another Actor's output.

To get the banner scoped to a specific category (which is what you usually want — the site-wide banner is a mix of every category), pass the category page URL:

{ "What to scrape": "Sponsored listings (banner)", "Category page URL": "https://www.ouedkniss.com/automobiles_vehicules/1", "Maximum results": 30 }

5. Track a seller's inventory

Pick any store page on the site (or from sellerProfileUrl on a listing row) and paste it into Seller:

{
"What to scrape": "Seller listings",
"Seller page URL": "https://www.ouedkniss.com/store/290/dyalkom/",
"Include real phone + email": true
}

You get the seller's full listing grid — every row is one of their listings. The exact same flow works for personal accounts: paste a /membre/… URL and each listing row comes back with the seller's name, username, and member-since date.

6. Find similar products

Found a listing you like? Paste its URL and find similar products — you can queue up several listings in one run:

{
"What to scrape": "Similar products",
"Listing URLs": [
"https://www.ouedkniss.com/renault-clio-d57354225",
"https://www.ouedkniss.com/peugeot-208-d59321100"
]
}

Each returned row is tagged with attributes.slot = "similar", and attributes.similarToId records which source listing produced it, so results from several URLs stay easy to group.

Input

Only What to scrape is required. All other fields have defaults. Every reference field takes a full page URL, pasted straight from the browser's address bar — the Actor rejects bare IDs and slugs with a message telling you exactly what to paste instead.

The Console form groups the inputs into three collapsible sections — Filters, Limits & performance, and Output & debugging — under the mode picker and its related fields.

What to scrape

FieldDescriptionDefault
What to scrapeSearch by keyword / Browse a category / Specific listing URLs / Category menu (full tree) / Sponsored listings (banner) / Seller listings / Similar products(required)
Search keywordSearch term, when What to scrape = "Search by keyword"
Category page URLThe category page URL, pasted from the address bar (e.g. https://www.ouedkniss.com/automobiles_vehicules/1). Meaning depends on What to scrape: the category to browse (Browse a category, required), the banner scope (Sponsored listings), or the sub-tree root (Category menu). Empty = site-wide banner / full tree walk. Ignored in the other modes.
Seller page URLThe seller to scrape, when What to scrape = "Seller listings". Paste a store page URL (https://www.ouedkniss.com/store/290/dyalkom/) or a member profile URL (https://www.ouedkniss.com/membre/13412324) — the URL decides which kind of seller it is.
Listing URLsOne or more listing page URLs (e.g. https://www.ouedkniss.com/renault-clio-d57354225), used by both modes that start from a listing page: Specific listing URLs (full detail data per URL) and Similar products (similar items per URL).
LanguageWhich language to fetch field values in (Arabic / French / English)French

Limits & performance

FieldDescriptionDefault
Maximum resultsMax listings to push. Applies in every mode. 0 = no cap200
Maximum pagesMax API requests that list results. 48 listings per page (24 for member-profile listing grids). 0 = no cap. Ignored in Category menu and Sponsored listings (those don't paginate).20
How deep to walk the menuMenu-tree walk depth (top level = 0), used by Category menu2
Requests per minuteRate limit per worker30
Proxy fallback attemptsHow many proxy IPs to try at the start of a run when the site blocks the actor's exit IP. The first IP that returns data is reused for the rest of the run. No effect locally.5

Output & debugging

FieldDescriptionDefault
Include real phone + emailAlso fetch contact info (a couple of extra API calls). Effective in Specific listing URLs mode only — per-listing phone/email the site gates behind a click. The other modes never fetch a surface that carries contact data, so the toggle does nothing there.false
Skip duplicate listingsSkip listings already pushed earlier in this runtrue
Debug: include raw API responseAdd a raw field with the original API response to each recordfalse

Filters

Search by keyword, Browse a category and Seller listings (store grids) can be narrowed with a flat set of Filter by… inputs, grouped in their own form section. All are optional; the other modes ignore them.

FieldDescriptionDefault
Filter by wilaya (region)Wilaya (province) IDs. Discover them by running Category menu first
Filter by commune (city)Commune IDs. More granular than wilaya
Minimum price (DZD)Min price in DZD (inclusive). Leave empty for no lower bound
Maximum price (DZD)Max price in DZD (inclusive). Leave empty for no upper bound
Only listings with photosOnly listings with at least one photofalse
Only listings with a priceOnly listings with a numeric price (excludes 'contact for price')false
Only listings that accept trade-inOnly listings where the seller accepts trade-infalse
Only listings with deliveryOnly listings where the seller offers deliveryfalse
Filter by seller typeAny (default), Individual sellers only, or Stores only. Map to the site's own enum; other values are rejected by the server.Any
Sort byMost recently bumped or Most recently posted. Price-sort is not supported by the public APIMost recently bumped
Items per pageItems per page, max 4848

Output

One JSON object per listing, in the Dataset tab. Every field is a scalar or a list of scalars — no nested objects (except the free-form specs map) — so the dataset table view shows clean values instead of "N fields" badges.

The dataset has three views that you can switch between from the view tabs at the top of the table:

  • Listings — card projection (title, price, location, category, timestamps). The default. Use this for any mode except Category menu.
  • Category menu — category-tree projection (category name, slug, parent breadcrumb, depth, rank). Use this for Category menu runs; the Listings view shows only id + scrapedAt for those rows.
  • Listing details — full detail-page projection (adds description, seller info, contact info, gallery count, specs). Use this for Specific listing URLs runs with Include real phone + email on.

Organic row

search / category / directUrls runs produce rows like this:

{
"id": "57354225",
"url": "https://www.ouedkniss.com/renault-clio-d57354225",
"title": "Renault Clio 2019 essence",
"description": "Clio IV intens, full options, premier propriétaire…",
"condition": "used",
"priceAmount": 1850000,
"priceNegotiable": true,
"categoryPath": "Véhicules › Automobiles › Renault",
"categoryId": "2487",
"wilayaCode": "16",
"wilayaName": "Alger",
"commune": "Hydra",
"street": null,
"sellerId": "13412324",
"sellerName": "Moon Lite",
"sellerUsername": "moonlite",
"sellerType": "individual",
"sellerProfileUrl": "https://www.ouedkniss.com/membre/13412324",
"sellerMemberSince": null,
"sellerPhoneNumbers": ["0555000000"],
"sellerPhoneIntls": ["+213555000000"],
"sellerPhoneWhatsapps": [true],
"sellerPhoneVibers": [false],
"sellerPhoneTelegrams": [false],
"sellerEmails": ["moon@example.com"],
"storeId": null,
"storeName": null,
"storeImageUrl": null,
"storeProfileUrl": null,
"likeCount": null,
"images": ["https://cdn.ouedkniss.com/…/01.jpg", "https://cdn.ouedkniss.com/…/02.jpg"],
"primaryImageUrl": "https://cdn.ouedkniss.com/…/01.jpg",
"video": null,
"postedAt": "2025-12-01T10:23:00.000Z",
"lastBumpedAt": "2026-01-14T08:11:00.000Z",
"scrapedAt": "2026-08-25T19:30:00.000Z",
"attributes": { "Kilométrage": "80 000 km", "Carburant": "Essence" }
}

Sponsored listings (banner) runs produce rows with the banner's store metadata — the banner API doesn't return description, location, category, or specs:

{
"id": "57403311",
"url": "https://www.ouedkniss.com/…-d57403311",
"title": "MACBOOK AIR M4 16/256Gb",
"description": null,
"condition": "unspecified",
"priceAmount": 138000,
"priceNegotiable": false,
"categoryPath": "",
"categoryId": null,
"wilayaCode": null,
"wilayaName": null,
"commune": null,
"street": null,
"sellerId": null,
"sellerName": null,
"sellerUsername": null,
"sellerType": "unspecified",
"sellerProfileUrl": null,
"sellerPhoneNumbers": [],
"sellerPhoneIntls": [],
"sellerPhoneWhatsapps": [],
"sellerPhoneVibers": [],
"sellerPhoneTelegrams": [],
"sellerEmails": [],
"storeId": "8832",
"storeName": "TRETEC informatique",
"storeImageUrl": "https://cdn.ouedkniss.com/…",
"storeProfileUrl": "https://www.ouedkniss.com/store/8832/",
"likeCount": 12,
"images": ["https://cdn.ouedkniss.com/…/01.jpg"],
"primaryImageUrl": "https://cdn.ouedkniss.com/…/01.jpg",
"video": null,
"postedAt": null,
"lastBumpedAt": null,
"scrapedAt": "2026-08-25T19:30:00.000Z",
"attributes": {}
}

Seller listings rows

Seller listings runs return the seller's listings only — one flat row per listing, identical in shape to every other organic row. For a personal account (/membre/… URL), each row also carries the seller's name, username, and member-since date, taken from the profile the run resolves. There is no seller-identity row of its own: if a store's name or URL matters downstream, it is already on the company's listings — or run Specific listing URLs on one of them for the full seller block.

Category-menu row

Category menu (full tree) runs produce rows like this (one per category node in the walk):

{
"id": "606",
"categoryName": "Voitures",
"categorySlug": "automobiles-voitures",
"categoryIcon": "car.png",
"categoryDelivery": true,
"categoryRank": 1,
"categoryDepth": 1,
"parentTreeIds": "21",
"parentTreeNames": "Automobiles & Véhicules",
"parentTreeSlugs": "automobiles_vehicules",
"scrapedAt": "2026-08-29T09:00:00.000Z"
}

Field-by-field

  • priceAmount — numeric price in Algerian Dinar. null or priceNegotiable: true means "contact for price".
  • categoryPath — breadcrumb from root to leaf, parts joined with . The last segment is the leaf category. Empty for sponsored-listing rows.
  • categoryId — site-side ID of the leaf category (the last segment of categoryPath). Useful for joining with the dataset produced by Category menu (where it appears as the row id).
  • primaryImageUrl — first image URL (scalar copy of images[0]). Surfaces as a thumbnail in the dataset table; the images array renders as an "N items" badge, so the thumbnail needs its own field.
  • wilayaCode — 58-wilaya code from Algeria's 2019 administrative reorganization. null for sponsored-listing rows.
  • sellerPhoneNumbers, sellerPhoneIntls, sellerPhoneWhatsapps, sellerPhoneVibers, sellerPhoneTelegrams — parallel arrays; index N refers to the Nth phone. Empty unless Include real phone + email is on and the run is Specific listing URLs mode (per-listing contact). Always empty for sponsored-listing rows.
  • sellerEmails — empty unless Include real phone + email is on and the run is Specific listing URLs mode (same surface as the phone arrays). Always empty for sponsored-listing rows.
  • sellerMemberSince — when the seller account was created, ISO-8601 (assumed UTC). Populated on Seller listings rows for member accounts; null everywhere else (store pages don't expose an account-creation date).
  • storeId / storeName / storeImageUrl / storeProfileUrl — populated only for sponsored-listing rows. The store's profile URL is built from the store ID (the banner API doesn't expose the store slug).
  • likeCount — populated only for sponsored-listing rows.
  • attributes — the one nested field. Free-form key/value for category-specific specs (mileage, fuel type, …) on listing rows. Similar-product rows carry slot: "similar" plus similarToId (the source listing's ID). Empty for sponsored-listing and category-tree rows.
  • categoryName / categorySlug / categoryIcon / categoryDelivery / categoryRank / categoryDepth — populated only for rows from Category menu.
  • parentTreeIds / parentTreeNames / parentTreeSlugs — breadcrumb from the root to (excluding) the current category-tree node, parts joined with . Empty for non-category rows and for root-level nodes.

Notes and limits

  • Needs Apify Proxy. OuedKniss blocks the default datacenter IP range, so the Apify account running this Actor needs at least one proxy group enabled. Without one, runs appear to succeed but push zero records.
  • No phone numbers or emails unless Include real phone + email is on AND What to scrape is Specific listing URLs. By default sellerPhoneNumbers and sellerEmails are empty arrays in every mode. Individual sellers' contact info is gated behind the site's click-to-reveal endpoints, which only the direct-URL mode triggers — member profiles expose no contact info anywhere on the web (the site directs buyers to its mobile app). Seller listings, search, category, categories, and Similar products never fetch a surface that carries contact data. The Actor prints a warning at startup if the toggle is enabled in a mode where it does nothing.
  • Sponsored-listings mode is opt-in via What to scrape = "Sponsored listings (banner)". Use it when you specifically want the paid cross-listing banner; the response shape is much sparser than organic listings (only title, price, store metadata, one image).
  • No price-sort. OuedKniss's public API only supports Most recently bumped and Most recently posted orderings.

FAQ

Can I scrape all of OuedKniss? Technically yes, but please don't. Use Category menu first to discover what you actually need, then narrow with Filter by…. Set Maximum pages and Maximum results to keep the run bounded.

Does this Actor store cookies or login sessions? No. Every run is anonymous.

How do I find a seller's URL? Open the store or seller page on ouedkniss.com and copy the URL from the address bar — https://www.ouedkniss.com/store/290/dyalkom/ for stores, https://www.ouedkniss.com/membre/13412324 for personal sellers. Paste the whole URL into the Seller input; the Actor extracts the ID and detects the seller type. On listing rows, the seller's profile URL is in sellerProfileUrl.

My run hit Maximum results early. Why? Either the dataset already contains those listing IDs (dedupe is on by default) or the site returned fewer unique results than expected. Try raising Maximum results and Maximum pages, or turning Skip duplicate listings off to see raw counts.

Contact

Bug reports, feature requests, or a custom scraper for a marketplace not yet covered? Open an issue on the Actor's Apify Console page or message the maintainer directly there.