{
  "openapi": "3.0.1",
  "info": {
    "title": "Vinted Monitor — New Listings, Prices & Discord Alerts",
    "description": "Monitor and scrape Vinted catalog listings across 22 European markets. Extract prices, brands, sizes, conditions, seller ratings, and photos from search URLs or keywords. Discord and Telegram alerts for new items.",
    "version": "0.2",
    "x-build-id": "I40QPQhy6hzV95m26"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/crawloop~vinted-monitor/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-crawloop-vinted-monitor",
        "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/crawloop~vinted-monitor/runs": {
      "post": {
        "operationId": "runs-sync-crawloop-vinted-monitor",
        "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/crawloop~vinted-monitor/run-sync": {
      "post": {
        "operationId": "run-sync-crawloop-vinted-monitor",
        "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": {
          "startUrls": {
            "title": "Catalog / search URLs",
            "type": "array",
            "description": "Paste Vinted catalog search URLs from your browser. Size, brand, category, and price filters in the URL are kept. Example: https://www.vinted.fr/catalog?search_text=nike&order=newest_first",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "searchTerms": {
            "title": "Search keywords",
            "type": "array",
            "description": "Keyword searches when you do not have a full catalog URL. Resolved on the default Vinted domain below.",
            "items": {
              "type": "string"
            }
          },
          "domain": {
            "title": "Default Vinted domain",
            "enum": [
              "fr",
              "de",
              "at",
              "be",
              "nl",
              "es",
              "it",
              "pt",
              "pl",
              "cz",
              "sk",
              "hu",
              "ro",
              "lt",
              "lu",
              "se",
              "dk",
              "fi",
              "ie",
              "gr",
              "co.uk",
              "com"
            ],
            "type": "string",
            "description": "Market used for keyword searches (catalog URLs keep their own domain). Residential proxy country follows this value when not set on the proxy.",
            "default": "fr"
          },
          "maxItems": {
            "title": "Max listings",
            "minimum": 1,
            "maximum": 2000,
            "type": "integer",
            "description": "Maximum listings to save this run. In scrape mode this is the catalog cap. In monitor mode this is the cap on NEW listings after the seed cycle.",
            "default": 50
          },
          "order": {
            "title": "Sort order",
            "enum": [
              "newest_first",
              "relevance",
              "price_low_to_high",
              "price_high_to_low"
            ],
            "type": "string",
            "description": "Catalog sort. Monitor mode always works best with newest first.",
            "default": "newest_first"
          },
          "minPrice": {
            "title": "Minimum price",
            "type": "number",
            "description": "Optional price_from overlay on every target (catalog URL filters still apply unless this is set)."
          },
          "maxPrice": {
            "title": "Maximum price",
            "type": "number",
            "description": "Optional price_to overlay on every target."
          },
          "monitorMode": {
            "title": "Monitor new listings",
            "type": "boolean",
            "description": "Track seen item IDs in a named Key-Value store. First run seeds silently. Later runs (or live poll cycles) save only new listings and send Discord/Telegram alerts. Use Apify Scheduler every 2–5 minutes.",
            "default": false
          },
          "checkInterval": {
            "title": "Live poll interval (seconds)",
            "minimum": 0,
            "maximum": 600,
            "type": "integer",
            "description": "0 = one cycle then exit (correct for Scheduler). 30–600 keeps the run alive and re-polls. Minimum 30 seconds to stay inside DataDome limits.",
            "default": 0
          },
          "monitorStoreName": {
            "title": "Monitor state store name",
            "type": "string",
            "description": "Named Key-Value store for seen listing IDs across scheduled runs. Change this to keep separate watches.",
            "default": "vinted-monitor-state"
          },
          "emitExisting": {
            "title": "Emit listings on first monitor seed",
            "type": "boolean",
            "description": "If monitor mode is on, also write the current catalog snapshot on the seed run (no Discord/Telegram alerts). Default off so the first scheduled run stays silent.",
            "default": false
          },
          "discordWebhook": {
            "title": "Discord webhook URL",
            "type": "string",
            "description": "Optional Discord webhook for new-listing embeds (title, price, photo, seller)."
          },
          "telegramToken": {
            "title": "Telegram bot token",
            "type": "string",
            "description": "Optional Telegram bot token for new-listing photo alerts."
          },
          "telegramChatId": {
            "title": "Telegram chat ID",
            "type": "string",
            "description": "Telegram chat ID or channel username that receives alerts."
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Residential proxies are strongly recommended. Vinted DataDome typically blocks datacenter IPs after one or two requests.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ]
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}