{
  "openapi": "3.0.1",
  "info": {
    "title": "Vinted Scraper — Listings, Demand Signals & Sold Tracking",
    "description": "Scrape Vinted across every EU market: price, brand, size, condition, favourites, listing age, seller country and all photos. Works on vinted.be, .nl, .de, .it and .es, not just .fr. Watch mode re-checks known listings so you can see which ones sold. No login, no proxy.",
    "version": "0.1",
    "x-build-id": "AsD5mkRPXBBlIHFZT"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/studio-amba~vinted-scraper-v2/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-studio-amba-vinted-scraper-v2",
        "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/studio-amba~vinted-scraper-v2/runs": {
      "post": {
        "operationId": "runs-sync-studio-amba-vinted-scraper-v2",
        "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/studio-amba~vinted-scraper-v2/run-sync": {
      "post": {
        "operationId": "run-sync-studio-amba-vinted-scraper-v2",
        "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": {
          "mode": {
            "title": "Mode",
            "enum": [
              "index",
              "full",
              "watch"
            ],
            "type": "string",
            "description": "index = fast listing scrape from Vinted's search API (default). full = the same, plus one item-page fetch per listing for description, colour, material and reserved status. watch = re-check a fixed set of listings and report which are still live and which have vanished.",
            "default": "index"
          },
          "searchQueries": {
            "title": "Search Queries",
            "type": "array",
            "description": "One or more search terms. Each is paged separately and the Max Items budget is split evenly between them.",
            "default": [
              "nike"
            ],
            "items": {
              "type": "string"
            }
          },
          "searchQuery": {
            "title": "Search Query (single)",
            "type": "string",
            "description": "Convenience alternative to Search Queries when you only want one term."
          },
          "market": {
            "title": "Market",
            "enum": [
              "be",
              "fr",
              "nl",
              "de",
              "it",
              "es",
              "pt",
              "at",
              "lu",
              "pl",
              "cz",
              "sk",
              "lt",
              "hu",
              "ro",
              "se",
              "fi",
              "dk",
              "gr",
              "ie",
              "hr",
              "uk",
              "us"
            ],
            "type": "string",
            "description": "Which Vinted domain to read. IMPORTANT: fr, be, nl, de, it and es all serve THE SAME euro catalogue — the market only changes the language of the condition text, the currency and the link host, not which items exist. uk (GBP) and pl (PLN) are genuinely separate catalogues.",
            "default": "be"
          },
          "maxItems": {
            "title": "Max Items",
            "minimum": 1,
            "maximum": 100000,
            "type": "integer",
            "description": "Stop after this many records. Note Vinted caps ANY single search at 960 results (96 per page, 10 pages max). To go deeper, split the search into price bands with Price From / Price To, or add more queries.",
            "default": 100
          },
          "startUrls": {
            "title": "Vinted URLs",
            "type": "array",
            "description": "Paste Vinted catalogue or search URLs and their filters are reused verbatim, so you can build a search in the browser and hand it over. Individual /items/ URLs are treated as listings to watch and only used in watch mode.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "order": {
            "title": "Sort Order",
            "enum": [
              "relevance",
              "newest_first",
              "price_low_to_high",
              "price_high_to_low"
            ],
            "type": "string",
            "description": "Defaults to relevance when a search term is given, newest first when it is not."
          },
          "priceFrom": {
            "title": "Price From",
            "minimum": 0,
            "type": "integer",
            "description": "Minimum asking price, in the market's currency. Also the practical way past the 960-result cap: run the same query over several price bands."
          },
          "priceTo": {
            "title": "Price To",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum asking price, in the market's currency."
          },
          "conditionIds": {
            "title": "Condition",
            "type": "array",
            "description": "Filter by item condition. 1 = new without tags, 2 = very good, 3 = good, 4 = satisfactory, 6 = new with tags, 7 = not fully functional.",
            "items": {
              "type": "string",
              "enum": [
                "6",
                "1",
                "2",
                "3",
                "4",
                "7"
              ],
              "enumTitles": [
                "New with tags",
                "New without tags",
                "Very good",
                "Good",
                "Satisfactory",
                "Not fully functional"
              ]
            }
          },
          "brandIds": {
            "title": "Brand IDs",
            "type": "array",
            "description": "Vinted numeric brand ids (e.g. 14 = adidas, 5257 = Lanvin). A brand id overrides the search term, so use one or the other.",
            "items": {
              "type": "string"
            }
          },
          "catalogIds": {
            "title": "Category IDs",
            "type": "array",
            "description": "Vinted numeric category ids, taken from the catalog_ids[] parameter in any Vinted category URL.",
            "items": {
              "type": "string"
            }
          },
          "fetchSellerCountry": {
            "title": "Fetch Seller Country",
            "type": "boolean",
            "description": "Look up each seller's country. Vinted's search results do NOT carry it, so this costs one extra API call per unique seller (~0.2s, cached within a run). Turn off for the fastest possible scrape.",
            "default": true
          },
          "includeSellerProfile": {
            "title": "Include Seller Profile (city, rating, reviews)",
            "type": "boolean",
            "description": "Adds the seller's city, rating and review count. This is personal data under GDPR and goes beyond what the listing card itself shows, so it is off by default. Only turn it on if your use case genuinely needs it and you have a lawful basis.",
            "default": false
          },
          "watchItemIds": {
            "title": "Listings to Watch",
            "type": "array",
            "description": "Watch mode only. Vinted listing ids or full item URLs. These are added to the watchlist and re-checked on every run. Leave empty and keep Seed From Search on to let the first run build the list itself.",
            "items": {
              "type": "string"
            }
          },
          "watchStoreName": {
            "title": "Watchlist Store Name",
            "type": "string",
            "description": "Name of the key-value store holding the watchlist between runs. Use different names to keep separate watchlists. This is what makes repeat runs accumulate instead of starting blind.",
            "default": "vinted-watchlist"
          },
          "seedWatchlistFromSearch": {
            "title": "Seed Watchlist From Search",
            "type": "boolean",
            "description": "In watch mode, also run the search queries each time and add anything new to the watchlist. Keeps the tracked set growing with fresh listings and refreshes prices on the ones already tracked.",
            "default": true
          },
          "checkReserved": {
            "title": "Check Reserved Status",
            "type": "boolean",
            "description": "Fetch each still-live listing's page to read whether the seller has marked it reserved. Reserved means a sale is in progress, so reserved-then-gone is a far stronger sold signal than gone alone. Costs one page fetch (~0.7s, ~370 KB) per live listing per run.",
            "default": false
          },
          "missesBeforeVanished": {
            "title": "Misses Before Vanished",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "How many consecutive runs a listing must answer 404 before it is marked vanished. The probe asks Vinted about the listing directly rather than looking for it in search results, so this only guards against network flakes, not against search ranking shuffle. 2 is a safe default; 1 reacts a run faster.",
            "default": 2
          },
          "dropVanishedAfterRuns": {
            "title": "Keep Vanished Listings For",
            "minimum": 0,
            "maximum": 50,
            "type": "integer",
            "description": "How many further runs a vanished listing stays in the output and the store before it is dropped. Gives a downstream consumer a few chances to pick up the transition.",
            "default": 3
          },
          "requestDelayMs": {
            "title": "Delay Between Requests (ms)",
            "minimum": 0,
            "maximum": 10000,
            "type": "integer",
            "description": "Pause between HTTP calls. No rate limiting was observed at 40 consecutive calls, so this is politeness rather than necessity. Set 0 for maximum speed.",
            "default": 150
          },
          "proxyConfiguration": {
            "title": "Proxy Configuration",
            "type": "object",
            "description": "Leave this OFF. A direct connection is what mints a Vinted token, it is faster and it is free. Measured 2026-07-29: Apify residential exits work here but are 2-7x slower for no benefit, and roughly half of shared datacenter exits get challenged. It is here as an escape hatch — if runs start failing at the token mint, the outbound range is being challenged and a different exit is the one thing that can fix it.",
            "default": {
              "useApifyProxy": false
            }
          }
        }
      },
      "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
                  }
                }
              },
              "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}