{
  "openapi": "3.0.1",
  "info": {
    "title": "Vinted Scraper: New Listing & Price Drop Alerts",
    "description": "Vinted scraper for 22 countries: up to 2,000 listings per search, past the 96-per-page cap. Monitoring returns new listings, price drops and gone ones, a Vinted sold items tracker with sell-through rate and cross country price gap in euros. Brand, size, condition, link. No login. Pay per listing.",
    "version": "1.0",
    "x-build-id": "JzMWmLzBhsLhiweIz"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/accountable_eel~vinted-listing-lookup/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-accountable_eel-vinted-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~vinted-listing-lookup/runs": {
      "post": {
        "operationId": "runs-sync-accountable_eel-vinted-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~vinted-listing-lookup/run-sync": {
      "post": {
        "operationId": "run-sync-accountable_eel-vinted-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",
        "required": [
          "searches"
        ],
        "properties": {
          "searches": {
            "title": "Vinted searches (keywords or pasted Vinted search links)",
            "type": "array",
            "description": "One search per line: plain keywords such as \"carhartt jacket\", or a search link copied from your browser on any Vinted country site (its own filters such as brand, size and category are kept). Keywords run once in every country you pick below; a pasted link runs on its own country site. No login required. Accepted formats: carhartt, levis 501, https://www.vinted.fr/catalog?search_text=stone%20island&order=newest_first. You're only charged for the ones we actually find — a miss costs nothing.",
            "items": {
              "type": "string"
            }
          },
          "countries": {
            "title": "Vinted countries to search",
            "type": "array",
            "description": "One country code per line. Keywords run once in each: fr, de, it, es, nl, be, at, pl, cz, sk, lt, lu, pt, uk, ie, se, fi, dk, hu, ro, hr, gr. Prices come back in each site's own currency plus a euro conversion. Ignored for pasted Vinted links, which use their own country. Leave empty for France.",
            "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
          },
          "includeKeywords": {
            "title": "Only keep rows containing",
            "type": "array",
            "description": "Optional. Only keep results that mention at least one of these words (e.g. a job title, a city, a product name). Leave empty to keep everything.",
            "items": {
              "type": "string"
            }
          },
          "excludeKeywords": {
            "title": "Skip rows containing",
            "type": "array",
            "description": "Optional. Drop any result that mentions one of these words. Leave empty to skip nothing.",
            "items": {
              "type": "string"
            }
          },
          "maxResults": {
            "title": "Stop after this many results",
            "minimum": 1,
            "type": "integer",
            "description": "Optional. Stop the run once this many results have been found — useful for a quick, cheap sample. Leave blank for no limit."
          },
          "sort": {
            "title": "Sort order",
            "enum": [
              "newest",
              "relevance"
            ],
            "type": "string",
            "description": "Forced to newest first whenever monitoring is on, so every run compares the same ordering. Collecting more than 960 listings per search also needs newest first.",
            "default": "newest"
          },
          "maxListingsPerSearch": {
            "title": "Most listings to return per search, per country",
            "type": "integer",
            "description": "Vinted shows 96 listings per page and stops any single search at 960. Above 960 (up to 2,000) this actor splits the search into price bands and merges them newest first. You pay per listing returned, so this is also your budget control.",
            "default": 96
          },
          "minPrice": {
            "title": "Minimum price (each country's own currency)",
            "type": "integer",
            "description": "Optional. Sent to Vinted as its own price filter, on the item price before the buyer protection fee. On a multi-country run it applies in each site's currency (euros on vinted.fr, zloty on vinted.pl)."
          },
          "maxPrice": {
            "title": "Maximum price (each country's own currency)",
            "type": "integer",
            "description": "Optional. Sent to Vinted as its own price filter, on the item price before the buyer protection fee. Leave empty for no maximum."
          },
          "sellerType": {
            "title": "Seller type",
            "enum": [
              "any",
              "private",
              "business"
            ],
            "type": "string",
            "description": "Keep only private or only business sellers. Applied while paging, so the actor keeps reading pages (up to Vinted's 960) until it has enough matching listings.",
            "default": "any"
          },
          "deltaMode": {
            "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 Vinted 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. Turn on \"Alert on gone listings\" below to also get listings that disappeared (a sold signal). Every row then carries the watchlist's sell-through rate and the search's median euro price. Unchanged listings are removed before you are billed, so a quiet run only costs the start fee and returns one summary row. Schedule it hourly and send the results to Discord, Slack, Telegram, Google Sheets or n8n.",
            "default": false
          },
          "deltaName": {
            "title": "Watchlist name (optional)",
            "type": "string",
            "description": "Leave empty and one is derived from this run's price and seller 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. The drop is measured on the item price, not the total with the fee.",
            "default": true
          },
          "alertOnGone": {
            "title": "Alert on gone listings (sold signal)",
            "type": "boolean",
            "description": "Off by default. With monitoring on, also return listings this watchlist saw on its previous run that have since disappeared from the part of the search the run covered: delisted, most often sold, sometimes withdrawn. Vinted never confirms a sale. gonePresumedSold is true when the last price was at or under the search's median and the listing was seen on at least 2 runs in a row. Billed as ordinary listing rows, no extra request.",
            "default": false
          },
          "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
          },
          "includeDetails": {
            "title": "Fetch listing details (description, colour, upload time, seller rating)",
            "type": "boolean",
            "description": "Off by default. When on, the actor opens each returned listing's page for its description (emails and phone numbers removed), colour, upload time, reserved flag and the seller's rating and review count. 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
          },
          "includeAllPhotos": {
            "title": "Include every photo link",
            "type": "boolean",
            "description": "Off by default: you get the main photo only, because Vinted photos often show the seller wearing the item. When on, imageUrls lists the photo links; all photos need listing details turned on (search results carry only the main photo). Links only, nothing is downloaded.",
            "default": false
          },
          "includeSellerInfo": {
            "title": "Include the raw Vinted seller ID",
            "type": "boolean",
            "description": "Off by default. Every row already carries an anonymous seller hash, so you can group listings by seller without knowing who they are. Turning this on adds Vinted's own numeric seller ID (sellerId); you then need a lawful reason to process it. No names are ever returned.",
            "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",
                "searchCountries",
                "listingCount",
                "totalAvailable",
                "truncated",
                "newCount",
                "priceDropCount",
                "monitorStatus",
                "goneCount",
                "sellThroughRate",
                "medianPriceEur",
                "listings",
                "listingId",
                "title",
                "price",
                "totalPrice",
                "currency",
                "priceEur",
                "countryMedianPriceEur",
                "priceGapPct",
                "brand",
                "size",
                "condition",
                "country",
                "favouriteCount",
                "isPromoted",
                "sellerType",
                "sellerHash",
                "imageUrl",
                "url",
                "isNew",
                "changeType",
                "firstSeenAt",
                "lastSeenAt",
                "daysListed",
                "description",
                "color",
                "postedText",
                "postedAt",
                "sellerRating",
                "sellerReviewCount",
                "isReserved"
              ],
              "enumTitles": [
                "Search",
                "Countries searched",
                "Listings returned",
                "Matching on Vinted (960 = 960 or more per country)",
                "Stopped short (960 cap or a block)",
                "New since last run",
                "Price drops since last run",
                "Monitoring status",
                "Gone since last run (delisted, most often sold)",
                "Sell-through rate, watchlist lifetime (0-1)",
                "Median price of the search, EUR",
                "All listings found (full list)",
                "Vinted listing ID",
                "Title",
                "Price (local currency)",
                "Price incl. buyer protection fee",
                "Currency",
                "Price in EUR (ECB daily rate)",
                "Median price in this country, EUR",
                "Cross-country price gap % (vs median of all countries)",
                "Brand",
                "Size",
                "Condition",
                "Vinted country",
                "Favourites",
                "Promoted listing",
                "Seller type (private / business)",
                "Anonymous seller ID",
                "Main photo",
                "Listing link",
                "Is this listing new?",
                "Change (new / price-drop / gone / seen)",
                "First seen on a run",
                "Last seen on a run",
                "Days listed (first to last seen)",
                "Description (with details)",
                "Colour (with details)",
                "Uploaded (as Vinted words it, with details)",
                "Uploaded at, approximate (with details)",
                "Seller rating out of 5 (with details)",
                "Seller review count (with details)",
                "Reserved (with details)"
              ]
            },
            "default": [
              "searchQuery",
              "searchCountries",
              "listingCount",
              "totalAvailable",
              "truncated",
              "newCount",
              "priceDropCount",
              "monitorStatus",
              "goneCount",
              "sellThroughRate",
              "medianPriceEur",
              "listings",
              "listingId",
              "title",
              "price",
              "totalPrice",
              "currency",
              "priceEur",
              "countryMedianPriceEur",
              "priceGapPct",
              "brand",
              "size",
              "condition",
              "country",
              "favouriteCount",
              "isPromoted",
              "sellerType",
              "sellerHash",
              "imageUrl",
              "url",
              "isNew",
              "changeType",
              "firstSeenAt",
              "lastSeenAt",
              "daysListed",
              "description",
              "color",
              "postedText",
              "postedAt",
              "sellerRating",
              "sellerReviewCount",
              "isReserved"
            ]
          },
          "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
          },
          "residentialFallback": {
            "title": "Retry refused pages on a residential connection",
            "type": "boolean",
            "description": "On by default. Vinted sometimes refuses Apify's shared datacenter connections on a country site (seen on vinted.de). The actor first retries on fresh datacenter connections, then on a residential one, for that page only. It costs you nothing extra: you still pay per listing returned. Turn it off to never use residential connections.",
            "default": true
          },
          "maxConcurrency": {
            "title": "Max concurrency",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "Parallel requests. Keep conservative — this target has no browser fallback, so getting blocked costs more than slow-and-steady.",
            "default": 3
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Apify Proxy config. Residential recommended for anti-bot-sensitive targets.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}