{
  "openapi": "3.0.1",
  "info": {
    "title": "2dehands & 2ememain – Belgium Classifieds & Seller Reviews",
    "description": "Scrape classifieds from 2dehands.be and 2ememain.be by keyword, filters, or URLs. Returns title, price, location, images, seller details, category, and full tag-based seller reviews. Supports sort, category, price filters, listing URLs, and search URLs.",
    "version": "1.0",
    "x-build-id": "GmihzPUrqQXp8191P"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/abotapi~2dehands-2ememain-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-abotapi-2dehands-2ememain-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/abotapi~2dehands-2ememain-scraper/runs": {
      "post": {
        "operationId": "runs-sync-abotapi-2dehands-2ememain-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/abotapi~2dehands-2ememain-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-abotapi-2dehands-2ememain-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",
        "required": [
          "mode"
        ],
        "properties": {
          "mode": {
            "title": "1. Mode",
            "enum": [
              "search",
              "url"
            ],
            "type": "string",
            "description": "search = build a search from a keyword plus filters. url = paste one or more listing or search URLs and walk them forward.",
            "default": "search"
          },
          "queries": {
            "title": "Search keywords",
            "type": "array",
            "description": "Product keywords such as \"bmw\", \"iphone\", or \"fiets\". Each line runs a separate search.",
            "items": {
              "type": "string"
            }
          },
          "searchQuery": {
            "title": "Search keyword (alias)",
            "type": "string",
            "description": "Single-keyword alias of Search keywords; both are combined."
          },
          "searchQueries": {
            "title": "Search keywords (alias list)",
            "type": "array",
            "description": "Alias of Search keywords; both are combined.",
            "items": {
              "type": "string"
            }
          },
          "listingIds": {
            "title": "Exact listing IDs",
            "type": "array",
            "description": "Fetch these exact listings (for example m2427421626) instead of searching. When filled, the keyword and filter fields are ignored. Accepts the bare id or a listing URL.",
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "Listing or search URLs",
            "type": "array",
            "description": "One or more URLs (url mode). Supported: keyword search (/q/bmw/), paginated search (/p/2/ or ?currentPage=2), hash filters and sort (#sortBy:SORT_INDEX|sortOrder:DECREASING|offeredSince:Today|PriceCentsFrom:5000|PriceCentsTo:20000|currentPage:3), category pages (/l/auto-s/, /l/auto-s/q/bmw/, /l/auto-s/bmw/), listing pages (/v/...), seller profiles (/u/name/id/), on 2dehands.be or 2ememain.be, and /lrp/api/search links. Other links (mobile host, bare /v/<id>) are skipped with a warning. Filters above apply to search links except postcode, condition and delivery, which do not apply to seller-profile or listing links; pagination starts at the page implied by the URL and walks forward.",
            "default": [
              "https://www.2dehands.be/q/bmw/",
              "https://www.2ememain.be/q/iphone/",
              "https://www.2dehands.be/q/bmw/p/2/",
              "https://www.2dehands.be/q/bmw/?sortBy=SORT_INDEX&sortOrder=DECREASING&priceFrom=100&priceTo=5000",
              "https://www.2dehands.be/q/bmw/p/2/?sortBy=SORT_INDEX&sortOrder=DECREASING",
              "https://www.2dehands.be/q/bmw/#Language:all-languages|sortBy:SORT_INDEX|sortOrder:DECREASING|offeredSince:Today",
              "https://www.2dehands.be/l/auto-s/",
              "https://www.2dehands.be/l/auto-s/p/2/",
              "https://www.2dehands.be/l/auto-s/q/bmw/",
              "https://www.2dehands.be/l/auto-s/bmw/",
              "https://www.2dehands.be/v/auto-s/bmw/m2453646187-bmw-118i",
              "https://www.2ememain.be/v/velos-velomoteurs/velos-hommes-velos-de-sport-velo-de-randonnee/m2461083552-velo-electrique-bergamont-e-revox-4",
              "https://2dehands.be/q/volvo/",
              "https://www.2dehands.be/u/geert-baart/57629670/",
              "https://www.2dehands.be/lrp/api/search?query=fiets&limit=3&offset=0"
            ],
            "items": {
              "type": "string"
            }
          },
          "domain": {
            "title": "Site",
            "enum": [
              "2dehands.be",
              "2ememain.be"
            ],
            "type": "string",
            "description": "Which Belgian site to search. Both share the same catalogue and API.",
            "default": "2dehands.be"
          },
          "minPrice": {
            "title": "Minimum price (EUR)",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only listings priced at or above this amount (applied to the listing price). Leave at 0 to keep all. Narrows results.",
            "default": 0
          },
          "maxPrice": {
            "title": "Maximum price (EUR)",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only listings priced at or below this amount. Leave at 0 for no upper bound. Narrows results.",
            "default": 0
          },
          "priceMinEur": {
            "title": "Minimum price in EUR (alias)",
            "minimum": 0,
            "type": "integer",
            "description": "Alias of Minimum price; Minimum price wins when both are set."
          },
          "priceMaxEur": {
            "title": "Maximum price in EUR (alias)",
            "minimum": 0,
            "type": "integer",
            "description": "Alias of Maximum price; Maximum price wins when both are set."
          },
          "sort": {
            "title": "Sort results",
            "enum": [
              "optimized",
              "date_desc",
              "date_asc",
              "price_asc",
              "price_desc"
            ],
            "type": "string",
            "description": "Order the results by relevance, newest, oldest, or price.",
            "default": "optimized"
          },
          "sortBy": {
            "title": "Sort (alias)",
            "enum": [
              "date",
              "price_asc",
              "price_desc",
              "relevance"
            ],
            "type": "string",
            "description": "Alias of Sort: date = newest first, relevance = best match. When set it wins over Sort."
          },
          "categoryId": {
            "title": "Category ID (optional)",
            "minimum": 0,
            "type": "integer",
            "description": "Restrict the search to a top-level category by its numeric id. Leave at 0 to search all categories.",
            "default": 0
          },
          "postcode": {
            "title": "Belgian postcode",
            "type": "string",
            "description": "4-digit postcode (for example 2000). Keeps only listings within the radius below. An invalid postcode stops the run instead of silently returning unfiltered results."
          },
          "radiusKm": {
            "title": "Radius around the postcode (km)",
            "minimum": 1,
            "maximum": 300,
            "type": "integer",
            "description": "1 to 300 km, only used together with a postcode. Defaults to 25 km when empty."
          },
          "conditions": {
            "title": "Item condition",
            "type": "array",
            "description": "Keep only listings in any of these conditions. Empty keeps all. Not every category offers every condition.",
            "items": {
              "type": "string",
              "enum": [
                "new",
                "as-new",
                "used",
                "refurbished",
                "not-working"
              ],
              "enumTitles": [
                "New",
                "As good as new",
                "Used",
                "Refurbished",
                "Not working"
              ]
            }
          },
          "delivery": {
            "title": "Delivery",
            "enum": [
              "any",
              "pickup",
              "shipping"
            ],
            "type": "string",
            "description": "any, pickup (Ophalen) or shipping (Verzenden; includes listings offering both).",
            "default": "any"
          },
          "buyItNowOnly": {
            "title": "Fixed-price listings only",
            "type": "boolean",
            "description": "Drop bidding, swap and on-request listings and keep only listings with a fixed price. Dropped rows are never charged.",
            "default": false
          },
          "postedAfter": {
            "title": "Posted on or after",
            "type": "string",
            "description": "YYYY-MM-DD (or an ISO timestamp, date part used). The site only publishes the posting day, so the window is day-precise (Europe/Brussels). Listings whose date cannot be read are kept."
          },
          "postedBefore": {
            "title": "Posted on or before",
            "type": "string",
            "description": "YYYY-MM-DD (or an ISO timestamp, date part used). Day-precise like Posted on or after."
          },
          "fetchDetails": {
            "title": "Fetch full listing details",
            "type": "boolean",
            "description": "Open each listing page to add view/favorite counts, full category, seller type and profile, item attributes, shipping, bidding, and the seller's tag-based reviews. Adds requests per listing (billed as a detail-enrichment surcharge). Turn off to collect only the search-card fields.",
            "default": false
          },
          "scrapeDetails": {
            "title": "Fetch details (alias)",
            "type": "boolean",
            "description": "Alias of Fetch details; either one switches it on.",
            "default": false
          },
          "includeReviews": {
            "title": "Include seller reviews",
            "type": "boolean",
            "description": "When details are on, capture the seller's full tag-based reviews (score, positive/negative characteristic tags, reviewed item, reviewer, date) plus a rating summary. Only fetched for sellers that have reviews.",
            "default": true
          },
          "maxReviews": {
            "title": "Max reviews per listing",
            "minimum": 1,
            "maximum": 200,
            "type": "integer",
            "description": "Cap on the number of individual reviews captured per listing's seller.",
            "default": 20
          },
          "maxItems": {
            "title": "Max listings (the run cap)",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "Global cap on the number of listings to return across all searches. This is THE cap - Max pages defaults to unlimited and stops at this number. 0 means unlimited (clamped to 1000).",
            "default": 20
          },
          "maxPages": {
            "title": "Max pages per search",
            "minimum": 1,
            "type": "integer",
            "description": "Per-search page limit (30 listings per page). Leave empty for the built-in hard cap of 200 pages per search; the run stops at Max listings first."
          },
          "proxy": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Apify Residential proxy set to country BE is recommended for the highest reliability, since both sites are Belgian. Some datacenter exit IPs may be geo-restricted.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ],
              "apifyProxyCountry": "BE"
            }
          },
          "proxyConfiguration": {
            "title": "Proxy configuration (alias)",
            "type": "object",
            "description": "Alias of Proxy; when set it wins over Proxy."
          },
          "resumeFromRunId": {
            "title": "Resume from a previous run",
            "type": "string",
            "description": "Paste a previous run ID or dataset ID to continue a large pull without returning or charging for listings already collected there. Use this after an interrupted run, or to keep extending one walk-all pull across separate runs. For recurring daily monitoring of the same search, use Incremental mode below instead."
          },
          "incrementalMode": {
            "title": "Incremental changes for scheduled runs",
            "type": "boolean",
            "description": "Turn this on for daily or recurring monitoring. The first run returns all matching listings as NEW. Later runs normally return only NEW, UPDATED, and REAPPEARED listings. Turn on \"Emit unchanged\" or \"Emit expired\" only when you also want those listings returned (and billed). State is kept separately per mode + search/URL/filter configuration; use State key when you want to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a previous run above.",
            "default": false
          },
          "stateKey": {
            "title": "State key (optional, incremental mode only)",
            "type": "string",
            "description": "Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key automatically from the mode + search/filter settings — different searches then never mix state with each other."
          },
          "emitUnchanged": {
            "title": "Emit unchanged listings (incremental mode only)",
            "type": "boolean",
            "description": "Off by default. Turn on to also return listings that have not changed since the last run, marked UNCHANGED. This returns — and bills — extra rows you already have, so leave it off unless you specifically want the full snapshot every run.",
            "default": false
          },
          "emitExpired": {
            "title": "Emit expired listings (incremental mode only)",
            "type": "boolean",
            "description": "Off by default. Turn on to also return listings that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search — not when Max listings capped it or when Resume was used. This returns — and bills — extra synthetic rows, so leave it off unless you need expiry tracking.",
            "default": false
          },
          "onlyNewListings": {
            "title": "Only listings not seen before",
            "type": "boolean",
            "description": "Emit only listings this search has not shown before (remembered between runs). Rows skipped as already seen are never pushed or charged. Uses the same remembered state as Incremental mode.",
            "default": false
          },
          "resetState": {
            "title": "Forget remembered listings first",
            "type": "boolean",
            "description": "Clears the remembered state for this search before the run (only with Incremental mode or Only listings not seen before).",
            "default": false
          },
          "ignoreFieldsForChanges": {
            "title": "Ignore fields when detecting changes (incremental mode only)",
            "type": "array",
            "description": "Incremental mode only. Field names (or dotted paths such as seller.name) that should NOT make a listing count as UPDATED when only they change. They stay in the output. View, favourite and bid counters are always ignored already.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "mcpConnectors": {
            "title": "Pipe results into your apps (optional)",
            "type": "array",
            "description": "Optionally send a condensed summary of each result into the apps you already use, via Model Context Protocol (MCP) connectors. The full record stays in the dataset. Leave empty to skip. Supported: Notion, Linear, Airtable, Apify."
          },
          "notionParentPageUrl": {
            "title": "Notion parent page (Notion connector only)",
            "type": "string",
            "description": "URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors."
          },
          "maxNotifyListings": {
            "title": "Max items to export per connector",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Cap on items written to each connector per run. Does not affect the dataset.",
            "default": 50
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}