{
  "openapi": "3.0.1",
  "info": {
    "title": "Vinted Scraper & API - New Listings to Discord, Telegram",
    "description": "Vinted scraper and Vinted API: Vinted search, prices and deals in any country. Get Vinted new listings on Discord or Telegram, or use a Vinted watchlist as a Vinted bot backend (a monitor: no login, no buying, no seller data). $0.003 per item.",
    "version": "0.1",
    "x-build-id": "GxXmFbE6QMp9nLTPT"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/lukehunter~vinted-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-lukehunter-vinted-scraper",
        "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/lukehunter~vinted-scraper/runs": {
      "post": {
        "operationId": "runs-sync-lukehunter-vinted-scraper",
        "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/lukehunter~vinted-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-lukehunter-vinted-scraper",
        "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": {
          "searchTerms": {
            "title": "Search terms",
            "type": "array",
            "description": "Search words for second-hand listings on Vinted, as a list of plain-text terms, e.g. [\"levi's 501\", \"nike air max\"]. The only field needed for a normal call (set \"country\" to pick the marketplace). Each term is searched on the domain set by \"country\" below. Maximum 50 terms per run.",
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "Vinted catalog URLs (optional)",
            "type": "array",
            "description": "Optional. Full Vinted catalog search URLs to scrape instead of (or alongside) search terms, a list of strings, e.g. \"https://www.vinted.co.uk/catalog?search_text=jacket&price_to=20\". Any filters already in the URL (brand, size, price, etc.) are kept; only pagination is added. Must be a vinted.* URL. Maximum 50 per run.",
            "items": {
              "type": "string"
            }
          },
          "watchlist": {
            "title": "Vinted Pro: watchlist (optional)",
            "type": "array",
            "description": "Optional. Up to 50 named saved searches, each tracked on its own, e.g. [{\"name\": \"Nike jackets\", \"searchTerm\": \"nike jacket\", \"country\": \"uk\", \"priceTo\": 40, \"brand\": \"Nike\", \"size\": \"M\"}]. Only \"name\" and one of \"searchTerm\"/\"url\" are required. Brand, size and condition filter before charging (filtered listings cost nothing); write them as Vinted shows them. Entries may carry notifyDiscordWebhookUrl / notifyTelegramChatId (hence secret). Names must be unique."
          },
          "country": {
            "title": "Vinted country",
            "enum": [
              "uk",
              "fr",
              "de",
              "es",
              "it",
              "nl",
              "be",
              "pl",
              "us",
              "au",
              "at",
              "cz",
              "dk",
              "ee",
              "fi",
              "gr",
              "hr",
              "hu",
              "ie",
              "lt",
              "lu",
              "lv",
              "pt",
              "ro",
              "se",
              "si",
              "sk"
            ],
            "type": "string",
            "description": "Two-letter code of the Vinted marketplace to search, one of the listed values, default \"uk\" (vinted.co.uk). Examples: \"fr\" (vinted.fr), \"de\" (vinted.de), \"us\" (vinted.com). Applies to \"searchTerms\"; ignored for \"startUrls\", which use their own domain.",
            "default": "uk"
          },
          "priceFrom": {
            "title": "Minimum price (optional)",
            "minimum": 0,
            "type": "integer",
            "description": "Minimum price as a whole number in the marketplace's own currency (GBP for uk, EUR for fr/de, USD for us), e.g. 10. Leave empty for no minimum."
          },
          "priceTo": {
            "title": "Maximum price (optional)",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum price as a whole number in the marketplace's own currency (GBP for uk, EUR for fr/de, USD for us), e.g. 50. Leave empty for no maximum."
          },
          "sortBy": {
            "title": "Sort by",
            "enum": [
              "relevance",
              "newest",
              "price_low",
              "price_high"
            ],
            "type": "string",
            "description": "Result order, one of the listed values, default \"relevance\". Example: \"newest\" for the latest listings, \"price_low\" for cheapest first, \"price_high\" for most expensive first.",
            "default": "relevance"
          },
          "maxPagesPerSearch": {
            "title": "Maximum pages per search",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "Catalog pages to fetch per search term or start URL, integer 1-20, default 1 (about 96 items per page), e.g. 3 for broader coverage. Leave at 1 for a quick look.",
            "default": 1
          },
          "maxItems": {
            "title": "Maximum rows",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Maximum listings returned across all searches, integer 1-5000, default 60 (use 10-20 for a quick test, e.g. 10). You are charged $0.003 per delivered row, so this is your cost cap.",
            "default": 60
          },
          "onlyNewSinceLastRun": {
            "title": "New-listing alerts: only new items since last run",
            "type": "boolean",
            "description": "true returns only listings not delivered on a previous run of the same search (term/URL, country, price range, sort); skipped listings are never charged again. Default false: a one-off run gets the full current results. Example: run hourly on a Schedule with true for new-listing alerts. The first run delivers everything; each search term or URL is its own watch.",
            "default": false
          },
          "stateStoreName": {
            "title": "New-listing alerts: state store name",
            "type": "string",
            "description": "Only used when change mode is on. Name of the key-value store that remembers which items each search already delivered between scheduled runs, e.g. \"vinted-scraper-seen-items\". Letters, numbers and hyphens only. Leave the default unless several tasks need separate histories.",
            "default": "vinted-scraper-seen-items"
          },
          "discordWebhookUrl": {
            "title": "Discord webhook URL",
            "type": "string",
            "description": "Post results to a Discord channel. In Discord: Server Settings -> Integrations -> Webhooks -> New Webhook -> choose the channel -> Copy Webhook URL. Example: https://discord.com/api/webhooks/<id>/<token>. Leave empty to skip Discord."
          },
          "telegramBotToken": {
            "title": "Telegram bot token",
            "type": "string",
            "description": "Post results to Telegram. Create a bot by chatting with @BotFather on Telegram (send /newbot) and paste the token it gives you, e.g. 123456789:AA.... Needs \"Telegram chat ID\" below. Leave empty to skip Telegram."
          },
          "telegramChatId": {
            "title": "Telegram chat ID",
            "type": "string",
            "description": "Where the bot should post: a numeric chat id (e.g. 123456789, or -1001234567890 for a group or channel) or a public @channelusername. The bot must be added to that chat or channel first (as an administrator for a channel), and for a private chat you must press Start on the bot. Needs \"Telegram bot token\" above."
          },
          "slackWebhookUrl": {
            "title": "Slack webhook URL",
            "type": "string",
            "description": "Post results to a Slack channel (Block Kit cards, up to 10 per message). Create an incoming webhook at api.slack.com/apps -> Create New App -> Incoming Webhooks -> Add New Webhook to Workspace. Example: https://hooks.slack.com/services/T000/B000/XXXX. Leave empty to skip Slack."
          },
          "slackCompatibleWebhookUrl": {
            "title": "Slack-compatible webhook URL (Mattermost, Rocket.Chat)",
            "type": "string",
            "description": "Post results to a Mattermost or Rocket.Chat incoming webhook, which accept Slack-style webhook payloads. Must be a public https:// address, e.g. https://chat.example.com/hooks/abc123 (no localhost, private IP or .local/.internal hosts). These apps do not render Slack Block Kit, so they get a plain Markdown list. For real Slack use \"Slack webhook URL\" above. Leave empty to skip."
          },
          "teamsWebhookUrl": {
            "title": "Microsoft Teams webhook URL (Workflows)",
            "type": "string",
            "description": "Post results to a Teams channel as an Adaptive Card. In Teams: channel -> ... -> Workflows -> \"Post to a channel when a webhook request is received\" -> copy the URL. The host must end in .logic.azure.com or .powerplatform.com, e.g. https://prod-12.westeurope.logic.azure.com/workflows/... The retired Office 365 connector webhooks are not supported. Leave empty to skip Teams."
          },
          "googleChatWebhookUrl": {
            "title": "Google Chat webhook URL",
            "type": "string",
            "description": "Post results to a Google Chat space. In the space: Apps & integrations -> Webhooks -> Add webhook -> copy the URL. Example: https://chat.googleapis.com/v1/spaces/<space>/messages?key=...&token=.... Leave empty to skip Google Chat."
          },
          "ntfyTopic": {
            "title": "ntfy topic",
            "type": "string",
            "description": "Get a phone push with no account via ntfy (ntfy.sh). Install the ntfy app, subscribe to a topic name, and enter the same name here. Anyone who knows the topic can read it, so pick a long, unguessable name (letters, numbers, - and _), e.g. acme-leads-7k2x9q. At most 10 individual pushes per run, then one \"...and N more\". Leave empty to skip ntfy."
          },
          "ntfyServer": {
            "title": "ntfy server",
            "type": "string",
            "description": "Only used with \"ntfy topic\". Leave as https://ntfy.sh, or enter the public https:// address of your own ntfy server, e.g. https://ntfy.example.com.",
            "default": "https://ntfy.sh"
          },
          "ntfyToken": {
            "title": "ntfy access token (optional)",
            "type": "string",
            "description": "Only used with \"ntfy topic\", for a self-hosted server or a reserved topic that needs a login. An access token from ntfy (starts with tk_, e.g. tk_abc123...). Leave empty for open topics."
          },
          "pushoverUserKey": {
            "title": "Pushover user key",
            "type": "string",
            "description": "Get a phone push via Pushover. Your user key (30 characters, e.g. uQiRzpo4DXghDmr9QzzfQu27cmVRsG) is shown on the Pushover dashboard (pushover.net). Needs \"Pushover app token\" below. At most 10 individual pushes per run, then one \"...and N more\". Leave empty to skip Pushover."
          },
          "pushoverAppToken": {
            "title": "Pushover app token",
            "type": "string",
            "description": "The API token of a Pushover application you create at pushover.net/apps/build (name it after this Actor), e.g. azGDORePK8gMaC0QOYAMyEEuzJnyUi. Needs \"Pushover user key\" above."
          },
          "webhookUrl": {
            "title": "Generic JSON webhook URL (Zapier, Make, n8n, Pipedream, IFTTT, Home Assistant)",
            "type": "string",
            "description": "POST the delivered rows as JSON to any public https:// URL: {source, actor, runId, count, items}. At most 100 rows per POST; every delivered row is sent regardless of the max-notifications cap. For example, route results to email, a spreadsheet or any app. Localhost, private IP and .local/.internal addresses are rejected. Leave empty to skip."
          },
          "maxNotifications": {
            "title": "Max notifications per run",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "Caps how many results are sent to chat and phone channels per run (Discord, Telegram, Slack, Teams, Google Chat, ntfy, Pushover), 1-100, default 25 (e.g. 10). Extra results are still in the dataset. The generic webhook is not capped. Only used when a destination above is set.",
            "default": 25
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}