{
  "openapi": "3.0.1",
  "info": {
    "title": "Wallapop Scraper & Monitor: New Listing, Price Drop Alerts",
    "description": "Wallapop scraper and monitor. Search by keyword or paste a Wallapop link, get every listing newest first, and have new listings and price drops posted to Discord, Slack or Telegram. You are billed only for listings you did not already have. No login, no API key.",
    "version": "1.0",
    "x-build-id": "XtG5I6FnxINBC1ey5"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/accountable_eel~wallapop-listing-lookup/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-accountable_eel-wallapop-listing-lookup",
        "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/accountable_eel~wallapop-listing-lookup/runs": {
      "post": {
        "operationId": "runs-sync-accountable_eel-wallapop-listing-lookup",
        "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/accountable_eel~wallapop-listing-lookup/run-sync": {
      "post": {
        "operationId": "run-sync-accountable_eel-wallapop-listing-lookup",
        "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": {
          "searches": {
            "title": "Keywords or Wallapop search links",
            "type": "array",
            "description": "One search per line: plain keywords (bicicleta, iphone 13) or a pasted Wallapop search link. A link's keywords, price range, category and area are used; any other link filter is named in ignoredSearchFilters. Results are always newest first. Accepted formats: bicicleta, iphone 13, https://es.wallapop.com/search?keywords=bicicleta&min_sale_price=100. You're only charged for the ones we actually find — a miss costs nothing.",
            "items": {
              "type": "string"
            }
          },
          "testRun": {
            "title": "Try it first — only process the first 5",
            "type": "boolean",
            "description": "Turn this on to test your input on a small sample before running the full list. Turn it off to process everything.",
            "default": false
          },
          "onlyFound": {
            "title": "Hide rows with no result",
            "type": "boolean",
            "description": "Only keep rows where something was actually found. Misses are always free, whether or not you show them here.",
            "default": false
          },
          "maxListingsPerSearch": {
            "title": "Most listings to return per search",
            "type": "integer",
            "description": "Wallapop returns 40 listings per page. Default 40, maximum 400 per search per run. You pay per listing returned, so this is also your budget control. With monitoring on, listings you already have do not count against it.",
            "default": 40
          },
          "minPrice": {
            "title": "Minimum price (euros)",
            "type": "integer",
            "description": "Optional. Sent to Wallapop as its own price filter, so listings below it are never fetched or billed."
          },
          "maxPrice": {
            "title": "Maximum price (euros)",
            "type": "integer",
            "description": "Optional. Sent to Wallapop as its own price filter."
          },
          "categoryId": {
            "title": "Category ID",
            "type": "integer",
            "description": "Optional. Wallapop's numeric category, for example 17000 for Bikes. Every returned listing carries its categoryId, so you can copy one from a first run. Sent to Wallapop, which only returns that category."
          },
          "latitude": {
            "title": "Area centre: latitude",
            "type": "number",
            "description": "Optional. With longitude and a distance, Wallapop returns only listings within that many kilometres. This is the right way to search one area: Wallapop's own newest-first search is country-wide otherwise. Madrid is 40.4168."
          },
          "longitude": {
            "title": "Area centre: longitude",
            "type": "number",
            "description": "Optional, used together with latitude. Madrid is -3.7038."
          },
          "distanceKm": {
            "title": "Area radius (km)",
            "type": "integer",
            "description": "Optional, needs latitude and longitude. Wallapop narrows the search to this distance."
          },
          "countries": {
            "title": "Only these countries",
            "type": "array",
            "description": "Optional. Two-letter codes, one per line: ES, IT, PT. Applied by the actor after Wallapop answers, before you are billed. Wallapop's search spans several countries and returns them mixed.",
            "items": {
              "type": "string"
            }
          },
          "cities": {
            "title": "Only these cities",
            "type": "array",
            "description": "Optional, one per line, accents and capitals ignored. Wallapop's newest-first search is country-wide, so the actor drops other cities after fetching and before billing. For a whole area it is faster to give latitude, longitude and a radius above.",
            "items": {
              "type": "string"
            }
          },
          "postalCodePrefixes": {
            "title": "Only these postal codes",
            "type": "array",
            "description": "Optional. A listing is kept when its postal code starts with one of these, for example 28 for Madrid province or 08 for Barcelona.",
            "items": {
              "type": "string"
            }
          },
          "excludeWords": {
            "title": "Skip listings containing these words",
            "type": "array",
            "description": "Optional, one per line. Checked against title and description, accents and capitals ignored. A listing dropped here is never remembered as seen and never billed.",
            "items": {
              "type": "string"
            }
          },
          "onlyNewSinceLastRun": {
            "title": "Only return listings that are new, or cheaper, since the last run",
            "type": "boolean",
            "description": "Turns a search into a watchlist. A listing is new when its Wallapop listing ID was not returned by a previous run of the same watchlist, and a price drop when its price fell by at least the percentage below since it was last seen. Unchanged listings are removed before you are billed, so a quiet run only costs the start fee and returns one summary row. Price drops are only seen on listings still near the top of the newest-first list. Schedule it every 10 minutes or hourly, and have each alert posted straight to Discord, Slack or Telegram with \"Send alerts to\" below.",
            "default": false
          },
          "deltaName": {
            "title": "Watchlist name (optional)",
            "type": "string",
            "description": "Leave empty and one is derived from this run's searches and filters, so two schedules with different filters keep separate memories. Type your own name to keep one memory across a filter change. Naming a watchlist with the checkbox above off returns every listing but still marks each one new / price-drop / seen.",
            "default": ""
          },
          "alertOnNew": {
            "title": "Alert on new listings",
            "type": "boolean",
            "description": "With monitoring on, return listings this watchlist has never seen before.",
            "default": true
          },
          "alertOnPriceDrop": {
            "title": "Alert on price drops",
            "type": "boolean",
            "description": "With monitoring on, return listings already seen whose price has dropped since the last sighting.",
            "default": true
          },
          "minPriceDropPct": {
            "title": "Minimum price drop to alert on (%)",
            "type": "integer",
            "description": "A listing must be at least this much cheaper than when it was last seen to count as a price drop.",
            "default": 5
          },
          "skipFirstRun": {
            "title": "Seed silently (no rows on the first run)",
            "type": "boolean",
            "description": "The first run of a watchlist has nothing to compare with. Turn this on to remember everything it finds without returning or billing it, so a webhook does not get a hundred messages on day one. Alerts start from the second run.",
            "default": false
          },
          "quietRunOutput": {
            "title": "What a quiet monitoring run writes to the dataset",
            "enum": [
              "summary",
              "none"
            ],
            "type": "string",
            "description": "A quiet run is a search with nothing new or cheaper since the last run. \"One summary row\" (the default) keeps the row with monitorStatus NO_CHANGES and listingCount 0. \"Nothing\" writes zero items, so a bot or integration reading the dataset never has to skip rows. A search that failed still returns its error row.",
            "default": "summary"
          },
          "notifyUrl": {
            "title": "Send alerts to (Discord or Slack webhook, Telegram bot link, or any URL)",
            "type": "string",
            "description": "Optional. After the listings are billed, each new and price-drop listing is posted here as one message: photo, title, price, place and link, with a NEW / PRICE DROP -X% badge. Discord or Slack: paste the channel's webhook URL. Telegram: https://api.telegram.org/bot<token>/sendMessage?chat_id=<chat id>. Any other URL receives JSON. Messages are free, and a message that fails never fails the run (the row's notifyErrors says why). Stored encrypted, never logged or written to the results. Alerts only go out with monitoring on."
          },
          "notifyFormat": {
            "title": "Message format",
            "enum": [
              "auto",
              "discord",
              "slack",
              "telegram",
              "json"
            ],
            "type": "string",
            "description": "Leave on \"Detect from the link\": discord.com links get Discord messages, hooks.slack.com Slack, api.telegram.org Telegram, anything else JSON. Pick one only to override that.",
            "default": "auto"
          },
          "maxNotificationsPerRun": {
            "title": "Most alert messages per run",
            "type": "integer",
            "description": "Up to 100. Above this, one \"+N more\" message says how many more listings are in the run's dataset, so a busy first run never floods the channel. 0 sends only that one summary message.",
            "default": 20
          },
          "includeDetails": {
            "title": "Fetch listing details (views, favourites, conversations, condition)",
            "type": "boolean",
            "description": "Off by default. When on, the actor opens each returned listing (up to 100 per search) for its view, favourite and conversation counts, condition and characteristics. Billed as a separate listing-details charge, only for listings whose details arrived. With monitoring on, only new and price-drop listings are opened.",
            "default": false
          },
          "columns": {
            "title": "Which columns do you want?",
            "type": "array",
            "description": "Choose which pieces of information to include in each result row. All are included by default.",
            "items": {
              "type": "string",
              "enum": [
                "searchQuery",
                "monitorStatus",
                "listingCount",
                "newCount",
                "priceDropCount",
                "url",
                "title",
                "price",
                "currency",
                "description",
                "category",
                "city",
                "postalCode",
                "region",
                "countryCode",
                "createdAt",
                "shippable",
                "imageUrl",
                "listingId",
                "sellerHash",
                "isNew",
                "changeType",
                "firstSeenAt"
              ],
              "enumTitles": [
                "Search",
                "Run status",
                "Listings returned",
                "New listings",
                "Price drops",
                "Listing link",
                "Title",
                "Price",
                "Currency",
                "Description",
                "Category",
                "City",
                "Postal code",
                "Region",
                "Country",
                "Listed",
                "Shipping available",
                "Photo",
                "Listing ID",
                "Seller (hashed)",
                "Is this listing new?",
                "Change",
                "First seen on a run"
              ]
            },
            "default": [
              "searchQuery",
              "monitorStatus",
              "listingCount",
              "newCount",
              "priceDropCount",
              "url",
              "title",
              "price",
              "currency",
              "description",
              "category",
              "city",
              "postalCode",
              "region",
              "countryCode",
              "createdAt",
              "shippable",
              "imageUrl",
              "listingId",
              "sellerHash",
              "isNew",
              "changeType",
              "firstSeenAt"
            ]
          },
          "expandRows": {
            "title": "One row per listing (recommended) — turn off for one row per search instead",
            "type": "boolean",
            "description": "When on, each listing found gets its own row instead of being grouped under its search. You're still only charged once per search, no matter how many rows it produces.",
            "default": true
          },
          "maxConcurrency": {
            "title": "Max concurrency",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "Parallel requests. Keep conservative — this target has no browser fallback, so getting blocked costs more than slow-and-steady.",
            "default": 2
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Apify Proxy configuration. The default (Apify datacenter proxy) is what this actor is built and tested on. Residential proxies are not needed.",
            "default": {
              "useApifyProxy": true
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}