{
  "openapi": "3.0.1",
  "info": {
    "title": "Vinted Deal Monitor — New Listings, Price Drops & Alerts",
    "description": "Monitor Vinted searches across 20+ markets. Get new listings, price drops and underpriced items vs market median, with Telegram or webhook alerts. Pay only for new rows. JSON, CSV, API, MCP.",
    "version": "0.1",
    "x-build-id": "ASImNYWY67pDEns9Z"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/kondasviktor~vinted-deal-monitor/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-kondasviktor-vinted-deal-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/kondasviktor~vinted-deal-monitor/runs": {
      "post": {
        "operationId": "runs-sync-kondasviktor-vinted-deal-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/kondasviktor~vinted-deal-monitor/run-sync": {
      "post": {
        "operationId": "run-sync-kondasviktor-vinted-deal-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": {
          "mode": {
            "title": "Mode",
            "enum": [
              "monitor",
              "snapshot"
            ],
            "type": "string",
            "description": "**monitor** = remember what it has seen and write only NEW / PRICE_DROP / DEAL / LIKELY_SOLD rows (schedule this). **snapshot** = one-off export, every row is written and charged.",
            "default": "monitor"
          },
          "searches": {
            "title": "Searches",
            "type": "array",
            "description": "Your saved searches. Each: `{ \"name\": \"Nike Dunk FR\", \"query\": \"nike dunk\", \"markets\": [\"fr\",\"de\"], \"brandIds\": [], \"catalogIds\": [], \"sizeIds\": [], \"conditions\": [], \"priceMin\": 0, \"priceMax\": 100, \"mustInclude\": [], \"mustExclude\": [\"replica\"] }`. Only `query` (or a catalog/brand id) is required; everything else falls back to the global fields below. One search × one market = one paid \"tracked search\" per run."
          },
          "searchUrls": {
            "title": "Search URLs (alternative)",
            "type": "array",
            "description": "Paste Vinted search URLs instead — the country and filters (keyword, brand, size, condition, price) are read from each URL. Mixed countries are fine.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "markets": {
            "title": "Default markets",
            "type": "array",
            "description": "Markets for searches that do not set their own. Each market is a separate paid search check.",
            "items": {
              "type": "string",
              "enum": [
                "fr",
                "de",
                "uk",
                "es",
                "it",
                "nl",
                "be",
                "pl",
                "cz",
                "sk",
                "hu",
                "lt",
                "lv",
                "ee",
                "at",
                "lu",
                "pt",
                "ro",
                "gr",
                "hr",
                "fi",
                "dk",
                "se",
                "ie",
                "si",
                "us"
              ],
              "enumTitles": [
                "France (vinted.fr)",
                "Germany (vinted.de)",
                "United Kingdom (vinted.co.uk)",
                "Spain (vinted.es)",
                "Italy (vinted.it)",
                "Netherlands (vinted.nl)",
                "Belgium (vinted.be)",
                "Poland (vinted.pl)",
                "Czechia (vinted.cz)",
                "Slovakia (vinted.sk)",
                "Hungary (vinted.hu)",
                "Lithuania (vinted.lt)",
                "Latvia (vinted.lv)",
                "Estonia (vinted.ee)",
                "Austria (vinted.at)",
                "Luxembourg (vinted.lu)",
                "Portugal (vinted.pt)",
                "Romania (vinted.ro)",
                "Greece (vinted.gr)",
                "Croatia (vinted.hr)",
                "Finland (vinted.fi)",
                "Denmark (vinted.dk)",
                "Sweden (vinted.se)",
                "Ireland (vinted.ie)",
                "Slovenia (vinted.si)",
                "United States (vinted.com)"
              ]
            },
            "default": [
              "fr"
            ]
          },
          "conditions": {
            "title": "Conditions",
            "type": "array",
            "description": "Only listings in these conditions (normalized to English across all countries). Leave all selected for no filter.",
            "items": {
              "type": "string",
              "enum": [
                "new_with_tags",
                "new_without_tags",
                "very_good",
                "good",
                "satisfactory"
              ],
              "enumTitles": [
                "New with tags",
                "New without tags",
                "Very good",
                "Good",
                "Satisfactory"
              ]
            },
            "default": [
              "new_with_tags",
              "new_without_tags",
              "very_good",
              "good",
              "satisfactory"
            ]
          },
          "priceMin": {
            "title": "Minimum price",
            "minimum": 0,
            "type": "number",
            "description": "In the market's own currency (e.g. EUR, GBP, PLN, HUF)."
          },
          "priceMax": {
            "title": "Maximum price",
            "minimum": 0,
            "type": "number",
            "description": "In the market's own currency."
          },
          "mustInclude": {
            "title": "Must include",
            "type": "array",
            "description": "Every term must appear in the title (and description when item details are on). Case- and accent-insensitive.",
            "items": {
              "type": "string"
            }
          },
          "mustExclude": {
            "title": "Must exclude",
            "type": "array",
            "description": "Drop listings containing any of these terms — use it against fakes: \"replica\", \"fake\", \"inspired\".",
            "items": {
              "type": "string"
            }
          },
          "excludeSellerIds": {
            "title": "Exclude sellers (IDs)",
            "type": "array",
            "description": "Seller IDs to ignore, e.g. known relisters. The ID is in the `sellerId` output field.",
            "items": {
              "type": "string"
            }
          },
          "maxItemsPerSearch": {
            "title": "Max items per search",
            "minimum": 1,
            "maximum": 10000,
            "type": "integer",
            "description": "Per search per market. **Also your cost cap**: every written row costs $0.001. Above 960 the Actor splits the search into price bands to get past Vinted's 960-result ceiling.",
            "default": 200
          },
          "alertOn": {
            "title": "Send alerts for",
            "type": "array",
            "description": "Events that trigger Telegram / webhook alerts. The first monitor run is a baseline and does not announce existing listings as NEW. Alerts are sent in monitor mode only.",
            "items": {
              "type": "string",
              "enum": [
                "NEW",
                "PRICE_DROP",
                "DEAL",
                "LIKELY_SOLD_OR_REMOVED"
              ],
              "enumTitles": [
                "New listing",
                "Price drop",
                "Deal (below market median)",
                "Likely sold or removed"
              ]
            },
            "default": [
              "DEAL",
              "PRICE_DROP"
            ]
          },
          "dealThresholdPct": {
            "title": "Deal threshold (% below median)",
            "minimum": 1,
            "maximum": 99,
            "type": "number",
            "description": "A listing is a DEAL when its price is at least this far below the median of comparable listings (same brand, category, size, condition).",
            "default": 30
          },
          "minCompsForDeal": {
            "title": "Minimum comparables for a deal verdict",
            "minimum": 3,
            "maximum": 200,
            "type": "integer",
            "description": "Below this many comparable listings there is no deal verdict (`compsConfidence: low`). 8–19 comparables = medium confidence, 20+ = high.",
            "default": 8
          },
          "priceDropThresholdPct": {
            "title": "Price drop threshold (%)",
            "minimum": 1,
            "maximum": 99,
            "type": "number",
            "description": "Minimum price reduction since the last time the listing was seen.",
            "default": 10
          },
          "includeItemDetails": {
            "title": "Include item details",
            "type": "boolean",
            "description": "Open each written listing for description, all photos, seller rating, review count and brand/category IDs. Costs $0.002 per item; a failed fetch keeps the row (as partial) and is not charged.",
            "default": false
          },
          "sellerMinRating": {
            "title": "Minimum seller rating (0–5)",
            "minimum": 0,
            "maximum": 5,
            "type": "number",
            "description": "Needs \"Include item details\". Sellers without enough verified rating are left out."
          },
          "sellerMinReviews": {
            "title": "Minimum seller reviews",
            "minimum": 0,
            "type": "integer",
            "description": "Needs \"Include item details\"."
          },
          "includeSellerLogin": {
            "title": "Include seller username",
            "type": "boolean",
            "description": "Off by default (GDPR-minimal): rows carry the pseudonymous seller ID and profile link only. Needs item details to fill the username.",
            "default": false
          },
          "outputCurrency": {
            "title": "Output currency",
            "enum": [
              "EUR",
              "USD",
              "GBP",
              "PLN",
              "CZK",
              "HUF",
              "RON",
              "DKK",
              "SEK"
            ],
            "type": "string",
            "description": "Prices are also converted into this currency with the daily ECB rate (`priceOut`). `priceEur` is always included.",
            "default": "EUR"
          },
          "telegramBotToken": {
            "title": "Telegram bot token",
            "type": "string",
            "description": "From @BotFather (`/newbot`). Looks like `123456:ABC-DEF…`."
          },
          "telegramChatId": {
            "title": "Telegram chat ID",
            "type": "string",
            "description": "Your user, group or channel ID (send a message to your bot, then ask @userinfobot). Alerts arrive with photo, price, discount and link."
          },
          "webhookUrl": {
            "title": "Webhook URL",
            "type": "string",
            "description": "POST `{ monitorId, runId, events: [...] }` as JSON — works with Discord, Slack, Make, n8n, Zapier. Stored as a secret (many webhook URLs contain tokens)."
          },
          "webhookSecret": {
            "title": "Webhook signing secret",
            "type": "string",
            "description": "Optional. Adds an `X-Signature: sha256=…` header (HMAC-SHA256 of the raw body) so your endpoint can verify the sender."
          },
          "maxAlertsPerRun": {
            "title": "Max alerts per run",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "Above this, one digest message is sent instead of many.",
            "default": 20
          },
          "monitorId": {
            "title": "Monitor ID",
            "type": "string",
            "description": "Name of the state store (a–z, 0–9, \"-\"). Derived from your searches when empty — so **set it explicitly** if you plan to edit your searches and keep the history of what was already seen."
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Starts on Apify datacenter proxy and escalates to residential (in the market's country) only when Vinted keeps blocking — sticky per market for the rest of the run.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}