{
  "openapi": "3.0.1",
  "info": {
    "title": "Vinted Products Deal Detector",
    "description": "Get instant alerts when underpriced items appear on Vinted. Pick your product, price range, and condition — it learns the real market price and pings you the moment a genuine bargain shows up, with your savings on every alert.",
    "version": "0.0",
    "x-build-id": "kolFNCGWrpF0tCvLi"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/alkausari_mujahid~vinted-products-deal-detector/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-alkausari_mujahid-vinted-products-deal-detector",
        "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/alkausari_mujahid~vinted-products-deal-detector/runs": {
      "post": {
        "operationId": "runs-sync-alkausari_mujahid-vinted-products-deal-detector",
        "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/alkausari_mujahid~vinted-products-deal-detector/run-sync": {
      "post": {
        "operationId": "run-sync-alkausari_mujahid-vinted-products-deal-detector",
        "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": [
          "product",
          "webhookUrl"
        ],
        "properties": {
          "product": {
            "title": "Product",
            "type": "string",
            "description": "The product to monitor on Vinted, e.g. \"Dior Sauvage\" or \"iPhone 15\". The Actor builds the Vinted search automatically."
          },
          "webhookUrl": {
            "title": "Webhook URL",
            "type": "string",
            "description": "Where deal alerts are sent — Slack, Discord, Make, Zapier, or your own app. Use https://webhook.site for testing."
          },
          "minPrice": {
            "title": "Minimum Price ($)",
            "minimum": 0,
            "type": "integer",
            "description": "Only alert on items priced at or above this (USD). Filters the Vinted search directly. Leave empty for no lower limit."
          },
          "maxPrice": {
            "title": "Maximum Price ($)",
            "minimum": 0,
            "type": "integer",
            "description": "Only alert on items priced at or below this (USD). Filters the Vinted search directly. Leave empty for no upper limit."
          },
          "conditions": {
            "title": "Condition",
            "type": "array",
            "description": "How picky to be about item condition. Each tier covers several real Vinted conditions, so you still get plenty of matching listings:\n• Good — New with tags, New without tags, Very good\n• Average — Good\n• Poor — Satisfactory, Not fully functional\nDefault (Good + Average) gives the best mix of quality and volume. Leave empty to accept everything.",
            "items": {
              "type": "string",
              "enum": [
                "Good",
                "Average",
                "Poor"
              ],
              "enumTitles": [
                "Good — New with tags, New without tags, Very good",
                "Average — Good",
                "Poor — Satisfactory, Not fully functional"
              ]
            },
            "default": [
              "Good",
              "Average"
            ]
          },
          "order": {
            "title": "Sort by",
            "enum": [
              "newest_first",
              "relevance",
              "price_low_to_high",
              "price_high_to_low"
            ],
            "type": "string",
            "description": "How listings are scanned. \"Newest first\" is recommended — it catches freshly-posted deals before they sell. Newest first and Relevance also apply to the market-price baseline; the price sorts apply only to the live scan (they would skew the baseline median, so they're not used there).",
            "default": "newest_first"
          },
          "vintedUrl": {
            "title": "Advanced: Vinted URL",
            "type": "string",
            "description": "Optional, for power users. Filter a search on vinted.com however you like — category, brand, size, colour, price, anything — then paste the URL here. When set, it defines the search and the Product/Conditions fields above are ignored. Include the price filter in the URL itself; the Actor only strips the sort and page parameters and applies your chosen Sort. Leave empty to use the simple Product search."
          },
          "resaleFeePct": {
            "title": "Resale Fee (%) — for profit estimate",
            "minimum": 0,
            "maximum": 50,
            "type": "integer",
            "description": "Assumed cost of reselling (platform fees + shipping) as a percentage of the market price. Used to turn gross savings into an estimated net profit: profit = market price − listing price − (this % × market price).",
            "default": 10
          },
          "alertOnFirstRun": {
            "title": "Alert on the first run",
            "type": "boolean",
            "description": "By default, the very first run for a new search seeds quietly — it learns the market price and records the current deals but does NOT send alerts, so you aren't flooded with the whole existing backlog. New listings alert normally from the next run on. Turn this on to also send alerts for everything found on the first run (useful for testing or a one-time catch-up).",
            "default": false
          },
          "baselineMaxAgeHours": {
            "title": "Baseline Max Age (hours)",
            "minimum": 1,
            "type": "integer",
            "description": "Rebuild the market price baseline if it is older than this. Lower values keep the median fresher but increase scraping costs.",
            "default": 6
          },
          "baselinePages": {
            "title": "Baseline Pages",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "Number of search result pages to scrape when building the price baseline. More pages = more price samples = more accurate median. Each page yields ~48 items.",
            "default": 15
          },
          "monitorPages": {
            "title": "Monitor Pages (per run)",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "Number of newest-first pages to check per run for new listings. Keep low (1–3) when scheduling runs every few minutes.",
            "default": 2
          },
          "minSampleSize": {
            "title": "Min Sample Size for Baseline",
            "minimum": 3,
            "type": "integer",
            "description": "Minimum listings required per condition to compute a valid market median. Conditions with fewer samples are skipped — items in that condition will not trigger alerts until enough data is collected.",
            "default": 8
          },
          "seenIdTtlHours": {
            "title": "Seen ID TTL (hours)",
            "minimum": 1,
            "type": "integer",
            "description": "How long to remember a processed item before re-evaluating it if it reappears (e.g. a seller relists at a lower price).",
            "default": 24
          },
          "proxyConfiguration": {
            "title": "Proxy Configuration",
            "type": "object",
            "description": "Proxy settings passed to the Vinted crawler. Residential proxies improve success rates but require a paid Apify plan.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}