{
  "openapi": "3.0.1",
  "info": {
    "title": "OuedKniss Multi-Scraper (ouedkniss.com)",
    "description": "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.",
    "version": "0.0",
    "x-build-id": "1QN7g07nyqMutL3Qy"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/hamza325~ouedkniss-multi-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-hamza325-ouedkniss-multi-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/hamza325~ouedkniss-multi-scraper/runs": {
      "post": {
        "operationId": "runs-sync-hamza325-ouedkniss-multi-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/hamza325~ouedkniss-multi-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-hamza325-ouedkniss-multi-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "pageUrl": {
            "title": "URL",
            "type": "string",
            "description": "Any ouedkniss.com page URL, pasted straight from the browser's address bar. The Actor detects what the link points at and runs the matching task: a search or category page (`https://www.ouedkniss.com/s/1?c=automobiles-voitures&keywords=t-roc`, `https://www.ouedkniss.com/automobiles_vehicules/1?keywords=t-roc`, `https://www.ouedkniss.com/t-roc-r/1`) runs that search with every filter the link carries — category, keywords, wilaya, price, seller type, sorting, and the category's own spec filters like brand or year; a seller page (a `/store/…` or `/membre/…` URL) scrapes that seller's listings; a listing page (`…-d{id}`) scrapes that listing with full detail data. The run starts at the page stated in a results URL and paginates forward. To scrape several listings at once, use the Listing URLs field in the legacy section below."
          },
          "maxItems": {
            "title": "Maximum results",
            "minimum": 0,
            "type": "integer",
            "description": "Stop after pushing this many listings. Applies in every mode. 0 = no cap.",
            "default": 200
          },
          "maxPages": {
            "title": "Maximum pages",
            "minimum": 0,
            "type": "integer",
            "description": "Stop after this many API requests that list results. One page = one request (48 items per page for search/category, 24 for the member-profile listing grid). Use 0 for no cap. Ignored in **Category menu** (`categories`) and **Sponsored listings** (`topAnnounList`) (those don't paginate).",
            "default": 20
          },
          "maxDepth": {
            "title": "How deep to walk the menu",
            "minimum": 0,
            "maximum": 10,
            "type": "integer",
            "description": "Used only by **Category menu** (`categories`) to limit how deep the category tree is walked. Top level = 0. Default 2 keeps the run bounded — recursive walks grow quickly. Raise it to discover deeper branches (OuedKniss's full tree goes ~5 levels, but each extra level multiplies the number of API calls).",
            "default": 2
          },
          "maxRequestsPerMinute": {
            "title": "Requests per minute",
            "minimum": 1,
            "type": "integer",
            "description": "Requests per minute. The polite default keeps the site happy long-term — higher values make blocking more likely, not runs faster.",
            "default": 30
          },
          "proxyMaxAttempts": {
            "title": "Proxy fallback attempts",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "How many 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. Default 5. Has no effect when running locally.",
            "default": 5
          },
          "locale": {
            "title": "Language",
            "enum": [
              "ar",
              "fr",
              "en"
            ],
            "type": "string",
            "description": "Which language to fetch field values in. Defaults to French (most listings).",
            "default": "fr"
          },
          "includeContactInfo": {
            "title": "Include real phone + email",
            "type": "boolean",
            "description": "If true, the Actor also retrieves contact info. In **Specific listing URLs** (`directUrls`) it reveals the actual phone number and email that the site hides behind a click on each listing. In every other mode it has no effect — those runs never fetch a surface that carries contact data — and the phone/email arrays stay empty. The Actor prints a warning at startup if this is enabled in a mode where it does nothing.",
            "default": false
          },
          "dedupe": {
            "title": "Skip duplicate listings",
            "type": "boolean",
            "description": "Skip listings whose ID has already been pushed in this run. Duplicates are dropped at the request-queue level too, so re-running the same Actor with the same settings is idempotent.",
            "default": true
          },
          "debugIncludeRaw": {
            "title": "Debug: include raw source record",
            "type": "boolean",
            "description": "Add a `raw` field with the original source record to each row",
            "default": false
          },
          "startMode": {
            "title": "What to scrape",
            "enum": [
              "auto",
              "search",
              "category",
              "directUrls",
              "categories",
              "topAnnounList",
              "seller",
              "similar"
            ],
            "type": "string",
            "description": "Task selector, grouped under \"Legacy inputs (advanced)\". The default `auto` detects the task from the pasted URL: a search or category page runs the search, a seller page scrapes that seller's listings, a listing page scrapes that listing. Surfaces a URL can't express are selected here explicitly: `search` (plain keyword search), `category` (browse one category), `directUrls` (full detail for hand-picked listing URLs), `categories` (category-menu walk), `topAnnounList` (the sponsored banner), `seller` (a seller's listings), `similar` (similar to a listing). Keep `auto` unless you need one of those.",
            "default": "auto"
          },
          "searchQuery": {
            "title": "Search keyword",
            "type": "string",
            "description": "Legacy input, hidden from the form. Plain keyword search with no filters. Prefer the URL field: perform the search on the site with the filters you want and paste the link."
          },
          "categoryUrl": {
            "title": "Category page URL",
            "type": "string",
            "description": "The category page URL for **Browse a category** (`category`), the sub-tree root for **Category menu** (`categories`) and the banner scope for **Sponsored listings** (`topAnnounList`). Keywords and URL filters on a pasted category link are applied. A pasted link alone (URL field) covers category browsing automatically."
          },
          "sellerUrl": {
            "title": "Seller page URL",
            "type": "string",
            "description": "Legacy input, hidden from the form. The seller page URL for **Seller listings** (`seller`) — a store URL (`https://www.ouedkniss.com/store/290/dyalkom/`) or a member profile URL (`https://www.ouedkniss.com/membre/13412324`). A pasted link alone (URL field) covers this automatically."
          },
          "startUrls": {
            "title": "Listing URLs",
            "type": "array",
            "description": "Legacy input, hidden from the form. Several listing page URLs at once (e.g. `https://www.ouedkniss.com/renault-clio-d57354225`), for **Specific listing URLs** (`directUrls`, full detail data per URL) and **Similar products** (`similar`). For a single listing, the URL field above is enough.",
            "items": {
              "type": "string"
            }
          },
          "filterRegionIds": {
            "title": "Filter by wilaya (region)",
            "type": "array",
            "description": "Legacy input, hidden from the form. Filter **Search by keyword** (`search`), **Browse a category** (`category`) and **Seller listings** (`seller`, store grids) by wilaya (province) IDs. Discover them by running **Category menu** (`categories`) first. Leave empty to skip. A pasted results URL (URL field) carries these filters for you.",
            "items": {
              "type": "string"
            }
          },
          "filterCityIds": {
            "title": "Filter by commune (city)",
            "type": "array",
            "description": "Legacy filter field. Hidden from the input form — a **Search URL** (`searchUrl`) carries these filters for you. Still accepted for existing integrations: filter by commune IDs (more granular than wilaya). Leave empty to skip. Ignored when **Search URL** (`searchUrl`) is set.",
            "items": {
              "type": "string"
            }
          },
          "filterPriceMin": {
            "title": "Minimum price (DZD)",
            "minimum": 0,
            "type": "integer",
            "description": "Legacy filter field. Hidden from the input form — a **Search URL** (`searchUrl`) carries these filters for you. Still accepted: lower price bound in DZD, inclusive. Leave empty for no lower bound. Ignored when **Search URL** (`searchUrl`) is set."
          },
          "filterPriceMax": {
            "title": "Maximum price (DZD)",
            "minimum": 0,
            "type": "integer",
            "description": "Legacy filter field. Hidden from the input form — a **Search URL** (`searchUrl`) carries these filters for you. Still accepted: upper price bound in DZD, inclusive. Leave empty for no upper bound. Ignored when **Search URL** (`searchUrl`) is set."
          },
          "filterHasPictures": {
            "title": "Only listings with photos",
            "type": "boolean",
            "description": "Legacy filter field. Hidden from the input form — a **Search URL** (`searchUrl`) carries these filters for you. Still accepted: only return listings that include at least one photo. Ignored when **Search URL** (`searchUrl`) is set.",
            "default": false
          },
          "filterHasPrice": {
            "title": "Only listings with a price",
            "type": "boolean",
            "description": "Legacy filter field. Hidden from the input form — a **Search URL** (`searchUrl`) carries these filters for you. Still accepted: only return listings with a numeric price (excludes 'contact for price'). Ignored when **Search URL** (`searchUrl`) is set.",
            "default": false
          },
          "filterExchange": {
            "title": "Only listings that accept trade-in",
            "type": "boolean",
            "description": "Legacy filter field. Hidden from the input form — a **Search URL** (`searchUrl`) carries these filters for you. Still accepted: only return listings where the seller accepts trade-in. Ignored when **Search URL** (`searchUrl`) is set.",
            "default": false
          },
          "filterDelivery": {
            "title": "Only listings with delivery",
            "type": "boolean",
            "description": "Legacy filter field. Hidden from the input form — a **Search URL** (`searchUrl`) carries these filters for you. Still accepted: only return listings where the seller offers delivery. Ignored when **Search URL** (`searchUrl`) is set.",
            "default": false
          },
          "filterOrigin": {
            "title": "Filter by seller type",
            "enum": [
              "",
              "INDIVIDUAL",
              "STORE"
            ],
            "type": "string",
            "description": "Legacy filter field. Hidden from the input form — a **Search URL** (`searchUrl`) carries these filters for you. Still accepted: restrict results by whether the seller is a person (`INDIVIDUAL`) or a business (`STORE`). Empty string (default) returns both. Ignored when **Search URL** (`searchUrl`) is set. Values: `INDIVIDUAL` for personal sellers, `STORE` for stores, empty string for no filter.",
            "default": ""
          },
          "filterOrderByField": {
            "title": "Sort by",
            "enum": [
              "REFRESHED_AT",
              "CREATED_AT"
            ],
            "type": "string",
            "description": "Legacy filter field. Hidden from the input form — a **Search URL** (`searchUrl`) carries the sorting for you. Still accepted: sort order applied to search/category results (`REFRESHED_AT` = most recently bumped, `CREATED_AT` = most recently posted). Ignored when **Search URL** (`searchUrl`) is set. Values: `REFRESHED_AT` (most recently bumped) or `CREATED_AT` (most recently posted).",
            "default": "REFRESHED_AT"
          },
          "filterCount": {
            "title": "Items per page",
            "minimum": 1,
            "maximum": 48,
            "type": "integer",
            "description": "Legacy filter field. Hidden from the input form. Still accepted: number of items per page (max 48). Ignored when **Search URL** (`searchUrl`) is set.",
            "default": 48
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}