# Vinted Brand Monitor (`apt_marble/vinted-brand-monitor`) Actor

Track any brand on Vinted across markets with price, size and status filters — titles, prices, discounts, sizes, photos, dates and links.

- **URL**: https://apify.com/apt\_marble/vinted-brand-monitor.md
- **Developed by:** [Hamza](https://apify.com/apt_marble) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.50 / 1,000 brand listings

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Vinted Brand Monitor

Watch your favorite brands on Vinted and catch the best deals first. Enter brand IDs like Nike or Zara — optionally narrowed by keywords, sizes, price range and status — and get every matching listing back as clean, structured data. Each row carries the title, price, original price and discount, brand, size, status, photo, listing date and a direct link. Collect anywhere from a handful of results to a 5,000-row multi-market export. Built for deal hunters, resellers and market researchers who need brand listings as data: track prices per brand across markets, spot discounted items fast, watch new arrivals daily, and build inventory lists without opening a single listing page by hand.

### What you can do with it

- **Watch any brand** — track one brand or many in a single run, with the brand labeled on every row.
- **Cover many markets** — run one brand across France, Germany, Spain, the UK, the US, Poland and more in a single run.
- **Catch new arrivals first** — sort newest-first and re-run on a schedule to spot fresh listings before anyone else.
- **Find the biggest markdowns** — every row shows the original price and the discount versus it, so underpriced items stand out.
- **Filter by size and price** — narrow the watch to the sizes you sell and the price band that works for you.
- **Build inventory lists** — export titles, prices, discounts, sizes, photos and links straight into a spreadsheet or pipeline.

### What you get

One row per listing. Abridged sample of a single result:

```json
{
  "itemId": "4123456789",
  "title": "Nike Air Max sneakers - like new",
  "url": "https://www.vinted.fr/items/4123456789-nike-air-max-sneakers-like-new",
  "thumbnail": "https://images.vinted.net/t/abc123_300x300.jpg",
  "price": 32.5,
  "originalPrice": 45,
  "discountVsOriginal": 0.2778,
  "currency": "EUR",
  "brandId": "53",
  "brand": "Nike",
  "size": "M",
  "status": "Available",
  "domain": "vinted.fr",
  "postedDate": "2026-09-01T14:32:00.000Z"
}
```

Each row keeps the listing's main photo, its size and status where shown, and the exact discount versus the original price when the listing shows one. Where a listing omits a field — no original price, no photo, no size — the actor leaves it empty rather than guessing.

### Input reference

| Setting | Type | Default | What it does |
| --- | --- | --- | --- |
| Brand IDs | list of text | — | Brand IDs to track. One search runs per brand, in every market and keyword. If left empty, add keywords instead. |
| Keywords | list of text | — | Keywords to narrow the brand watch, e.g. `["dress", "sneakers"]`. Leave empty to list everything from the brands. |
| Vinted domains | list of text | `vinted.fr` | Market domains to search: `vinted.fr`, `vinted.de`, `vinted.es`, `vinted.it`, `vinted.co.uk`, `vinted.com`, `vinted.pl`, `vinted.nl` and more. |
| Min price | number | — | Minimum listing price in the market currency. Leave empty for no lower bound. |
| Max price | number | — | Maximum listing price in the market currency. Leave empty for no upper bound. |
| Size IDs | list of text | — | Size IDs to filter by. Leave empty for all sizes. |
| Status IDs | list of text | — | Listing status IDs to filter by. Leave empty for all statuses. |
| Max items | whole number | `200` | How many listings to collect. The actor works through the result pages automatically until this number is reached or the results run out. Maximum 5,000. |
| Sort | choice | `newest` | `newest` (newest first), `price_asc` (cheapest first), `price_desc` (priciest first), or `relevance`. |

Provide at least one brand ID or one keyword; a run works out of the box with the default market.

### Output fields

| Field | Type | Description |
| --- | --- | --- |
| `itemId` | text | The listing's numeric ID. |
| `title` | text | Listing title as shown to readers. |
| `url` | text | Direct link to the listing. |
| `thumbnail` | text | The listing's main photo, when it has one. |
| `price` | number | Current asking price, when listed. |
| `originalPrice` | number | Original price shown on the listing, when it has one. |
| `discountVsOriginal` | number | Fraction saved versus the original price (e.g. `0.25` means 25% off), when computable. |
| `currency` | text | Currency code of the market, e.g. `EUR`, `GBP`, `USD`, `PLN`. |
| `brandId` | text | Brand ID the listing was found under. |
| `brand` | text | Brand name as shown on the listing. |
| `size` | text | Size as shown on the listing, when shown. |
| `status` | text | Listing status as shown, when shown. |
| `condition` | text | Condition label, when shown. |
| `seller` | text | Seller name, when shown. |
| `location` | text | City or country shown on the listing, when shown. |
| `domain` | text | Market domain the listing was found in. |
| `postedDate` | text | Date and time the listing was published, in ISO format, when shown. |
| `query` | text | Keyword that produced this row (empty for unfiltered brand lists). |
| `rank` | number | Position of the listing in its search results. |

### Example use cases

- **Reseller deal flow** — watch top streetwear brands newest-first every morning and message sellers on the standout discounted rows.
- **Brand price watch** — pull 2,000 rows for a designer brand across five markets and compare asking prices by market.
- **Size-specific hunting** — filter to the sizes you sell and a max price, and export only flippable inventory with links.
- **Markdown tracker** — re-run weekly, sort by discount, and catch newly reduced listings in your brands.
- **Market sizing** — count listings per brand and market to see where supply concentrates.

### Pricing

You pay per result, with no monthly minimum.

| What you are charged for | Price |
| --- | --- |
| Brand listing — one listing added to your dataset | **$1.50 per 1,000** |

**Worked example.** A brand check collecting 1000 listings costs 1000 × $0.0015 = **$1.50**.

### Limits & what this actor cannot do

- Titles, prices, photos and availability are a snapshot at the moment of collection; listings are edited, reserved or sold constantly.
- The actor returns what Vinted actually serves and reports distinct listings only — the same listing repeated across pages is returned once.
- Each row carries the search result's single main photo, not the full gallery, and no description text; both live on the listing page.
- Where a listing omits a field the actor leaves it empty rather than guessing.
- Prices come back in each market's own currency; a figure is never re-labelled into a different currency.
- Speed depends on the size of the job and on Vinted's own response times; no fixed throughput is promised.
- Vinted's terms govern automated access. You are responsible for using the data lawfully and in line with the source site's terms, and for handling any personal data in line with applicable privacy law.

### FAQ

**Do I need a Vinted account?**
No. The actor reads only what Vinted shows publicly in its listings.

**Does it need my login or password?**
No. There is nothing to connect and nothing to configure — enter brand IDs and press start.

**How do I find a brand ID?**
Open the brand's page on Vinted in your browser — the numeric ID appears in its web address. Paste it into Brand IDs.

**Which markets can I search?**
Any Vinted market domain (`vinted.fr`, `vinted.de`, `vinted.es`, `vinted.it`, `vinted.co.uk`, `vinted.com`, `vinted.pl`, …). Mix as many as you like in one run.

**How many listings can I get in one run?**
Up to 5,000 per run. If a brand holds more than that, split it with narrower keywords or fewer markets per run.

**Why are some fields empty?**
Because the listing did not show them. The actor reports exactly what the search carries — an empty field means "not shown", never a failed guess.

**Can I get full descriptions and all photos?**
Not from brand tracking — results carry one photo and no description. Feed the listing links from any run into a listing-details scraper for the complete record.

**Can I schedule it?**
Yes. Schedule it hourly, daily or weekly, and each run writes a fresh dataset you can compare against the last — ideal for tracking prices, markdowns and new arrivals over time.

**Is the data complete?**
It is complete for everything Vinted shows openly in its brand results. The actor reports distinct listings rather than the shifting estimate of the total, and leaves unshown fields empty instead of inventing them.

# Actor input Schema

## `brandIds` (type: `array`):

Vinted numeric brand IDs to track, e.g. Nike, Zara, Levi's. One search is run per brand in every domain. If left empty, use Queries instead.

## `queries` (type: `array`):

Keywords to narrow the brand watch, e.g. "dress" or "sneakers". One search is run per keyword within every brand and domain. Leave empty to list everything from the brands.

## `domains` (type: `array`):

Vinted market domains to search, e.g. vinted.fr, vinted.de, vinted.es, vinted.it, vinted.co.uk, vinted.com, vinted.pl, vinted.nl. One search is run per domain.

## `minPrice` (type: `number`):

Minimum listing price in the market currency. Leave empty for no lower bound.

## `maxPrice` (type: `number`):

Maximum listing price in the market currency. Leave empty for no upper bound.

## `sizeIds` (type: `array`):

Vinted numeric size IDs to filter by. Leave empty for all sizes.

## `statusIds` (type: `array`):

Vinted numeric listing status IDs to filter by. Leave empty for all statuses.

## `maxItems` (type: `integer`):

Maximum total listings to collect across all searches. The actor pages through results automatically until this number is reached or the results run out.

## `sort` (type: `string`):

Order the results are returned in.

## Actor input object example

```json
{
  "brandIds": [
    "53"
  ],
  "queries": [
    "dress"
  ],
  "domains": [
    "vinted.fr",
    "vinted.de",
    "vinted.co.uk"
  ],
  "sizeIds": [],
  "statusIds": [],
  "maxItems": 200,
  "sort": "newest"
}
```

# Actor output Schema

## `results` (type: `string`):

Every row this run produced.

## `runSummary` (type: `string`):

What this run collected, and anything it could not read.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "brandIds": [
        "53"
    ],
    "queries": [
        "dress"
    ],
    "domains": [
        "vinted.fr",
        "vinted.de",
        "vinted.co.uk"
    ],
    "sizeIds": [],
    "statusIds": [],
    "maxItems": 200,
    "sort": "newest"
};

// Run the Actor and wait for it to finish
const run = await client.actor("apt_marble/vinted-brand-monitor").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "brandIds": ["53"],
    "queries": ["dress"],
    "domains": [
        "vinted.fr",
        "vinted.de",
        "vinted.co.uk",
    ],
    "sizeIds": [],
    "statusIds": [],
    "maxItems": 200,
    "sort": "newest",
}

# Run the Actor and wait for it to finish
run = client.actor("apt_marble/vinted-brand-monitor").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "brandIds": [
    "53"
  ],
  "queries": [
    "dress"
  ],
  "domains": [
    "vinted.fr",
    "vinted.de",
    "vinted.co.uk"
  ],
  "sizeIds": [],
  "statusIds": [],
  "maxItems": 200,
  "sort": "newest"
}' |
apify call apt_marble/vinted-brand-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,apt_marble/vinted-brand-monitor"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/EfhfFeqrgldj3Iwjk/builds/XD5QVVa0fhVOUJa0P/openapi.json
