OuedKniss Multi-Scraper (ouedkniss.com) avatar

OuedKniss Multi-Scraper (ouedkniss.com)

Pricing

from $0.50 / 1,000 results

Go to Apify Store
OuedKniss Multi-Scraper (ouedkniss.com)

OuedKniss Multi-Scraper (ouedkniss.com)

Scrape ouedkniss.com — Algeria's largest classifieds marketplace. Paste a search, category, store or listing URL: get title, price in DZD, condition, wilaya, category, seller contacts and photos.

Pricing

from $0.50 / 1,000 results

Rating

0.0

(0)

Developer

Hamza Abbad

Hamza Abbad

Maintained by Community

Actor stats

0

Bookmarked

13

Total users

4

Monthly active users

15 hours ago

Last modified

Security

Limited permissions

Share

OuedKniss Multi-Scraper

Scrape OuedKniss — Algeria's largest classifieds marketplace. Every record is a normalized Listing ready to feed straight into a spreadsheet, a database, or another Actor downstream.

What you can scrape

Paste any ouedkniss.com page URL into URL (pageUrl) and the Actor detects what the link points at and runs the matching task:

URL you pasteWhat runs
A search page (https://www.ouedkniss.com/s/1?c=automobiles-voitures&keywords=t-roc)That search — with every filter the link carries: category, keywords, wilaya, price, seller type, sorting, and the category's own spec filters (brand, year, mileage…)
A category page opened from the icons (https://www.ouedkniss.com/automobiles_vehicules/1?keywords=t-roc) or a keyword permalink (https://www.ouedkniss.com/t-roc-r/1)Same search behavior — category and keywords read from the link
A seller page (https://www.ouedkniss.com/store/290/dyalkom/ or https://www.ouedkniss.com/membre/13412324)Seller listings — every listing that seller has published, paginated; each row carries the seller's name, username and (for personal accounts) member-since date
A listing page (https://www.ouedkniss.com/renault-clio-d57354225)Specific listing URLs — that listing with the full detail data: description, gallery, specs, contact info when enabled

A few tasks can't be expressed by a pasted URL, so they stay available through the legacy What to scrape (startMode) input in the collapsible Legacy inputs (advanced) section: the Category menu walk (categories), the Sponsored listings banner (topAnnounList), Similar products (similar), and the explicit mode selection for old integrations.

Banner rows (topAnnounList) and category-tree rows (categories) have their own dataset views. All other modes produce the same flat organic 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 light. Quick 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 (includeContactInfo) is on and the run scrapes listing detail pages, the Actor fetches the real phone numbers and emails the site gates behind a click on each listing. Search/category/seller/banner runs never fetch a surface that carries contact data, so the toggle warns at startup there.
  • One URL decides everything. Run a search on ouedkniss.com with all the filters you want, copy the address bar link, paste it in — the Actor detects the task and applies everything the link carries. No IDs, no slugs, no per-filter fields to fill in — and the Actor tells you exactly what it expected if a URL points at the wrong kind of page.

Where it goes beyond a search feed

A search scraper stops at the results page. This Actor also reads the four surfaces the site only exposes one page deeper:

SurfaceWhat a run gives youWhat it is for
Seller pages — a store (/store/290/dyalkom/) or a member (/membre/13412324)every listing that seller has published, paginated, with sellerName, sellerUsername and, for personal accounts, the member-since datefollow a dealer's stock, or a competitor's pricing, over time
Similar listings (similar)the competing offers the site pairs with one adprice a listing against its actual rivals instead of a category average
Category menu (categories)the whole category tree — 780+ nodes with slug, depth, icon and parent chainfind the exact category slug for a query, or map the marketplace
Sponsored banner (topAnnounList)the promoted slots at the top of one category (30 per category, heavily category-dependent)see what sellers pay to promote, per niche
Listing detailgallery, per-category spec sheet, description and — with includeContactInfo — the real phone numbers and emails behind the site's clickprice research and lead generation

Search and category runs give you the feed; these give you the seller, the competition, the taxonomy and the contacts behind it.

Quick start

  1. Open the site in your browser, type what you're looking for, tick the filters you want (category, wilaya, price, anything in the category's own filter panel), then copy the address bar link.

  2. Click Try actor and paste that link into URL (pageUrl) — the minimum valid input is:

    { "pageUrl": "https://www.ouedkniss.com/s/1?c=automobiles-voitures&keywords=t-roc" }
  3. Click Start. Results land in the Dataset tab, one JSON object per listing. If you ran Category menu (categories), switch the dataset view to Category menu so the rows render meaningfully.

The same one-field input works for a seller's inventory ("pageUrl": "https://www.ouedkniss.com/store/290/dyalkom/"), a single listing in full detail ("pageUrl": "https://www.ouedkniss.com/renault-clio-d57354225"), and a plain keyword search ("pageUrl": "https://www.ouedkniss.com/s/1?keywords=iphone").

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 (categories):

{ "startMode": "categories", "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 it, filtered — right from the browser

Now do it the one-field way: browse to that category on the site, tick Algiers, minimum price, whatever the filter panel offers, and copy the final URL into URL (pageUrl):

{ "pageUrl": "https://www.ouedkniss.com/s/1?c=automobiles-voitures&keywords=t-roc&regionIds=16&priceRangeMin=1000000" }

The Actor reads the whole link: category (c=… or a path like /automobiles_vehicules/1), keywords (keywords=…), wilayas (regionIds=…), communes (cityIds=…), price range (priceRangeMin/priceRangeMax), photos/price flags, trade-in and delivery, seller type, sorting — plus the category's own spec filters as loose params (e.g. marque-voiture=renault, annee=2020-2024, kilometrage=0-50000). Every results-page shape the site produces is accepted: the filter-panel search page (/s/1?c=…&keywords=…), a category opened from the icons (/automobiles_vehicules/1?keywords=…), or a keyword permalink (/t-roc-r/1). The run starts at the page stated in the URL and paginates forward; caps still apply.

The same link also drives the older structured fields if you prefer them: Browse a category (category) takes the category page URL (keywords and URL filters ride along), and a plain Search keyword (searchQuery) still runs an unfiltered keyword search.

3. Enrich a hand-picked set

Paste a single listing into URL (pageUrl) — or several listings into the legacy Listing URLs (startUrls) field — with contact info on:

{
"startUrls": [
"https://www.ouedkniss.com/renault-clio-d57354225",
"https://www.ouedkniss.com/peugeot-208-d59321100"
],
"includeContactInfo": 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

The banner isn't reachable from a pasted URL alone — set the mode explicitly in the Legacy inputs (advanced) section:

{ "startMode": "topAnnounList", "maxItems": 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:

{ "startMode": "topAnnounList", "categoryUrl": "https://www.ouedkniss.com/automobiles_vehicules/1", "maxItems": 30 }

The banner also picks up the keywords of a pasted search: give topAnnounList a search URL and the banner narrows to promoted listings matching those keywords, e.g. a pageUrl of https://www.ouedkniss.com/automobiles_vehicules/1?keywords=t-roc returns the T-Roc placements. That's the same scoping the site's own banner applies; the deeper search filters (wilaya, price, …) don't narrow the banner — the site doesn't scope it by them either.

5. Track a seller's inventory

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

{ "pageUrl": "https://www.ouedkniss.com/store/290/dyalkom/" }

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

Similar products can't be told apart from a plain listing URL, so it keeps the explicit mode. Found a listing you like? Queue it up:

{
"startMode": "similar",
"startUrls": [
"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

URL (pageUrl) is the one input a run needs; everything else has defaults. The Console form shows it on its own, followed by two collapsible sections — Limits & performance and Output & debugging — plus a collapsible Legacy inputs (advanced) section with the explicit per-task controls from earlier versions. New runs don't need them; JSON/API callers use the key names, the Console form shows the Label names.

Main input

Label (key)DescriptionDefault
URL (pageUrl)Any ouedkniss.com page URL, pasted from the address bar. The Actor detects the task from it: search/category page → that search (all URL filters applied), seller page → that seller's listings, listing page → that listing in full detail.—

Limits & performance

Label (key)DescriptionDefault
Maximum results (maxItems)Max listings to push. Applies in every task. 0 = no cap200
Maximum pages (maxPages)Max listing pages per run. 48 listings per page (24 for member-profile listing grids). 0 = no cap. Ignored in Category menu (categories) and Sponsored listings (topAnnounList) (those don't paginate).20
How deep to walk the menu (maxDepth)Menu-tree walk depth (top level = 0), used by the Category menu task2
Requests per minute (maxRequestsPerMinute)Requests per minute. The polite default keeps the site happy long-term — higher values make blocking more likely, not runs faster.30
Proxy fallback attempts (proxyMaxAttempts)Datacenter proxy addresses to try before falling back to residential proxies (capped at 3). The first address that returns data is kept for the rest of the run. Has no effect on local runs.5

Output & debugging

Label (key)DescriptionDefault
Language (locale)Which language to fetch field values in (Arabic (ar) / French (fr) / English (en))fr
Include real phone + email (includeContactInfo)Also fetch contact info (a couple of extra page loads). Effective in listing-detail runs only (a pasted listing URL, or several via the legacy Listing URLs field) — per-listing phone/email the site gates behind a click. Search/category/seller/banner runs never fetch a surface that carries contact data, so the toggle warns at startup there.false
Skip duplicate listings (dedupe)Skip listings already pushed earlier in this runtrue
Debug: include raw source record (debugIncludeRaw)Add a raw field with the original source record to each rowfalse

Legacy inputs (advanced)

Grouped under the collapsible Legacy inputs (advanced) section. New runs only need the URL field above; these stay for old integrations and for the tasks a pasted URL can't express.

Label (key)DescriptionDefault
What to scrape (startMode)auto (default) detects the task from the pasted URL. Explicit values for everything a URL can't express: search / category / directUrls / categories / topAnnounList / seller / similar.auto
Search keyword (searchQuery)Plain keyword search with no filters. Prefer the URL field.—
Category page URL (categoryUrl)The category page URL for Browse a category (category), the sub-tree root for Category menu (categories), the banner scope for Sponsored listings (topAnnounList) — keywords on that URL scope the banner. Keywords and URL filters on a pasted category link are applied.—
Seller page URL (sellerUrl)The seller to scrape in Seller listings (seller) — a store URL or a member profile URL; the URL decides which kind of seller it is.—
Listing URLs (startUrls)Several listing page URLs at once, for Specific listing URLs (directUrls) and Similar products (similar). For a single listing the URL field is enough.—
Filter by wilaya (region) (filterRegionIds)Wilaya (province) IDs. Discover them by running Category menu (categories) first—
Filter by commune (city) (filterCityIds)Commune IDs. More granular than wilaya—
Minimum price (DZD) (filterPriceMin)Min price in DZD (inclusive). Leave empty for no lower bound—
Maximum price (DZD) (filterPriceMax)Max price in DZD (inclusive). Leave empty for no upper bound—
Only listings with photos (filterHasPictures)Only listings with at least one photofalse
Only listings with a price (filterHasPrice)Only listings with a numeric price (excludes 'contact for price')false
Only listings that accept trade-in (filterExchange)Only listings where the seller accepts trade-infalse
Only listings with delivery (filterDelivery)Only listings where the seller offers deliveryfalse
Filter by seller type (filterOrigin)INDIVIDUAL for personal sellers, STORE for stores, empty string (default) for both. Other values are rejected by the server.""
Sort by (filterOrderByField)Most recently bumped (REFRESHED_AT) or Most recently posted (CREATED_AT). Sorting by price is not offeredREFRESHED_AT
Items per page (filterCount)Items 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 categories.
  • Category menu — category-tree projection (category name, slug, parent breadcrumb, depth, rank). Use this for categories 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 (directUrls) runs with Include real phone + email (includeContactInfo) 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 slot doesn't carry 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 (seller) 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 (directUrls) 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 (categories) (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 (includeContactInfo) is on and the run is Specific listing URLs (directUrls) (per-listing contact). Always empty for sponsored-listing rows.
  • sellerEmails — empty unless Include real phone + email (includeContactInfo) is on and the run is Specific listing URLs (directUrls) (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 slot doesn't carry 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 (categories).
  • 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

  • Works when the site pushes back. If OuedKniss blocks a run, the Actor switches route on its own and keeps going; the fallback route is billed by data volume on your Apify account (a typical run uses a few megabytes). If nothing gets through, the run fails at startup with the cause instead of pushing an empty dataset.
  • No phone numbers or emails unless Include real phone + email (includeContactInfo) is on AND the run scrapes listing detail pages (a pasted listing URL, or several via the legacy Listing URLs field). By default sellerPhoneNumbers and sellerEmails are empty arrays in every other task. The site hides individual sellers' contact details behind a click on the listing page — only runs that open listing detail pages can collect them. Member profiles expose no contact info anywhere on the site (the site directs buyers to its mobile app). Seller, search, category, banner and similar runs never touch a page that carries contact data. The Actor prints a warning at startup if the toggle is enabled in a run where it does nothing.
  • The sponsored banner is opt-in via the legacy What to scrape input (startMode: "topAnnounList"). Use it when you specifically want the paid cross-listing banner; banner rows carry much less data than regular listings (only title, price, store metadata, one image). The banner narrows by category and keywords of the scoped URL — that is all the site itself scopes it by.
  • No price-sort. OuedKniss only offers Most recently bumped and Most recently posted orderings.

FAQ

Can I scrape all of OuedKniss? Technically yes, but please don't. Use the Category menu task (startMode: "categories") first to discover what you actually need, then narrow with a pasted URL (pageUrl). Set Maximum pages (maxPages) and Maximum results (maxItems) to keep the run bounded.

How do I search with filters? Perform the search on ouedkniss.com — category, keywords, wilaya, price, whatever the filter panel offers — and copy the address bar link into URL (pageUrl). The link carries the whole search.

The URL I pasted starts a few pages into the results. Which page will get scraped? The run starts at the page stated in the pasted URL and paginates forward. If you get results from mid-list, go back to page 1 in the browser and copy the link again.

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 URL (pageUrl); 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 site not yet covered? Open an issue on the Actor's Apify Console page or message the maintainer directly there.